接入步骤一定看官网教程、非常简单、非常简单、客户端 Android 集成流程 | 网页&移动应用
该文只展示一些简单的支付封装、及注意事项。
正文:
1、支付宝支付所需参数、必须均来自服务端、即客户端不需要配置appkey等一些无用信息、只需要拿到服务端返回的支付参数、orderinfo(String类型)、传给sdk即可;同样也需要支付宝控制台申请创建app开通相应功能;
2、如下为支付代码:(注意支付请求必须异步)
/**
* 支付宝支付
*/
object AliPayUtils {
//支付标志 可自定义
const val ALI_PAY_FLAG = 1
//支付成功后的回调(同步回调)、真正支付成功已服务端返回为准;
const val PAY_SUCCESS="9000"
/***
*发起支付
* handler 需自行定义、用来处理支付回调
* orderInfo 订单参数、来自服务器
* CoroutineScope 为Kt协程 可以用线程代替、
* @return Job 可以取消协程
*/
fun pay(activity: Activity, handler: Handler?, orderInfo: String): Job {
return CoroutineScope(Dispatchers.Default).launch {
val aliPay = PayTask(activity)
val result: Map<String, String> = aliPay.payV2(orderInfo, true)
val msg = Message().apply {
what = ALI_PAY_FLAG
obj = result
}
handler?.sendMessage(msg)
}
}
//---------以下为Thread写法
fun pay(activity: Activity, handler: Handler?, orderInfo: String) {
Thread{
val aliPay = PayTask(activity)
val result: Map<String, String> = aliPay.payV2(orderInfo, true)
val msg = Message().apply {
what = ALI_PAY_FLAG
obj = result
}
handler?.sendMessage(msg)
}.start()
}
}
3、回调处理 handler在Activity中定义。
private var handler = object : Handler() {
override fun handleMessage(msg: Message) {
super.handleMessage(msg)
//同步返回结果、
val payResult = PayResult(msg.obj as Map<String, String>)
when (payResult.resultStatus) {
AliPayUtils.PAY_SUCCESS -> {//=9000
ToastUtils.showToast(getString(R.string.ali_pay_suc))
finish()
}
else -> {
// payResult.resultStatus 返回错误码、自行处理
}
}
}
}
//----------PayResult 支付成功返回结果、 该代码参考了(抄)官方demo
/**
* 支付结果回调
*/
class PayResult(rawResult: Map<String, String>) {
//支付状态
var resultStatus: String? = null
//对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
var result: String? = null
//备注
var memo: String? = null
init {
//map for循环、
rawResult.forEach {
when (it.key) {
"resultStatus" -> resultStatus = it.value
"result" -> result = it.value
"memo" -> memo = it.value
}
}
}
}
至此完成;