0

I'm developing an Android app with UPI payment integration using "Gpay." I need to display the UPI payment status ("Success" or "Failure") to users after transactions are completed in "Gpay."

What's the technical approach to achieve this? Can I handle payment status callbacks from "Gpay" to my app? Are there established practices for integrating UPI payment status in an Android app?

I appreciate any technical insights or guidance on effectively showing UPI payment outcomes within my app.

1 Answers1

0

You can refer this link Open github to view Upi payment source code

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;
}

}

Prasanth John
  • 146
  • 1
  • 4