Android 支付寶,微信支付

Android 支付寶,微信支付

https://docs.open.alipay.com/204

https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_1

1、配置

android {
    compileSdkVersion 27
    defaultConfig {
        resValue("string", "wx_appid", "wxa----------------")       //此處填入自己appid,必須
    }
}
dependencies {
    implementation  'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:5.1.4'   //微信支付
    implementation files('libs/alipaySdk-xxxx.jar') //支付寶
}

2、復(fù)制資源

1、支付寶jar包下載地址:https://docs.open.alipay.com/54/104509
(此資源較敏感,防止第三方修改,本文不提供,僅提供官網(wǎng)下載地址,下載后放入[project]/[model]/libs目錄中,1中引用需要修改為jar包名稱)。

2、在主包下面新建包wxapi,新建類WXPayEntryActivity.java

package com.xxx.wxapi;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

import com.xxx.utils.PayUtils;
import com.tencent.mm.opensdk.constants.ConstantsAPI;
import com.tencent.mm.opensdk.modelbase.BaseReq;
import com.tencent.mm.opensdk.modelbase.BaseResp;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;

/**
 * Created by 林少 on 2016/6/22.
 */
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
    public IWXAPI api;
    public static PayUtils.WxPayNotify notify;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        api = WXAPIFactory.createWXAPI(this, getString(getResources().getIdentifier("wx_appid", "string", getPackageName())));
        api.handleIntent(getIntent(), this);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent, this);
    }

    @Override
    public void onReq(BaseReq req) {
    }

    @Override
    public void onResp(BaseResp resp) {
        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            if (resp.errCode == 0) {
                notify.success();
            } else {
                notify.failure();
            }
            finish();
        }
    }
}

AndroidManifest.xml添加

    <activity
        android:name="com.alipay.sdk.app.H5PayActivity"
        android:configChanges="orientation|keyboardHidden|navigation|screenSize"
        android:exported="false"
        android:screenOrientation="behind"
        android:windowSoftInputMode="adjustResize|stateHidden" />
    <activity
        android:name="com.alipay.sdk.app.H5AuthActivity"
        android:configChanges="orientation|keyboardHidden|navigation"
        android:exported="false"
        android:screenOrientation="behind"
        android:windowSoftInputMode="adjustResize|stateHidden" />
    <activity
        android:name=".wxapi.WXPayEntryActivity"
        android:exported="true"
        android:launchMode="singleTop" />

3、將下面工具類放入項(xiàng)目中,代碼為kotlin編寫,如需要轉(zhuǎn)換為java,請(qǐng)留言

package com.xxx.utils

import android.app.Activity
import android.content.Context
import android.os.Handler
import android.os.Message
import android.text.TextUtils
import com.alipay.sdk.app.PayTask
import com.xxx.wxapi.WXPayEntryActivity
import com.tencent.mm.opensdk.constants.Build
import com.tencent.mm.opensdk.modelpay.PayReq
import com.tencent.mm.opensdk.openapi.WXAPIFactory

/**
 * 支付utils
 * Created by 林少 on 2016/12/2.
 */

class PayUtils {

    interface AlipayNotify {
        fun success()

        fun loadinging()

        fun failure()
    }

    private class AlipayPayResult(rawResult: Map<String, String>?) {
        /**
         * @return the resultStatus
         */
        var resultStatus: String? = null
            private set
        /**
         * @return the result
         */
        var result: String? = null
            private set
        /**
         * @return the memo
         */
        var memo: String? = null
            private set

        init {
            if (null != rawResult) {
                for (key in rawResult.keys) {
                    if (TextUtils.equals(key, "resultStatus")) {
                        resultStatus = rawResult[key]
                    } else if (TextUtils.equals(key, "result")) {
                        result = rawResult[key]
                    } else if (TextUtils.equals(key, "memo")) {
                        memo = rawResult[key]
                    }
                }
            }
        }

        override fun toString(): String {
            return ("resultStatus={" + resultStatus + "};memo={" + memo
                    + "};result={" + result + "}")
        }
    }

    data class WxInfoBean(
            var timestamp: String? = null,
            var sign: String? = null,
            var partnerid: String? = null,
            var noncestr: String? = null,
            var prepayid: String? = null,
            var packageValue: String? = null,
            var appid: String? = null
    )

    interface WxPayNotify {
        fun success()

        fun failure()
    }

    companion object {
        private val SDK_PAY_FLAG = 1
        private var alipayNotify: AlipayNotify? = null
        private val mHandler = Handler(Handler.Callback { message ->
            if (message.what == SDK_PAY_FLAG) {
                val payResult = AlipayPayResult(message.obj as Map<String, String>)
                val resultStatus = payResult.resultStatus
                // 判斷resultStatus 為“9000”則代表支付成功,具體狀態(tài)碼代表含義可參考接口文檔
                if (TextUtils.equals(resultStatus, "9000")) {
                    alipayNotify!!.success()
                } else {
                    // “8000”代表支付結(jié)果因?yàn)橹Ц肚涝蚧蛘呦到y(tǒng)原因還在等待支付結(jié)果確認(rèn),最終交易是否成功以服務(wù)端異步通知為準(zhǔn)(小概率狀態(tài))
                    if (TextUtils.equals(resultStatus, "8000")) {
                        alipayNotify!!.loadinging()
                    } else {
                        // 其他值就可以判斷為支付失敗,包括用戶主動(dòng)取消支付,或者系統(tǒng)返回的錯(cuò)誤
                        alipayNotify!!.failure()
                    }
                }
            }
            false
        })

        fun alipayPay(aty: Activity, orderInfo: String, notify: AlipayNotify) {
            alipayNotify = notify
            val payRunnable = Runnable {
                val alipay = PayTask(aty)
                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()
        }

        /**
         * <activity android:name="com.alipay.sdk.app.H5PayActivity" android:configChanges="orientation|keyboardHidden|navigation" android:exported="false" android:screenOrientation="behind" android:windowSoftInputMode="adjustResize|stateHidden"></activity>
         */

        fun wxPayMethod(context: Context, wxResultBean: WxInfoBean, wxPayNotify: WxPayNotify) {
            val api = WXAPIFactory.createWXAPI(context, null)
            api.registerApp(context.getString(context.resources.getIdentifier("wx_appid", "string", context.packageName)))
            WXPayEntryActivity.notify = wxPayNotify
            val isPaySupported = api.getWXAppSupportAPI() >= Build.PAY_SUPPORTED_SDK_INT
            if (isPaySupported) {
                val req = PayReq()
                req.appId = wxResultBean.appid
                req.partnerId = wxResultBean.partnerid
                req.prepayId = wxResultBean.prepayid
                req.nonceStr = wxResultBean.noncestr
                req.timeStamp = wxResultBean.timestamp
                req.packageValue = wxResultBean.packageValue
                req.sign = wxResultBean.sign
                api.sendReq(req)
            } else {
                ToastUtil.showShort(context, "您未安裝微信或者安裝的版本過低,不支持微信支付")
            }
        }
    }
    /**
     * <activity android:name=".wxapi.WXPayEntryActivity" android:exported="true" android:launchMode="singleTop" android:theme="@android:style/Theme.Translucent"></activity>
     */
}

public class PayUtils {
    interface AlipayNotify {
        void success();

        void loadinging();

        void failure();
    }

    interface WxPayNotify {
        void success();

        void failure();
    }

    private static class AlipayPayResult {
        public AlipayPayResult(Map<String, String> rawResult) {
            if (null != rawResult) {
                for (String key : rawResult.keySet()) {
                    if (TextUtils.equals(key, "resultStatus")) {
                        resultStatus = rawResult.get(key);
                    } else if (TextUtils.equals(key, "result")) {
                        result = rawResult.get(key);
                    }
                    if (TextUtils.equals(key, "memo")) {
                        memo = rawResult.get(key);
                    }
                }
            }
        }

        String resultStatus;
        String result;
        String memo;

        public String getResultStatus() {
            return resultStatus;
        }

        public void setResultStatus(String resultStatus) {
            this.resultStatus = resultStatus;
        }

        public String getResult() {
            return result;
        }

        public void setResult(String result) {
            this.result = result;
        }

        public String getMemo() {
            return memo;
        }

        public void setMemo(String memo) {
            this.memo = memo;
        }

        @Override
        public String toString() {
            return "AlipayPayResult{" +
                    "resultStatus='" + resultStatus + '\'' +
                    ", result='" + result + '\'' +
                    ", memo='" + memo + '\'' +
                    '}';
        }
    }

    private class WxInfoBean {
        String timestamp;
        String sign;
        String partnerid;
        String noncestr;
        String prepayid;
        String packageValue;
        String appid;
    }

    private static final int SDK_PAY_FLAG = 1;
    private static AlipayNotify alipayNotify;
    private static Handler mHandler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            if (msg.what == SDK_PAY_FLAG) {
                AlipayPayResult payResult = new AlipayPayResult((Map<String, String>) msg.obj);
                String resultStatus = payResult.getResultStatus();
                if (TextUtils.equals(resultStatus, "9000")) {
                    alipayNotify.success();
                } else if (TextUtils.equals(resultStatus, "8000")) {
                    alipayNotify.loadinging();
                } else {
                    alipayNotify.failure();
                }
            }
            return false;
        }
    });

    public static void alipayPay(final Activity aty, final String orderInfo, AlipayNotify notify) {
        alipayNotify = notify;
        Runnable payRunnable = new Runnable() {
            @Override
            public void run() {
                PayTask alipay = new PayTask(aty);
                Map<String, String> result = alipay.payV2(orderInfo, true);
                Message msg = new Message();
                msg.what = SDK_PAY_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };
        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }

    public static void wxPayMethod(Context context, WxInfoBean wxResultBean, WxPayNotify wxPayNotify) {
        IWXAPI api = WXAPIFactory.createWXAPI(context, null);
        api.registerApp(context.getString(context.getResources().getIdentifier("wx_appid", "string", context.getPackageName())));
        WXPayEntryActivity.notify = wxPayNotify;
        boolean isPaySupported = api.getWXAppSupportAPI() >= Build.PAY_SUPPORTED_SDK_INT;
        if (isPaySupported) {
            PayReq req = new PayReq();
            req.appId = wxResultBean.appid;
            req.partnerId = wxResultBean.partnerid;
            req.prepayId = wxResultBean.prepayid;
            req.nonceStr = wxResultBean.noncestr;
            req.timeStamp = wxResultBean.timestamp;
            req.packageValue = wxResultBean.packageValue;
            req.sign = wxResultBean.sign;
            api.sendReq(req);
        } else {
            Toast.makeText(context, "您未安裝微信或者安裝的版本過低,不支持微信支付", Toast.LENGTH_SHORT).show();
        }
    }
}

4、支付調(diào)用

支付寶
//back.data為后臺(tái)返回
PayUtils.alipayPay(this@PayVipActivity, back.data, object : PayUtils.AlipayNotify {
                                override fun success() {
                                    T("支付成功")
                                    finish()
                                }

                                override fun loadinging() {
                                    T("支付結(jié)果確認(rèn)中,請(qǐng)勿返回")
                                }

                                override fun failure() {
                                    T("支付失敗,請(qǐng)重試")
                                }
                            })
微信
//back.data為后臺(tái)返回簽名過的對(duì)象
PayUtils.wxPayMethod(this@PayVipActivity, back.data, object : PayUtils.WxPayNotify {
                                override fun success() {
                                    T("支付成功")
                                    finish()
                                }

                                override fun failure() {
                                    T("支付失敗,請(qǐng)重試")
                                }
                            })

出現(xiàn)錯(cuò)誤請(qǐng)檢查配置先,微信支付錯(cuò)誤如果返回失敗,自己debug看log,如果是-1,先檢查開放平臺(tái)包名和簽名,如果正確說明后臺(tái)簽名錯(cuò)誤,請(qǐng)把次鏈接給他,zzzz,http://www.itdecent.cn/p/332e2e968c2b

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,346評(píng)論 25 708
  • 此項(xiàng)目已開源 趕快來圍觀 Start支持下吧 【客戶端開源地址-JPay】【服務(wù)端端開源地址-在com.javen...
    LucasAdam閱讀 2,121評(píng)論 0 3
  • 起風(fēng)了,窗戶開著,坐在沙發(fā)上涼爽的風(fēng)撲面而來,涼涼的,很舒服。戴上耳機(jī),在荔枝fm上錄制一篇在網(wǎng)上看到的文章,有動(dòng)...
    暖樹聽風(fēng)閱讀 214評(píng)論 0 2
  • 工作: 事假一天,此話題省略一千字。 金錢: 作為普通人,如果沒有遇到天災(zāi)人禍,過日子其實(shí)一點(diǎn)也不費(fèi)錢。 不吃肉三...
    俏村姑閱讀 254評(píng)論 0 0
  • 這幾天家長們聽到的最多的就是孩子們說“我們要坐輪船去日本旅游啦“!周五,”二1班要去日本旅游“的消息傳遍了全校,...
    松鼠媽媽小凡凡閱讀 1,030評(píng)論 3 4

友情鏈接更多精彩內(nèi)容