移动端UPI应用支付链接如何获取交易状态及回调响应
UPI支付状态追踪方案
你用的这种普通UPI Deep Link(upi://pay?xxx)本身是前端跳转唤起支付,没有内置的回调机制,所以没法直接拿到交易状态。要实现成功/失败的追踪,得根据你的开发场景(原生APP/H5)选择对应的方案:
1. 原生APP场景(安卓/iOS)
UPI规范支持通过系统Intent的返回结果传递交易状态,以安卓为例:
- 使用
registerForActivityResult启动UPI支付Intent,支付完成后,UPI应用会返回包含交易状态的响应数据。 - 核心代码示例:
val upiIntent = Intent(Intent.ACTION_VIEW).apply { data = Uri.parse("upi://pay?pa=upiaddress@okhdfcbank&pn=JohnDoe&cu=INR&tn=ORDER12345") } val activityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { val response = result.data?.getStringExtra("response") // 解析response字段,格式类似:SUCCESS|txnId=12345&... 或 FAILURE|reason=... when { response?.startsWith("SUCCESS") == true -> { // 处理支付成功逻辑 } response?.startsWith("FAILURE") == true -> { // 处理支付失败逻辑 } else -> { // 交易待定,需要后续后端确认 } } } } activityResultLauncher.launch(upiIntent)
iOS端同理,通过UIApplication.shared.open(_:options:completionHandler:)的completion回调,结合UPI应用返回的URL Scheme参数来解析状态。
2. H5/Web场景
纯静态H5无法直接监听UPI应用的返回结果,必须依赖后端配合:
- 后端轮询方案:
- 支付链接中添加唯一订单号参数:
tn=ORDER12345,确保UPI交易和你的订单关联。 - 用户点击支付后,前端跳转到UPI应用,同时后端开始定时调用NPCI的UPI交易查询API(需商家提前接入NPCI商户平台,获取API权限),查询依据为订单号或UPI返回的txnId。
- 前端每隔几秒轮询你的后端接口,获取最新的交易状态。
- 支付链接中添加唯一订单号参数:
- 第三方支付网关Webhook:
如果接入了PhonePe、Paytm等第三方支付网关的商户服务,它们会提供Webhook机制——支付状态变更时,网关会主动向你的后端接口推送状态通知,前端再从后端同步结果。
关键注意事项
- 必须在支付链接中加入
tn参数(唯一订单号),这是关联UPI交易和业务订单的核心标识。 - 纯前端方案无法实现可靠的状态追踪,因为交易查询需要商户身份验证,这些敏感逻辑必须放在后端。
内容的提问来源于stack exchange,提问作者Siddhartha Panda
相关产品推荐
相关产品推荐

