微信支付-H5支付繞過ip地址

跟着上一篇的微信文章,上一章沒有H5的支付。在這周工做種,主要是對H5支付功能進行代碼編寫,這篇文章算是一次總結,也讓新手遇到個人問題,能夠有個解決方案。html

微信H5支付的特殊要求:

H5支付和JSAPI支付差很少,可是是在其餘瀏覽器進入到微信端。微信團隊爲了作這個用戶校驗,要求添加一個字段spbill_create_ip終端IP,必須傳正確的用戶端IP,支持ipv四、ipv6格式。這個IP地址,安裝微信團隊的思路來講,就是前端獲取就能夠了,但舔狗最好仍是一無全部,發現除開在QQ瀏覽器上,我是能夠正確使用,可是換了其餘瀏覽器以後,就出現各類問題。前端

坑的解說

在訂單成功發送以後,會返回mweb_url支付跳轉連接,前端經過這個鏈接就能夠跳轉到微信,而且進行支付:window.location.href=mweb_url;git

這樣都好理解,然而。若是不在QQ瀏覽器上使用的時候,就跳轉不了?這什麼操做?github

原來,這行代碼。實際上是再次作請求。獲取到行行String字符串,也能夠理解爲是HTML。也就是說,實際上是在前端添加HTML代碼,這裏面的內容再次跳轉到微信端。web

理清一下這個思路:後端

①mweb_url 字段是用來再次作請求,而且作校驗瀏覽器

②獲取到的HTML數據,是真正的跳轉連接bash

在HTML中,有這幾行代碼(稍後會提供)服務器

url="weixin://wap/payprepayid%327097225 &package=977**** &noncestr=15****8 &sign=6882******ea"; 
top.location.href=url;複製代碼

你會發現,這個連接的幾個參數就是用來作支付校驗的。在經過top.location.href進入到微信端,若是你去看JD的H5支付,也會發現這行代碼。JD也是繞夠了這個IP微信

繞開IP的方法:

準確的說,是繞過前端的IP,最重的方法是爲了得到準確的跳轉連接。在後端獲取,因此咱們使用的是後端的地址,而不是前端的地址。並在後端正確獲取到。

但前端仍是須要傳一個數據,來替代IP,就是當前的的地址。在前端跳轉到微信的時候,會作URL校驗,判斷是不是本頁面作的支付請求。雖然不知道這個有什麼用,仍是須要傳的。

方法總結:

①終端IP地址由後端提供

②須要前端傳URL地址

代碼準備:

獲取到準確的跳轉地址

/**
url 微信返回的mweb_urlrefererUrl 前端URL地址*/
public String getWeiUrl(String url,String refererUrl) throws Exception {
    Map<String, String> header = new HashMap<>();
    header.put("Accept-Language", "zh-CN,zh;q=0.9");
    header.put("Accept-Encoding", "gzip, deflate, br");
    header.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
    header.put("Referer", refererUrl);
    header.put("Host", "wx.tenpay.com");
    header.put("Upgrade-Insecure-Requests", "1");
    header.put("Cache-Control", "no-cache");
    header.put("Pragma", "no-cache");
    String s = HttpUtils.get(url, null, header);
    logger.info("HTML ->"+s+" ->"); //能夠在這裏看數據
    String temp=s.substring(s.indexOf("weixin://") , s.length() - 1);
    return temp.substring(0, temp.indexOf("\""));

複製代碼

spbill_create_ip 是傳的後端的地址,代碼等下更新到GitHub上面。

使用:

String total_fee = "1";
//合成表單
PayHouse payHouse = new PayHouse.Builder(new MyConfig())
        .setAttach("")
        .setBody("")
        .setOutTradeNo(UUID.randomUUID().toString().replaceAll("-", ""))
        .setTotalFee(total_fee)
        .setTradeType(WxPayTradeType.H5PAT)
        .setPayAPIType(PayAPIType.UNIFIEDORDER)
        .setProductId("")
        .setSpbillCreateIp("服務器的地址")
        .setRefererUrl("前端的URL地址")
        .build();
Map<String, String> implement = payHouse.implement();
System.out.println(implement);複製代碼

打印

{mweb_url=weixin://wap/pay?prepayid%3Dwx1112*****4&package=6****2&noncestr=****54&sign=d803*****cc8f5}

前端使用

top.location.href=mweb_url複製代碼

下面是結果


GitHub地址:放微信支付簡單起來

相關文章
相關標籤/搜索