非商家身份下Jetpack Compose应用UPI深度链接支付失败求助
UPI好友转账失败的问题解决
你遇到的支付失败是因为生成的UPI链接里包含了tid(交易ID)和tr(交易参考ID)这两个参数——这俩是给商家/收单机构专用的,个人好友转账场景下完全不需要,GPay和PhonePe会识别这类参数为商家交易请求,而你没有商家资质,所以触发了安全拦截。
修正后的UPI链接生成代码
移除tid和tr参数,同时用标准URL编码处理空格(替换为%20):
fun getUPIString( payeeAddress: String, payeeName: String, trxnNote: String, payeeAmount: String ): String { val encodedPayeeName = payeeName.replace(" ", "%20") val encodedTrxnNote = trxnNote.replace(" ", "%20") return "upi://pay?pa=$payeeAddress&pn=$encodedPayeeName&tn=$encodedTrxnNote&am=$payeeAmount&cu=INR" }
Jetpack Compose中调用示例
用rememberLauncherForActivityResult处理支付Intent的结果:
@Composable fun UPIPaymentButton() { val paymentLauncher = rememberLauncherForActivityResult( contract = ActivityResultContracts.StartActivityForResult() ) { result -> // 解析支付结果,UPI返回的response格式通常为"txnId=xxx;responseCode=00;..." val response = result.data?.getStringExtra("response") // 根据responseCode判断支付状态,比如00代表成功 } Button(onClick = { val upiUrl = getUPIString( payeeAddress = "your_friend@upi", payeeName = "好友姓名", trxnNote = "聚餐分摊", payeeAmount = "50.00" ) val intent = Intent(Intent.ACTION_VIEW).apply { data = Uri.parse(upiUrl) // 可指定支付应用,或者去掉让用户自行选择 // setPackage("com.google.android.apps.nbu.paisa.user") // GPay // setPackage("com.phonepe.app") // PhonePe } paymentLauncher.launch(intent) }) { Text("发起UPI转账") } }
官方规范参考
个人UPI转账遵循NPCI(国家支付公司)的UPI Deep Link规范,核心必填参数仅需:
pa:收款方UPI IDpn:收款方名称tn:交易备注am:交易金额cu:货币代码(默认INR)
Android端Intent调用规范可参考Android官方Intent文档,UPI深层链接的完整规范可查阅NPCI官方发布的《UPI Deep Link Specification》。
内容的提问来源于stack exchange,提问作者Abhigyan Singh
相关产品推荐
相关产品推荐

