后台代码

jssdk.PHP——因sae的不可写环境,故需要将accesstoken和JsApiTicket存入数据库。 
数据库字段:id(int 3),accesstoken(string 255),lasttime(int 10)

  1. <?php
  2. class JSSDK {
  3. private $appId;
  4. private $appSecret;
  5.  
  6. public function __construct($appId, $appSecret) {
  7. $this->appId = $appId;
  8. $this->appSecret = $appSecret;
  9. }
  10.  
  11. public function getSignPackage() {
  12. $jsapiTicket = $this->getJsApiTicket();
  13.  
  14. // 注意 URL 一定要动态获取,不能 hardcode.
  15. $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
  16. $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
  17.  
  18. $timestamp = time();
  19. $nonceStr = $this->createNonceStr();
  20.  
  21. // 这里参数的顺序要按照 key 值 ASCII 码升序排序
  22. $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
  23.  
  24. $signature = sha1($string);
  25.  
  26. $signPackage = array(
  27. "appId" => $this->appId,
  28. "nonceStr" => $nonceStr,
  29. "timestamp" => $timestamp,
  30. "url" => $url,
  31. "signature" => $signature,
  32. "rawString" => $string
  33. );
  34. return $signPackage;
  35. }
  36.  
  37. private function createNonceStr($length = 16) {
  38. $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
  39. $str = "";
  40. for ($i = 0; $i < $length; $i++) {
  41. $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
  42. }
  43. return $str;
  44. }
  45.  
  46. private function getJsApiTicket() {
  47. $accessToken = $this -> getAccesstoken();
  48. $lastAT = M('accesstoken')->find(2);//1:token;2:ticket
  49. if(!$lastAT){
  50. M('accesstoken') -> add(array('id'=>2,'accesstoken'=>'null','lasttime'=>0));
  51. $lastAT['lasttime'] = 0;
  52. }
  53. $ticket = $lastAT['accesstoken'];
  54. $now = NOW_TIME;
  55. $timecha = $now - $lastAT['lasttime'];
  56. if($timecha >= 7200){
  57. // $url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?' . http_build_query ( $param );
  58. // $content = file_get_contents ( $url );
  59. // $content = json_decode ( $content, true );
  60. // 如果是企业号用以下 URL 获取 ticket
  61. // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";
  62. $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=".$accessToken;
  63. $res = json_decode($this->httpGet($url));
  64. $ticket = $res->ticket;
  65. $data['accesstoken'] = $ticket;
  66. $data['lasttime'] = NOW_TIME;
  67. M('accesstoken')->where(array('id'=>2))->save($data);
  68. }
  69. return $ticket;
  70. }
  71.  
  72. //sae无法写入操作,改从数据库获取
  73. private function getAccessToken() {
  74. $param['grant_type'] = 'client_credential';
  75. $param['appid'] = C("APPID");
  76. $param['secret'] = C("SECRET");
  77. $lastAT = M('accesstoken')->find(1);
  78. $accesstoken = $lastAT['accesstoken'];
  79. if(!$lastAT){
  80. M('accesstoken') -> add(array('id'=>1,'accesstoken'=>'null','lasttime'=>0));
  81. $lastAT['lasttime'] = 0;
  82. }
  83. $now = NOW_TIME;
  84. $timecha = $now - $lastAT['lasttime'];
  85. if($timecha >= 7200){
  86. $url = 'https://api.weixin.qq.com/cgi-bin/token?' . http_build_query ( $param );
  87. $content = file_get_contents ( $url );
  88. $content = json_decode ( $content, true );
  89. $data['accesstoken'] = $content['access_token'];
  90. $data['lasttime'] = NOW_TIME;
  91. M('accesstoken')->where(array('id'=>1))->save($data);
  92. $accesstoken = $content['access_token'];
  93. }
  94. $lastAT = M('accesstoken')->find(1);
  95. return $accesstoken;
  96. }
  97.  
  98. private function httpGet($url) {
  99. $curl = curl_init();
  100. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  101. curl_setopt($curl, CURLOPT_TIMEOUT, 500);
  102. // 为保证第三方服务器与微信服务器之间数据传输的安全性,所有微信接口采用https方式调用,必须使用下面2行代码打开ssl安全校验。
  103. // 如果在部署过程中代码在此处验证失败,请到 http://curl.haxx.se/ca/cacert.pem 下载新的证书判别文件。
  104. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
  105. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
  106. curl_setopt($curl, CURLOPT_URL, $url);
  107.  
  108. $res = curl_exec($curl);
  109. curl_close($curl);
  110.  
  111. return $res;
  112. }
  113.  
  114. private function get_php_file($filename) {
  115. return trim(substr(file_get_contents($filename), 15));
  116. }
  117. private function set_php_file($filename, $content) {
  118. $fp = fopen($filename, "w");
  119. fwrite($fp, "<?php exit();?>" . $content);
  120. fclose($fp);
  121. }
  122. }

如果你的服务器是可写环境,可以使用官方提供的包。

前台文件

可以使用include将此文件包含在需要页面

  1. <?php
  2. include('jssdk.php');
  3. $jssdk = new JSSDK(C('APPID'), C('SECRET'));
  4. if(isWeixinBrowser()){
  5. $signPackage = $jssdk->GetSignPackage();
  6. }
  7. ?>
  8. <script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
  9. <script>
  10. wx.config({
  11. debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  12. appId: '<?php echo $signPackage["appId"];?>', // 必填,公众号的唯一标识
  13. timestamp: <?php echo $signPackage["timestamp"];?>, // 必填,生成签名的时间戳
  14. nonceStr: '<?php echo $signPackage["nonceStr"];?>', // 必填,生成签名的随机串
  15. signature: '<?php echo $signPackage["signature"];?>',// 必填,签名,见附录1
  16. jsApiList: [
  17. 'checkJsApi',
  18.  
  19. 'onMenuShareTimeline',
  20.  
  21. 'onMenuShareAppMessage',
  22.  
  23. 'onMenuShareQQ',
  24.  
  25. 'onMenuShareWeibo'
  26.  
  27. ] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
  28. });
  29. wx.ready(function () {
  30.  
  31. // 1 判断当前版本是否支持指定 JS 接口,支持批量判断
  32.  
  33. wx.checkJsApi({
  34.  
  35. jsApiList: [
  36.  
  37. 'getNetworkType',
  38.  
  39. 'previewImage',
  40.  
  41. 'onMenuShareTimeline',
  42.  
  43. 'onMenuShareAppMessage',
  44.  
  45. 'onMenuShareQQ',
  46.  
  47. 'onMenuShareWeibo'
  48.  
  49. ],
  50.  
  51. /* success: function (res) {
  52.  
  53. alert(JSON.stringify(res));
  54.  
  55. } */
  56.  
  57. });
  58.  
  59. var shareData = {
  60.  
  61. title: document.title,
  62.  
  63. <notempty name="page_title">
  64. desc: '我在'+'{:C('WEB_SITE_TITLE')}'+'发现了非常不错的宝贝:'+'{$page_title}'+'快来看看吧!',
  65. <else/>
  66. desc: '我发现了个很不错的商城'+'{:C('WEB_SITE_TITLE')}'+'快来看看吧!',
  67. </notempty>
  68.  
  69. link: window.location.href,
  70.  
  71. <notempty name="page_title">
  72. imgUrl: document.getElementById("detail_img").src,
  73. <else/>
  74. imgUrl: '{:get_cover(get_cover_id(34),'path')}',
  75. </notempty>
  76.  
  77. /* trigger: function (res) {
  78.  
  79. alert('用户点击发送给朋友');
  80.  
  81. }, */
  82.  
  83. success: function (res) {
  84.  
  85. alert('感谢您的分享');
  86.  
  87. },
  88.  
  89. cancel: function (res) {
  90.  
  91. alert('请主公三思,分享一下吧(ㄒoㄒ)~~');
  92.  
  93. },
  94.  
  95. fail: function (res) {
  96.  
  97. alert(JSON.stringify(res));
  98.  
  99. }
  100.  
  101. };
  102.  
  103. wx.onMenuShareAppMessage(shareData);
  104.  
  105. wx.onMenuShareTimeline(shareData);
  106.  
  107. wx.onMenuShareQQ(shareData);
  108.  
  109. wx.onMenuShareWeibo(shareData);
  110.  
  111. });
  112.  
  113. /* wx.error(function (res) {
  114.  
  115. alert(res.errMsg);
  116.  
  117. }); */
  118. </script>

出处:blog.csdn.NET/afanxingzhou

公众号js-sdk简的更多相关文章

  1. SAE微信公众号PHP SDK, token一直验证失败

    用的是SAE,创建的是微信公众号PHP SDK框架,里面example文件夹下有server.php用来验证token的.但是问题来了,无论我怎么输入URL和token,一直告诉我token验证失败. ...

  2. VopSdk一个高逼格微信公众号开发SDK(源码下载)

    看之前回复很多说明大家很有热情&文章被误删掉了,不想让有的朋友错失这个高逼格的东西,现在重新发布,这次就直接放出源码,文章最末下载地址. 看之前回复很多说明大家很有热情&文章被误删掉了 ...

  3. VopSdk一个高逼格微信公众号开发SDK:自动化生产(装逼模式开启)

    VopSdk一个高逼格微信公众号开发SDK(源码下载) VopSdk一个高逼格微信公众号开发SDK:自动化生产(装逼模式开启) 针对第一版,我们搞了第二版本,老规矩先定个目标. 一 我们的目标 a.移 ...

  4. 最新微信公众平台js sdk整合PHP版

    由于没有持续关注微信公众平台相关的开发,所以看到这个东西时,都没有耐心看完开发文档,或者不知道重点. 重点在哪呢?重点在示例代码:http://mp.weixin.qq.com/wiki/7/aaa1 ...

  5. 微信JS-SDK]微信公众号JS开发之卡券领取功能详解

    js sdk: http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E9.99.84.E5.BD.952-.E6 ...

  6. VopSdk一个高逼格微信公众号开发SDK

    一.我们的目标 分离基础参数和业务参数. 具有高重用和扩展性. 轻量级. 二.实现目标 (一)分离基础参数和业务参数 仔细分析所有接口,抽离出每个模块接口的公共参数. A.针对微信公众号所有接口分析( ...

  7. 微信支付-小程序H5 公众号 Payment SDK

    前言 今天是2020年一天,去年最后一个月开发了订单和支付系统,尤其在支付系统和微信对接的时候遇到了很多坑,这里给大家总结下,以免大家遇到相同的问题还浪费大量时间 微信支付前期准备 微信商户号,需要商 ...

  8. 如何站在使用者的角度来设计SDK-微信公众号开发SDK(消息处理)设计之抛砖引玉

    0.SDK之必备的基本素质 在项目中免不了要用到各种各样的第三方的sdk,在我现在的工作中就在公司内部积累了各种各样的的公共库(基于.net的,基于silverlight的等等),托管到了内部的nug ...

  9. 微信公众号 - js传入时间戳换算(以前几天、几小时...)

    // 获取当前时间戳 function timestamps() { return Math.round(new Date().getTime() / 1000).toString() } // 距离 ...

  10. 微信JS SDK接入的几点注意事项

    微信JS SDK接入,主要可以先参考官网说明文档,总结起来有几个步骤: 1.绑定域名:先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”.备注:登录后可在“开发者中心”查看对 ...

随机推荐

  1. Linux 之rsyslog+LogAnalyzer 日志收集系统

    一.LogAnalyzer介绍 LogAnalyzer工具提供了一个易于使用,功能强大的前端,用于搜索,查看和分析网络活动数据,包括系统日志,事件日志和其他许多日志源.由于它只是将数据展示到我们用户的 ...

  2. 3.docker学习之docker与虚拟化

    虚拟化技术是一个总称,是一系列实现虚拟技术的统称.从广义上来说,虚拟化技术包括了虚拟机技术和容器技术, 所谓虚拟化技术最大的特点就是将一个真实的机器进行虚拟地分割,然后分割出来的部分可以独立使用   ...

  3. centos 安装php7

    yum安装php7 删除之前的版本 # yum remove php* rpm 安装 Php7 相应的 yum源 CentOS/RHEL 7.x: # rpm -Uvh https://dl.fedo ...

  4. 四、jenkins+postman+newman环境搭建

    前提: 搭建环境之前需要先理清楚各个环境的依赖关系,jenkins只支持windows命令行跟linux shell环境执行构建命令,而postman的测试脚本不能直接在命令行或shell环境执行,p ...

  5. 好记性不如烂笔头-Mysql查找如何判断字段是否包含某个字符串

    好记性不如烂笔头-Mysql查找如何判断字段是否包含某个字符串 利用mysql 字符串函数 find_in_set(); SELECT * FROM users WHERE find_in_set(' ...

  6. 函数~匿名方法~lambda的逐渐过渡思想

    前提:基于委托实现 (1)使用函数名称 delegate void Printer(string s);//(1)申明委托 static void Main(string[] args) { //(3 ...

  7. [Z] SVN的trunk、branch、tag

    Subversion有一个很标准的目录结构,是这样的.比如项目是proj,svn地址为svn://proj/,那么标准的svn布局是 svn://proj/|+-trunk+-branches+-ta ...

  8. Linux运维跳槽必备的40道面试精华题

    过一次年,结婚.存款.父母养老,一系列向钱看的事都在碾压我们本来还挺简单的神经,但难过没有出路,唯有找到好的方法和事业方向,才能实现一步一个脚印的逆袭. 下面是一名资深Linux运维求职数十家公司总结 ...

  9. 如何将Excel日期快速转化为文本格式?

    Excel表中日期格式其实是数值,有时候需要原样转成文本,有时候也要将文本转成日期. 我发现了一个方法,估计是最快的了.不需要用那一堆year() month()之类的函数. 快速将日期格式转化为文本 ...

  10. Mysql合并两列数据

    实例: UPDATE x_yiyuanpinggu_nengli SET ch_yuzhongfangxiang = CONCAT(ch_yuanyuzhong,ch_mubiaoyuzhong) M ...