The implementation of smart intent is very easy. A merchant needs to incorporate the following codes on their checkout page:

class MainActivity : AppCompatActivity() {
private val REQUEST_CODE = 123
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val BHIM_UPI = "in.org.npci.upiapp"
val GOOGLE_PAY = "com.google.android.apps.nbu.paisa.user"
val PHONE_PE = "com.phonepe.app"
val PAYTM = "net.one97.paytm"
val upiApps = listOf<String>(PAYTM, GOOGLE_PAY, PHONE_PE, BHIM_UPI)
var upiButton = findViewById(R.id.upi) as Button
var paytmButton = findViewById(R.id.paytm) as Button
var gpayButton = findViewById(R.id.gpay) as Button
var phonepeButton = findViewById(R.id.phonepe) as Button
var bhimButton = findViewById(R.id.bhim) as Button
val upiAppButtons = listOf<Button>(paytmButton, gpayButton, phonepeButton, bhimButton)
val uri = "upi://pay?pa=paytmqr2810050501011ooqggb29a01@paytm&pn=Paytm%20Merchant&mc=5499&mode=02&orgid=000000&paytmqr=2810050501011OOQGGB29A01&am=11&sign=MEYCIQDq96qhUnqvyLsdgxtfdZ11SQP//6F7f7VGJ0qr//lF/gIhAPgTMsopbn4Y9DiE7AwkQEPPnb2Obx5Fcr0HJghd4gzo"
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(uri))
intent.data = Uri.parse(uri)
upiButton.setOnClickListener{
val chooser = Intent.createChooser(intent, "Pay with...")
startActivityForResult(chooser, REQUEST_CODE)
}
for(i in upiApps.indices){
val b = upiAppButtons[i]
val p = upiApps[i]
Log.d("UpiAppVisibility", p + " | " + isAppInstalled(p).toString() + " | " + isAppUpiReady(p))
if(isAppInstalled(p)&&isAppUpiReady(p)) {
b.visibility = View.VISIBLE
b.setOnClickListener{
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(uri))
intent.data = Uri.parse(uri)
intent.setPackage(p)
startActivityForResult(intent, REQUEST_CODE)
}
}
else{
b.visibility = View.INVISIBLE
}
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_CODE) {
Log.d("result", data.toString())
data?.getStringExtra("Status")?.let { Log.d("result", it) };
data?.getStringExtra("Status")?.let { Toast.makeText(applicationContext, it, Toast.LENGTH_LONG).show() };
}
}
fun isAppInstalled(packageName: String): Boolean {
val pm = getPackageManager()
try {
pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
return true;
} catch (e: PackageManager.NameNotFoundException) {
e.printStackTrace()
}
return false;
}
fun isAppUpiReady(packageName: String): Boolean {
var appUpiReady = false
val upiIntent = Intent(Intent.ACTION_VIEW, Uri.parse("upi://pay"))
val pm = getPackageManager()
val upiActivities: List<ResolveInfo> = pm.queryIntentActivities(upiIntent, 0)
for (a in upiActivities){
if (a.activityInfo.packageName == packageName) appUpiReady = true
}
return appUpiReady
}