Платежный шлюз 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
}