微信H5支付:网络环境未能通过安全验证,请稍后再试。解决办法(PHP版)

前(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] : '';
}

 然后再支付试试,就出现了久违的画面:

  

  

 

  

 

 

 

    

转载于:https://www.cnblogs.com/zjfblog/p/7485432.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值