根据公司项目的需要,项目中集成银联支付,集成的步骤如下:
1. 集成银联支付的sdk到项目中
下载银联支付官方提供的demo和sdk,如图片中所示,将UPPayAssistEx.jar和UPPayPluginExPro.jar两个jar包放入libs文件夹下,将data.bin文件放到assets文件夹下,将手机cpu支持文件放到jniLibs文件夹下。
2. 将官方提供的代码文件,放入到自己的代码中。
3. 在AndroidManifest.xml文件中引入相应的activity
4. 对支付按钮做相应的监听
ib_payment_yinlian.setOnClickListener { toYinLianPay() }
5. 查询商户服务器后台,获取支付需要的信息
private fun toYinLianPay() {
val orderCode = intent.getStringExtra(ExtraHelper.ORDER_CODE) ?: return ToastUtils.showShort(R.string.error_get_order_code_failed)
val paymentAmount = intent.getStringExtra(ExtraHelper.ORDER_PAYMENT_AMOUNT)
val d = NetApi.getAliPay(orderCode, YINLIAN_PAY, paymentAmount)
.compose(RxHelper.applyLoading(DialogHelper.loading(this)))
.subscribe({ res ->
handleYinLianData(res.data!!)
}, { it ->
ToastUtils.showShort("${it.message}")
})
disposables.add(d)
}
6. 根据从商户服务器获取到的订单信息和银联支付tn的值,向银联服务器发出支付请求
处理支付所需信息的代码
private fun handleYinLianData(data: AliPayModel) {
mPayRecordId = data.payRecordId
val tn = data.payUrl
Log.e("ddd","tn" + tn)
Log.e("ddd","mPayRecordId" + mPayRecordId)
val yinLianPayRunnable = Runnable {
val msg = Message()
msg.what = SDK_PAY_UPPAY.toInt()
msg.obj = tn
handler.sendMessage(msg)
}
val yinLianPayThread = Thread(yinLianPayRunnable)
yinLianPayThread.start()
}
发出支付请求的代码:
private val handler = @SuppressLint("HandlerLeak")
object : Handler() {
override fun handleMessage(msg: Message) {
if (msg.what == SDK_PAY_UPPAY.toInt()){
val tn = msg.obj
Log.i("charge", tn.toString())
UPPayAssistEx.startPay ([email protected], null, null, tn.toString(), "01")
}
}
}
7. 支付之后,根据支付成功或者失败的结果,将信息同步给商户服务器
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
/**
* 步骤3:处理银联手机支付控件返回的支付结果
*/
if (data == null) {
return
}
Log.e("sdsf","requestCode"+ requestCode)
Log.e("sdsf","resultCode"+ resultCode)
Log.e("sdsf","data"+ data)
Log.e("sdsf","data.getExtras().getString(\"result_data\")"+ data.getExtras().getString("result_data"))
var msg = ""
/*
* 支付控件返回字符串:success、fail、cancel 分别代表支付成功,支付失败,支付取消
*/
val str = data.extras!!.getString("pay_result")
if (str!!.equals("success", ignoreCase = true)) {
// 支付成功后,extra中如果存在result_data,取出校验
// result_data结构见c)result_data参数说明
when {
data.hasExtra("result_data") -> msg = "支付成功!"
str.equals("fail", ignoreCase = true) -> msg = "支付失败!"
str.equals("cancel", ignoreCase = true) -> msg = "用户取消了支付"
}
val builder = AlertDialog.Builder(this)
builder.setTitle("支付结果通知")
builder.setMessage(msg)
builder.setInverseBackgroundForced(true)
builder.setNegativeButton("确定") { dialog, which ->
// dialog.dismiss()
val intent = Intent([email protected],MineOrdersListActivity::class.java)
intent.putExtra(INTENT_ID,when{
data.hasExtra("result_data") -> INTENT_TO_ORDER_PAID
str.equals("fail", ignoreCase = true) -> INTENT_TO_ORDER_NO_PAID
else ->INTENT_TO_ORDER_NO_PAID
})
startActivity(intent)
}
builder.create().show()
}
val orderCode = intent.getStringExtra(ExtraHelper.ORDER_CODE) ?: return ToastUtils.showShort(R.string.error_get_order_code_failed)
// callBack(requestCode.toString(),resultCode,str,orderCode,"app","alipay")
if (data.hasExtra("result_data")) {
// 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
Toast.makeText([email protected], "支付成功", Toast.LENGTH_SHORT).show()
Log.e("dsfs","dsfdfssfdsfsdfsdf"+ mPayRecordId)
val d = NetApi.synchPayLog(str,mPayRecordId.toString(),orderCode, data.getExtras().getString("result_data"), "app", "upacp")
.compose(RxHelper.applyLoading(DialogHelper.loading([email protected])))
.subscribe({
}, { it ->
ToastUtils.showShort("${it.message}")
})
disposables.add(d)
intent(INTENT_TO_ORDER_PAID)
} else {
// 该笔订单真实的支付结果,需要依赖服务端的异步通知。
Toast.makeText([email protected], "支付失败", Toast.LENGTH_SHORT).show()
val d = NetApi.synchPayLog(str,mPayRecordId.toString(),orderCode, data.getExtras().getString("result_data"), "app", "upacp")
.compose(RxHelper.applyLoading(DialogHelper.loading([email protected])))
.subscribe({
}, { it ->
ToastUtils.showShort("${it.message}")
})
disposables.add(d)
intent(INTENT_TO_ORDER_NO_PAID)
}
}
代码中 disposables方法的作用是向商户服务器请求token值所需的,如果你的商户服务器不设置请求需要的token,可以将这个方法删除掉。
完成了上述的步骤后,银联支付的功能就初步实现了。