IIS+PHP下微信二次开发JS-SDK签名失败(已解决)

今天朋友丢个页面给我让配置下微信分享信息(标题,摘要,图片)。
二话不说,从微信开发文档里面把JS-SDK的下载下来,然后按开发文档说的那样做好配置。但是签名一直失败啊~~~~,我想很多新手跟我一样,也会遇到或多或少这样的问题,如果你遇到的问题跟我一样,那这篇文章一定对你有所帮助。
服务器环境
IIS6.0+PHP5.2.9 (ISAPI模式)

  • 问题一:报错“Call to undelfined function curl_init()
    解决方案:打开php.ini,找到;extension=php_curl.dll,把前面的;去掉重启服务器,开始我是在服务里面重启IIS server,但是重启了还是同样的报错,用命令行模式运行下curl_init()没报错,看来是没重启成功,继续去IIS里面进行下步操作:
    IIS+PHP下微信二次开发JS-SDK签名失败(已解决)_第1张图片
    QQ图片20160203133325.png

    好啦,这下没有报错了,但是签名还是失败。
    好吧~~~又去看jssdk.php函数:
private function httpGet($url) {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_TIMEOUT, 500);
    // 为保证第三方服务器与微信服务器之间数据传输的安全性,所有微信接口采用https方式调用,必须使用下面2行代码打开ssl安全校验。
    // 如果在部署过程中代码在此处验证失败,请到 http://curl.haxx.se/ca/cacert.pem 下载新的证书判别文件。
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
    curl_setopt($curl, CURLOPT_URL, $url);

    $res = curl_exec($curl);
    curl_close($curl);

    return $res;
  }

这里我想应该是CURLOPT_SSL的问题,可以试试把php.ini里面的extension=php_openssl.dll开启,这里我跳过了这部,直接修改了httpGet这个函数,改成下面这样子咯~

  private function httpGet($url) {
    $res = file_get_contents($url);
    return $res;
  }

到这里以为万事大吉了,可是刷新页面,继续出现如下错误

  • 问题二:警告“iis php file_get_contents failed to open stream
    继续打开php.ini,保证下面2行是开启状态,重启ISAPI_筛选器
allow_url_fopen = On
allow_url_include = On

好啦,警告也没有啦,签名也成功!但是问题又来了

  • 问题三:输入http://xxx.xxx.xxx/index.php签名是没有问题的,但是输入http://xxx.xxx.xxx/签名又失败了。
    继续看jssdk.php
 public function getSignPackage() {
    $jsapiTicket = $this->getJsApiTicket();

    // 注意 URL 一定要动态获取,不能 hardcode.
    $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
    $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

说明:
1.在apache+php下面,上面2个链接的$_SERVER[REQUEST_URI]分别对应"/index.php"和“/”
2.在IIS+php中两个链接的$_SERVER[REQUEST_URI]都是"/index.php",在IIS环境下只需要把

$url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

改成

$url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[HTTP_X_REWRITE_URL]";

因为微信浏览器打开的url必须跟签名sdk里面传入的url一致!

你可能感兴趣的:(IIS+PHP下微信二次开发JS-SDK签名失败(已解决))