UPI App Глубокие ссылки с использованием Intent - непоследовательное и ошибочное поведение

У меня есть глубокие ссылки на приложения UPI из моего родного приложения для Android с использованием намерения. Я проверил это с помощью различных приложений UPI, таких как BHIM, PhonePe, AXIS, UnionBank, Pockets и т. Д.

Я создал URI push-платежа. Я могу запускать различные приложения UPI. Однако поведение довольно противоречиво.

"UPI:// платить pa=xxxxx@upi&pn=payee&am=5.00&tn=Test_Transaction?"

  1. Большинство приложений реагируют, когда намерение включено. Они запускаются.
  2. несколько приложений отображали страницу оплаты правильно с суммой. Остальные приложения вообще не отображали страницу. PhonePe, ось отображается. BHIM не отображал страницу оплаты
  3. Платеж успешно осуществлен ТОЛЬКО через PhonePay и Axis
  4. После того, как оплата UPI была успешно завершена, приложение UPI закрывается и контроль возвращается к моему приложению. Однако данные ответа всегда NULL. Ни одно из приложений не предоставляет данные ответа при успешной оплате
  5. Если оплата не удалась или я отменил платеж в приложении UPI или не ввел правильный PIN-код и не закрыл приложение UPI, большинство приложений не возвращают данные ответа.
  6. Только AXISPay вернул данные ответа: Intent { (имеет дополнения) }

Кто-нибудь - какие-либо комментарии? Почему такое противоречивое поведение?

Удивительно, что диплинкинг не работает с приложением BHIM.

Я могу поделиться кодом Android, если кто-то хочет попробовать.

3 ответа

Это действительно работает и для приложения BHIM. Используйте этот код, он работает как очарование для всех приложений с поддержкой PSP.

Примечание. Вместо использования "%" лучше использовать "+" для замены пробела в URL. Это работает лучше.

private String getUPIString(String payeeAddress, String payeeName, String payeeMCC, String trxnID, String trxnRefId,
                            String trxnNote, String payeeAmount, String currencyCode, String refUrl) {
    String UPI = "upi://pay?pa=" + payeeAddress + "&pn=" + payeeName
            + "&mc=" + payeeMCC + "&tid=" + trxnID + "&tr=" + trxnRefId
            + "&tn=" + trxnNote + "&am=" + payeeAmount + "&cu=" + currencyCode
            + "&refUrl=" + refUrl;
    return UPI.replace(" ", "+");
}

Затем передайте параметры в метод и передайте строку в Intent следующим образом:

Intent intent = new Intent();
            intent.setAction(Intent.ACTION_VIEW);
            intent.setData(Uri.parse(UPI));
            Intent chooser = Intent.createChooser(intent, "Pay with...");
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                startActivityForResult(chooser, 1, null);
            }

Для корректного отображения страницы оплаты необходимо setAction(Intent.ACTION_VIEW) на ваше намерение.

Я получаю ответ только из приложения BHIM с помощью getStringsExtra("response") о намерениях данных.

public void UPI()
    {
         Long tsLong = System.currentTimeMillis()/1000;
         String transaction_ref_id = tsLong.toString()+"UPI"; // This is your Transaction Ref id - Here we used as a timestamp -

         String sOrderId= tsLong +"UPI";// This is your order id - Here we used as a timestamp -

         Log.e("TR Reference ID==>",""+transaction_ref_id);
        Uri myAction = Uri.parse("upi://pay?pa="+sVPA+"&pn="+"Merchant%20Finance"+"&mc="+"&tid="+transaction_ref_id +"&tr="+transaction_ref_id +"&tn=Pay%20to%20Merchant%20Finance%20Assets&am="+"1.00"+"&mam=null&cu=INR&url=https://mystar.com/orderid="+sOrderId);


         PackageManager packageManager = getPackageManager();
         //Intent intent = packageManager.getLaunchIntentForPackage("com.mgs.induspsp"); // Comment line - if you want to open specific application then you can pass that package name For example if you want to open Bhim app then pass Bhim app package name - 
         Intent intent = new Intent();

         if (intent != null) {
             intent.setAction(Intent.ACTION_VIEW);
             intent.setData(myAction);
            // startActivity(intent);
             Intent chooser = Intent.createChooser(intent, "Pay with...");
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                 startActivityForResult(chooser, 1, null);
             }

         }
    }


// For onActivityResult -

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);

        try
        {
            Log.e("UPI RESULT REQUEST CODE-->",""+requestCode);
            Log.e("UPI RESULT RESULT CODE-->",""+resultCode);
            Log.e("UPI RESULT DATA-->",""+data);



            if(resultCode == -1)
            {

                // 200 Success

            }
            else
            {
                // 400 Failed
            }


            YourActivity.this.finish(); 


        }
        catch(Exception e)
        {
            Log.e("Error in UPI onActivityResult->",""+e.getMessage());
        }
    }

Вот как я решил это для Redmi Note 5 Pro и других телефонов MI:

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(UPI));
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(intent);
} else {
    Toast.makeText(this, "No application available to handle this request!", Toast.LENGTH_SHORT).show();
}
Другие вопросы по тегам