The problem in your case is not related to UPI
but how Android manages Activity
results and Intent
s.
You cannot use the Intent.FLAG_ACTIVITY_NEW_TASK
if the caller (in this case your Activity
) is requesting a result from the activity being launched (the UPI PSP in this case). [source]
So a simple solution would be to simply create the Uri
and launch the Intent
without the flag. In java that would look like:
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");
}
}
}
As far the request parameters are concerned, following is a simple reference that I got from the UPI DeepLinking Specificication page.
pa
: UPI Virtual address of the payee (the one who receives the payment)
pn
: Name of the payee. Can be name of merchant or store.
tn
: Transaction note. A simple description of the transaction, like, payment for in-app items, bill payments, etc.
am
: Monetary amount of transaction in decimal format.
cu
: Currency used in the transaction. Currently only INR is supported.
Using the above parameters, you can create a payment request static mode to the PSP app (apps like PayTM or bank applications).
To create a payment request in dynamic mode, you also need to add the following:
tr
: Transaction reference. Your internal reference to the transaction in your system.
UPDATE 1
As the OP mentioned in the comments, to get back the response from the PSP app, like, transaction id, etc. we can use the Intent
passed in the onActivityResult()
when 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");
}
}
}