根据公司项目的需要,项目中集成银联支付,集成的步骤如下:
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 (this@PaymentActivity, 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(this@PaymentActivity,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(this@PaymentActivity, "支付成功", 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(this@PaymentActivity))) .subscribe({ }, { it -> ToastUtils.showShort("${it.message}") }) disposables.add(d) intent(INTENT_TO_ORDER_PAID) } else { // 该笔订单真实的支付结果,需要依赖服务端的异步通知。 Toast.makeText(this@PaymentActivity, "支付失败", Toast.LENGTH_SHORT).show() val d = NetApi.synchPayLog(str,mPayRecordId.toString(),orderCode, data.getExtras().getString("result_data"), "app", "upacp") .compose(RxHelper.applyLoading(DialogHelper.loading(this@PaymentActivity))) .subscribe({ }, { it -> ToastUtils.showShort("${it.message}") }) disposables.add(d) intent(INTENT_TO_ORDER_NO_PAID) } }
代码中 disposables方法的作用是向商户服务器请求token值所需的,如果你的商户服务器不设置请求需要的token,可以将这个方法删除掉。
完成了上述的步骤后,银联支付的功能就初步实现了。