公司项目中需要用到支付功能,记录下自己的开发历程,供新入门的同学们参考。
以公司项目开发的流程为主。
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() } } } } }
代码和讲解写的比较简单,如果有疑问的地方,可以和我联系。