1.微信app支付
微信的app支付適用于單個的app,比如公司是做app的,一共沒有幾個app,每個申請一個支付權(quán)限,然后單個app各自支付自己的業(yè)務(wù),當(dāng)然可以支付在同一個商戶的賬戶上。
說實話,見過了不少SDK,但是沒有見過比微信SDK更爛的api了,你需要自己在報名下創(chuàng)建wxapi文件夾,還要拷貝他們的activity到此目錄下,然后呢?這樣還沒完,很多開發(fā)者會莫名其妙這么一個透明的activity拿到回調(diào)結(jié)果后該怎么處理,今天就來講講這個支付結(jié)果的處理方式。
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);
以上代碼為調(diào)用微信的最核心代碼,從服務(wù)端拿回來微信支付所需要的數(shù)據(jù),以此填入,最后提交請求。如果所有的數(shù)據(jù)都正確,并且包名和簽名一致,那么恭喜你,微信可以支付了。
你就可以在<包名>/wxapi/WXPayEntryActivity中獲取結(jié)果了,

看onResp方法,在此方法中獲取微信的返回code,自建廣播,然后收取廣播拿到結(jié)果。大家看到這里肯定會想,喲?這不是正常微信支付嗎?有什么坑呢?
坑1. 包名跟微信后臺要保持一致。
坑2. 簽名要跟微信后臺保持一致。
坑3. 這尼瑪代碼簡直不成模塊啊。

來看我們的微信支付代碼,當(dāng)然你拷貝WXPayEntryActivity這一步還真是免不了。
那么我們來講講代碼中的pay方法,pay方法中包含了對服務(wù)端創(chuàng)建訂單的請求,支付完成后查詢支付支付結(jié)果的請求。但是你只需要傳入回調(diào)收結(jié)果就好了,不需要關(guān)心任何的內(nèi)部過程,這樣才是真正的模塊化,對嗎?
整個pay的過程,其實是跳轉(zhuǎn)至一個新的activity的過程,只不過此過程添加了參數(shù),和回調(diào),在新的activity中我們創(chuàng)建訂單,獲取支付信息,然后調(diào)用微信SDK進行支付。
2.微信H5支付
這種支付方式估計大家可能聽過,但是你聽過的可能跟我們的很不一樣,H5支付微信同時支持微信內(nèi)調(diào)起支付和微信外調(diào)起支付。
而今天我要說的就是微信外調(diào)起支付(以下簡稱H5外起支付)。
H5外起支付的優(yōu)點:
1.簽名無關(guān)性(整個支付,不需要你在微信后臺填寫app簽名)
2.包名無關(guān)性(整個支付,不需要你去微信后臺申請app)
大家試想,如果你是一個SDK開發(fā)者,你的SDK要提供給外面的任何人使用,那么別人每次都要通過你去微信那邊申請app,然后申請app支付權(quán)限,然后呢?別人開發(fā)的時候每次還要用微信后臺配置的簽名。成千上萬的開發(fā)者這么搞,你是不是就瘋了?
對,這時候你就需要用這種方式了。
首先我們先了解下H5外起支付的原理。這個東西正常的使用場景是這樣的,你有一個app,你用H5外起支付,那么你需要在webview中進行,服務(wù)端從微信那邊下訂單,拿到一個url,這個url在webview里面自動跳轉(zhuǎn),然后deeplink到微信。這樣微信支付就調(diào)來了,這時候支付完成后,返回你的app webview中,點擊“我已支付”,然后服務(wù)端查詢支付結(jié)果,然后展現(xiàn)在網(wǎng)頁中。
坑1. deeplink不能由客戶端獲取
微信H5外支付,之前是不能由客戶端獲取到deeplink的,整個過程需要在自有服務(wù)端進行,服務(wù)端進行各種請求之后獲取到一個http協(xié)議的鏈接,里面包含微信位置的deeplink,取出來之后發(fā)送給客戶端進行調(diào)起。
然而:
微信在之后進行了安全方面的認證,整個訂單創(chuàng)建和支付必須獲取到客戶端請求服務(wù)器創(chuàng)建訂單,服務(wù)器去微信那邊下單時需要發(fā)送客戶端的ip,拿到支付連接后回傳給客戶端,注意了,此時并拿不到deeplink,需要客戶端在webview中進行跳轉(zhuǎn)驗證ip,才能獲取到deeplink連接。然后坑出現(xiàn)了:
坑2. android4.4.4 webview發(fā)送referer不成功

上面的圖中,是我們正常webview發(fā)送referer的方式,然后在android4.4.4上這種方式,服務(wù)端是收不到referer字段的。那么android4.4.4上這種問題怎么解決呢?
翻閱了webview的所有api,我找到了一個方法 webview.loadDataWithBaseURL(baseUrl,htmlData)
這個方法是用來加載手機本地html的,baseUrl用來組織html中的相對路徑,我們知道其實正常的請求,這個東西跟referer是一致的,那么referer是可以寫在這個字段的,但是怎么去請求url這個鏈接呢,因為這是獲取deeplink最關(guān)鍵的一步,是的,為何不加載一段js自動做個跳轉(zhuǎn)呢?于是有了下面這段代碼。

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