微信支付各種坑--終章(-1&-2)
001.微信支付一路坑,走過一坑又一坑,總之,微信支付太過於坑爹,詳細大家也或多或少遇到過,一路艱辛終於完美繼承微信支付,下面進入填坑之路!!!
002.一些微信平臺的appid等這些就不多說了,自己去微信支付官網檢視,錯誤碼如下:
回撥中errCode值列表:
|
no01.去官網下載最新的sdk
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.至此,微信支付的坑填平,歡迎大家討論學習!!!