lmw
2024-05-21 0af0750101f969b6ff18d7ade37354b4bcdccd03
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
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()
    }
 
 
}