14

我使用意图从我的 android 本机应用程序中深度链接了 UPI 应用程序。我已经使用 BHIM、PhonePe、AXIS、UnionBank、Pockets 等各种 UPI 应用程序对此进行了测试。

我创建了推送支付 URI。我能够启动各种 UPI 应用程序。然而行为是相当不一致的。

"upi://pay?pa=xxxxx@upi&pn=payee&am=5.00&tn=Test_Transaction"

  1. 大多数应用程序在调用意图时都会做出响应。他们被发射。
  2. 很少有应用程序以金额正确显示付款页面。其他应用程序根本没有显示该页面。PhonePe,显示轴。BHIM 没有显示支付页面
  3. 仅通过 PhonePay 和 Axis 成功完成付款
  4. UPI 支付成功完成后,UPI 应用程序关闭,控制权返回到我的应用程序。但是,响应数据始终为 NULL。支付成功时没有应用程序提供响应数据
  5. 如果支付失败或者我在UPI应用中取消支付或者我没有输入正确的PIN并关闭UPI应用,大多数应用不返回响应数据。
  6. 仅 AXISPay 返回响应数据:Intent { (has extras) }

任何人 - 任何意见?为什么会有这种前后不一的行为?

令人惊讶的是深度链接无法与 BHIM 应用程序一起使用。

如果有人想尝试,我可以分享 android 代码。

4

4 回答 4

17

它也适用于 BHIM 应用程序。使用此代码,它对每个启用 PSP 的应用程序都具有吸引力。

注意:最好使用“+”代替 URL 中的空格,而不是使用“%”。这样效果更好。

private String getUPIString(String payeeAddress, String payeeName, String payeeMCC, String trxnID, String trxnRefId,
                            String trxnNote, String payeeAmount, String currencyCode, String refUrl) {
    String UPI = "upi://pay?pa=" + payeeAddress + "&pn=" + payeeName
            + "&mc=" + payeeMCC + "&tid=" + trxnID + "&tr=" + trxnRefId
            + "&tn=" + trxnNote + "&am=" + payeeAmount + "&cu=" + currencyCode
            + "&refUrl=" + refUrl;
    return UPI.replace(" ", "+");
}

然后将方法中的参数传递给Intent,这样就可以了:

Intent intent = new Intent();
            intent.setAction(Intent.ACTION_VIEW);
            intent.setData(Uri.parse(UPI));
            Intent chooser = Intent.createChooser(intent, "Pay with...");
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                startActivityForResult(chooser, 1, null);
            }
于 2017-09-29T06:28:41.240 回答
0

为了正确显示付款页面,您必须按照setAction(Intent.ACTION_VIEW)自己的意图行事。

我仅通过使用getStringsExtra("response")Intent 数据从 BHIM 应用程序获得响应。

于 2017-07-10T05:02:18.890 回答
0
public void UPI()
    {
         Long tsLong = System.currentTimeMillis()/1000;
         String transaction_ref_id = tsLong.toString()+"UPI"; // This is your Transaction Ref id - Here we used as a timestamp -

         String sOrderId= tsLong +"UPI";// This is your order id - Here we used as a timestamp -

         Log.e("TR Reference ID==>",""+transaction_ref_id);
        Uri myAction = Uri.parse("upi://pay?pa="+sVPA+"&pn="+"Merchant%20Finance"+"&mc="+"&tid="+transaction_ref_id +"&tr="+transaction_ref_id +"&tn=Pay%20to%20Merchant%20Finance%20Assets&am="+"1.00"+"&mam=null&cu=INR&url=https://mystar.com/orderid="+sOrderId);


         PackageManager packageManager = getPackageManager();
         //Intent intent = packageManager.getLaunchIntentForPackage("com.mgs.induspsp"); // Comment line - if you want to open specific application then you can pass that package name For example if you want to open Bhim app then pass Bhim app package name - 
         Intent intent = new Intent();

         if (intent != null) {
             intent.setAction(Intent.ACTION_VIEW);
             intent.setData(myAction);
            // startActivity(intent);
             Intent chooser = Intent.createChooser(intent, "Pay with...");
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                 startActivityForResult(chooser, 1, null);
             }

         }
    }


// For onActivityResult -

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);

        try
        {
            Log.e("UPI RESULT REQUEST CODE-->",""+requestCode);
            Log.e("UPI RESULT RESULT CODE-->",""+resultCode);
            Log.e("UPI RESULT DATA-->",""+data);



            if(resultCode == -1)
            {

                // 200 Success

            }
            else
            {
                // 400 Failed
            }


            YourActivity.this.finish(); 


        }
        catch(Exception e)
        {
            Log.e("Error in UPI onActivityResult->",""+e.getMessage());
        }
    }
于 2018-05-21T08:02:34.733 回答
-1

以下是我为 Redmi Note 5 Pro 和其他 MI 手机解决的方法:

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(UPI));
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(intent);
} else {
    Toast.makeText(this, "No application available to handle this request!", Toast.LENGTH_SHORT).show();
}
于 2019-10-11T09:38:59.570 回答