UPI支付网关使用Android Deep Link

5

有没有集成UPI支付网关使用Android Deep Link的工作样例。我已经阅读了NPCI规范并实现了它,但没有成功。交易没有完成。

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);
        Console.WriteLine("Request Code:" + requestCode);
    }

    private void RunUPI(string MobileNo)
    {
        var UPIUri = Android.Net.Uri.Parse("upi://pay?pa=xxx@xxxx&pn=xxxxxx&mc=null&tid=null&tr=test101&tn=This%20is%20test%20payment&am=10&mam=null&cu=INR&url=null");
        Intent intent = new Intent();
        intent.SetAction(Intent.ActionView);
        intent.SetData(UPIUri);
        var activities = PackageManager.QueryIntentActivities(intent, PackageInfoFlags.MatchDefaultOnly);
        var isIntentSafe = activities.Count > 0;
        if (true == isIntentSafe)
        {
            var chooser = Intent.CreateChooser(intent, "Pay With");
            chooser.SetFlags(ActivityFlags.NewTask);
            // Verify the intent will resolve to at least one activity
            if (chooser.ResolveActivity(PackageManager) != null)
            {
                txnUPIRequestCode = 0;
                StartActivityForResult(chooser, txnUPIRequestCode);
            }
        }
    }
2个回答

9
在您的情况下,问题与 UPI 无关,而是与 Android 如何管理 Activity 结果和 Intent 相关。如果调用者(在这种情况下是您的 Activity)正在请求从启动的活动(在此案例中为 UPI PSP )获得结果,则不能使用 {{link1:Intent.FLAG_ACTIVITY_NEW_TASK}}。{{link2:[来源]}}。
因此,一个简单的解决方案是仅创建 Uri 并在没有标志的情况下启动 Intent。在 Java 中,它看起来像:
private void launchUPI(){
  // look below for a reference to these parameters
  Uri uri = Uri.parse("upi://pay").buildUpon()
    .appendQueryParameter("pa", "xxx@xxxxx")
    .appendQueryParameter("pn", "XYZXYZ")
    .appendQueryParameter("tn", "Pay for in-app purchase")
    .appendQueryParameter("am", "20")
    .appendQueryParameter("cu", "INR")
    .build();

  Intent upiPayIntent = new Intent(Intent.ACTION_VIEW);
  upiPayIntent.setData(uri);

  Intent chooser = Intent.createChooser(upiPayIntent, "Pay with");

  if(null != chooser.resolveActivity(getPackageManager())) {
    Log.d(TAG, "UPI Payment resolved to activity");
    startActivityForResult(chooser, REQ_UPIPAYMENT);
  } else {
    Log.d(TAG, "No activity found to handle UPI Payment");
  }
}

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);

  if(REQ_UPIPAYMENT == requestCode){
    if(RESULT_OK == resultCode){
      Log.d(TAG, "UPI Payment successfull");
    } else {
      Log.d(TAG, "UPI Payment failed");
    }
  }
}

就请求参数而言,以下是我从 UPI DeepLinking Specificication page中得到的一个简单参考:
  • pa:收款人(接收付款的人)的UPI虚拟地址
  • pn:收款人的名称。可以是商家或商店的名称。
  • tn:交易说明。交易的简单描述,如应用内物品支付、账单支付等。
  • am:以十进制格式表示的交易金额。
  • cu:交易中使用的货币。目前仅支持INR。
使用上述参数,您可以创建一个向PSP应用程序(如PayTM或银行应用程序)发送静态模式的付款请求。
动态模式下创建付款请求,您还需要添加以下内容:
  • tr:交易参考。您在系统中对交易的内部参考。

更新 1

正如 OP 在评论中提到的那样,要想从 PSP 应用程序中获取响应,例如交易 ID 等,我们可以在 RESULT_OK == resultCode 时使用传递给 onActivityResult()Intent 参数。

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);

  if(REQ_UPIPAYMENT == requestCode){
    if(RESULT_OK == resultCode){
      Log.d(TAG, "UPI Payment successfull");
      String transId = data.getStringExtra("response");
    } else {
      Log.d(TAG, "UPI Payment failed");
    }
  }
}

它起作用了。非常感谢。我该如何读取交易响应参数,例如txnId、responseCode和txnRef(来自NPCI规范)? - Manikandan
1
理解了。字符串变量pspResonse = intent.getStringExtra("response"); - Manikandan
太酷了!感谢分享。我会更新答案以供日后读者参考。 - riyaz-ali
大家好... 请问在哪里声明REQ_UPIPAYMENT? - Ranjith Kumar

0
您可以获取设备上所有的UPI应用程序,并使用任何应用程序来启动交易。 这是您可以使用的函数,以获取所有UPI应用程序。
private fun upiApps(context: Context): MutableList<PaymentUpiOption> {

    val upiOptions = mutableListOf<PaymentUpiOption>()

    // Set Parameters for UPI
    val payUri = Uri.Builder()

    payUri.scheme("upi").authority("pay")
    payUri.appendQueryParameter("pa", "")
    payUri.appendQueryParameter("pn", "")
    payUri.appendQueryParameter("tid", "")
    payUri.appendQueryParameter("mc", "")
    payUri.appendQueryParameter("tr", "")
    payUri.appendQueryParameter("tn", "")
    payUri.appendQueryParameter("am", "")
    payUri.appendQueryParameter("cu", "")

    val paymentIntent = Intent(Intent.ACTION_VIEW)
    paymentIntent.data = payUri.build()

    val appList = context.packageManager.queryIntentActivities(paymentIntent, 0)
    for (i in appList) {
        // this is a custom model class
        val paymentUpiOption = PaymentUpiOption(
            i.loadLabel(context.packageManager).toString(),
            i.activityInfo.packageName,
            i.loadIcon(context.packageManager),
            "upiTxn",
            "UPI"
        )
        upiOptions.add(paymentUpiOption)
    }
    return upiOptions
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接