通常狀況下,要實現應用內支付接入 App 支付 SDK 便可知足業務需求,不過考慮到對於一些相似遊戲中心的場景,更可能是須要支持 H5 支付。相對微信來講,支付寶的對接簡單完善不少,因此本篇文章主要說說接入微信 H5 支付的流程和一些問題。php
按照微信支付官網 H5 支付說明 ,目前是沒有直接申請接入 H5 支付的入口,只能在微信商戶平臺中去另行開通。然鵝~微信商戶平臺帳戶也不支持直接註冊申請,只能先註冊微信開放平臺後接入微信 App 支付後纔會有商戶帳號分配。java
1. 註冊微信開放平臺帳戶android
2. 申請開放平臺開發者認證web
3. 建立一個應用提交申核api
須要應用相關資質,主要是爲了開通支付功能。瀏覽器
4. 爲應用申請微信 App 支付,開通微信支付功能微信
開通成功後會自動分配微信商戶平臺帳戶網絡
5. 登陸商戶平臺申請開通 H5 支付ide
這裏只是簡單介紹下申請流程的主要環節,具體操做起來有多麻煩我也不想去體會。測試
說到這裏可能有些人想笑了,既然叫 H5 支付那不是應該跟應用自己沒多大關係纔對,不就是一個支付連接跳轉而已嗎。
話是這麼說沒錯,可是具體操做起來仍是有些坑須要去踩。因爲微信 H5 支付自己就是瀏覽器網頁支付場景下的產物,因此微信官方並不推薦在應用中使用 H5 支付。
跟瀏覽器不同,在 WebView 中咱們還須要本身處理一些問題。好比爲了實現調起微信支付,須要對支付連接進行攔截後才能進行處理,下面就來看看這個流程。
WebViewClient webViewClient = new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// 判斷 url 的 scheme 進行相應的處理
if (url.startsWith("weixin://")){
try{
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
return true;
}catch (Exception e) {
//防止crash (若是手機上沒有安裝處理某個 scheme 開頭的 url 的APP, 會致使crash)
AlertDialog.Builder builder;
builder = new AlertDialog.Builder(mActivity);
builder.setTitle("支付中心").setMessage("該手機沒有安裝微信客戶端,請安裝微信後從新完成支付,或換用支付寶進行支付").setPositiveButton("肯定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
}).create().show();
return true;
}
}else if (url.startsWith("alipays://") || url.startsWith("alipay")){ // ------ 對alipays:相關的scheme處理 -------
try{
mActivity.startActivity(new Intent("android.intent.action.VIEW", Uri.parse(url)));
return true;
}catch (Exception e) {
// 啓動支付寶失敗,換成網頁支付
mPayWebView.loadUrl(url);
return true;
}
}
if (!(url.startsWith("http") || url.startsWith("https"))) {
return true;
}
view.loadUrl(url, map);
return true;
}
}
複製代碼
你覺得這樣就完了是吧,然鵝並無,實際開發中很大機率會出現微信提示商家參數格式有誤,請聯繫商家解決的問題,並且更尷尬的是:這個問題並不會 iOS 中出現,也不會 Android 瀏覽器中出現,恰恰就是在應用的 WebView 中出現了。
查看官方文檔出錯問題介紹,說是當前調起 H5支付的 referer 爲空致使,WTF? 難道 Android WebView 打開一個連接的 referer 不知指向當前頁面的域名?都說實踐是檢驗真理的惟一標準,抓包看看好像還真的是,很好,再一次感受到了 Android 系統咖喱味代碼。
沒辦法,這鍋也不能甩給微信,只能按照文檔說的解決方法本身來背。然而這文檔說的也是不明不白的,只是說域名設置要一致,廢話很少說,直接動手更簡單,下面給出示例代碼(已自行檢驗過,真實可用的)
直接在原有的代碼基礎上進行更改
WebViewClient webViewClient = new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
...
if (!(url.startsWith("http") || url.startsWith("https"))) {
return true;
}
// 好比咱們申請時填寫的是常常用來測試網絡連通性的 http://www.baidu.com
HashMap<String, String> map = new HashMap<String, String>();
// 指定申請微信 H5 支付時填寫的域名,
map.put("Referer", "http://www.baidu.com");
view.loadUrl(url, map);
return true;
}
}
複製代碼