一、JSSDK类定义

  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. $url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
  14. $timestamp = time();
  15. $nonceStr = $this->createNonceStr();
  16.  
  17. // 这里参数的顺序要按照 key 值 ASCII 码升序排序
  18. $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
  19.  
  20. $signature = sha1($string);
  21.  
  22. $signPackage = array(
  23. "appId" => $this->appId,
  24. "nonceStr" => $nonceStr,
  25. "timestamp" => $timestamp,
  26. "url" => $url,
  27. "signature" => $signature,
  28. "rawString" => $string
  29. );
  30. return $signPackage;
  31. }
  32.  
  33. private function createNonceStr($length = 16) {
  34. $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
  35. $str = "";
  36. for ($i = 0; $i < $length; $i++) {
  37. $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
  38. }
  39. return $str;
  40. }
  41.  
  42. private function getJsApiTicket() {
  43. // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
  44. $data = json_decode(file_get_contents("jsapi_ticket.json"));
  45. if ($data->expire_time < time()) {
  46. $accessToken = $this->getAccessToken();
  47. $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
  48. $res = json_decode($this->httpGet($url));
  49. $ticket = $res->ticket;
  50. if ($ticket) {
  51. $data->expire_time = time() + 7000;
  52. $data->jsapi_ticket = $ticket;
  53. $fp = fopen("jsapi_ticket.json", "w");
  54. fwrite($fp, json_encode($data));
  55. fclose($fp);
  56. }
  57. } else {
  58. $ticket = $data->jsapi_ticket;
  59. }
  60.  
  61. return $ticket;
  62. }
  63.  
  64. private function getAccessToken() {
  65. // access_token 应该全局存储与更新,以下代码以写入到文件中做示例
  66. $data = json_decode(file_get_contents("access_token.json"));
  67. if ($data->expire_time < time()) {
  68. $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
  69. $res = json_decode($this->httpGet($url));
  70. $access_token = $res->access_token;
  71. if ($access_token) {
  72. $data->expire_time = time() + 7000;
  73. $data->access_token = $access_token;
  74. $fp = fopen("access_token.json", "w");
  75. fwrite($fp, json_encode($data));
  76. fclose($fp);
  77. }
  78. } else {
  79. $access_token = $data->access_token;
  80. }
  81. return $access_token;
  82. }
  83.  
  84. private function httpGet($url) {
  85. $curl = curl_init();
  86. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  87. curl_setopt($curl, CURLOPT_TIMEOUT, 500);
  88. curl_setopt($curl, CURLOPT_URL, $url);
  89.  
  90. $res = curl_exec($curl);
  91. curl_close($curl);
  92.  
  93. return $res;
  94. }
  95. }

二、类调用

  1. <?php
  2. require_once "jssdk.php";
  3. $jssdk = new JSSDK("yourAppID", "yourAppSecret");
  4. $signPackage = $jssdk->GetSignPackage();
  5. ?>
  6. <!DOCTYPE html>
  7. <html lang="en">
  8. <head>
  9. <meta charset="UTF-8">
  10. <title></title>
  11. </head>
  12. <body>
  13.  
  14. </body>
  15. <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
  16. <script>
  17. // 注意:所有的JS接口只能在公众号绑定的域名下调用,公众号开发者需要先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。
  18. // 如果发现在 Android 不能分享自定义内容,请到官网下载最新的包覆盖安装,Android 自定义分享接口需升级至 6.0.2.58 版本及以上。
  19. // 完整 JS-SDK 文档地址:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html
  20. wx.config({
  21. appId: '<?php echo $signPackage["appId"];?>',
  22. timestamp: <?php echo $signPackage["timestamp"];?>,
  23. nonceStr: '<?php echo $signPackage["nonceStr"];?>',
  24. signature: '<?php echo $signPackage["signature"];?>',
  25. jsApiList: [
  26. // 所有要调用的 API 都要加到这个列表中
  27. ]
  28. });
  29. wx.ready(function () {
  30. // 在这里调用 API
  31. });
  32. </script>
  33. </html>

微信JS SDK PHP Demo的更多相关文章

  1. 实战微信JS SDK开发:贺卡制作与播放(1)

    前段时间忙于CanTK 2.0的开发,所以博客一直没有更新.CanTK 2.0主要增强了游戏和富媒体的开发,现在编码和测试基本完成了,等文档完成了再正式发布,里面有不少激动人心的功能,等发布时再一一细 ...

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

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

  3. 微信js sdk上传多张图片

    微信js sdk上传多张图片,微信上传多张图片 该案例已tp3.2商城为例 直接上代码: php代码: public function ind(){ $appid="111111111111 ...

  4. 微信js SDK接口

    微信JS-SDK说明文档 http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html 一.微信登录功能 在进行微信OAut ...

  5. 调用微信js sdk

    场景:需要调用微信获取当前位置的借口. 途径:查看微信 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115 .后 ...

  6. 微信JS SDK配置授权,实现分享接口

    微信开放的JS-SDK面向网页开发者提供了基于微信内的网页开发工具包,最直接的好处就是我们可以使用微信分享.扫一扫.卡券.支付等微信特有的能力.7月份的时候,因为这个分享的证书获取问题深深的栽了一坑, ...

  7. 微信JS SDK使用权限签名算法

    jsapi_ticket 生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时票据.正常情况下,jsapi_ticket的有效期为7200秒, ...

  8. 微信js sdk分享开发摘记java版

    绑定域名和引入js的就不说了 废话不说直接上代码 public void share(HttpServletRequest request) throws Exception { StringBuff ...

  9. 微信JS SDK Demo 官方案例[转]

    摘要: 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以直接使用 ...

随机推荐

  1. 使用 jQuery 页面回到顶部

    function backTop() { $(window).scroll(function () { if ($(window).scrollTop() > 100) { $("#t ...

  2. iOS 状态栏黑色背景白色字体

    一. 状态栏背景(黑色)的设置 1.在有导航栏的情况下,给导航栏设置一个像素为44的背景图片即可 [[UINavigationBar appearance] setBackgroundImage:[U ...

  3. BizTalk开发系列(二十三) BizTalk性能指标参考

    BizTalk项目目前比较少,使用的客户也不多.大多只知道BizTalk是一个不错的产品,是Microsoft SOA平台的核心产品,不过还没有将其应用到生产环境.还有一些客户对BizTalk的性能不 ...

  4. swift 2.x学习笔记(二)

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #008400 } p.p2 { margin: 0.0px 0. ...

  5. 解决JQuery EasyUI onLoadSuccess执行两次的问题

    今天使用EasyUI的datagrid时发现首次打开页面时onLoadSuccess方法执行了两次.后来发现主要问题是datagrid被初始化了两次.主要原因是一开始html中声明了dg为easyui ...

  6. 一步一步来做WebQQ机器人-(一)(验证码)

    × Well done! 为了探究webqq的http请求流程和数据交互,我付出了很多心血. 写下这篇文章!!!这是我逝去的青春 系列写完之后我会把源码打包奉上~ ------我的征途是星辰大海 预计 ...

  7. angular 路由去除#号

    1.  路由启动          $locationProvider.html5Mode(true);  通过pushstatex修改url app.js define([ 'angular', & ...

  8. 帝国CMS列表模板页面内容截取

    $listtemp = '<div class="c_n_item">';$listtemp .= '<div class="c_n_title&quo ...

  9. 解决编译错误: 非法字符: '\ufeff' 解决方案|错误: 需要class, interface或enum

    http://www.cnblogs.com/oymx/p/5353235.html 可以 note++打开  在格式里  选择utf-8 无bom格式编码 即可

  10. Java基础之在窗口中绘图——填充星型(StarApplet 2 filled stars)

    Applet程序. import javax.swing.*; import java.awt.*; import java.awt.geom.GeneralPath; @SuppressWarnin ...