微信支付SDK-我們曾經踩過的坑

1.微信app支付

微信的app支付適用于單個的app,比如公司是做app的,一共沒有幾個app,每個申請一個支付權限,然后單個app各自支付自己的業務,當然可以支付在同一個商戶的賬戶上。

說實話,見過了不少SDK,但是沒有見過比微信SDK更爛的api了,你需要自己在報名下創建wxapi文件夾,還要拷貝他們的activity到此目錄下,然后呢?這樣還沒完,很多開發者會莫名其妙這么一個透明的activity拿到回調結果后該怎么處理,今天就來講講這個支付結果的處理方式。

JSONObject json = new JSONObject(payinfo);
PayReq req = new PayReq();//
String wxAppid = json.getString("appid");
req.appId = wxAppid;
IWXAPI api= WXAPIFactory.createWXAPI(getActivity(), wxAppid);
api.registerApp(wxAppid);
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
api.sendReq(req);

以上代碼為調用微信的最核心代碼,從服務端拿回來微信支付所需要的數據,以此填入,最后提交請求。如果所有的數據都正確,并且包名和簽名一致,那么恭喜你,微信可以支付了。

你就可以在<包名>/wxapi/WXPayEntryActivity中獲取結果了,

Paste_Image.png

看onResp方法,在此方法中獲取微信的返回code,自建廣播,然后收取廣播拿到結果。大家看到這里肯定會想,喲?這不是正常微信支付嗎?有什么坑呢?

坑1. 包名跟微信后臺要保持一致。
坑2. 簽名要跟微信后臺保持一致。
坑3. 這尼瑪代碼簡直不成模塊啊。
Paste_Image.png

來看我們的微信支付代碼,當然你拷貝WXPayEntryActivity這一步還真是免不了。
那么我們來講講代碼中的pay方法,pay方法中包含了對服務端創建訂單的請求,支付完成后查詢支付支付結果的請求。但是你只需要傳入回調收結果就好了,不需要關心任何的內部過程,這樣才是真正的模塊化,對嗎?

整個pay的過程,其實是跳轉至一個新的activity的過程,只不過此過程添加了參數,和回調,在新的activity中我們創建訂單,獲取支付信息,然后調用微信SDK進行支付。

2.微信H5支付

這種支付方式估計大家可能聽過,但是你聽過的可能跟我們的很不一樣,H5支付微信同時支持微信內調起支付和微信外調起支付。
而今天我要說的就是微信外調起支付(以下簡稱H5外起支付)。

H5外起支付的優點:
1.簽名無關性(整個支付,不需要你在微信后臺填寫app簽名)
2.包名無關性(整個支付,不需要你去微信后臺申請app)

大家試想,如果你是一個SDK開發者,你的SDK要提供給外面的任何人使用,那么別人每次都要通過你去微信那邊申請app,然后申請app支付權限,然后呢?別人開發的時候每次還要用微信后臺配置的簽名。成千上萬的開發者這么搞,你是不是就瘋了?

對,這時候你就需要用這種方式了。

首先我們先了解下H5外起支付的原理。這個東西正常的使用場景是這樣的,你有一個app,你用H5外起支付,那么你需要在webview中進行,服務端從微信那邊下訂單,拿到一個url,這個url在webview里面自動跳轉,然后deeplink到微信。這樣微信支付就調來了,這時候支付完成后,返回你的app webview中,點擊“我已支付”,然后服務端查詢支付結果,然后展現在網頁中。

坑1. deeplink不能由客戶端獲取

微信H5外支付,之前是不能由客戶端獲取到deeplink的,整個過程需要在自有服務端進行,服務端進行各種請求之后獲取到一個http協議的鏈接,里面包含微信位置的deeplink,取出來之后發送給客戶端進行調起。

然而:

微信在之后進行了安全方面的認證,整個訂單創建和支付必須獲取到客戶端請求服務器創建訂單,服務器去微信那邊下單時需要發送客戶端的ip,拿到支付連接后回傳給客戶端,注意了,此時并拿不到deeplink,需要客戶端在webview中進行跳轉驗證ip,才能獲取到deeplink連接。然后坑出現了:

坑2. android4.4.4 webview發送referer不成功
請求代碼.png

上面的圖中,是我們正常webview發送referer的方式,然后在android4.4.4上這種方式,服務端是收不到referer字段的。那么android4.4.4上這種問題怎么解決呢?

翻閱了webview的所有api,我找到了一個方法 webview.loadDataWithBaseURL(baseUrl,htmlData)
這個方法是用來加載手機本地html的,baseUrl用來組織html中的相對路徑,我們知道其實正常的請求,這個東西跟referer是一致的,那么referer是可以寫在這個字段的,但是怎么去請求url這個鏈接呢,因為這是獲取deeplink最關鍵的一步,是的,為何不加載一段js自動做個跳轉呢?于是有了下面這段代碼。

html中的js自動跳轉拿到deeplink,然后webview自動跳轉deeplink到微信支付。
至此問題完美解決!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,820評論 25 708
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,180評論 4 61
  • 文丨南西 將半夜醒了的睡意 攤開,捧在手里 就能看到 你 奔波、冒險、倔強、孤獨 冷漠、沉默、傷心、歡喜 和這個袒...
    吖爆2016閱讀 411評論 0 0
  • 你送的青梳 在掉下幾根寥寥白發后 斷齒了 我的琴弦 在手中被撥弄音符 也凌亂了 既然離別的人沒說再見 你也不用為沒...
    山屈生閱讀 273評論 0 1
  • 于晚間晚上十一點十九分,讀莫提默·J. 艾德勒、查爾斯·范多倫《如何閱讀一本書》收獲頗多。思以往閱讀方式,猶如小學...
    Laughing_閱讀 182評論 0 0