1. 程式人生 > >微信支付各種坑--終章(-1&-2)

微信支付各種坑--終章(-1&-2)

         001.微信支付一路坑,走過一坑又一坑,總之,微信支付太過於坑爹,詳細大家也或多或少遇到過,一路艱辛終於完美繼承微信支付,下面進入填坑之路!!!

         002.一些微信平臺的appid等這些就不多說了,自己去微信支付官網檢視,錯誤碼如下:

          

回撥中errCode值列表:

名稱 描述解決方案
0成功展示成功頁面
-1錯誤可能的原因:簽名錯誤、未註冊APPID、專案設定APPID不正確、註冊的APPID與設定的不匹配、其他異常等。
-2使用者取消無需處理。發生場景:使用者不支付了,點選取消,返回APP。

 

                     no01.去官網下載最新的sdk

(必須)及demo,這個也會導致-1

                     no02.配置我們的WXPayEntryActivity該類必須放在包名.wxapi,比如com.weixin.test.wxapi.WXPayEntryActivity ,包名或類名不一致會造成無法回撥,如下圖

切記配置清單檔案,(不必配置其他資訊,有些配置<intent-filter>這個是非必需的加不加都沒影響),exported=true這個必須配置,不配置回撥會出問題

<activity
    android:name=".wxapi.WXPayEntryActivity"
    android:exported
="true" android:launchMode="singleTop">

                       no03.簽名問題,一定要用在微信開發平臺配置我們的app的正式簽名(即你釋出的app的簽名,這個是必須),保證簽名一致仔細檢查,這個是-1常用問題,(可以用微信分享來驗證簽名正確與否,分享成功則說明簽名沒有問題,可往其他方向排查)

                       no04.我們和後臺的互動,整合微信分享很簡單,我們只需要拿到後臺返回的引數請求即可,但是必須謹慎小心,看清每一個鍵值對,包括後臺的2次簽名、加密等一些問題(ios成功基本後臺那邊就沒啥大問題了),引數不對微信支付回撥失敗或者莫名的一些問題,微信支付核心程式碼:

PayReq req = new PayReq();
try {
    req.appId = json.getString("appid");
req.partnerId = json.getString("partnerid");
req.prepayId = json.getString("prepayid");
req.nonceStr = json.getString("noncestr");
req.timeStamp = json.getString("timestamp");
req.packageValue = json.getString("package");
req.sign = json.getString("sign");
req.extData = "app data"; // optional
    // 在支付之前,如果應用沒有註冊到微信,應該先呼叫IWXMsg.registerApp將應用註冊到微信
api.registerApp(APP_ID);//你前面添加了就不必再次新增
api.sendReq(req);
LogUtils.i(TAG, "掉微信支付,,,,,,,,");
} catch (JSONException e) {
    LogUtils.i(TAG, e.toString());
e.printStackTrace();
}

                             no05.回撥介面的基本配置,一個模式cv即可(可以在回撥中做一些我們自己的操作):

                                      說明:* api.sendReq(req)後,不管微信的支付頁面有沒有調出來,最終都會來到這個WXPayEntryActivity頁面 ,在這個頁面,我們可以自己做一些事情,但是我這裡就直接finish掉了*

public class WXPayEntryActivity extends BaseActivity implements IWXAPIEventHandler {
    private IWXAPI api;
    private static final String APP_ID = "你申請的ID";
@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wxpay_entry);
LogUtils.i(TAG, "onCreate" + "支付回撥執行");
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 baseReq) {
        LogUtils.i(TAG, "baseReq:" + baseReq.toString() + "00000000000");
}

    //支付結果回撥
@Override
public void onResp(BaseResp baseResp) {
        LogUtils.i(TAG, "支付回撥執行");
        if (baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            if (baseResp.errCode == 0) {        
                showToastLong("支付成功!");
                Logi("baseReq:" + baseResp.errCode);
} else { showToastLong("支付失敗,請重新嘗試!");Logi("baseReq:" + baseResp.errCode);} finish();} }}

                                no06.切勿欣喜,運氣好你的測試沒有問題,但是還有坑,慎之又慎啊!就是還有一種情況,那就是我們開發者用debug模式安裝到手機,然後跑了支付的功能,當然,這時候因為appId是用正式簽名MD5碼生成的,所以會返回 -1,然後你又換了個正式環境的,點破手機還是返回 -1 ,而且你確定之前正式包還是可以支付正常的,這時候你就蒙逼了,沒錯,這時候清下快取這招就好使了或者解除安裝微信再安裝城了,這個-1困擾我很久啊,但是這個錯誤只是針對我們開發者而言,因為客戶不可能會安裝這個debug包的!

               003.另外還有一種返回-2的情況就是我們在第一次點選支付,支付失敗,沒有調起支付介面直接調了WXPayEntryActivity

返回-2,第二次點選又支付成功了,,,,,一直這樣迴圈,那麼檢查你是不是傳送了2次請求,如果沒有那你就清理快取或者解除安裝微信!

                004.至此,微信支付的坑填平,歡迎大家討論學習!!!