Android UPI支付意图总是失败

7kqas0il  于 2023-03-21  发布在  Android
关注(0)|答案(4)|浏览(293)

我的应用程序有两种用户类型-买家和卖家。卖家可以提供自己的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应用程序时,是什么原因导致付款失败吗?
任何帮助/建议将不胜感激!

wfsdck30

wfsdck301#

下面是我的使用案例。我有一个Marketplace应用程序,买家和卖家都可以在其中注册。卖家列出他们的产品。买家提出购买产品。卖家提供UPI信息(UPI ID或“一体式”QR码)。买家使用卖家通过应用程序提供的UPI信息启动付款。
一种方法是在NCPI(www.example.com)注册为独立开发人员infinit.co.in并申请使用UPI。我还不知道完整的流程,因为我一直在请求访问UPI(!)。我的假设是,一旦允许访问,您就可以在UPI基础设施中注册您的私钥。要启动付款,请创建UPI深层链接URL,如下所示。
upi://支付?pa=〈〉&pn=〈〉&tn=〈〉&cu=印度卢比
使用您的应用随附的公钥对其进行签名。要签名的规范可在@JensV提到的UPI开发人员文档中找到。
那么现在如果你不想做以上任何一个选项有什么可用?我看到两个选项:一个要求卖家提供他们的UPI ID,并在您的应用程序中允许买家复制剪贴板上的卖家UPI ID,以便他们可以打开任何UPI支付应用程序(GPay、Paytm等),并在开始付款时粘贴UPI ID。另一个简洁的方法是要求卖家获取“一体化”商家二维码。(有很多)扫描二维码,你会得到一个“签名”的UPI网址(大多数情况下)。现在你所要做的就是使用意图启动UPI应用程序使用这个“签名”的网址。有了这个方法,我能够执行支付与所有的应用程序,除了GPay(!)。
还有一个信息-如果您没有办法获得签名的UPI URL,您仍然可以使用上面提到的原始UPI URL。只有通过发卡行的UPI应用程序付款才能成功。也就是说,如果您使用的UPI ID的发卡行是HDFC银行,那么使用“未签名”的UPI URL,您可以调用HDFC移动的银行应用程序并进行付款。它总是会成功的。
如果我能够以开发者的身份在UPI注册,并且能够注册我的私钥,我将更新这个线程来解释这个过程。

gpnt7bae

gpnt7bae2#

根据NPCI的新规定,所有的UPI应用程序都与最小交易量绑定。
如果收款人upiid注册为非业务upiid,则无法成功付款。
因此解决方案是创建新的业务UPI ID。

fhg3lkii

fhg3lkii3#

通过Intent启动付款时,您需要签署Intent。
请参见本文档中的黄色标记部分:https://web.archive.org/web/20200921110005/https://www.npci.org.in/sites/default/files/UPI%20Linking%20Specs_ver%201.6.pdf
原来的网址似乎死了,但引用了多个来源,包括谷歌。
这将导致类似以下的结果:

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);

此外,参数modeorgid对于Intent创建的付款似乎是非可选的。
我不太清楚你想达到什么目的。但是,由于我看到的API不是设计用于处理“用户对用户”支付的,我会验证你所做的事情是否实际上是允许的/可能的。你可能无法签署不是指向你公司的交易,从而使这成为不可能。
进一步强调这一点,为了签署Intent,您需要加密,这通常(在此类系统中)发生在您控制的服务器上,以进行逆向工程,从而伪造付款。

  • 免责声明:我对UPI没有经验,因此这个答案大多是基于猜测,没有经过测试。我建议在发布之前查找一些UPI上的更多资源。*

我找到的一些其他资源:

n9vozmp4

n9vozmp44#

要进行基于UPI意向的支付,您需要一个与当前帐户关联的UPI ID,该ID可由您的银行提供。请注意,属于Paytm或Google Pay企业帐户的UPI ID可能无法用于此目的。请务必向您的银行请求一个与当前帐户关联的UPI ID。获得此ID后,您可以使用它通过各种应用程序和平台进行UPI支付

相关问题