Reputation: 279
I have deeplinked UPI apps from my android native app using intent. I have tested this with various UPI apps like BHIM, PhonePe, AXIS, UnionBank, Pockets etc.
I created push payment URI. I am able to launch various UPI apps. However behaviour is quite inconsistent.
"upi://pay?pa=xxxxx@upi&pn=payee&am=5.00&tn=Test_Transaction"
Anyone - any comments? Why such inconsistent bahaviour?
Surprising is deeplinking not working with BHIM app.
I can share android code if someone want want to try.
Upvotes: 18
Views: 29602
Reputation: 829
Here is how I solved it for Redmi Note 5 Pro and other MI phones:
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();
}
Upvotes: -2
Reputation: 11
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());
}
}
Upvotes: 0
Reputation: 522
It really works for the BHIM application also. Use this Code it works like a charm for every PSP enabled applications.
Note: Instead of using the "%" better to use "+" to replace the white space from the URL. That works better.
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(" ", "+");
}
Then pass the parameters in the method and pass the string to the Intent in this way:
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);
}
Upvotes: 18
Reputation: 508
For displaying payment page correctly, you have to setAction(Intent.ACTION_VIEW)
on your intent.
I am getting response only from BHIM app by using getStringsExtra("response")
on Intent data.
Upvotes: 0