Android 接入微信支付

前言:

參考地址(做的時(shí)候有參考了以下兩個(gè)博客的內(nèi)容,自己按照實(shí)際情況,簡(jiǎn)化了些東西):

https://github.com/tsy12321/PayAndroid

http://loody.github.io/2014/12/21/2014-12-21-weixin-pay/

一、注意事項(xiàng):

微信開放平臺(tái)有個(gè)不成文的規(guī)定(文檔里沒有說明):

    1、支付回調(diào)的Activity必須是:你的包名(微信demo里是:net.sourceforge.simcpux)+.wxapi.WXPayEntryActivity.java
    2、其他的接口(比如登錄、分享)回調(diào)的Activity必須是:你的包名(微信demo里是:net.sourceforge.simcpux)+.wxapi.WXEntryActivity.java
    3、兩個(gè)回調(diào)的Activity必須要實(shí)現(xiàn)IWXAPIEventHandler的接口

二、發(fā)起支付的關(guān)鍵代碼:

PayReq request = new PayReq();
request.appId = "微信appId";
request.partnerId = "收款方商戶id";
request.prepayId= "預(yù)支付訂單id";
request.packageValue = "Sign=WXPay";//死值
request.nonceStr= "隨機(jī)字符串";
request.timeStamp= "當(dāng)前時(shí)間戳";
request.sign= "簽名";

boolean checkArgs = request.checkArgs();
if(checkArgs ) {
    mWXApi.sendReq(request);
}

三、以下為自己在項(xiàng)目中的實(shí)例:

因?yàn)轭A(yù)支付在服務(wù)器完成,所以這里只說客戶端的事情

/**
 * Description:微信的注冊(cè)信息
 * <p>
 * Author: Zoe
 * Time: 2017/2/20 0020 17:13
 */
public class WeChatConstants {

    // APP_ID 替換為你的應(yīng)用從官方網(wǎng)站申請(qǐng)到的合法appId
    public static final String APP_ID = "wxd930ea5d5a258f4f";

    //支付狀態(tài)
    public static final int PAY_ERROR = -1;  //支付失敗
    public static final int PAY_CACEL = -2;  //支付取消
    public static final int PAY_SUCCESS = 0;   //支付成功

    public static final int NO_OR_LOW_WX = 1;   //未安裝微信或微信版本過低
    public static final int ERROR_PAY_PARAM = 2;  //支付參數(shù)錯(cuò)誤
    public static final int ERROR_PAY = 3;  //支付失敗

}
/**
 * Description:微信支付回調(diào)Activity
 * <p>
 * Author: Zoe
 * Time: 2017/2/20 0020 17:32
 */
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_weichat_pay_result);

        if(WeChatManager.getInstance() != null) {
            WeChatManager.getInstance().getWXApi().handleIntent(getIntent(), this);
        } else {
            finish();
        }
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        if(WeChatManager.getInstance() != null) {
            WeChatManager.getInstance().getWXApi().handleIntent(intent, this);
        }
    }

    //當(dāng)微信發(fā)送請(qǐng)求到你的應(yīng)用,將通過IWXAPIEventHandler接口的onReq方法進(jìn)行回調(diào)
    @Override
    public void onReq(BaseReq baseReq) {
    }

    //應(yīng)用請(qǐng)求微信的響應(yīng)結(jié)果將通過onResp回調(diào)
    //如果支付成功則調(diào)用支付結(jié)果查詢的接口,設(shè)置支付狀態(tài)
    // 注意一定不能以客戶端返回作為用戶支付的結(jié)果,應(yīng)以服務(wù)器端的接收的支付通知或查詢API返回的結(jié)果為準(zhǔn)
    @Override
    public void onResp(BaseResp resp) {
        Debug.i("wechat/////////onPayFinish, errCode = " + resp.errCode);

        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            if (WeChatManager.getInstance() != null) {
                if (resp.errStr != null) {
                    Debug.i("wechat////////errstr=" + resp.errStr);
                    WeChatManager.getInstance().onResp(resp.errCode);
                    finish();
                }
            }
        }
    }
}
/**
 * Description:微信支付管理
 * <p>
 * Author: Zoe
 * Time: 2017/2/20 0020 17:21
 */
public class WeChatManager {

    private static WeChatManager mWXManager;

    private IWXAPI mWXApi;
    private String mPayParam;
    private WXPayResultCallBack mCallback;

    public static void init(Context context) {
        if (mWXManager == null) {
            mWXManager = new WeChatManager(context);
        }
    }

    public WeChatManager(Context context) {
        //通過WXAPIFactory工廠,獲取IWXAPI的實(shí)例
        // IWXAPI 是第三方app和微信通信的openapi接口
        mWXApi = WXAPIFactory.createWXAPI(context, WeChatConstants.APP_ID, true);
        //將應(yīng)用的appId注冊(cè)到微信
        mWXApi.registerApp(WeChatConstants.APP_ID);
    }

    public static WeChatManager getInstance() {
        return mWXManager;
    }

    public IWXAPI getWXApi() {
        return mWXApi;
    }

    public interface WXPayResultCallBack {
        void onSuccess(); //支付成功

        void onError(int error_code);   //支付失敗

        void onCancel();    //支付取消
    }

    /**
     * 發(fā)起支付
     *
     * @param pay_param 由服務(wù)器返回
     * @param callback
     */
    public void doPay(String pay_param, WXPayResultCallBack callback) {
        mPayParam = pay_param;
        mCallback = callback;

        if (!check()) {
            if (mCallback != null) {
                mCallback.onError(WeChatConstants.NO_OR_LOW_WX);
            }
            return;
        }

        JSONObject param = null;
        try {
            param = new JSONObject(mPayParam);
        } catch (JSONException e) {
            e.printStackTrace();
            if (mCallback != null) {
                mCallback.onError(WeChatConstants.ERROR_PAY_PARAM);
            }
            return;
        }
        if (TextUtils.isEmpty(param.optString("appid"))
                || TextUtils.isEmpty(param.optString("partnerid"))
                || TextUtils.isEmpty(param.optString("prepayid"))
                || TextUtils.isEmpty(param.optString("package"))
                || TextUtils.isEmpty(param.optString("noncestr"))
                || TextUtils.isEmpty(param.optString("timestamp"))
                || TextUtils.isEmpty(param.optString("sign"))) {
            if (mCallback != null) {
                mCallback.onError(WeChatConstants.ERROR_PAY_PARAM);
            }
            return;
        }

        PayReq req = new PayReq();
        req.appId = param.optString("appid");
        req.partnerId = param.optString("partnerid");
        req.prepayId = param.optString("prepayid");
        req.packageValue = param.optString("package");
        req.nonceStr = param.optString("noncestr");
        req.timeStamp = param.optString("timestamp");
        req.sign = param.optString("sign");

        mWXApi.sendReq(req);
    }

    /**
     * 支付回調(diào)響應(yīng)
     *
     * @param error_code
     */
    public void onResp(int error_code) {
        if (mCallback == null) {
            return;
        }

        if (error_code == WeChatConstants.PAY_SUCCESS) {   //支付成功
            mCallback.onSuccess();
        } else if (error_code == WeChatConstants.PAY_ERROR) {   //支付錯(cuò)誤
            mCallback.onError(WeChatConstants.ERROR_PAY);
        } else if (error_code == WeChatConstants.PAY_CACEL) {   //支付取消
            mCallback.onCancel();
        }

        mCallback = null;
    }

    /**
     * 檢測(cè)是否支持微信支付
     *
     * @return
     */
    private boolean check() {
        return mWXApi.isWXAppInstalled() && mWXApi.getWXAppSupportAPI() >= Build.PAY_SUPPORTED_SDK_INT;
    }
}

使用的時(shí)候,直接調(diào)用WeChatManager的doPay方法,在相應(yīng)的回調(diào)中做對(duì)應(yīng)的處理即可

示例:

/**
     * 微信支付
     * @param pay_param 支付服務(wù)生成的支付參數(shù)
     */
    private void doWXPay(String pay_param) {
        String wx_appid = "wxXXXXXXX";     //替換為自己的appid
        WXPay.init(getApplicationContext(), wx_appid);      //要在支付前調(diào)用
        WXPay.getInstance().doPay(pay_param, new WXPay.WXPayResultCallBack() {
        
            @Override
            public void onSuccess() {
                Debug.i("wechat/////////result////支付成功");
            }

            @Override
            public void onError(int error_code) {
                switch (error_code) {
                    case WXPay.NO_OR_LOW_WX:
                         Debug.i("wechat/////////result////未安裝微信或微信版本過低");
                        break;
                    case WXPay.ERROR_PAY_PARAM:
                        Debug.i("wechat/////////result////參數(shù)錯(cuò)誤");
                        break;
                    case WXPay.ERROR_PAY:
                        Debug.i("wechat/////////result////支付失敗");
                        break;
                }
            }

            @Override
            public void onCancel() {
                 Debug.i("wechat/////////result////支付取消");
            }
        });
    }

最后附上微信開放平臺(tái)支付的調(diào)試工具:[http://mp.weixin.qq.com/debug/cgi-bin/readtmpl?t=pay/index]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,333評(píng)論 25 708
  • 今天來聊聊,android中接入微信支付的需求,肯定有人會(huì)說,這多簡(jiǎn)單呀,還在這里扯什么,趕快去洗洗睡吧~~ 那我...
    SmileUsers閱讀 37,969評(píng)論 26 76
  • 都說微信用戶體驗(yàn)如何如何好,不知道他們有沒有看過微信支付的開發(fā)文檔。微信支付開發(fā)文檔真垃圾。 我是準(zhǔn)備將微信支付單...
    nashxk閱讀 1,344評(píng)論 0 0
  • 今天早上老公又說起抽油煙機(jī)的角已經(jīng)撞他頭兩次了,我家的抽油煙機(jī)是很老式的那種,我之前確實(shí)把那個(gè)角包起來過,因?yàn)橹?..
    徐愷嶸閱讀 185評(píng)論 0 0
  • 正念練習(xí) 柔和清晰的專注力 今天是正念日,也就是帶著正念去感知一天的生活。正念起床,正念早餐,正念運(yùn)動(dòng)…… 一組群...
    悠悠然a閱讀 176評(píng)論 0 1