zoukankan      html  css  js  c++  java
  • thinkphp调用微信jssdk开发

    一:准备文件,并将文件置于网站根目录下
    
    access_token.json
    {"access_token":"","expire_time":0}
    
    
    

      

     jsapi_ticket.json
    {"jsapi_ticket":"","expire_time":0}
    
    
    

      

     
    jssdk.php
    <?php
    class JSSDK {
      private $appId;
      private $appSecret;
    
      public function __construct($appId, $appSecret) {
        $this->appId = $appId;
        $this->appSecret = $appSecret;
      }
    
      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]";
    
        $timestamp = time();
        $nonceStr = $this->createNonceStr();
    
        // 这里参数的顺序要按照 key 值 ASCII 码升序排序
        $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
    
        $signature = sha1($string);
    
        $signPackage = array(
          "appId" => $this->appId,
          "nonceStr" => $nonceStr,
          "timestamp" => $timestamp,
          "url" => $url,
          "signature" => $signature,
          "rawString" => $string
        );
        return $signPackage; 
      }
    
      private function createNonceStr($length = 16) {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) {
          $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
      }
    
      private function getJsApiTicket() {
        // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
        $data = json_decode($this->get_php_file("jsapi_ticket.php"));
        if ($data->expire_time < time()) {
          $accessToken = $this->getAccessToken();
          // 如果是企业号用以下 URL 获取 ticket
          // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";
          $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
          $res = json_decode($this->httpGet($url));
          $ticket = $res->ticket;
          if ($ticket) {
            $data->expire_time = time() + 7000;
            $data->jsapi_ticket = $ticket;
            $this->set_php_file("jsapi_ticket.php", json_encode($data));
          }
        } else {
          $ticket = $data->jsapi_ticket;
        }
    
        return $ticket;
      }
    
      private function getAccessToken() {
        // access_token 应该全局存储与更新,以下代码以写入到文件中做示例
        $data = json_decode($this->get_php_file("access_token.php"));
        if ($data->expire_time < time()) {
          // 如果是企业号用以下URL获取access_token
          // $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret";
          $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
          $res = json_decode($this->httpGet($url));
          $access_token = $res->access_token;
          if ($access_token) {
            $data->expire_time = time() + 7000;
            $data->access_token = $access_token;
            $this->set_php_file("access_token.php", json_encode($data));
          }
        } else {
          $access_token = $data->access_token;
        }
        return $access_token;
      }
    
      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;
      }
    
      private function get_php_file($filename) {
        return trim(substr(file_get_contents($filename), 15));
      }
      private function set_php_file($filename, $content) {
        $fp = fopen($filename, "w");
        fwrite($fp, "<?php exit();?>" . $content);
        fclose($fp);
      }
    }
    
    
    

      

     二:编辑显示页面对应的后台PHP文件,添加如下代码 jssdk.php 我放在verdor/weixin/ 下面
    Vendor('weixin.jssdk');
       
    $jssdk = new JSSDK("APPID", "APPSECRET");       
    
    $signPackage = $jssdk->GetSignPackage();              
    
    $this->signPackage = $signPackage;
    
    
    

      

     三:在需要页面上或公共js里(所有页面)
    <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
    <script>
      wx.config({
        appId: '{suetech:$signPackage.appId}',
        timestamp: {suetech:$signPackage.timestamp},
        nonceStr: '{suetech:$signPackage.nonceStr}',
        signature: '{suetech:$signPackage.signature}',
        jsApiList: [
          'checkJsApi',
          'onMenuShareTimeline',
          'onMenuShareAppMessage',
          'onMenuShareQQ',
          'onMenuShareWeibo'
        ]
      });
    /*
    * 注意:
    * 1. 所有的JS接口只能在公众号绑定的域名下调用,公众号开发者需要先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。
    * 2. 如果发现在 Android 不能分享自定义内容,请到官网下载最新的包覆盖安装,Android 自定义分享接口需升级至 6.0.2.58 版本及以上。
    * 3. 完整 JS-SDK 文档地址:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html
    *
    * 如有问题请通过以下渠道反馈:
    * 邮箱地址:weixin-open@qq.com
    * 邮件主题:【微信JS-SDK反馈】具体问题
    * 邮件内容说明:用简明的语言描述问题所在,并交代清楚遇到该问题的场景,可附上截屏图片,微信团队会尽快处理你的反馈。
    */
    wx.ready(function () {
      // 1 判断当前版本是否支持指定 JS 接口,支持批量判断
      wx.checkJsApi({
        jsApiList: [
          'getNetworkType',
          'previewImage',
          'onMenuShareTimeline',
          'onMenuShareAppMessage',
          'onMenuShareQQ',
          'onMenuShareWeibo'
        ],
        success: function (res) {
          alert(JSON.stringify(res));
        }
      });
      var shareData = {
        title: '标题',
        desc: '描述',
        link: '链接',
        imgUrl: '图片',
        trigger: function (res) {
          alert('用户点击发送给朋友');
        },
        success: function (res) {
          alert('已分享');
        },
        cancel: function (res) {
          alert('已取消');
        },
        fail: function (res) {
          alert(JSON.stringify(res));
        }
      };
      wx.onMenuShareAppMessage(shareData);
      wx.onMenuShareTimeline(shareData);
      wx.onMenuShareQQ(shareData);
      wx.onMenuShareWeibo(shareData);
    });
    wx.error(function (res) {
      alert(res.errMsg);
    }); 
    </script>  

    如果报错curl_setopt(): CURLOPT_SSL_VERIFYHOST with value 1 is deprecated and will be removed as of libcurl 7.28.1. It is recommended to use value 2 instead

    修改

    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);

    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);

    需要注意的地方是在微信公众账号中配置您的域名,设置方法:

    登陆微信公众账号->公众号设置->功能设置->JS接口安全域名->设置

     

  • 相关阅读:
    判断变量是否是数组
    手机闹钟功能: 使用状态图解决闹钟响铃问题
    logging基本使用方法
    ssh 通过跳板机连接到远程服务器
    ssh 执行命令并实时显示结果
    使用 python 将 " " 转换为 " "
    python 文件操作
    python SMTP 发送邮件
    C++统一初始化
    设计模式之单例模式实现(C++)
  • 原文地址:https://www.cnblogs.com/qhorse/p/9021007.html
Copyright © 2011-2022 走看看