package com.future.dispatch.base
|
|
import android.annotation.SuppressLint
|
import android.content.Context
|
import android.content.DialogInterface
|
import android.os.Bundle
|
import android.os.Handler
|
import android.os.Message
|
import android.text.TextUtils
|
import android.widget.Toast
|
import androidx.appcompat.app.AlertDialog
|
import com.future.dispatch.utils.payutil.AuthResult
|
import com.future.dispatch.utils.payutil.PayResult
|
import com.lljjcoder.style.citylist.Toast.ToastUtils
|
|
|
abstract class BaseAlipayActivity : MyBaseActivity() {
|
|
|
/**
|
* 用于支付宝支付业务的入参 app_id。
|
*/
|
val APPID = ""
|
|
/**
|
* 用于支付宝账户登录授权业务的入参 pid。
|
*/
|
val PID = ""
|
|
/**
|
* 用于支付宝账户登录授权业务的入参 target_id。
|
*/
|
val TARGET_ID = ""
|
|
/**
|
* pkcs8 格式的商户私钥。
|
*
|
* 如下私钥,RSA2_PRIVATE 或者 RSA_PRIVATE 只需要填入一个,如果两个都设置了,本 Demo 将优先
|
* 使用 RSA2_PRIVATE。RSA2_PRIVATE 可以保证商户交易在更加安全的环境下进行,建议商户使用
|
* RSA2_PRIVATE。
|
*
|
* 建议使用支付宝提供的公私钥生成工具生成和获取 RSA2_PRIVATE。
|
* 工具地址:https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=106097&docType=1
|
*/
|
val RSA2_PRIVATE = ""
|
val RSA_PRIVATE = ""
|
|
private val SDK_PAY_FLAG = 1
|
private val SDK_AUTH_FLAG = 2
|
|
open fun aliPaySuccess(){
|
|
}
|
|
@SuppressLint("HandlerLeak")
|
private val mHandler: Handler = object : Handler() {
|
override fun handleMessage(msg: Message) {
|
when (msg.what) {
|
SDK_PAY_FLAG -> {
|
val payResult =
|
PayResult(msg.obj as Map<String?, String?>)
|
/**
|
* 对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
|
*/
|
val resultInfo: String = payResult.getResult() // 同步返回需要验证的信息
|
val resultStatus: String = payResult.getResultStatus()
|
// 判断resultStatus 为9000则代表支付成功 //out_trade_no 为订单编号 截取 英文编号 + 后14位数字
|
if (TextUtils.equals(resultStatus, "9000")) { // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
|
aliPaySuccess()
|
// showAlert(AlipayActivity.this, "支付成功" + payResult);
|
} else { // 该笔订单真实的支付结果,需要依赖服务端的异步通知。
|
ToastUtils.showShortToast(mContext, "支付取消")
|
}
|
}
|
SDK_AUTH_FLAG -> {
|
val authResult = AuthResult(
|
msg.obj as Map<String?, String?>,
|
true
|
)
|
val resultStatus: String = authResult.getResultStatus()
|
// 判断resultStatus 为“9000”且result_code
|
// 为“200”则代表授权成功,具体状态码代表含义可参考授权接口文档
|
if (TextUtils.equals(
|
resultStatus,
|
"9000"
|
) && TextUtils.equals(authResult.getResultCode(), "200")
|
) { // 获取alipay_open_id,调支付时作为参数extern_token 的value
|
// 传入,则支付账户为该授权账户
|
showAlert(mContext, "auth success 认证成功$authResult")
|
} else { // 其他状态值则为授权失败
|
showAlert(mContext, "auth failed 认证失败$authResult")
|
}
|
}
|
else -> {
|
}
|
}
|
}
|
}
|
|
|
/**
|
* 支付宝支付业务示例
|
*/
|
open fun payV2(orderInfo: String?) { // if (TextUtils.isEmpty(APPID) || (TextUtils.isEmpty(RSA2_PRIVATE) && TextUtils.isEmpty(RSA_PRIVATE))) {
|
// showAlert(this,"error_missing_appid_rsa_private");
|
// return;
|
// }
|
//
|
// /*
|
// * 这里只是为了方便直接向商户展示支付宝的整个支付流程;所以Demo中加签过程直接放在客户端完成;
|
// * 真实App里,privateKey等数据严禁放在客户端,加签过程务必要放在服务端完成;
|
// * 防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险;
|
// *
|
// * orderInfo 的获取必须来自服务端;
|
// */
|
// boolean rsa2 = (RSA2_PRIVATE.length() > 0);
|
// Map<String, String> params = OrderInfoUtil2_0.buildOrderParamMap(APPID, rsa2);
|
// String orderParam = OrderInfoUtil2_0.buildOrderParam(params);
|
//
|
// String privateKey = rsa2 ? RSA2_PRIVATE : RSA_PRIVATE;
|
// String sign = OrderInfoUtil2_0.getSign(params, privateKey, rsa2);
|
// final String orderInfo = orderParam + "&" + sign;
|
// val payRunnable = Runnable {
|
// val alipay = PayTask(mContext as MyBaseActivity)
|
// val result =
|
// alipay.payV2(orderInfo, true)
|
// val msg = Message()
|
// msg.what = SDK_PAY_FLAG
|
// msg.obj = result
|
// mHandler.sendMessage(msg)
|
// }
|
// 必须异步调用
|
// val payThread = Thread(payRunnable)
|
// payThread.start()
|
|
}
|
|
|
open fun showAlert(ctx: Context, info: String) {
|
showAlert(ctx, info, null)
|
}
|
|
open fun showAlert(
|
ctx: Context,
|
info: String,
|
onDismiss: DialogInterface.OnDismissListener?
|
) {
|
AlertDialog.Builder(ctx)
|
.setMessage(info)
|
.setPositiveButton("确认", null)
|
.setOnDismissListener(onDismiss)
|
.show()
|
}
|
|
open fun showToast(ctx: Context, msg: String) {
|
Toast.makeText(ctx, msg, Toast.LENGTH_LONG).show()
|
}
|
|
open fun bundleToString(bundle: Bundle?): String? {
|
if (bundle == null) {
|
return "null"
|
}
|
val sb = StringBuilder()
|
for (key in bundle.keySet()) {
|
sb.append(key).append("=>").append(bundle[key]).append("\n")
|
}
|
return sb.toString()
|
}
|
|
|
}
|