设为首页收藏本站

爱学IT网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1332|回复: 0

[经验贴] 新版微信扫码支付模式二,二维码无法显示解决方案

[复制链接]
发表于 2018-12-28 10:50:48 | 显示全部楼层 |阅读模式
新版微信扫码支付模式二,二维码无法显示解决方案
& code_url为空解决方案

新版微信支付sdk&demo 模式二在本地无法显示 二维码 或者 $result["code_url"]的值为空。并且在正式服务器中是没问题的。
因为在本地环境无法显示。而在正式环境下却能正常显示。这可以肯定微信的demo 在本地环境中的一些配置项可能无法正常使用。
废话少说直接看下面解决方案:

只是在本地环境会出现这种情况。正式环境中一般情况是不用做如下修改的。

1、curl 问题。
如果你和老版的微信支付demo对比发现 请求证书的问题,新版改为严格校验证书。

提交数据到https时,需要pem证书来加密。
我们使用浏览器访问https的时候,浏览器会自动加载网站的安全证书进行加密。但是你用curl请求https时,没有通过浏览器,就只有自己手动增加一个安全证书进行加密。
  1. 将 /lib/WxPay.Api.php 函数 postXmlCurl 中的两行代码

  2. curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
  3. curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验
  4. 改为

  5. curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
  6. curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
复制代码




CURLOPT_SSL_VERIFYPEER         设置为FALSE 禁止 cURL 验证对等证书(peer’s certificate)。要验证的交换证书可以在 CURLOPT_CAINFO 选项中设置,或在 CURLOPT_CAPATH中设置证书目录。 CURLOPT_CAINFO         一个保存着1个或多个用来让服务端验证的证书的文件名。这个参数仅仅在和CURLOPT_SSL_VERIFYPEER一起使用时才有意义。可能需要绝对路径。
CURLOPT_CAPATH         一个保存着多个CA证书的目录。这个选项是和CURLOPT_SSL_VERIFYPEER一起使用的。
CURLOPT_SSL_VERIFYHOST         设置为 1 是检查服务器SSL证书中是否存在一个公用名(common name)。译者注:公用名(Common Name)一般来讲就是填写你将要申请SSL证书的域名 (domain)或子域名(sub domain)。 设置成 2,会检查公用名是否存在,并且是否与提供的主机名匹配。 在生产环境中,这个值应该是 2(默认值)。

2、获取本地IP的问题。
根据错误提示知道:"未定义的索引" 错误出在  /exaple/native.php 的 42 行,
  1. $result = $notify->GetPayUrl($input);
  2. //echo "<pre>";print_r($result);exit();
  3. $url2 = $result["code_url"];
复制代码

显而易见,是变量 $result 中没有定义 code_url。打印变量 $result: echo "<pre>";print_r($result);exit()
  1. Array(    [return_code] => FAIL    [return_msg] => invalid spbill_create_ip)
复制代码
参数 spbill_create_ip 在  /lib/WxPay.Api.php  的53行
  1. $inputObj->SetSpbill_create_ip($_SERVER['REMOTE_ADDR']);//终端ip
复制代码


打印出变量  $_SERVER['REMOTE_ADDR'] ,发现是  ::1 ,这明显是一个无效的ip地址
//获取请求地址


  1. //获取浏览器ip地址
  2. public static function real_ip()
  3. {
  4.     static $realip;

  5.     if ($realip !== NULL) {
  6.         return $realip;
  7.     }

  8.     if (isset($_SERVER)) {
  9.         if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
  10.             $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);

  11.             foreach ($arr as $ip) {
  12.                 $ip = trim($ip);

  13.                 if ($ip != 'unknown') {
  14.                     $realip = $ip;
  15.                     break;
  16.                 }
  17.             }
  18.         }
  19.         else if (isset($_SERVER['HTTP_CLIENT_IP'])) {
  20.             $realip = $_SERVER['HTTP_CLIENT_IP'];
  21.         }
  22.         else if (isset($_SERVER['REMOTE_ADDR'])) {
  23.             $realip = $_SERVER['REMOTE_ADDR'];
  24.         }
  25.         else {
  26.             $realip = '0.0.0.0';
  27.         }
  28.     }
  29.     else if (getenv('HTTP_X_FORWARDED_FOR')) {
  30.         $realip = getenv('HTTP_X_FORWARDED_FOR');
  31.     }
  32.     else if (getenv('HTTP_CLIENT_IP')) {
  33.         $realip = getenv('HTTP_CLIENT_IP');
  34.     }
  35.     else {
  36.         $realip = getenv('REMOTE_ADDR');
  37.     }

  38.     preg_match('/[\\d\\.]{7,15}/', $realip, $onlineip);
  39.     $realip = (!empty($onlineip[0]) ? $onlineip[0] : '0.0.0.0');
  40.     return $realip;
  41. }
复制代码

将上面的函数添加到类WxPayApi后,修改如下
  1. $inputObj->SetSpbill_create_ip(self::real_ip());//终端ip      //$inputObj->SetSpbill_create_ip("1.1.1.1");      
复制代码

3、时区问题导致二维码不显示
    如果上面两个问题,都没有解决掉。那就是时区问题,也是最容易忽略的问题。
微信文档https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=4_2 中 有这么两句话。
   时间        标准北京时间,时区为东八区;如果商户的系统时间为非标准北京时间。参数值必须根据商户系统所在时区先换算成标准北京时间, 例如商户所在地为0时区的伦敦,当地时间为2014年11月11日0时0分0秒,换算成北京时间为2014年11月11日8时0分0秒。
                   时间戳        标准北京时间,时区为东八区,自1970年1月1日 0点0分0秒以来的秒数。注意:部分系统取到的值为毫秒级,需要转换成秒(10位数字)。


在native.php 文件中设置对应时区
  1. //设置时区
  2. date_default_timezone_set('Asia/Shanghai');
复制代码

这时候在运行基本上就已经解决了

   




部分内容来自https://www.cnblogs.com/lhat/p/5611242.html



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

申请友链|小黑屋|爱学IT网 ( 京ICP备13007648号-1  

GMT+8, 2019-11-19 15:55 , Processed in 0.127256 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表