本文介绍了使用Android Deep Link的UPI Payment Gateway的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有任何可行的示例可使用Android Deep Link集成UPI付款网关.我仔细阅读了NPCI规范,并没有成功实施它.交易未完成.

Is there any working sample to integrate UPI payment gateway using Android Deep Link. I went through NPCI specifications and implemented it with no success. Transaction is not getting completed.

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结果和Intent无关.

The problem in your case is not related to UPI but how Android manages Activity results and Intents.

不能使用 Intent.FLAG_ACTIVITY_NEW_TASK (如果呼叫者(在本例中为Activity)正在从启动的活动中请求结果(在本例中为 UPI PSP ). [源代码]

You cannot use the Intent.FLAG_ACTIVITY_NEW_TASK if the caller (in this case your Activity) is requesting a result from the activity being launched (the UPI PSP in this case). [source]

所以一个简单的解决方案是简单地创建Uri并在没有标志的情况下启动Intent.在Java中看起来像:

So a simple solution would be to simply create the Uri and launch the Intent without the flag. In java that would look like:

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深度链接规范页面.

As far the request parameters are concerned, following is a simple reference that I got from the UPI DeepLinking Specificication page.

  • pa :收款人(接收付款的人)的UPI虚拟地址
  • pn :收款人的名称.可以是商家或商店的名称.
  • tn :交易记录.对交易的简单描述,例如应用内商品的付款,账单付款等.
  • am :十进制格式的交易金额.
  • cu :交易中使用的货币.目前仅支持INR.
  • pa: UPI Virtual address of the payee (the one who receives the payment)
  • pn: Name of the payee. Can be name of merchant or store.
  • tn: Transaction note. A simple description of the transaction, like, payment for in-app items, bill payments, etc.
  • am: Monetary amount of transaction in decimal format.
  • cu: Currency used in the transaction. Currently only INR is supported.

使用上述参数,您可以为 PSP 应用(如PayTM或银行应用之类的应用)创建静态模式付款请求.

Using the above parameters, you can create a payment request static mode to the PSP app (apps like PayTM or bank applications).

要以动态模式创建付款请求,您还需要添加以下内容:

To create a payment request in dynamic mode, you also need to add the following:

  • tr :交易参考.您对系统中交易的内部引用.

正如评论中提到的OP一样,要获取 PSP 应用的响应(例如交易ID等),我们可以使用onActivityResult()中传递的Intent,当RESULT_OK == resultCode.

As the OP mentioned in the comments, to get back the response from the PSP app, like, transaction id, etc. we can use the Intent passed in the onActivityResult() when RESULT_OK == resultCode.

@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");
    }
  }
}

这篇关于使用Android Deep Link的UPI Payment Gateway的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-04 22:19