You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Node.js及React+Express Web应用中集成UPI Intent?

UPI Intent 集成方案:Node.js 与 React+Express Web 应用

1. 如何在 Node.js 中实现 UPI Intent?

UPI Intent 的核心是生成符合 UPI 规范的支付链接,并处理后续交易验证,Node.js 中可按以下步骤落地:

核心流程

  • 熟悉 UPI URI 规范:UPI 支付链接遵循 upi://pay?参数列表 格式,必填参数包括:
    • pa:收款方 UPI ID(如 merchant@bank)
    • pn:收款人/商家名称
    • am:交易金额(精确到小数点后两位)
    • tn:交易备注(如订单号)
    • cu:货币类型(默认 INR)
  • 生成合规 UPI URI:通过 Node.js 拼接参数并编码,确保符合 URI 标准。
  • 签名与网关对接(可选):若对接官方 UPI 服务商(如 PhonePe、Paytm),需按服务商要求对参数排序、加盐后用私钥签名,保障请求合法性。
  • 提供前端接口:编写接口接收订单信息,返回生成好的 UPI 链接。
  • 回调验证:支付完成后,UPI 网关会回调后端接口,需验证回调签名与参数,更新订单状态。

Express 后端代码示例

const express = require('express');
const app = express();
app.use(express.json());

// 生成 UPI Intent URI 的工具函数
function generateUpiUri(upiParams) {
  const requiredFields = ['pa', 'pn', 'am', 'tn'];
  const missing = requiredFields.filter(field => !upiParams[field]);
  if (missing.length) throw new Error(`缺少必填参数:${missing.join(', ')}`);

  const params = new URLSearchParams({
    ...upiParams,
    cu: upiParams.cu || 'INR'
  });
  return `upi://pay?${params.toString()}`;
}

// 生成 UPI 支付链接的接口
app.post('/api/upi/generate-intent', (req, res) => {
  try {
    const { merchantUpiId, merchantName, amount, orderId } = req.body;
    const upiUri = generateUpiUri({
      pa: merchantUpiId,
      pn: merchantName,
      am: amount.toFixed(2),
      tn: `订单 ${orderId} 支付`
    });
    res.status(200).json({ upiUri });
  } catch (err) {
    res.status(400).json({ error: err.message });
  }
});

// 处理 UPI 网关回调示例
app.post('/api/upi/callback', (req, res) => {
  const callbackData = req.body;
  // 1. 按服务商要求验证回调签名
  // 2. 校验交易状态、金额、订单号是否匹配
  // 3. 更新数据库中的订单状态
  res.status(200).json({ status: 'success', message: '回调处理完成' });
});

app.listen(3000, () => console.log('服务启动在 3000 端口'));

2. React + Express 构建的 Web 应用能否集成 UPI Intent 流?

完全可以,虽然 UPI Intent 最初面向原生移动端,但 Web 应用可根据终端类型采用不同方案:

移动端 Web(H5)场景

前端拿到后端返回的 UPI URI 后,直接通过 window.location.href = upiUri 触发跳转,手机浏览器会唤起本地已安装的 UPI 应用(如 Google Pay、PhonePe)。用户完成支付后,可通过后端回调或轮询接口获取交易状态。

桌面 Web 场景

由于桌面端无法直接唤起手机 UPI 应用,可采用两种方案:

  1. 生成 UPI 二维码:后端用 qrcode 或 qr-image 库生成支付链接的二维码图片,前端展示二维码,用户用手机 UPI 应用扫码支付,同时前端轮询后端接口查询交易状态。
  2. 引导手动复制链接:展示 UPI 链接,提示用户复制到手机 UPI 应用中完成支付。

React 前端代码示例

import { useState } from 'react';
import QRCode from 'qrcode.react';

function UpiPayment({ order }) {
  const [upiUri, setUpiUri] = useState('');
  const [showQrCode, setShowQrCode] = useState(false);

  const handleInitiatePayment = async () => {
    try {
      const response = await fetch('/api/upi/generate-intent', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
          merchantUpiId: 'merchant@examplebank',
          merchantName: '示例商家',
          amount: order.amount,
          orderId: order.id
        })
      });
      const data = await response.json();
      setUpiUri(data.upiUri);

      // 判断是否为移动端设备
      const isMobile = /Android|webOS|iPhone|iPad|iPod/i.test(navigator.userAgent);
      if (isMobile) {
        window.location.href = data.upiUri;
      } else {
        setShowQrCode(true);
      }
    } catch (err) {
      alert(`支付初始化失败:${err.message}`);
    }
  };

  return (
    <div className="payment-container">
      <button onClick={handleInitiatePayment} className="payment-btn">
        用 UPI 支付
      </button>
      {showQrCode && (
        <div className="qr-container">
          <p>扫码完成支付</p>
          <QRCode value={upiUri} size={200} />
          <p>或复制链接:<code>{upiUri}</code></p>
        </div>
      )}
    </div>
  );
}

export default UpiPayment;

关键注意事项

  • 必须做后端回调验证:不能仅依赖前端反馈,务必在后端验证 UPI 网关回调的签名与参数,防止伪造交易。
  • 服务商对接更稳定:若需要自动回调、交易纠纷保障等功能,建议对接官方 UPI 商家 API,而非仅生成基础 UPI URI,后者无官方回调机制,需自行实现轮询逻辑。
  • 兼容性处理:移动端唤起可能受浏览器设置影响,可增加 fallback 提示(如“若未唤起应用,请复制链接到 UPI 应用”)。

内容的提问来源于stack exchange,提问作者saif azamkhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 17:04:56