Платежный шлюз UPI с использованием Android Deep Link

Есть ли какой-нибудь рабочий образец для интеграции платежного шлюза 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);
            }
        }
    }

1 ответ

Проблема в вашем случае не связана с UPI но как управляет Android Activity результаты и Intent s.

Вы не можете использовать Intent.FLAG_ACTIVITY_NEW_TASK если звонящий (в этом случае ваш Activity) запрашивает результат от запускаемого действия (в данном случае PSP UPI). [источник]

Таким простым решением было бы просто создать 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.

  • pa: UPI Виртуальный адрес получателя (того, кто получает платеж)
  • pn Имя получателя Может быть имя продавца или магазина.
  • tn: Примечание к транзакции. Простое описание транзакции, как, например, оплата товаров в приложении, оплата счетов и т. Д.
  • am: Денежная сумма транзакции в десятичном формате.
  • cu: Валюта, используемая в транзакции. В настоящее время поддерживается только INR.

Используя вышеприведенные параметры, вы можете создать статический режим запроса платежа для приложения PSP (таких приложений, как PayTM или банковские приложения).

Чтобы создать запрос на оплату в динамическом режиме, вам также необходимо добавить следующее:

  • tr: Ссылка на транзакцию. Ваша внутренняя ссылка на транзакцию в вашей системе.

ОБНОВЛЕНИЕ 1

Как указывалось в комментариях к ОП, чтобы получить ответ от приложения PSP, например, идентификатор транзакции и т. Д., Мы можем использовать Intent прошло в onActivityResult() когда 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");
    }
  }
}

Вы можете просмотреть список всех приложений 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
}
Другие вопросы по тегам