这是我想要做的。我的应用程序有两种类型的用户——买家和卖家。卖家可以提供他们的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应用程序时,你知道是什么导致付款失败吗?
如有任何帮助/建议,我们将不胜感激!
这是我的用例。我有一个市场应用程序,买家和卖家都可以在这里注册。卖家列出他们的产品。买家提出购买这些产品。卖家提供UPI信息(UPI ID或"一体式"二维码)。买家使用卖家通过应用程序提供的UPI信息启动付款。
一种方法是将自己注册为NCPI(infinit.co.in)的独立开发人员,并申请使用UPI。我还不知道整个过程,因为我一直在请求访问UPI(!)。我的假设是,一旦允许访问,您就可以在UPI基础设施中注册您的私钥。要启动支付,请创建UPI深度链接URL,如下所示。
upi://pay?pa=<gt&pn=<gt&tn=<gt&cu=印度卢比
使用应用程序附带的公钥对此进行签名。正如@JensV所提到的,要签署的规范可以在UPI开发者文档中找到。
那么,现在如果你不想做以上任何一项,有什么选择?我看到两种选择:一种是要求卖家提供他们的UPI ID,在你的应用程序中,允许买家在剪贴板上复制卖家的UPI标识,这样他们就可以打开任何UPI支付应用程序(GPay、Paytm等),并在开始支付时粘贴UPI ID。另一种巧妙的方法是要求卖方获得";一体式";商户二维码。使用任何图书馆(有很多)扫描二维码,你会得到一个";签名的";UPI URL(大部分时间)。现在,您所要做的就是使用Intent来启动UPI应用程序;签名的";URL。使用这种方法,我可以使用除GPay之外的所有应用程序进行支付(!)。
还有一条信息-如果你没有办法获得签名的UPI URL,你仍然可以使用上面提到的原始UPI URL。只有使用发行人的UPI应用程序才能成功付款。即,如果您使用的UPI ID的发行人是HDFC银行,则使用";无符号的";UPI URL您可以调用HDFC移动银行应用程序并进行支付。它将永远成功。
如果我能够作为开发人员向UPI注册并能够注册我的私钥,我将更新此线程来解释过程。
根据NPCI的新规则,所有upi应用程序都绑定了最小事务。
如果收款人upi-id注册为非业务upi-id,则无法成功付款。
所以解决方案是创建新的业务UPI id。
通过意向启动支付时,您需要签署意向。
请参阅本文档中的黄色标记部分: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
对于Intent创建的支付似乎是非可选的。
我不太确定你想完成什么。但由于我所看到的API并不是用来处理;"用户对用户";付款,我会核实你所做的是否真的被允许/可能。您可能无法签署非针对您公司的交易,因此无法实现这一点。
为了进一步加强这一点,为了签署意向书,您需要加密,加密通常(在此类系统中)发生在您控制的服务器上,以进行逆向工程,从而伪造付款。
免责声明:我与合众社没有经验,因此这个答案主要基于猜测,没有经过测试。我建议在发布之前在合众社上查找更多资源
我发现的其他一些资源:
- infinite.co.in在点击";显影剂";在npci主页上
- https://infinit.co.in/Solutions/UPI/product_doc.pdf-5.11解释签署意向的概念及其一般工作方式
- https://www.npci.org.in/what-we-do/upi/product-overview-合众社官方产品页面,找不到太多有用的信息
要进行基于UPI意向的支付,您需要一个与您的活期账户相关的UPI ID,该ID可以由您的银行提供。请注意,属于Paytm或Google Pay商业账户的UPI ID可能不适用于此目的。向您的银行申请与您的活期账户相关的UPI ID是很重要的。一旦你有了这个ID,你就可以使用它通过各种应用程序和平台进行UPI支付