使用Android Deep Link的UPI支付网关

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Android Deep Link的UPI支付网关相关的知识,希望对你有一定的参考价值。

是否有任何工作样本使用android Deep Link集成UPI支付网关。我完成了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);
            }
        }
    }
答案

您的案例中的问题与UPI无关,但Android如何管理Activity结果和Intents。

如果调用者(在本例中为Intent.FLAG_ACTIVITY_NEW_TASK)正在请求启动的活动(在本例中为UPI PSP),则不能使用Activity[source]

所以一个简单的解决方案就是简单地创建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:交易参考。您对系统中事务的内部引用。

UPDATE 1

正如评论中提到的OP,要从PSP应用程序中获取响应,例如,事务ID等,我们可以使用Intent时传递的onActivityResult()

RESULT_OK == resultCode

以上是关于使用Android Deep Link的UPI支付网关的主要内容,如果未能解决你的问题,请参考以下文章

使用 UPI(具体为 GooglePay)验证付款是不是实际完成

谷歌支付 UPI 在 asp.net 中的集成

Android Navigation Url Deep Link Back to Previous App

网络上的 UPI 付款响应

如何在 Android 应用程序中集成 Google pay、PhonePe 等支付方式 [关闭]

移动应用支付支持 - 通过 BHIM 支付