android项目银联支付

根据公司项目的需要,项目中集成银联支付,集成的步骤如下:

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,可以将这个方法删除掉。

完成了上述的步骤后,银联支付的功能就初步实现了。

猜你喜欢

转载自blog.csdn.net/mlsnatalie/article/details/81588332