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,請留言

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)中,請勿返回")
                                }

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

                                override fun failure() {
                                    T("支付失敗球恤,請重試")
                                }
                            })

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舀锨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子宛逗,更是在濱河造成了極大的恐慌坎匿,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雷激,死亡現(xiàn)場離奇詭異替蔬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)屎暇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門承桥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人恭垦,你說我怎么就攤上這事快毛。” “怎么了番挺?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵唠帝,是天一觀的道長。 經(jīng)常有香客問我玄柏,道長襟衰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任粪摘,我火速辦了婚禮瀑晒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘徘意。我一直安慰自己苔悦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布椎咧。 她就那樣靜靜地躺著玖详,像睡著了一般。 火紅的嫁衣襯著肌膚如雪勤讽。 梳的紋絲不亂的頭發(fā)上蟋座,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機(jī)與錄音脚牍,去河邊找鬼向臀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛诸狭,可吹牛的內(nèi)容都是我干的券膀。 我是一名探鬼主播君纫,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼三娩!你這毒婦竟也來了庵芭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤雀监,失蹤者是張志新(化名)和其女友劉穎双吆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體会前,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡好乐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瓦宜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔚万。...
    茶點(diǎn)故事閱讀 40,427評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖临庇,靈堂內(nèi)的尸體忽然破棺而出反璃,到底是詐尸還是另有隱情,我是刑警寧澤假夺,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布淮蜈,位于F島的核電站,受9級特大地震影響已卷,放射性物質(zhì)發(fā)生泄漏梧田。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一侧蘸、第九天 我趴在偏房一處隱蔽的房頂上張望裁眯。 院中可真熱鬧,春花似錦讳癌、人聲如沸穿稳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逢艘。三九已至,卻和暖如春泡仗,著一層夾襖步出監(jiān)牢的瞬間埋虹,已是汗流浹背猜憎。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工娩怎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胰柑。 一個(gè)月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓截亦,卻偏偏與公主長得像爬泥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子崩瓤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容

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