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

Android中无需支付网关实现向商户ID/VPA的UPI支付及链接问题

Android 无第三方支付网关实现UPI支付及链接问题排查

一、不依赖第三方网关实现UPI支付的核心方案

要在Android应用里直接发起UPI支付,不需要集成Razorpay、PayU这类网关,核心是利用UPI系统深链唤起用户手机中已安装的UPI支付应用(如Google Pay、Paytm、PhonePe),具体步骤如下:

1. 构造合规的UPI支付链接

UPI支付链接遵循upi://pay?[参数]格式,必填参数包括:

  • pa:商户/收款方的VPA(比如merchant@bank)
  • pn:收款方名称
  • am:交易金额(数字格式,如10代表10卢比)
  • cu:货币代码(固定为INR)
  • tr:唯一交易参考号(必须确保每次交易唯一,避免重复提交)

可选参数(不需要时直接省略,不要设为null):

  • tn:交易备注(URL编码后的字符串)
  • mc:商户代码(由支付机构提供,无则省略)
  • tid:交易ID(可选,无则省略)

2. 唤起UPI支付应用

通过Android的Intent唤起支持UPI的应用,并处理支付结果:

// 替换为真实的VPA和参数
val validUpiLink = "upi://pay?pa=merchant@axisbank&pn=Test Merchant&tr=ORDER_12345&tn=Test%20Payment&am=10&cu=INR"

val upiIntent = Intent(Intent.ACTION_VIEW).apply {
    data = Uri.parse(validUpiLink)
    addCategory(Intent.CATEGORY_DEFAULT)
    flags = Intent.FLAG_ACTIVITY_NEW_TASK
}

// 检查是否有应用能处理该Intent
if (upiIntent.resolveActivity(packageManager) != null) {
    // 用registerForActivityResult处理结果(替代过时的startActivityForResult)
    upiPaymentLauncher.launch(upiIntent)
} else {
    Toast.makeText(this, "请安装支持UPI的支付应用", Toast.LENGTH_SHORT).show()
}

3. 解析支付结果

通过ActivityResult获取支付应用返回的结果,解析response字段判断状态:

private val upiPaymentLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        result.data?.getStringExtra("response")?.let { response ->
            when {
                response.contains("SUCCESS") -> {
                    // 支付成功,执行后续逻辑(如更新订单状态)
                    Toast.makeText(this, "支付成功", Toast.LENGTH_SHORT).show()
                }
                response.contains("FAILURE") -> {
                    Toast.makeText(this, "支付失败,请重试", Toast.LENGTH_SHORT).show()
                }
                response.contains("SUBMITTED") -> {
                    Toast.makeText(this, "支付已提交,请等待确认", Toast.LENGTH_SHORT).show()
                }
                else -> {
                    Toast.makeText(this, "支付结果未知", Toast.LENGTH_SHORT).show()
                }
            }
        }
    } else {
        Toast.makeText(this, "支付已取消", Toast.LENGTH_SHORT).show()
    }
}

二、你的UPI链接无法工作的原因及修正

你提供的链接无法正常触发支付,主要有两个问题:

  1. 无效参数值:把可选参数(mc、tid、mam、url)设为null,UPI应用会识别为无效参数,直接拒绝处理链接。不需要的参数应该直接删除,而不是赋值null。
  2. 转义字符错误:链接中的&是HTML转义后的字符,在Android代码中需要替换为正常的&,否则Uri解析会出错。

修正后的链接示例

upi://pay?pa=xxx@xxxx&pn=xxxxxx&tr=test101&tn=This%20is%20test%20payment&am=10&cu=INR

关键注意事项

  • tr(交易参考号)必须唯一,否则可能被支付应用判定为重复交易
  • 金额am必须是纯数字,不能包含逗号、货币符号等
  • 不同UPI应用的response格式可能略有差异,解析时要做兼容处理
  • 测试时请使用真实的可收款VPA,占位符xxx@xxxx无法完成真实支付

内容的提问来源于stack exchange,提问作者Ankush Kapoor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:01:31