我正在使用“Gpay”开发一个具有 UPI 支付集成的 Android 应用程序。我需要在“Gpay”中交易完成后向用户显示UPI支付状态(“成功”或“失败”)。
实现这一目标的技术途径是什么?我可以处理从“Gpay”到我的应用程序的付款状态回调吗?是否有在 Android 应用程序中集成 UPI 支付状态的既定做法?
我感谢任何关于在我的应用程序中有效显示 UPI 支付结果的技术见解或指导。
您可以参考这个链接 打开github查看Upi支付源码
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding;
private Context context = this;
final int UPI_PAYMENT = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
View view = binding.getRoot();
setContentView(view);
onClick();
}
private void onClick() {
binding.payNow.setOnClickListener(v -> {
String amount = binding.amountEt.getText().toString();
String upiId = binding.upiIdEt.getText().toString();
String name = binding.nameEt.getText().toString();
String note = binding.noteEt.getText().toString();
payUsingUpi(amount, upiId, name, note);
});
}
void payUsingUpi(String amount, String upiId, String name, String note) {
Uri uri = Uri.parse("upi://pay").buildUpon()
.appendQueryParameter("pa", upiId)
.appendQueryParameter("pn", name)
.appendQueryParameter("tn", note)
.appendQueryParameter("am", amount)
.appendQueryParameter("cu", "INR")
.build();
Intent upiPayIntent = new Intent(Intent.ACTION_VIEW);
upiPayIntent.setData(uri);
// Show dialog user can choose the app
Intent chooser = Intent.createChooser(upiPayIntent, "Pay with");
// Check intent resolves
if (null != chooser.resolveActivity(getPackageManager())){
startActivityForResult(chooser, UPI_PAYMENT);
}else {
Toast.makeText(context, "No upi app found. install upi app try again", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case UPI_PAYMENT:
if ((RESULT_OK == resultCode) || (resultCode == 11)) {
if (data != null) {
String trxt = data.getStringExtra("response");
Log.d("UPI", "onActivityResult: " + trxt);
ArrayList<String> dataList = new ArrayList<>();
dataList.add(trxt);
upiPaymentDataOperation(dataList);
} else {
Log.d("UPI", "onActivityResult: " + "Return data is null");
ArrayList<String> dataList = new ArrayList<>();
dataList.add("nothing");
upiPaymentDataOperation(dataList);
}
} else {
Log.d("UPI", "onActivityResult: " + "Return data is null"); //when user simply back without payment
ArrayList<String> dataList = new ArrayList<>();
dataList.add("nothing");
upiPaymentDataOperation(dataList);
}
break;
}
}
private void upiPaymentDataOperation(ArrayList<String> data) {
if (isConnectionAvailable(MainActivity.this)) {
String str = data.get(0);
Log.d("UPIPAY", "upiPaymentDataOperation: "+str);
String paymentCancel = "";
if(str == null) str = "discard";
String status = "";
String approvalRefNo = "";
String response[] = str.split("&");
for (int i = 0; i < response.length; i++) {
String equalStr[] = response[i].split("=");
if(equalStr.length >= 2) {
if (equalStr[0].toLowerCase().equals("Status".toLowerCase())) {
status = equalStr[1].toLowerCase();
}
else if (equalStr[0].toLowerCase().equals("ApprovalRefNo".toLowerCase()) || equalStr[0].toLowerCase().equals("txnRef".toLowerCase())) {
approvalRefNo = equalStr[1];
}
}
else {
paymentCancel = "Payment cancelled by user.";
}
}
if (status.equals("success")) {
//Code to handle successful transaction here.
Toast.makeText(MainActivity.this, "Transaction successful.", Toast.LENGTH_SHORT).show();
Log.d("UPI", "responseStr: "+approvalRefNo);
}
else if("Payment cancelled by user.".equals(paymentCancel)) {
Toast.makeText(MainActivity.this, "Payment cancelled by user.", Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(MainActivity.this, "Transaction failed.Please try again", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(MainActivity.this, "Internet connection is not available. Please check and try again", Toast.LENGTH_SHORT).show();
}
}
public static boolean isConnectionAvailable(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager != null) {
NetworkInfo netInfo = connectivityManager.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnected()
&& netInfo.isConnectedOrConnecting()
&& netInfo.isAvailable()) {
return true;
}
}
return false;
}
}