前(tu)言(cao)
(這段前言純屬吐槽,着急解決問題的小伙伴,趕緊看正文吧)
最近做了支付寶和微信支付,先做的是PC端網站的支付,就是出個二維碼,然后手機掃描支付,當然支付寶在掃碼頁面支持登錄支付;然后客戶又要求也支持手機端支付,總不能讓客戶拿一個手機去掃另一個手機吧,是吧?
等做起移動端的支付的時候,不得不感慨,支付寶就是支付寶,支付接口用起來都比微信好用。不過也就是吐槽一下,目前的情況確實是這樣,當然目前不代表將來。
吐槽的原因有兩點:
1、便利性。主要是同一個接口,PC端和移動端共用的需求。
支付寶的網站支付接口,同一個接口,添加自己的業務邏輯寫成后,不用做任何修改,PC端/手機端網頁均可使用。也就是說,支付寶的移動端我不用改代碼就能用了,哈哈。
而微信則需要修改,比如我先做了PC支付,當我的手機也想通過網頁支付時(微信稱之為H5支付),我就得主動傳一個參數,告訴微信,我這是移動端的請求,感覺不如支付寶那么方便。
而且,由於不明原因(什么代理之類的,我也不太清),請求客戶端IP的方法也得修改一下。
2、時間。
其實這個問題,跟我沒關系,不過還是要吐槽一下。因為微信的H5支付是最近才出來的,我能知道的最早時間大概是2017-7-26,來源,不過幸好我是8月底才有這個需求的,幸運啊~
正文
問題如圖:
其實很簡單,就是修改下微信sdk中文件\lib\WxPay.Api.php中的函數unifiedOrder獲取IP的方式:
原本是這樣的:
$inputObj->SetSpbill_create_ip($_SERVER['REMOTE_ADDR']);//終端ip
我們修改一下,定義個函數專門獲取下:
$inputObj->SetSpbill_create_ip(get_client_ip());
function get_client_ip() { if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) { $ip = getenv('HTTP_CLIENT_IP'); } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) { $ip = getenv('HTTP_X_FORWARDED_FOR'); } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) { $ip = getenv('REMOTE_ADDR'); } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) { $ip = $_SERVER['REMOTE_ADDR']; } return preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : ''; }
然后再支付試試,就出現了久違的畫面: