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?"
- Большинство приложений реагируют, когда намерение включено. Они запускаются.
- несколько приложений отображали страницу оплаты правильно с суммой. Остальные приложения вообще не отображали страницу. PhonePe, ось отображается. BHIM не отображал страницу оплаты
- Платеж успешно осуществлен ТОЛЬКО через PhonePay и Axis
- После того, как оплата UPI была успешно завершена, приложение UPI закрывается и контроль возвращается к моему приложению. Однако данные ответа всегда NULL. Ни одно из приложений не предоставляет данные ответа при успешной оплате
- Если оплата не удалась или я отменил платеж в приложении UPI или не ввел правильный PIN-код и не закрыл приложение UPI, большинство приложений не возвращают данные ответа.
- Только 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();
}