使用Android Deep Link的UPI支付网关

书史足自悦,安用勤与劬。这篇文章主要讲述使用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
【使用Android Deep Link的UPI支付网关】正如评论中提到的OP,要从PSP应用程序中获取响应,例如,事务ID等,我们可以使用Intent时传递的onActivityResult()
RESULT_OK == resultCode


    推荐阅读