網(wǎng)絡設置指引
網(wǎng)絡超時的定位
1. 手工定位
1.1 確認商戶服務器出口IP
Linux: ifconfig直接輸出已配置外網(wǎng)IP,如無配置外網(wǎng)則需要使用第二種方式《自動化工具定位》方式獲取
Windows: 可以通過瀏覽器訪問https://ip.qq.com頁面獲取
1.2 通過ping確認延時和丟包情況
Linux: ping api.mch.weixin.qq.com -c 100
Windows: ping api.mch.weixin.qq.com -n 100
1.3 通過trace確認對應的路由節(jié)點
Linux: traceroute api.mch.weixin.qq.com
Windows: tracert api.mch.weixin.qq.com
1.4 通過mtr確認對應的路由節(jié)點丟包情況
mtr -4 -i 1 api.mch.weixin.qq.com
1.5 curl測試
curl -o /dev/null -4 -v -s -w %{time_namelookup}:%{time_connect}:%{time_starttransfer}:%{time_total}"\n" 'https://api.mch.weixin.qq.com/orderquery'
**這里的輸出需要確認有一列的時間超過3s才有參考意義
2. 自動化工具定位
2.1 運行工具命令:
./wxpaymonitor -t
2.2 工具運行輸出結(jié)果:
2.3 自動化工具定位說明:
◆ 工具最優(yōu)接入IP建議
從ping測延時的結(jié)果會按照延時最低到最高的排序,其中最優(yōu)IP需要與RemoteIp能匹配。如果IP的耗時為9999.999ms則表示該IP不通,同時會有i/o timeout的條目提示。如果商戶測試的RemoteIp與該條目錄一致,則可以確認存在網(wǎng)絡異常。
◆ LocalDns相關的配置建議
從工具測試的結(jié)果,UserIp與LocalDns以及RemoteIp需要屬于同運營商,具體IP運營商歸屬商戶側(cè)可以通過https://ip.qq.com查詢(騰訊內(nèi)部可通過https://gslb.oa.com/oss/ip_library查詢IP歸屬)
◆ 接口耗時說明
Duration:表示此次請求接口總耗時
Lookup duration:表示此次請求通過DNS解析域名耗時,如果此耗時比較高,建議確認DNS解析是否正常
Connection duration:表示此次請求連接建立耗時,如果此耗時超過1s,表示網(wǎng)絡層面TCP連接建立時間長
Request duration: 表示此次請求在業(yè)務層面處理的耗時,如果此耗時超過3s則需要重點排查業(yè)務處理日志,建議商戶提供具體的單號確認問題。
總體來看請求耗時>連接耗時>DNS解析耗時,且總體耗時不超過3s屬正常范圍。
附一:微信支付回調(diào)通知出口IP列表商戶側(cè)對商戶回調(diào)通知功能開通白名單網(wǎng)段:
上海電信出口網(wǎng)段:101.226.103.0/25
上海聯(lián)通出口網(wǎng)段:140.207.54.0/25
上海CAP出口網(wǎng)段:121.51.58.128/25
深圳電信出口網(wǎng)段:183.3.234.0/25
深圳聯(lián)通出口網(wǎng)段:58.251.80.0/25
深圳CAP出口網(wǎng)段:121.51.30.128/25
香港出口網(wǎng)段:203.205.219.128/25
退款結(jié)果通知、分賬動賬通知IP(新增):
175.24.214.208、175.24.211.24、175.24.213.135、109.244.180.23、114.132.203.119、43.139.43.69
微信支付網(wǎng)絡監(jiān)控工具部署指引
1. 簡介
為定位解決公網(wǎng)網(wǎng)絡偶現(xiàn)不穩(wěn)定的問題,特提供此監(jiān)控程序。
監(jiān)控程序可監(jiān)控商戶服務器與微信支付服務器之間的網(wǎng)絡質(zhì)量,并將監(jiān)控數(shù)據(jù)上報到遠端,微信支付技術人員可利用監(jiān)控數(shù)據(jù)進行問題的分析與定位。
監(jiān)控程序有兩種工作模式:常駐后臺運行;一次性檢查。
如果您對程序的邏輯與性能存在疑慮,請查看文檔最后的附錄“程序邏輯簡介”。
2. 常駐后臺運行
2.1 獲取程序包
獲取程序包,并拷貝到服務器/data目錄(或其他目錄)下。
文件地址:https://wx.gtimg.com/opitil/file/wxpaymonitor-stable.tgz
您可以直接在服務器上執(zhí)行:
wget --no-check-certificate
https://wx.gtimg.com/opitil/file/wxpaymonitor-stable.tgz
或者,在頁面打開鏈接,進行下載,然后上傳至服務器
2.2 解壓程序包
命令:tar -xvzf wxpaymonitor-stable.tgz
2.3 啟動程序。
使用service.sh腳本啟動程序。
命令:./service.sh start
2.4 輸入“微信支付商戶號”。
首次運行程序會要求您輸入商戶號。如下圖所示。
商戶號mch_id可以登錄商戶平臺-賬戶概覽頁面獲取,如果不清楚,請?zhí)?。
2.5 確認程序正常運行
./service.sh show
3. 一次性檢查
./wxpaymonitor -t
對微信支付API服務進行一次性檢查。
包含:接口網(wǎng)絡耗時;獲取LocalDns;測試微信支付服務器延時。
如下圖所示。
圖中各字段解釋如下表所示。
字段名 |
含義 |
---|---|
RemoteIp |
DNS解析得到的IP |
Total duration |
接口總耗時 |
Lookup duration |
DNS解析耗時 |
Connection duration |
Connect耗時 |
Request duration |
請求耗時 |
UserIp |
商戶服務器IP |
LocalDns |
LocalDns |
WXPAY_IP |
微信支付服務器IP |
TIME |
Ping測耗時 |
4. 其他功能
運行./wxpaymonitor -h,可以查看所有命令參數(shù)。如下圖。
(1)./wxpaymonitor -i
展示程序的關鍵配置信息。
微信支付技術人員可能會要求您提供輸出信息的前兩行,以便在管理系統(tǒng)中能夠查詢到您的數(shù)據(jù)。如圖所示。
(2)./wxpaymonitor -m
設置mch_id。
您初次啟動時,可能設置mch_id為0。當您獲取到準確的mch_id后,可通過此命令進行設置。重啟服務后生效,重啟命令:./service.sh restart。
(3)./wxpaymonitor -u
檢測更新。
只提示是否存在新版本,不會自動進行更新操作。考慮到您可能對自動更新存在顧慮,所以沒有實現(xiàn)自動更新的功能。您可以聯(lián)系微信支付技術人員,獲取最新版本。
5. 附錄一:程序邏輯簡
監(jiān)控程序使用golang編寫,程序常駐后臺運行時,會做三件事。
5.1 對微信支付API發(fā)起一次GET請求
請求API是微信支付查單接口,https://api.mch.weixin.qq.com/pay/orderquery。通過發(fā)起一次GET請求,獲取:域名解析耗時;connect耗時;域名解析IP列表。
5.2 對一個隨機域名發(fā)起一次域名解析
隨機域名是****.mmpay.imtmp.net,這個特定的域名解析時,最終會遞歸到騰訊的DNS根服務器,根服務器會拿到用戶的LocalDns。
5.3 Ping測試api.mch.weixin.qq.com解析出的IP
對解析出的IP列表發(fā)送ICMP包,三次探測取平均值,得到ping測延時。
監(jiān)控的結(jié)果會進行上報,上報地址為:https://api.mch.weixin.qq.com/opitil/mReport。微信支付內(nèi)部提供管理平臺對數(shù)據(jù)進行分析、繪圖,輔助技術人員定位問題。
程序定時每分鐘運行一次。
做一次性檢查時,程序邏輯基本類似,只是將檢測結(jié)果輸出到控制臺。
6. 附錄二:程序目錄結(jié)構(gòu)
bin --- 工具腳本目錄
data --- 數(shù)據(jù)文件目錄
etc --- 配置文件目錄
log --- 日志目錄
service.sh --- 啟停腳本
wxpaymonitor --- 程序二進制
公網(wǎng)冗災和演練方案
微信支付接入完畢后,在準備互聯(lián)網(wǎng)策略時,或者已經(jīng)運行一段時間后準備做自動冗災方案時,請參考如下公網(wǎng)冗災方案
1. 商戶訪問微信支付
1.1 商戶側(cè)使用api.mch.weixin.qq.com
(主)和api2.mch.weixin.qq.com
(備)這兩個支付api域名訪問微信支付,這兩個域名功能完全一樣
1.2 商戶側(cè)的訪問支付接口的代碼邏輯需具備失敗換域名重試的機制,即訪問api.mch.weixin.qq.com
不通的話,就換成api2.mch.weixin.qq.com
重試
注意這里域名的切換機制需商家側(cè)在滿足一定條件情況下才觸發(fā),如主域名持續(xù)一段時間無法訪問或超時請求到達一定數(shù)量
2. 公網(wǎng)冗災演練
2.1 商家定期或者不定期進行api.mch.weixin.qq.com(主)和api2.mch.weixin.qq.com(備)這兩個支付api域名的自動切換演練
2.2 商戶側(cè)通過調(diào)整開發(fā)配置,進行api2.mch.weixin.qq.com(備)域名切換,驗證觀察業(yè)務是否能自動請求至api2.mch.weixin.qq.com(備)域名,且切換過程中業(yè)務無損失
2.3 在觀察業(yè)務正常的情況下再進行api.mch.weixin.qq.com(主)域名切換,驗證觀察業(yè)務是否能自動請求至api.mch.weixin.qq.com(主)域名,且切換過程中業(yè)務無損失
2.4 如遇故障影響業(yè)務,請優(yōu)先回退,之后再排查原因
專線冗災和演練方案
專線接入完畢后,在準備專線互聯(lián)策略時,或者專線已經(jīng)運行一段時間后準備做自動冗災方案時,請參考如下專線冗災方案
1. 商戶訪問微信支付
1.1 商戶側(cè)使用api.mch.weixin.qq.com
(主)和api2.mch.weixin.qq.com
(備)這兩個支付api域名訪問微信支付,這兩個域名功能完全一樣
1.2 這兩個域名分別配hosts綁定專線訪問微信的兩個131開頭的策略IP,具體電信IP和聯(lián)通IP那個綁定到api和api2, 商戶側(cè)可以測速后自己決定
1.3 商戶側(cè)的訪問支付接口的代碼邏輯需具備失敗換域名重試的機制,即訪問api.mch.weixin.qq.com
不通的話,就換成api2.mch.weixin.qq.com
重試
1.4 商戶側(cè)訪問微信支付時,若兩條專線都不通,要有能切回走公網(wǎng)訪問的能力。若無法走公網(wǎng),則商戶側(cè)需要知曉這里的風險
2. 微信支付回調(diào)通知商戶
2.1 商戶側(cè)與微信支付約定私有的回調(diào)域名,形如xxxx.wxpay.local
,xxxx替換為商戶名稱簡寫,具體有以下兩種方案可選:
隨機模式: xxxx.wxpay.local
為隨機回調(diào)域名,微信支付側(cè)會將該域名在配置文件中定義為全部回調(diào)IP,隨機選擇和重試;
主備模式:
s.xxxx.wxpay.local
順序模式,是將電信IP作為主回調(diào)IP的回調(diào)域名,此時聯(lián)通IP作為備用;
r.xxxx.wxpay.local
逆序模式,是將聯(lián)通IP作為主回調(diào)IP的回調(diào)域名,此時電信IP作為備用;
2.2 商戶可以只用隨機模式的私有回調(diào)域名,如果想要更好控制專線選擇,可以在需要切換時使用主備模式,微信支付側(cè)回調(diào)程序根據(jù)商戶側(cè)提供的私有回調(diào)域名自動適配回調(diào)IP。
2.3 走專線還是走公網(wǎng)? 商戶傳的私有回調(diào)地址就走專線回調(diào),其他回調(diào)地址類型走公網(wǎng)回調(diào)
3. 專線冗災演練
3.1 雙方約定時間定期或者不定期演練專線冗災自動切換
3.2 商戶側(cè)排查所有專線策略是否都通
3.3 微信支付側(cè)排查專線回調(diào)策略是否都通
3.4 商戶側(cè)通過調(diào)整防火墻策略等方式斷開其中一條專線,驗證觀察業(yè)務是否能自動切換至另一條線路,且切換過程中業(yè)務無損失
3.5 恢復后再斷開驗證另一條專線
3.6 如果商戶側(cè)能實現(xiàn)兩條專線都不通自動走公網(wǎng)調(diào)用的話,可以再驗證兩條專線都斷開的情況下,是否如預期走公網(wǎng)調(diào)用和走公網(wǎng)回調(diào)
3.7 如遇故障影響業(yè)務,請優(yōu)先回退,之后再排查原因。
開放平臺域名冗災
本文檔描述了開放平臺域名(https://open.weixin.qq.com/)和商戶平臺域名(http://www.tg885.com)近似的冗災方案。 適用于同時接入了開放平臺、公眾平臺和微信支付的商戶。目標是保持兩部分接口冗災一致。 微信支付域名冗災現(xiàn)有方案參見:http://www.tg885.com/wiki/doc/api/jsapi.php?chapter=23_2#menu3
1. 公網(wǎng)冗災
域名部署
公網(wǎng)上我們部署了api.weixin.qq.com和api2.weixin.qq.com。其功能完全一致。 api.weixin.qq.com指向就近入口,api2.weixin.qq.com指向異地同運營商的冗災入口。
冗災方案
商戶應在代碼層面冗災,針對網(wǎng)絡層異常(例如dns解析失敗/解析回環(huán)、請求超時、證書錯誤)這些原本即需要重試的情況,切換到備用域名重試。
冗災演練
商戶應定期進行主備域名的自動切換演練。
- 調(diào)整開發(fā)配置,斷開api.weixin.qq.com的請求。觀察是否開始出現(xiàn)請求api2.weixin.qq.com。并且關注業(yè)務是否中斷。
- 恢復api.weixin.qq.com,觀察能否自動切回api.weixin.qq.com,是否仍有api2.weixin.qq.com的請求,
以上步驟如遇到故障,優(yōu)先回退,再排查原因。
2. 專線內(nèi)冗災
域名部署
專線內(nèi)開放平臺資源允許通過ip訪問。 如果商戶通過專線訪問微信支付資源,我們強制要求雙線雙機房接入。同時要在專線內(nèi)訪問開放平臺資源的話,也需要在雙線同時開通接口。 也就是說正常情況下商戶應拿到兩個開放平臺接口ip。
冗災方案
- 給ip綁定域名:api.weixin.qq.com(主)和api2.weixin.qq.com(備)
- 參照公網(wǎng)冗災,可以復用同一份代碼,針對網(wǎng)絡層異常等原本需要充實的情況,切換重試備用域名。
冗災演練
商戶應定期進行主備域名的自動切換演練。
具體方案與公網(wǎng)冗災演練類似,應與支付冗災演練同時進行。
- 專線雙方約定冗災演練時間
- 商戶排查雙線策略是否正常
- 商戶側(cè)調(diào)整策略斷開一條專線,觀察流量是否自動切換到另一條專線。業(yè)務是否中斷。
- 恢復
- 同樣測試另一條專線。
- 恢復
- 如果商戶有配置雙專線失敗走公網(wǎng),則兩條專線都配置為斷開,觀察流量是否切換到公網(wǎng)。業(yè)務是否中斷。
以上步驟如遇到故障,優(yōu)先回退,再排查原因。
3. 客戶端js資源冗災
域名部署
現(xiàn)有js文件資源地址: https://res.wx.qq.com/open/js/jweixin-1.4.0.js (支持https)。
增加的冗災資源地址:https://res2.wx.qq.com/open/js/jweixin-1.4.0.js (支持https)。
冗災方案
客戶端通過AMD/CMD方式載入資源文件,并對載入的異常進行處理:遇到網(wǎng)絡相關的異常,轉(zhuǎn)入重試冗災地址。
參考文檔: https://requirejs.org/docs/api.html#errors
冗災演練
- 手機連入fiddler之類的開發(fā)代理軟件。
- 打開網(wǎng)頁,確保業(yè)務正常
- 代理軟件上屏蔽res.wx.qq.com域名的所有請求
- 測試業(yè)務是否正常
常見問題和注意事項
1. 服務器SSL版本說明
由于低版本的SSL存在高危漏洞,需要確認您系統(tǒng)所使用的SSL版本是否需要升級,詳細說明請見公眾平臺SSL安全策略說明:http://mp.weixin.qq.com/cgi-bin/announce?action=getannouncement&key=1414562353&version=11&lang=zh_CN
Java開發(fā)可以參考Oracle網(wǎng)站的說明:[Oracle Java disable SSL3](https://www.oracle.com/java/technologies/javase/instructions-to-mitigate-the-ssl-v30-vulnerability.html)
2. IPV6相關
如果您的服務器開啟了IPv6支持,由于當前互聯(lián)網(wǎng)對IPv6支持不完整,導致在DNS解析時通常會碰到超時問題;
建議在調(diào)用支付API時,顯示指定使用IPv4解析.
PHP程序使用curl調(diào)用參考代碼如下:
if(defined('CURLOPT_IPRESOLVE') && defined('CURL_IPRESOLVE_V4'))
{
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
}
3. 無法連接微信服務器,訪問api.mch.weixin.qq.com超時
a. 是否存在跨運營商訪問的情況可以ping api.mch.weixin.qq.com查詢對應的解析IP
通過訪問ip.qq.com獲取出口IP,也可以根據(jù)商戶側(cè)服務器的外網(wǎng)IP確認
b. 是否使用的阿里云主機
由于阿里云使用的BGP,需要確認解析出來的IP是否為182.254.44.159,否則需要調(diào)整DNS設置,使用阿里本身的DNS服務器
c. 確認java程序使用的HttpClient的版本是否<=4.3.4
可升級HttpClient到4.3.6版本
4. 無法與api.mch.weixin.qq.com域名建立SSL鏈接
A: 使用 curl -v https://api.mch.weixin.qq.com/ 查看console輸出1. 看是否獲取到服務器端SSL證書?
2. 看獲取到的證書是否過期?
3. 檢查命中的IP的443端口是否能telnet通(檢查是否有DNS緩存)
B: 使用curl -o /dev/null -s -w %{time_namelookup}:%{time_connect}:%{time_starttransfer}:%{time_total}"\n" 'https://api.mch.weixin.qq.com/sandbox/orderquery' 來檢查HTTPS請求的各階段耗時,排查定為異常的階段