首页 > 作文

PHP—微信JS

更新时间:2023-04-07 11:48:42 阅读: 评论:0

php—微信js-sdk获取access_token/jsapi_ticket/signature权限签名算法, php/thinkphp实现微信分享自定义文字和图片。

一.先看微信js-sdk文档

微信文档:附录1-js-sdk使用权限签名算法

jsapi_ticket

生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信js接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket 。

1.参考以下文档获取access_token(有效期7200秒,开发者必须在自己的服务全局缓存access_token):

/d/file/titlepic/token 采用http get方式请求获得jsapi_ticket(有效期7200秒,开发者必须在自己的服务全局缓存jsapi_ticket):

/d/file/titlepic/getticket 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的url,不包含#及其后面部分) 。对所有待签名参数按照字段名的ascii 码从小到大排序(字典序)后,使用url键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行url 转义。

即signature=sha1(string1)。 示例:

noncestr=wm3wzytpz0wzccnwjsapi_ticket=sm4aovdwfpe4dxkxges8vmcpggvi4c3vm0p37wvucfvkvay_90u5h9nbslyy3-sl-hhtdfl2fzfy1aochkp7qgtimestamp=1414587457url=/d/file/titlepic/pre%3e%3cp%3e%e6%ad%a5%e9%aa%a41 对所有待签名参数按照字段名的ascii 码从小到大排序(字典序)后,使用url键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1:

jsapi_ticket=sm4aovdwfpe4dxkxges8vmcpggvi4c3vm0p37wvucfvkvay_90u5h9nbslyy3-sl-hhtdfl2fzfy1aochkp7qg&noncestr=wm3wzytpz0wzccnw&timestamp=1414587457&url=/d/file/titlepic/pre%3e%3cp%3e%e6%ad%a5%e9%aa%a42 对string1进行sha1签名,得到signature:

0f9de62fce790f9a083d5c99e95740ceb90c27ed

注意事项

1.签名用的noncestr和timestamp必须与wx.config中的noncestr和timestamp相同。

2.签名用的url必须是调用js接口页面的完整url。

3.出于安全考虑,开发者必须在服务器端实现签名的逻辑。

总结一下就是:

先获取:access_token

再获取:jsapi_ticket

拼接字符串后进行sha1加密得到:signature

因为要写到服务端,下面用php实现

二.php实现signature

填入自己的appid和cret

因为要保存数据,需要两个文件(当然也可以存到数据库或者ssion)

到服务器里别忘改权限,不然写不进去

代码如下:

//微信配置    public function get_sign(){        // 微信 js 接口签名校验工具: /d/file/titlepic/sandbox        $appid = '---------';        $cret = '-------------------';        // 获取token        $token_data = file_get_contents(__dir__.'\wechat_token.txt');        $time = 7200;        if (!empty($token_data)) {            $token_data = json_decode($token_data, true);            $time  = time() - $token_data['time'];        }        if ($time > 3600) {            $token_url = "/d/file/titlepic/token            $token_res = $this->https_request($token_url);            $token_res = json_decode($token_res, true);            $token = $token_res['access_token'];            $data = array(                'time' =>time(),                'token' =>$token            );            $res = file_put_contents(__dir__.'\wechat_token.txt', json_encode($data));            if ($res) {                echo '更新 token 成功';            }        } el {            $token = $token_data['token'];        }        // 获取ticket        $ticket_data = file_get_contents(__dir__.'\wechat_ticket.txt');        $time1 = 7200;        if (!empty($ticket_data)) {            $ticket_data = json_decode($ticket_data, true);            $time1  = time() - $ticket_data['time'];        }        if ($time1 > 3600) {            $ticket_url = "/d/file/titlepic/getticket            $ticket_res = $this->https_request($ticket_url);            $ticket_res = json_decode($ticket_r深圳最好的高中es, true);            $ticket = $ticket_res['ticket'];            $data = array(                'time'    =>time(),                'ticket'  =>$ticket            );            $res = file_put_contents(__dir__.'\wechat_ticket.txt', json_encode($data));      启动仪式方案      if ($res) {                echo '更新 ticket 成功';            }        } el {            $ticket = $ticket_data['ticket'];        }        // 进行sha1签名        $timestamp = time();        $noncestr = $this->createnoncestr();        // 注意 url 建议动态获取(也可以写死).        $protocol = (!empty($_rver['https']) && $_rver['https'] !== 'off' || $_rver['rver_port'] == 443) ? "https://" : "http://";        $url = "$protocol$_rver[http_host]$_rver[request_uri]"; // 调用jssdk的页面地址        //$url = $_rver['http_referer']; // 前后端分离的, 获取请求地址(此值不准确时可以通过其他方式解决)        $str = "jsapi_ticket={$ticket}&noncestr={$noncestr}&timestamp={$timestamp}&url={$url}";        $sha_str = sha1($str);        $signpackage = array(            "appid" =>  $appid,            "noncestr" => $noncestr,            "timestamp" => $timestamp,            "signature" => $sha_str,        );        return $signpackage;    }    //随机字符串    public 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;    }    // 模拟 http 请求    public function https_request($url, $data = null){        // curl 初始化        $curl = curl_init();        // curl 设置        curl_topt($curl, curlopt_url, $url);        curl_topt($curl, curlopt_ssl_verifypeer, fal);        curl_topt($curl, curlopt_ssl_verifyhost, fal);        // 判断 $data get  or post        if ( !empty($data) ) {            curl_topt($curl,党校心得体会范文 curlopt_post, 1);            curl_topt($curl, curlopt_postfields, $data);        }        curl_topt($curl, curlopt_returntransfer, 1);        // 执行        $res = curl_exec($curl);        curl_clo($curl);        return $res;    }

  这里是返回的前端需要的数据:

$signpackage = array(            "appid" =>  $appid,            "noncestr" => $noncestr,            "timestamp" => $timestamp,            "signature" => $sha_str,        );

 拼接数据返回给前端

 

三.前端配置使用

引入js,然后调用sdk里的方法

<script src="http://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>

<script>    wx.config({    debug: fal, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。    appid: 'wxwxwxwxwxwxappid', // 必填,公众号的唯一标识    timestamp: <?php echo 一落千丈$data['timestamp']; ?>, // 必填,生成签名的时间戳    noncestr: '<?php echo $data["noncestr"]; ?>', // 必填,生成签名的随机串    signature: '<?php echo $data["signature"]; ?>',// 必填,签名    jsapilist: ['updateappmessagesharedata','updatetimelinesharedata'] // 必填,需要使用的js接口列表});wx.ready(function () {   //需在用户可能点击分享按钮前就先调用    wx.updateappmessagesharedata({         title: '<{$data.tname}> <{$data.company}> <{$data.city}> <{$data.price}>', // 分享标题        desc: '我在昂特发现了一个不错的职位,快来看看吧', // 分享描述        link: '<?php echo $data["url"]; ?>', // 分享链接,该链接域名或路径必须与当前页面对应的公众号js安全域名一致        imgurl: '/d/file/titlepic/weixin_logo.jpg', // 分享图标        success: function () {          // 设置成功        }    })});wx.ready(function () {      //需在用户可能点击分享按钮前就先调用    wx.updatetimelinesharedata({         title: '<{$data.tname}> <{$data.company}> <{$data.city}> <{$data.price}>', // 分享标题        link: '<?php echo $data["url"]; ?>', // 分享链接,该链接域名或路径必须与当前页面对应的公众号js安全域名一致        imgurl: '/d/file/titlepic/weixin_logo.jpg', // 分享图标        success: function () {          // 设置成功        }    })});

分享后

第一条是微信默认的分享效果

第二条是接入sdk后自定义的分享效果

本文发布于:2023-04-07 11:48:28,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/fdffe9b3d23baab803650679c8fff24b.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:PHP—微信JS.doc

本文 PDF 下载地址:PHP—微信JS.pdf

标签:自己的   字符串   必填   开发者
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图