Android 应用内微信 H5 支付
一般情況下,要實(shí)現(xiàn)應(yīng)用內(nèi)支付接入 App 支付 SDK 即可滿足業(yè)務(wù)需求,不過考慮到對(duì)于一些類似游戲中心的場(chǎng)景,更多是需要支持 H5 支付。相對(duì)微信來說,支付寶的對(duì)接簡(jiǎn)單完善很多,所以本篇文章主要說說接入微信 H5 支付的流程和一些問題。
申請(qǐng)流程
按照微信支付官網(wǎng) H5 支付說明 ,目前是沒有直接申請(qǐng)接入 H5 支付的入口,只能在微信商戶平臺(tái)中去另行開通。然鵝~微信商戶平臺(tái)賬戶也不支持直接注冊(cè)申請(qǐng),只能先注冊(cè)微信開放平臺(tái)后接入微信 App 支付后才會(huì)有商戶賬號(hào)分配。
1. 注冊(cè)微信開放平臺(tái)賬戶
2. 申請(qǐng)開放平臺(tái)開發(fā)者認(rèn)證
3. 創(chuàng)建一個(gè)應(yīng)用提交申核
需要應(yīng)用相關(guān)資質(zhì),主要是為了開通支付功能。
4. 為應(yīng)用申請(qǐng)微信 App 支付,開通微信支付功能
開通成功后會(huì)自動(dòng)分配微信商戶平臺(tái)賬戶
5. 登錄商戶平臺(tái)申請(qǐng)開通 H5 支付
這里只是簡(jiǎn)單介紹下申請(qǐng)流程的主要環(huán)節(jié),具體操作起來有多麻煩我也不想去體會(huì)。
應(yīng)用內(nèi)接入
說到這里可能有些人想笑了,既然叫 H5 支付那不是應(yīng)該跟應(yīng)用本身沒多大關(guān)系才對(duì),不就是一個(gè)支付鏈接跳轉(zhuǎn)而已嗎。
話是這么說沒錯(cuò),但是具體操作起來還是有些坑需要去踩。由于微信 H5 支付本身就是瀏覽器網(wǎng)頁支付場(chǎng)景下的產(chǎn)物,所以微信官方并不推薦在應(yīng)用中使用 H5 支付。
跟瀏覽器不一樣,在 WebView 中我們還需要自己處理一些問題。比如為了實(shí)現(xiàn)調(diào)起微信支付,需要對(duì)支付鏈接進(jìn)行攔截后才能進(jìn)行處理,下面就來看看這個(gè)流程。
WebViewClient webViewClient = new WebViewClient() {public boolean shouldOverrideUrlLoading(WebView view, String url) {// 判斷 url 的 scheme 進(jìn)行相應(yīng)的處理if (url.startsWith("weixin://")){ try{startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));return true;}catch (Exception e) {//防止crash (如果手機(jī)上沒有安裝處理某個(gè) scheme 開頭的 url 的APP, 會(huì)導(dǎo)致crash)AlertDialog.Builder builder;builder = new AlertDialog.Builder(mActivity);builder.setTitle("支付中心").setMessage("該手機(jī)沒有安裝微信客戶端,請(qǐng)安裝微信后重新完成支付,或換用支付寶進(jìn)行支付").setPositiveButton("確定", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialogInterface, int i) {dialogInterface.dismiss();}}).create().show();return true;}}else if (url.startsWith("alipays://") || url.startsWith("alipay")){ // ------ 對(duì)alipays:相關(guān)的scheme處理 -------try{mActivity.startActivity(new Intent("android.intent.action.VIEW", Uri.parse(url)));return true;}catch (Exception e) {// 啟動(dòng)支付寶失敗,換成網(wǎng)頁支付mPayWebView.loadUrl(url);return true;}}if (!(url.startsWith("http") || url.startsWith("https"))) {return true;}view.loadUrl(url, map);return true;} } 復(fù)制代碼你以為這樣就完了是吧,然鵝并沒有,實(shí)際開發(fā)中很大機(jī)率會(huì)出現(xiàn)微信提示商家參數(shù)格式有誤,請(qǐng)聯(lián)系商家解決的問題,而且更尷尬的是:這個(gè)問題并不會(huì) iOS 中出現(xiàn),也不會(huì) Android 瀏覽器中出現(xiàn),偏偏就是在應(yīng)用的 WebView 中出現(xiàn)了。
查看官方文檔出錯(cuò)問題介紹,說是當(dāng)前調(diào)起 H5支付的 referer 為空導(dǎo)致,WTF? 難道 Android WebView 打開一個(gè)鏈接的 referer 不知指向當(dāng)前頁面的域名?都說實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn),抓包看看好像還真的是,很好,再一次感覺到了 Android 系統(tǒng)咖喱味代碼。
沒辦法,這鍋也不能甩給微信,只能按照文檔說的解決方法自己來背。然而這文檔說的也是不明不白的,只是說域名設(shè)置要一致,廢話不多說,直接動(dòng)手更簡(jiǎn)單,下面給出示例代碼(已自行檢驗(yàn)過,真實(shí)可用的)
直接在原有的代碼基礎(chǔ)上進(jìn)行更改
WebViewClient webViewClient = new WebViewClient() {public boolean shouldOverrideUrlLoading(WebView view, String url) {...if (!(url.startsWith("http") || url.startsWith("https"))) {return true;}// 比如我們申請(qǐng)時(shí)填寫的是經(jīng)常用來測(cè)試網(wǎng)絡(luò)連通性的 http://www.baidu.comHashMap<String, String> map = new HashMap<String, String>();// 指定申請(qǐng)微信 H5 支付時(shí)填寫的域名,map.put("Referer", "http://www.baidu.com");view.loadUrl(url, map);return true;} } 復(fù)制代碼Over...
轉(zhuǎn)載于:https://juejin.im/post/5a3522fbf265da430a50a71d
總結(jié)
以上是生活随笔為你收集整理的Android 应用内微信 H5 支付的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: UICollectionView的sec
- 下一篇: iOS压缩动画 CGAffineTra
