這或許是你看到的最有效的微信H5支付幾大問題的解決方案
因為項目中使用到了支付带饱,當(dāng)前國內(nèi)支付無非就支付寶毡代、微信阅羹、銀聯(lián)這幾種方式勺疼,支付寶和銀聯(lián)支付今天暫時不討論,搞過的都清楚捏鱼,支付寶還是比較簡單的执庐,相對于前端來說,不會太復(fù)雜导梆,幾乎接近于完美(怎么說人也是做支付的)轨淌,而微信就真的有很多坑了!
1.商家參數(shù)格式有誤看尼,請聯(lián)系商家解決
說起來递鹉,真是欲哭為淚,尤其是使用vue react等單頁面應(yīng)用開發(fā)項目的藏斩,多少一開始都很頭大躏结,我一開始也遇到了這個問題,各種百度無果狰域,最后還是研究文檔發(fā)現(xiàn)了其中的問題媳拴!
首先,先看微信對于這個錯誤的解釋:
我們直接看第一個提示1.當(dāng)前調(diào)起H5支付的referer為空導(dǎo)致兆览,一般是因為直接訪問頁面調(diào)起H5支付屈溉,請按正常流程進行頁面跳轉(zhuǎn)后發(fā)起支付,或自行抓包確認referer值是否為空抬探。
先說這個問題的解決辦法:
不管你是用的vue還是react ,找到你項目里的 index.html子巾,一般在public文件夾下,
把index.html 中的
<meta name="referrer" content="never">
注釋掉這句代碼的意思是 發(fā)起的請求將不會攜帶 referer小压。
那如何理解這個referer呢线梗?
關(guān)于Referer
Referer是HTTP 請求header的一部分,當(dāng)瀏覽器向web服務(wù)器發(fā)送請求的時候场航,一般會帶上Referer缠导,告訴服務(wù)器該網(wǎng)頁是從哪個頁面鏈接過來的,服務(wù)器因此可以獲得一些信息用于處理溉痢。例如:你在百度搜索語雀僻造,可以看到控制臺網(wǎng)絡(luò)憋他,有Referer:https://www.yuque.com/dashboard 它表示一個來源。
Referer的作用我就不具體細說了髓削,一般是作為防盜鏈竹挡,防止惡意請求的,下一期我可以單獨出一個關(guān)于referer的介紹立膛。
vue react一開始用腳手架生成的時候揪罕,默認referer是用不攜帶的,所以宝泵,涉及到支付的時候好啰,一定要查看一下index.html!6獭框往!
2.商家存在未配置的參數(shù),請聯(lián)系商家解決
先看下微信文檔的解釋:
意思說的很明白就是域名沒有配置正確闯捎, 這個問題是跟著上一個問題來的椰弊,當(dāng)你配置好了referer,微信也能獲取到你的源瓤鼻,也就能獲取到你原地址中的域名秉版,如果你在微信開放平臺中授權(quán)H5的支付安全域名與referer中的不一致,就會報這個錯誤茬祷。
如果你能保證在微信開放平臺中已經(jīng)授權(quán)h5支付安全域名,且域名已經(jīng)備案
清焕,那大概率是不會出現(xiàn)這種問題。
在微信開放平臺中牲迫, 授權(quán)h5支付安全域名的時候耐朴,一般它會告訴你,設(shè)置一級域名或者二級域名盹憎,一般來說筛峭,設(shè)置一級域名以后,二級域名 三級域名會自動通過陪每,無需配置二級 三級域名影晓,但能還是有部分人,分不清什么是一級域名和二級域名
一級域名和二級域名的區(qū)別
1檩禾、定義不同
頂級域(或一級域名)挂签,英語:Top-level domains,first-level domains(TLDs)盼产,也翻譯為國際頂級域名饵婆。是互聯(lián)網(wǎng)DNS等級之中7a686964616fe78988e69d8331333431373165的最高級的域;
二級域(或稱二級域名戏售;英語:Second-level domain侨核;英文縮寫:SLD)是互聯(lián)網(wǎng)DNS等級之中草穆,處于頂級域名之下的域。二級域名是域名的倒數(shù)第二個部分搓译,例如在域名example.baidu.com中悲柱,二級域名是Baidu。
2些己、域名組成不同
一級域名是由一個合法的字符串+域名后綴組成豌鸡,例如:lisp.com這種形式的域名才是一級域名,lisp是域名主體段标,.com是域名后綴涯冠,可以是.net也是域名后綴;
二級域名是一個一級域名下面的主機名怀樟,它是在一級域名前面加上一個字符串功偿,比如asdx.lisp.com。
二級域名是依附在一級域名的存在而存在的往堡,也就是說頂級域名消失了,二級域名也會不復(fù)存在共耍,反而來說虑灰,二級域名網(wǎng)站不做了,主域名不受影響的痹兜。
3.同一訂單號調(diào)用統(tǒng)一下單接口后未支付 再到另一個支付方式支付 報:201 重復(fù)下單 錯誤
這個錯誤一般發(fā)生在后臺穆咐,php或者java端,微信在處理訂單的時候和支付寶不同字旭,例如你已經(jīng)用native的方式对湃,調(diào)用了統(tǒng)一下單接口,但是并未進行支付遗淳,這時拍柒,如果你拿同樣的參數(shù)再去調(diào)用H5支付的統(tǒng)一下單接口,勢必會報這個錯誤屈暗。
這個問題解決起來也好辦拆讯,在調(diào)用統(tǒng)一下單接口給$out_trade_no賦值時 給它加上區(qū)別字符,如 :
$out_trade_no = 'MWEB'.$out_trade_no; //H5支付
$out_trade_no = 'WWEB'.$out_trade_no; //native支付
這樣就不會報錯了
注意: 在支付成功回調(diào)邏輯處理的時候 別忘記把 $out_trade_no 的前幾位標(biāo)識符 去掉
最后
在前端代碼中獲取到支付鏈接以后直接
window.location.href= MWEB_URL + '&redirect_url=' + encodeURIComponent(redirect_url);
完事,收工养叛!