Android 微信支付接入流程

一、Android微信支付集成,準(zhǔn)備工作

1,微信開放平臺(tái) 注冊(cè),獲取App id等信息

注冊(cè)自己的應(yīng)用.png

注冊(cè)過程中填寫相應(yīng)的信息即可,需要注意應(yīng)用簽名的獲取。

應(yīng)用簽名.png

應(yīng)用簽名獲取步驟:

  • 找到自己項(xiàng)目的簽名文件,比如我的存放在項(xiàng)目中,如下圖:


    簽名文件.png
  • 打開命令提示框,輸入keytool -v -list -keystore 路徑 ,輸入密碼后會(huì)顯示出jks信息,例如:
    獲取簽名信息.png

    注意:這里的MD5就是需要的,將中間的 : 刪除,就是應(yīng)用簽名,也可以通過微信的一個(gè)工具apk,來獲取微信應(yīng)用簽名獲取apk下載 ,可以通過該工具對(duì)比 上面的MD5,是否一致!應(yīng)用信息填寫完畢,然后提交申請(qǐng)即可。
獲取應(yīng)用簽名工具.png

2,Android端集成

  • 在app model下添加以下依賴:
    //wx 支付依賴(包含統(tǒng)計(jì)功能)
    implementation 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'

    //不包含統(tǒng)計(jì)功能
    //implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'

  • 接收微信回調(diào)需要一個(gè)WXPayEntryActivity,目錄如下圖,推薦直接拷貝微信demo中的類,這里需要注意WXPayEntryActivity 路徑必須為:綁定的商戶應(yīng)用包名 + wxapi + WXPayEntryActivity,比如:我在微信開發(fā)平臺(tái)注冊(cè)包名為:com.example.wx , WXPayEntryActivity 的路徑就需要為:com.example.wx.wxapi.WXPayEntryActivity
    微信回調(diào)的類.png

注:微信demo

附上自己的類:

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
    private static final String TAG = "WXPayEntryActivity";

    private IWXAPI api;
    private String app_id = "";//微信開發(fā)后臺(tái)申請(qǐng)的app_id

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //這里可以不填寫
//        setContentView(R.layout.pay_result);

        api = WXAPIFactory.createWXAPI(this, app_id);
        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) {
    }

    /**
     * 處理結(jié)果回調(diào)
     *
     * @param resp
     */
    @Override
    public void onResp(BaseResp resp) {
        Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);

        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {

            switch (resp.errCode) {
                case 0://支付成功
                    Toast.makeText(this, "支付成功", Toast.LENGTH_SHORT).show();
                    Log.d(TAG, "onResp: resp.errCode = 0   支付成功");
                    break;
                case -1://錯(cuò)誤,可能的原因:簽名錯(cuò)誤、未注冊(cè)APPID、項(xiàng)目設(shè)置APPID不正確、注冊(cè)的APPID與設(shè)置的不匹配、其他異常等
                    Toast.makeText(this, "支付錯(cuò)誤" + resp.errCode, Toast.LENGTH_SHORT).show();
                    Log.d(TAG, "onResp: resp.errCode = -1  支付錯(cuò)誤");
                    break;
                case -2://用戶取消,無需處理。發(fā)生場(chǎng)景:用戶不支付了,點(diǎn)擊取消,返回APP。
                    Log.d(TAG, "onResp: resp.errCode = -2  用戶取消");
                    Toast.makeText(this, "用戶取消" + resp.errCode, Toast.LENGTH_SHORT).show();
                    break;

            }

            finish();//這里需要關(guān)閉該頁面
        }

    }

}

需要在注冊(cè)清單AndroidManifest.xml中添加權(quán)限與WXPayEntryActivity

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <activity
            android:name=".wxapi.WXPayEntryActivity"
            android:exported="true"
            android:launchMode="singleTop"/>
  • 調(diào)用API前,需要先向微信注冊(cè)您的APPID,注冊(cè)微信支付App Id,有兩種方式
//*********1,清單文件中直接注冊(cè)********
        <activity android:name=".wxapi.WXPayEntryActivity"
            android:exported="true"
            android:launchMode="singleTop" >
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />

                <!--這里填寫你申請(qǐng)的app id-->
                <data android:scheme="app id" />
            </intent-filter>
        </activity>


//**************2,在應(yīng)用入口Application,app id注冊(cè)到微信************************
IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);

// 將該app id 注冊(cè)到微信   AppID: 申請(qǐng)到的AppID
msgApi.registerApp(AppID);

二、Android 支付過程

1,Android端與后臺(tái)交互的大致流程如下:

微信支付,Android端流程.png

2,發(fā)起微信支付
Android App 調(diào)起微信支付所需的參數(shù)如下,這里的參數(shù)絕大多數(shù)是上圖流程中調(diào)用后臺(tái)訂單接口返回:

調(diào)起微信支付所需要的請(qǐng)求參數(shù) .png

后臺(tái)返回?cái)?shù)據(jù)后,調(diào)起微信支付的代碼如下:

/**
     * 調(diào)支付的方法
     * <p>
     * 注意: 每次調(diào)用微信支付的時(shí)候都會(huì)校驗(yàn) appid 、包名 和 應(yīng)用簽名的。 這三個(gè)必須保持一致才能夠成功調(diào)起微信
     *
     * @param wxPayBean
     */
    private void startWechatPay(WxPayBean wxPayBean) {
        tv_paylist.setText(tv_paylist.getText() + "\n\n調(diào)起微信支付....");

        //這里的appid,替換成自己的即可
        IWXAPI api = WXAPIFactory.createWXAPI(this, Constant.WxPayAppId);
        api.registerApp(Constant.WxPayAppId);

        //這里的bean,是服務(wù)器返回的json生成的bean
        PayReq payRequest = new PayReq();
        payRequest.appId = Constant.WxPayAppId;
        payRequest.partnerId = wxPayBean.getPartnerid();
        payRequest.prepayId = wxPayBean.getPrepayid();
        payRequest.packageValue = "Sign=WXPay";//固定值
        payRequest.nonceStr = wxPayBean.getNoncestr();
        payRequest.timeStamp = wxPayBean.getTimestamp();
        payRequest.sign = wxPayBean.getSign();

        //發(fā)起請(qǐng)求,調(diào)起微信前去支付
        api.sendReq(payRequest);
    }

這里的WxPayBean 是自己寫的一個(gè)請(qǐng)求參數(shù)的實(shí)體類:

public class WxPayBean {
    private String appid;//微信開放平臺(tái)審核通過的應(yīng)用APPID
    private String partnerid;//微信支付分配的商戶號(hào)
    private String prepayid;//微信返回的支付交易會(huì)話ID
//        private String package;// 擴(kuò)展字段 暫填寫固定值Sign=WXPay
    private String noncestr;//隨機(jī)字符串,隨機(jī)字符串,不長于32位。推薦隨機(jī)數(shù)生成算法
    private String sign;//簽名,詳見簽名生成算法注意:簽名方式一定要與統(tǒng)一下單接口使用的一致
    private String timestamp;//時(shí)間戳,請(qǐng)見接口規(guī)則-參數(shù)規(guī)定

   .......
}

3,微信支付結(jié)果回調(diào)在 {@link WXPayEntryActivity#onResp(BaseResp)}
只貼出該方法,具體類上面已經(jīng)貼出:

/**
     * 處理結(jié)果回調(diào)
     *
     * @param resp
     */
    @Override
    public void onResp(BaseResp resp) {
        Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);

        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {

            switch (resp.errCode) {
                case 0://支付成功
                    Toast.makeText(this, "支付成功", Toast.LENGTH_SHORT).show();
                    Log.d(TAG, "onResp: resp.errCode = 0   支付成功");
                    break;
                case -1://錯(cuò)誤,可能的原因:簽名錯(cuò)誤、未注冊(cè)APPID、項(xiàng)目設(shè)置APPID不正確、注冊(cè)的APPID與設(shè)置的不匹配、其他異常等
                    Toast.makeText(this, "支付錯(cuò)誤" + resp.errCode, Toast.LENGTH_SHORT).show();
                    Log.d(TAG, "onResp: resp.errCode = -1  支付錯(cuò)誤");
                    break;
                case -2://用戶取消,無需處理。發(fā)生場(chǎng)景:用戶不支付了,點(diǎn)擊取消,返回APP。
                    Log.d(TAG, "onResp: resp.errCode = -2  用戶取消");
                    Toast.makeText(this, "用戶取消" + resp.errCode, Toast.LENGTH_SHORT).show();
                    break;

            }

            finish();//這里需要關(guān)閉該頁面
        }

    }

附:微信支付Api

三、微信支付接入過程遇到的坑

1,支付不回調(diào)問題
如果獲取不到支付回調(diào),請(qǐng)檢查一下WXPayEntryActivity放置的路徑;微信支付必須要求該類的路徑為:包名.wxapi.WXPayEntryActivity,不然不能回調(diào)。

2,申請(qǐng)App Id,應(yīng)用簽名的獲取
如果接入有問題,請(qǐng)使用排查一下是否申請(qǐng)app id的時(shí)候,應(yīng)用簽名是否有誤,推薦使用微信應(yīng)用簽名獲取apk 來校驗(yàn),填入自己應(yīng)用包名即可查看應(yīng)用簽名。

3,在微信后臺(tái)申請(qǐng)完app以后,注意監(jiān)測(cè)是否獲得微信支付的能力,需要單獨(dú)申請(qǐng)
微信支付中,如果報(bào)appidmech_id(微信支付分配的商戶號(hào))的錯(cuò),應(yīng)該就是要支持支付功能的App的appid與商戶平臺(tái)的商戶id不對(duì)應(yīng)造成的。

微信支付的能力.png

附:檢測(cè)是否安裝微信app

   /**
     * 判斷微信是否安裝
     * @param context
     * @return true 已安裝   false 未安裝
     */
    public  static boolean isWxAppInstalled(Context context) {
        IWXAPI wxApi = WXAPIFactory.createWXAPI(context, null);
        wxApi.registerApp(Wx.APP_ID);
        boolean bIsWXAppInstalled = false;
        bIsWXAppInstalled = wxApi.isWXAppInstalled();
        return bIsWXAppInstalled;
    }
最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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