windows上面,php如果获取到用户的真实ip(用户通过代理访问的)

chaoshu 发布于 2017/11/15 16:13
阅读 226
收藏 0

做微信H5支付的时候,如果用户使用自带代理的浏览器支付时,就提示“ 网络环境未能通过安全验证,请稍后再试 ”。(省流加速一类的,关掉后就正常了。)

官方的解答是“ 商户侧统一下单传的终端IP(spbill_create_ip)与用户实际调起支付时微信侧检测到的终端IP不一致导致的,这个问题一般是商户在统一下单时没有传递正确的终端IP到spbill_create_ip导致 ”。

(详见:https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4)

微信官方推荐解决方案的环境是Linux+Nginx下的解决方案,而我这边的实际环境是Windows+IIS。

换了很多种方式都无法解决这个问题,请各位大佬指教。

=============================================

已解决,问题出在微信的SDK上面。

WxPay.Api.php中53行:

$inputObj->SetSpbill_create_ip($_SERVER['REMOTE_ADDR']);//终端ip

这种情况下统一下单的ip不是用户真实的ip(如果有使用代理的话)。

把这个地方修改一下就好了。

$inputObj->SetSpbill_create_ip(self::get_client_ip());
/**
 * 获取客户端ip
 * @return [type] [description]
 */
public 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] : '';
}

之前其实有设置过:

$input->SetSpbill_create_ip(getIp());

但是这个叼毛SDK里面下单的时候把值给覆盖了。

加载中
0
chaoshu
chaoshu
public static function get_client_ip() {
}
返回顶部
顶部