这是我想要做的。我的应用有两种类型的用户-买家和卖家。卖家可以提供他们的UPI ID,买家可以使用安装在其设备上的任何UPI应用程序使用提供的卖家UPI ID向卖家付款。
我正在构建一个UPI支付URL,如下所示:
String upiPaymentUrl = upi://pay?pa=<<Seller VPA ID>>&pn=<<Payee name>>&tn=<<Txn description>>&cu=INR然后,我使用以下代码来显示手机上所有支持UPI的应用程序:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(upiPaymentUrl));
Intent chooser = Intent.createChooser(intent, getString(R.string.payment_title));
startActivityForResult(chooser, Constant.REQUEST_CODE_UPIPAYMENT, null);选定的UPI应用程序将启动,我在URI中给出的所有数据都已正确填充。然后我开始付款,但付款总是失败。当我按原样使用UPI应用程序(没有从我的应用程序调用)并使用我用来构建UPI URL的相同值时,付款过程没有任何错误。当我从我的应用程序调用UPI应用程序时,你知道是什么原因导致支付失败吗?
如有任何帮助/建议,我们将非常感谢!
发布于 2020-11-07 18:34:05
所以这是我的用例。我有一个市场应用程序,买家和卖家都注册自己。卖家列出他们的产品。买家主动提出购买产品。卖方提供UPI信息(UPI ID或一体机二维码)。买方使用卖方通过app提供的UPI信息发起支付。
要做到这一点,一种方法是将自己注册为NCPI (infinit.co.in)的独立开发者,并申请使用UPI。我还不知道完整的过程,因为我被困在请求访问UPI (!)。我的假设是,一旦访问被允许,您就可以向UPI基础设施注册您的私钥。要发起支付,请创建UPI深度链接URL,如下所示。
upi://pay?pa=<>&pn=<>&tn=<>&cu=INR
使用您的应用程序附带的公钥对此进行签名。要签名的规范可以在@JensV提到的UPI开发人员文档中找到。
那么现在,如果您不想执行上述任何操作,那么有哪些选项可供选择?我看到了两种选择:一种是要求卖家提供他们的UPI,然后在你的应用程序中允许买家将卖家的UPI复制到剪贴板上,这样他们就可以打开任何UPI付款应用程序(GPay,Paytm等)。并在发起支付时粘贴UPI ID。另一种干净利落的做法是让卖家获得“一体式”商家二维码。使用任何库(有许多)来扫描二维码,您将得到一个“签名”的UPI URL (大多数情况下)。现在,您所要做的就是使用Intent来启动UPI应用程序,使用这个“签名”URL。使用这种方法,我可以使用除GPay(!)以外的所有应用程序进行支付。
更多信息-如果您无法获得签名的UPI URL,您仍然可以使用上面提到的原始UPI URL。只有使用发行商的UPI应用程序才能成功付款。例如,如果您使用的UPI ID的发行者是HDFC银行,那么使用“未签名”UPI URL,您可以调用HDFC手机银行应用程序并进行付款。它总是会成功的。
如果我能够注册UPI作为开发人员,并且能够注册我的私钥,我将更新这个线程来解释这个过程。
发布于 2021-04-03 21:44:57
根据NPCI的新规则,所有upi应用程序都以最小交易量绑定。
如果接收方upi id注册为非商业upiid,则它将无法成功付款。
因此,解决方案是创建新业务UPI id。
发布于 2020-11-04 01:02:27
当您通过意向书启动付款时,您需要签署意向书。
请参阅本文档中的黄色标记部分:https://web.archive.org/web/20200921110005/https://www.npci.org.in/sites/default/files/UPI%20Linking%20Specs_ver%201.6.pdf
最初的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 homepage.
https://stackoverflow.com/questions/64605705
复制相似问题