Android UPI支付意图总是失败

Android UPI支付意图总是失败,android,deep-linking,upi,Android,Deep Linking,Upi,这是我想做的。我的应用程序有两种类型的用户-买家和卖家。卖方可以提供其UPI ID,买方可以使用安装在其设备上的任何UPI应用程序,使用提供的卖方UPI ID向卖方付款 我正在构建一个UPI支付URL,如下所示: String upiPaymentUrl = upi://pay?pa=<<Seller VPA ID>>&pn=<<Payee name>>&tn=<<Txn description>>&

这是我想做的。我的应用程序有两种类型的用户-买家和卖家。卖方可以提供其UPI ID,买方可以使用安装在其设备上的任何UPI应用程序,使用提供的卖方UPI ID向卖方付款

我正在构建一个UPI支付URL,如下所示:

String upiPaymentUrl = upi://pay?pa=<<Seller VPA ID>>&pn=<<Payee name>>&tn=<<Txn description>>&cu=INR
启动所选的UPI应用程序,并正确填写我在URI中提供的所有数据。然后我开始付款,但付款总是失败。当我按原样使用UPI应用程序(未从我的应用程序调用)并使用与构建UPI URL相同的值时,付款将顺利进行,不会出现任何错误。当我从我的应用程序调用UPI应用程序时,知道是什么导致付款失败吗


如有任何帮助/建议,将不胜感激

通过意向启动支付时,您需要签署意向

请参阅本文档中的黄色标记部分:

最初的URL似乎已经死了,但被包括谷歌在内的多个来源引用

这将导致如下情况:

Uri uri =
    new Uri.Builder()
        .scheme("upi")
        .authority("pay")
        .appendQueryParameter("pa", "your-merchant-vpa@xxx")
        .appendQueryParameter("pn", "your-merchant-name")
        .appendQueryParameter("mc", "your-merchant-code")
        .appendQueryParameter("tr", "your-transaction-ref-id")
        .appendQueryParameter("tn", "your-transaction-note")
        .appendQueryParameter("am", "your-order-amount")
        .appendQueryParameter("cu", "INR")
        .build();

// Sign the uri as specified
String signature = someSignatureFunction(uri);

uri.buildUpon()
        .appendQueryParameter("sign", signature);
此外,参数
mode
orgid
对于意图创建的付款似乎是非可选的


我不太清楚你想完成什么。但是,因为我看到的API不是用来处理“用户对用户”付款的,所以我会验证您所做的是否确实是允许的/可能的。您可能无法签署不直接指向您的公司的交易,因此这是不可能的

进一步加强这一点,为了签署意图,您需要加密,加密通常(在此类系统中)发生在您控制的服务器上,以进行反向工程,从而伪造付款

免责声明:我对UPI没有过期性,因此这个答案主要是基于猜测而不是测试。我建议在发布之前在UPI上查找更多的资源


我还发现了一些其他资源:

  • 单击npci主页上的“开发者”时,会链接Infinite.co.in
  • -5.11解释签署意图概念及其一般工作原理
  • -官方UPI产品页面,找不到太多有用的信息

下面是我的用例。我有一个市场应用程序,买家和卖家都可以注册。卖家列出他们的产品。买家主动提出购买产品。卖方提供UPI信息(UPI ID或“一体式”二维码)。买方使用卖方通过app提供的UPI信息发起付款

一种方法是将自己注册为NCPI(Infinity.co.in)的独立开发人员,并申请使用UPI。我还不知道整个过程,因为我一直在请求访问UPI(!)。我的假设是,一旦允许访问,就可以向UPI基础设施注册私钥。要启动支付,请创建如下所示的UPI深度链接URL

upi://pay?pa=&pn=&tn=&cu=INR

使用应用程序附带的公钥对此进行签名。如@JensV所述,UPI开发者文档中提供了要签署的规范

那么,现在如果你不想做上述任何一项,有哪些选择?我看到两种选择:一种是要求卖家提供他们的UPI ID,在你的应用程序中允许买家在剪贴板上复制卖家的UPI ID,这样他们就可以打开任何UPI支付应用程序(GPay、Paytm等),并在启动支付时粘贴UPI ID。另一个简单的方法是让卖家获得“一体式”商户二维码。使用任何库(有很多库)扫描二维码,你会得到一个“签名”的UPI URL(大多数情况下)。现在您所要做的就是使用这个“签名”URL来启动UPI应用程序。有了这个方法,我可以用除GPay(!)之外的所有应用程序进行支付

还有一个信息-如果你没有办法获得注册的UPI URL,你仍然可以使用上面提到的原始UPI URL。只有发行人的UPI应用程序才能成功付款。i、 e.如果您使用的UPI ID的发行人是HDFC银行,则使用“未签名”的UPI URL,您可以调用HDFC移动银行应用程序并进行支付。它将永远成功


如果我能够以开发者身份向UPI注册,并且能够注册我的私钥,我将更新此线程以解释此过程。

根据NPCI的新规则,所有UPI应用程序都绑定最小交易量

如果接收方upi id注册为非业务upiid,则无法成功付款


因此,解决方案是创建新的业务UPI id。

可能会检查结果
Uri
对象包含的内容。如果您的url参数中有一些奇怪的字符,则可能是解析错误。只是一个猜测,我们也尝试了简单的ASCII输入。问题不在于链接。UPI应用程序正在打开并显示URL中存在的正确值。当我开始支付时,它就失败了
Uri uri =
    new Uri.Builder()
        .scheme("upi")
        .authority("pay")
        .appendQueryParameter("pa", "your-merchant-vpa@xxx")
        .appendQueryParameter("pn", "your-merchant-name")
        .appendQueryParameter("mc", "your-merchant-code")
        .appendQueryParameter("tr", "your-transaction-ref-id")
        .appendQueryParameter("tn", "your-transaction-note")
        .appendQueryParameter("am", "your-order-amount")
        .appendQueryParameter("cu", "INR")
        .build();

// Sign the uri as specified
String signature = someSignatureFunction(uri);

uri.buildUpon()
        .appendQueryParameter("sign", signature);