暢聊微信支付遇到的坑

好久沒更博了,甚是想念,工作的日子再也沒有學校的那種悠閒,仕途一片迷茫,走一步看一步…

列出自己開發中微信遇到的坑

  1. 示例demo有坑爹的歧義
  2. 支付的回調操作
  3. 簽名錯誤

示例demo有坑爹的歧義

剛接觸微信支付文檔的時候,是一種懵逼的狀態,一般大家都會去找示例demo玩玩,講真,我不建議大家看示例demo玩,裏面的代碼給開發者很多的誤解,有的開發者看了代碼,誤以爲訂單的一些信息是前端去生成的,在支付中,是強烈不建議在前端去生成支付信息的,對於前端的支付,我們只需要關注PayReq這個類,所有的預支付訂單信息是需要前端去後臺請求的,然後前端去api.sendReq(req)調起微信支付,支付成功後,微信會將支付成功的信息異步回調給後臺,後臺來設置訂單是夠支付成功,但是,這個過程並不是真正的安全,還需要前端的配合,前端在微信支付成功後,回調的resp.errCode == 0表示支付成功,然後我們在這個回調中,拿着prepayId預支付id再去後臺請求一次驗證,我們必須要保證前端支付成功和後端異步回調成功要一致,這樣才能保證支付的安全性。
還有就是,示例demo是eclipse項目……微信支付開發是沒人了嗎,沒人去維護一下嘛,如果想把示例demo導入as項目的開發者,記住,把.9patch的圖片的.9刪了,全部改成jpg或是png結尾的圖片,不然會報資源錯誤
然後就是,我們在看微信文檔的時候只需要看APP端開發步驟這個部分就行了,這個部分思路特別的清晰,支付的庫可以compile過來,既然這個部分講解的這麼好,爲啥示例demo那麼爛,什麼鬼。

支付的回調操作

這個地方我是能說WTF,這是赤果果的獨裁啊,我們在支付的回調配置中,回調類必須是包名下wxapi包下的WXPayEntryActivity類,舉個例子cn.e8.wq.wxapi.WXPayEntryActivity,這是強制性的,一個字母都不能錯,路徑也不能錯,不然喚起不了支付,這算是給微信做了一次廣告嗎。
還有就是,我們的應用會有很多的支付入口,每種入口支付成功後都會喚起不同的界面,微信所有的支付回調入口都是在WXPayEntryActivity類的onResp方法操作,比如,我想在A界面支付成功後跳C界面,B界面支付成功後跳D界面,你說,我肯定不能在回調裏寫死啊,你就說讓我咋辦吧,你說坑不坑,你看看別人家的支付,都是在當前頁面請求,在當前頁面回調,在當前頁面做處理,你呢?偏偏多這一事
當然,這難不倒刻苦的開發者們,我們可以這麼玩,在每次sendReq發送支付請求的時候,我們存儲一個標誌到SP裏面,然後在微信回調的onResp中取出這個標誌,然後做一系列的操作,比如,看看我的代碼。

支付方法

    private void pay(PayWeixin.JsonDataBean pay) {
        req.appId = pay.getAppid();
        req.partnerId = pay.getPartnerid();
        req.prepayId = pay.getPrepayid();
        req.packageValue = pay.getPackag();
        req.nonceStr = pay.getNoncestr();
        req.timeStamp = pay.getTimestamp();
        req.sign = pay.getSign();
        api.sendReq(req);
        //支付之前存儲當前的支付標記號
        SPUtils.getInstance(baseApp).push(SPUtils.KEY_PAY, SPUtils.PAY_shop);
    }

微信回調處理

    @SuppressLint("LongLogTag")
    @Override
    public void onResp(BaseResp resp) {
        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX && resp.errCode == 0) {
            String payTag = SPUtils.getInstance(this.getApplicationContext()).pop(SPUtils.KEY_PAY);
            switch (payTag) {
                case SPUtils.PAY_card:
                    EventBus.getDefault().post(new Card());
                    break;
                case SPUtils.PAY_zxing:
                    EventBus.getDefault().post(new Zxing());
                    break;
                case SPUtils.PAY_shop:
                    EventBus.getDefault().post(new Seller());
                    break;
                case SPUtils.PAY_order:
                    EventBus.getDefault().post(new Order());
                    break;
            }
        } else {
            Toast.makeText(this, "取消支付", Toast.LENGTH_SHORT).show();
        }
        finish();
    }

我這個地方因爲業務的需求,所以就用EventBus去處理了,你看我最後有個finish,因爲回調類是一個Activity類,爲了不讓用戶感覺出來,我設置了這個類的主題爲透明的,然後每次回調結束後都結束了這個Activity。

透明主題

android:theme="@android:style/Theme.Translucent.NoTitleBar"

簽名錯誤

這個地方說實話,還不算是太坑的地方,首先我們要去下載一個簽名工具,然後輸入自己的包名,就可以看到簽名了,有的開發者會遇到,我明明簽名對的,包名對的,怎麼請求支付還是返回-1簽名錯誤,我來說說我遇到的。

一、我應用集成了微信分享的功能,如果我們的簽名是錯誤的話,微信分享是絕對分享不了,這個地方我測試了,因爲有幾次,我經常改簽名,分享好幾次是失敗的,還有就是,如果我們在微信平臺更改簽名,需要過一段時間才能用,,更改後就立馬測試,絕對是返回-1,在測試的時候小夥伴的debug.ketstore和我不一樣,這樣就會導致兩個人都不好測試,如何解決呢,簽名唄,生成一個key.jks簽名,將debug測試也指向正式包的配置,這樣就不用老是去更改簽名了

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
        debug {
            signingConfig signingConfigs.release
        }
    }

二、在微信支付中,回調類的路徑一定要正確,不然會沒反應,上面也說過這個問題了,我遇到的還有一個大大的坑,就是支付成功了,他不顯示回調類,在我最開始接觸的時候,我們支付成功後返回應用的時候,WXPayEntryActivity根本就沒有被喚起,我根本無法去做處理,解決辦法:WXPayEntryActivity也是一個Activity類,需要到清單文件去註冊該類,我當時註冊過了,還是發生了,主要是沒有加 android:exported=”true”,加上去就好了

  <activity
            android:name=".wxapi.WXPayEntryActivity"
            android:exported="true"
            android:launchMode="singleTask"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"/>

三、這個問題你永遠都想不到,前臺微信分享都是成功的,配置都是正確的,然而,還是返回-1,我擦,能不能好好玩耍了,你可以告訴你一下你後臺,是不是他生成的sign有問題,我們在測試的時候支付是可以用的,後臺merge代碼的時候,突然就沒用了,我一度以爲是我前端的原因,改簽名,測試,發現分享是可以用的啊,簽名是對的啊,怎麼可能發生這種錯誤呢,我把測試的鏈接拿來用是可以支付的,後臺,我去找後臺review代碼,果然,他們生成sign的時候,多加了兩個字母,導致sign是錯誤的,所以,前端支付一直返回-1


如果還有遇到其他錯誤的,可以留言,最近想找個實習的崗位,求內薦

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章