项目中集成支付宝功能

公司项目中需要用到支付功能,记录下自己的开发历程,供新入门的同学们参考。

以公司项目开发的流程为主。

1.申请支付宝账号,这个就不多说了。

2.将订单编号、订单的金额、支付渠道作为参数,向后台请求数据,获取支付宝的参数

注意:实际项目开发中,支付宝的参数都要放在服务器后台,App从服务器获取,保证安全,不能将支付宝的参数写在程序中。

NetApi.getAliPay(orderCode, "1", paymentAmount)
        .compose(RxHelper.applyLoading(DialogHelper.loading(this)))
        .subscribe({ res ->
            handleData(res.data!!)
        }, { it ->
            ToastUtils.showShort("${it.message}")
        })

这里的网络请求使用retrofit,具体详情,见我的上一篇文章《一个简单的Retrofit 2.0项目实现》 

3.根据后台返回的数据,向支付宝发起请求

private fun handleData(data: AliPayModel) {

    val mPayRecordId = data.payRecordId
    val payRunnable = Runnable {
        val aliPay = PayTask(this@PaymentActivity)
        val result = aliPay.payV2(data.payUrl, true)
        Log.e("msp", result.toString())

        val msg = Message()
        msg.what = SDK_PAY_FLAG
        msg.obj = result
        msg.arg1 = mPayRecordId.toInt()
        mHandler.sendMessage(msg)
    }

    val payThread = Thread(payRunnable)
    payThread.start()
}

4.根据支付结果,向服务器发送支付成功和支付失败的同步通知。 

private val mHandler = @SuppressLint("HandlerLeak")
object : Handler() {
    override fun handleMessage(msg: Message) {
        when (msg.what) {
            SDK_PAY_FLAG -> {
                val payResult = PayResult(msg.obj as Map<String, String>)
                val str = msg.obj.toString()
                val payRecordId = msg.arg1

                /**
                 * 对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
                 */
                val resultInfo = payResult.result// 同步返回需要验证的信息
                val resultStatus = payResult.resultStatus
                // 判断resultStatus 为9000则代表支付成功
                if (TextUtils.equals(resultStatus, "9000")) {
                    // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
                    Toast.makeText(this@PaymentActivity, "支付成功", Toast.LENGTH_SHORT).show()
                    val orderCode = intent.getStringExtra(ExtraHelper.ORDER_CODE) ?: return ToastUtils.showShort(R.string.error_get_order_code_failed)
                    val d = NetApi.synchPayLog(resultStatus,payRecordId.toString(),orderCode, str, "app", "alipay")
                            .compose(RxHelper.applyLoading(DialogHelper.loading(this@PaymentActivity)))
                            .subscribe({
                            }, { it ->
                                ToastUtils.showShort("${it.message}")
                            })

                    disposables.add(d)

                    val intent = Intent(this@PaymentActivity, MineOrdersListActivity::class.java)
                    intent.putExtra("id",2)
                    startActivity(intent)
                    finish()

                } else {
                    // 该笔订单真实的支付结果,需要依赖服务端的异步通知。
                    Toast.makeText(this@PaymentActivity, "支付失败", Toast.LENGTH_SHORT).show()
                    val orderCode = intent.getStringExtra(ExtraHelper.ORDER_CODE) ?: return ToastUtils.showShort(R.string.error_get_order_code_failed)

                    val d = NetApi.synchPayLog(resultStatus,payRecordId.toString(),orderCode, str, "app", "alipay")
                            .compose(RxHelper.applyLoading(DialogHelper.loading(this@PaymentActivity)))
                            .subscribe({
                            }, { it ->
                                ToastUtils.showShort("${it.message}")
                            })

                    disposables.add(d)

                    val intent = Intent(this@PaymentActivity, MineOrdersListActivity::class.java)
                    intent.putExtra("id",1)
                    startActivity(intent)
                    finish()
                }
            }
        }
    }
}

代码和讲解写的比较简单,如果有疑问的地方,可以和我联系。

猜你喜欢

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