商家參數格式有誤,請聯系商家解決。WebView內調起微信H5支付,Android、快應用、uni-app等解決辦法。


商家參數格式有誤,請聯系商家解決

在做微信H5支付的時候難免會遇到這個問題,一般最常見的問題是請求頭沒有設置referer這個參數或referer參數域名與微信那邊設置的安全域名不一致導致的。在這里只講前者的解決方法,后者自行咨詢微信那邊處理。

下面提供Android、快應用、uni-app等開發的解決辦法。

  第一步 明確問題所在:

  第一種方法就是在請求后端支付接口返回的http協議的接口時,前端手動設置請求頭referer該參數。如果該接口通過按鈕或js事件觸發的話一般會自動帶上referer這個參數。那么前端如何偽造這個Referer參數呢,我們接着往下看。

首先說一下安卓的解決方法,請移步到https://blog.csdn.net/fuzhongbin/article/details/77162010,這個帖子講的還是比較詳細的,看完后基本能解決安卓上webView的微信H5支付的問題。

  下面我再說一下原理,其實微信那邊是需要驗證Referer這個參數的,而我們之間把鏈接復制到瀏覽器上打開卻會出現這個頁面。

 

看到這個頁面后相信你已經在瀏覽器上瘋狂的搜索了,文檔也不看,啥也不管,我就上百度、Bing、Google、CSDN、博客園等到處搜索,但很榮幸你能看到我這篇帖子,基本上看完可以解決你所遇到的問題。

  第二步 如何解決:

   首先我們先上微信官方文檔定位到該問題所在位置。

首先微信就說了可能是你Referer為空導致的,在這里很多小伙伴們就要問了啥是Referer值呢?Referer值在哪呢?相信看到這里有些小伙伴已經明白了,有些還是一頭霧水。我來找怎么解決這個問題,你來跟我扯這么多干哈呢,都看到這里也不說正事。那我們下面就直接上才藝。

第三步 啥是Regerer:

  打開瀏覽器的F12開發者模式。

  

可以很明顯的看到了Request Headers中有個Referer參數。上個官方的Demo自行調試。——>   https://wxpay.wxutil.com/mch/pay/h5.v2.php

第四步 解決問題

  我由於是在uniapp開發快應用的時候遇到的這個問題,其實在其他地方也可行。由於uniapp發起請求無法偽造請求頭referer這個參數,我就用后端做一次url轉發解決了,下面以PHP實現為例,其它的編程語言自行百度搜索接口轉發。

第五步 代碼實現以PHP為例

/**
     * url轉發接口,可用於快應用微信H5支付
     * @Route("/transpondUrl")
     * @param Request $request
     * @return Response
     */
    public function transpondUrlAction(Request $request){
        $url = $request->get("url");  // 獲取接口傳入需要轉發的url注意需要用url編碼。由於基於Symfony框架實現$request可以直接獲取url參數,原生可用$_GET['url']代替
        $userAgent = $request->headers->get("user-agent");
        if (empty($url) or $url == "") return new Response("參數不完整。");
        if (empty($userAgent)) $userAgent = $this->getAgent();
        $ch = curl_init();
        if (preg_match("/^https:\\/\\/.+/",$url)) {
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        }
        $cip = $request->getClientIp();
        curl_setopt ($ch, CURLOPT_URL, $url);
        curl_setopt ($ch, CURLOPT_USERAGENT, $userAgent);
        @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
        curl_setopt ($ch, CURLOPT_AUTOREFERER, 1);
//        curl_setopt ($ch, CURLOPT_COOKIEJAR, './cookie.txt');  // cookie日志
        // 微信Wap支付需要偽造請求頭Referer該參數,該參數需設置與微信支付配置都安全域名一致
        curl_setopt ($ch, CURLOPT_REFERER, "{設置與微信H5支付的安全域名}");
        curl_setopt($ch, CURLOPT_HTTPHEADER, ["CLIENT-IP:$cip"]);// 這里需要設置客戶端的Ip地址,用於偽造請求IP地址
        curl_setopt ($ch, CURLOPT_HEADER,1);//顯示返回的HEAD區域的內容
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt ($ch, CURLOPT_TIMEOUT, 10);
        $result = curl_exec($ch);
        curl_close($ch);
        return new Response($result);// 返回響應內容
    }

    public function getAgent()
    {
        $agentarry = [
            "iPhone11"                        =>       "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Mobile/14G60 MicroMessenger/6.5.18 NetType/WIFI Language/en",
            "華為P9全網通"                     =>         "Mozilla/5.0 (Linux; Android 7.0; EVA-AL00 Build/HUAWEIEVA-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.49 Mobile MQQBrowser/6.2 TBS/043508 Safari/537.36 MicroMessenger/6.5.13.1100 NetType/WIFI Language/zh_CN",
            "小米5X"                          =>         "Mozilla/5.0 (Linux; U; Android 7.1.2; zh-cn; MI 5X Build/N2G47H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.146 Mobile Safari/537.36 XiaoMi/MiuiBrowser/9.2.2",
            "一加手機3"                       =>          "Mozilla/5.0 (Linux; Android 7.1.1; ONEPLUS A3000 Build/NMF26F; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.49 Mobile MQQBrowser/6.2 TBS/043508 Safari/537.36 MicroMessenger/6.5.13.1100 NetType/WIFI Language/zh_CN",
            "努比亞Z11"                       =>         "Mozilla/5.0 (Linux; U; Android 6.0.1; zh-cn; NX531J Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko)Version/4.0 Chrome/37.0.0.0 MQQBrowser/6.8 Mobile Safari/537.36",
            "小米5s"                          =>         "Mozilla/5.0 (Linux; Android 6.0.1; MI 5s Build/MXB48T; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.49 Mobile MQQBrowser/6.2 TBS/043508 Safari/537.36 V1_AND_SQ_7.2.0_730_YYB_D QQ/7.2.0.3270 NetType/WIFI WebP/0.3.0 Pixel/1080",
            "華為nova"                        =>         "Mozilla/5.0 (Linux; Android 7.0; HUAWEI CAZ-AL10 Build/HUAWEICAZ-AL10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.49 Mobile MQQBrowser/6.2 TBS/043508 Safari/537.36 V1_AND_SQ_7.1.0_692_YYB_D QQ/7.1.0.3175 NetType/WIFI WebP/0.3.0 Pixel/1080",
            "聯想ZUK Z2 Pro"                  =>         "Mozilla/5.0 (Linux; Android 7.0; ZUK Z2121 Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.49 Mobile MQQBrowser/6.2 TBS/043508 Safari/537.36 V1_AND_SQ_7.2.0_730_YYB_D QQ/7.2.0.3270 NetType/4G WebP/0.3.0 Pixel/1080",
            "魅藍note 3"                      =>        "Mozilla/5.0 (Linux; Android 5.1; m3 note Build/LMY47I; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/48.0.2564.116 Mobile Safari/537.36 T7/9.3 baiduboxapp/9.3.0.10 (Baidu; P1 5.1)",
            "三星GALAXY S8+"                  =>        "Mozilla/5.0 (Linux; U; Android 7.0; zh-CN; SM-G9550 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 UCBrowser/11.7.0.953 Mobile Safari/537.36",
            "魅族MX6    "                        =>        "Mozilla/5.0 (Linux; Android 6.0; MX6 Build/MRA58K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.49 Mobile MQQBrowser/6.2 TBS/043508 Safari/537.36 MicroMessenger/6.5.13.1100 NetType/4G Language/zh_CN",
            "vivo Xplay5A"                    =>       "Mozilla/5.0 (Linux; Android 5.1.1; vivo Xplay5A Build/LMY47V; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/48.0.2564.116 Mobile Safari/537.36 T7/9.3 baiduboxapp/9.3.0.10 (Baidu; P1 5.1.1)",
            "三星GALAXY C7"                   =>        "Mozilla/5.0 (Linux; U; Android 6.0.1; zh-CN; SM-C7000 Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 UCBrowser/11.6.2.948 Mobile Safari/537.36",
            "三星GALAXY S8"                   =>         "Mozilla/5.0 (Linux; U; Android 7.0; zh-CN; SM-G9500 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 UCBrowser/11.7.0.953 Mobile Safari/537.36",
            "榮耀8青春版"                     =>         "Mozilla/5.0 (Linux; U; Android 7.0; zh-CN; PRA-AL00 Build/HONORPRA-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 UCBrowser/11.7.0.953 Mobile Safari/537.36",
            "UCOpenwave"                      =>      "Openwave/ UCWEB7.0.2.37/28/999",
            "UC Opera"                        =>      "Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/999",
            "小米4S"                          =>        "Mozilla/5.0 (Linux; U; Android 5.1.1; zh-cn; MI 4S Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.146 Mobile Safari/537.36 XiaoMi/MiuiBrowser/9.1.3",
            "OPPO R12"                       =>          "Mozilla/5.0 (Linux; U; Android 7.1.1; zh-CN; OPPO R11 Build/NMF26X) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 UCBrowser/11.7.0.953 Mobile Safari/537.36",
            "iPhone2"                        =>          "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Mobile/14G60 MicroMessenger/6.5.7 NetType/WIFI Language/zh_CN",
        ];
        return $agentarry[array_rand($agentarry,1)];
    }

 第六部 前端調用轉發接口

前端只需要通過請求或者在webview中調用這個接口把微信返回的url js用urlEncodeComponent(url)【注:url編碼方法,以js為例】編碼一下,再填入轉發接口即可。

該參數需設置與微信支付配置都安全域名一致


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM