TP5调用微信JSSDK 教程 —— 之异步使用

Posted 徐锅的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TP5调用微信JSSDK 教程 —— 之异步使用相关的知识,希望对你有一定的参考价值。

细节请参考前一篇文章:
JSSDK.php 修改下:

技术分享图片
  1 <?php
  2 namespace jssdk;
  3 
  4 class Jssdk {
  5   private $appId;
  6   private $appSecret;
  7   private $url;
  8 
  9   public function __construct($appId, $appSecret,$url) {
 10     $this->appId = $appId;
 11     $this->appSecret = $appSecret;
 12     $this->url = $url;
 13   }
 14 
 15   public function getSignPackage() {
 16     $jsapiTicket = $this->getJsApiTicket();
 17 
 18     // 注意 URL 一定要动态获取,不能 hardcode.
 19     $protocol = (!empty($_SERVER[‘HTTPS‘]) && $_SERVER[‘HTTPS‘] !== ‘off‘ || $_SERVER[‘SERVER_PORT‘] == 443) ? "https://" : "http://";
 20 //    $url = "$protocol$_SERVER[SERVER_NAME]$_SERVER[REQUEST_URI]";
 21     $url = $this->url;
 22 
 23     $timestamp = time();
 24     $nonceStr = $this->createNonceStr();
 25 
 26     // 这里参数的顺序要按照 key 值 ASCII 码升序排序
 27     $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
 28 
 29     $signature = sha1($string);
 30 
 31     $signPackage = array(
 32       "appId"     => $this->appId,
 33       "nonceStr"  => $nonceStr,
 34       "timestamp" => $timestamp,
 35       "url"       => $url,
 36       "signature" => $signature,
 37       "rawString" => $string
 38     );
 39     return $signPackage; 
 40   }
 41 
 42   private function createNonceStr($length = 16) {
 43     $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
 44     $str = "";
 45     for ($i = 0; $i < $length; $i++) {
 46       $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
 47     }
 48     return $str;
 49   }
 50 
 51   private function getJsApiTicket() {
 52     // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
 53     $data = json_decode($this->get_php_file(EXTEND_PATH .‘jssdk‘. DS ."jsapi_ticket.php"));
 54     if ($data->expire_time < time()) {
 55       $accessToken = $this->getAccessToken();
 56       // 如果是企业号用以下 URL 获取 ticket
 57       // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";
 58       $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
 59       $res = json_decode($this->httpGet($url));
 60       $ticket = $res->ticket;
 61       if ($ticket) {
 62         $data->expire_time = time() + 7000;
 63         $data->jsapi_ticket = $ticket;
 64         $this->set_php_file("jsapi_ticket.php", json_encode($data));
 65       }
 66     } else {
 67       $ticket = $data->jsapi_ticket;
 68     }
 69 
 70     return $ticket;
 71   }
 72 
 73   private function getAccessToken() {
 74     // access_token 应该全局存储与更新,以下代码以写入到文件中做示例
 75     $data = json_decode($this->get_php_file(EXTEND_PATH .‘jssdk‘. DS ."access_token.php"));
 76     if ($data->expire_time < time()) {
 77       // 如果是企业号用以下URL获取access_token
 78       // $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret";
 79       $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
 80       $res = json_decode($this->httpGet($url));
 81       $access_token = $res->access_token;
 82       if ($access_token) {
 83         $data->expire_time = time() + 7000;
 84         $data->access_token = $access_token;
 85         $this->set_php_file("access_token.php", json_encode($data));
 86       }
 87     } else {
 88       $access_token = $data->access_token;
 89     }
 90     return $access_token;
 91   }
 92 
 93   private function httpGet($url) {
 94     $curl = curl_init();
 95     curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
 96     curl_setopt($curl, CURLOPT_TIMEOUT, 500);
 97     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
 98     curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
 99     curl_setopt($curl, CURLOPT_URL, $url);
100 
101     $res = curl_exec($curl);
102     curl_close($curl);
103 
104     return $res;
105   }
106 
107   private function get_php_file($filename) {
108     return trim(substr(file_get_contents($filename), 15));
109   }
110   private function set_php_file($filename, $content) {
111     $fp = fopen($filename, "w");
112     fwrite($fp, "<?php exit();?>" . $content);
113     fclose($fp);
114   }
115 }
View Code

controller:

        $config = config(‘wxConfig‘);
        $jssdk = new Jssdk($config[‘id‘], $config[‘secret‘],$sign_url);
        $signPackage = $jssdk->GetSignPackage();
        return json([‘code‘=>1,‘msg‘=>‘success!‘,‘data‘=>$signPackage],200);

前端:

    <script src="/h/js/jquery.min.js?v=2.1.4"></script>
    <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
    <script src="/static/js/share_wx.js"></script>
    <script>
        $.fn.share_wx({
            desc: "xx",
            imgUrl: "xxurl"
        });
    </script>

share_wx:

技术分享图片
 1 /**
 2  * author:xuguo
 3  * weixin jssdk
 4  * xx.com
 5  */
 6 (function($){
 7     var share_wx = {};
 8     /**
 9      *
10      * @param obj  设置微信分享的信息
11      * {
12      *   title: "xx",
13      *   desc: "xx",
14      *   link: "xx",
15      *   imgUrl: "xx"
16      * }
17      */
18     share_wx.share_wx = function(obj) {
19         var url = location.href.split(‘#‘)[0];
20         $.ajax({
21             url:‘/index/index/share_wx‘,
22             type:"get",
23             data:{‘sign_url‘:url},
24             success:function (data) {
25                 if(data.code == 1){
26                     wx_(data.data)
27                 }
28             }
29         });
30 
31         /**
32          *
33          * @param options
34          * @private
35          */
36         function wx_(options) {
37             wx.config({
38                 debug: false,
39                 appId: options.appId,
40                 timestamp: options.timestamp,
41                 nonceStr: options.nonceStr,
42                 signature: options.signature,
43                 jsApiList: [
44                     "checkJsApi",
45                     "onMenuShareTimeline",
46                     "onMenuShareAppMessage",
47                     "onMenuShareQQ",
48                     "onMenuShareWeibo",
49                     "onMenuShareQZone"
50                 ]
51             });
52             wx.ready(function() {
53                 var shareData = obj;
54                 wx.onMenuShareAppMessage(shareData);
55                 wx.onMenuShareTimeline(shareData);
56                 wx.onMenuShareQQ(shareData);
57                 wx.onMenuShareWeibo(shareData);
58                 wx.onMenuShareQZone(shareData);
59             });
60         }
61     };
62     $.fn.extend(share_wx);
63 })(jQuery);
View Code

 

以上是关于TP5调用微信JSSDK 教程 —— 之异步使用的主要内容,如果未能解决你的问题,请参考以下文章

小白学react之调用微信jssdk实战

微信公众号开发之如何使用JSSDK

如何在React中调用微信的jsSDK

微信支付接口开发之---微信支付之JSSDK(公众号支付)步骤

微信官方jssdk Demo -php版

微信jssdk图片语音开发记录