文档章节

亲测:ThinkPHP 调用微信JS-SDK 开发详解

大道至精
 大道至精
发布于 2015/01/15 13:12
字数 924
阅读 32045
收藏 31

一:准备文件,并将文件置于网站根目录下

    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 = "http://$_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(file_get_contents("jsapi_ticket.json"));
    if ($data->expire_time < time()) {
      $accessToken = $this->getAccessToken();
      $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;
        $fp = fopen("jsapi_ticket.json", "w");
        fwrite($fp, json_encode($data));
        fclose($fp);
      }
    } else {
      $ticket = $data->jsapi_ticket;
    }
    return $ticket;
  }
  private function getAccessToken() {
    // access_token 应该全局存储与更新,以下代码以写入到文件中做示例
    $data = json_decode(file_get_contents("access_token.json"));
    if ($data->expire_time < time()) {
      $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;
        $fp = fopen("access_token.json", "w");
        fwrite($fp, json_encode($data));
        fclose($fp);
      }
    } 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);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($curl, CURLOPT_URL, $url);
    $res = curl_exec($curl);
    curl_close($curl);
    return $res;
  }
}

二:编辑显示页面对应的后台PHP文件,添加如下代码

      include('jssdk.php');
      $jssdk = new JSSDK("APPID", "APPSECRET");
      $signPackage = $jssdk->GetSignPackage(); 
      
      $this->signPackage = $signPackage;

请将APPID和APPSECRET换成您自己微信账号的信息

三:编辑显示页面模板html文件,添加如下代码

<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>

到此已经能够正常进行微信自定义分享了

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

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

© 著作权归作者所有

大道至精
粉丝 50
博文 53
码字总数 58567
作品 0
黄浦
程序员
私信 提问
加载中

评论(9)

P
PengQ
html 页面怎么调用?
JackJiang-
JackJiang-
很好。
l蓝墨水
l蓝墨水
菜鸟一枚,能再详细点吗,尤其是第二部,放到class外边还是方法内部?
suetech这是什么
大豆烧饼
大豆烧饼
'{suetech:$signPackage.appId}'
这段中的suetech使用方法是TP的特有方式?因为没用过TP,所以不太明白。
罗智伟

引用来自“子弹兄”的评论

那天我也试了,确实可以

引用来自“qhorse”的评论

我这怎么报错Class 'Home\Controller\JSSDK' not found
在jssdk 文件中 加入 namespace 然后可以用 use 引入
准备起飞
准备起飞

引用来自“子弹兄”的评论

那天我也试了,确实可以
我这怎么报错Class 'Home\Controller\JSSDK' not found
子弹兄
子弹兄
那天我也试了,确实可以
大道至精
大道至精

引用来自“子弹兄”的评论

貌似有错的吧,TP怎么还能这么做 include('jssdk.php');

已经应用在实际项目的中的咯,这样用没错的!
子弹兄
子弹兄
貌似有错的吧,TP怎么还能这么做 include('jssdk.php');
appId: '{suetech:$signPackage.appId}',大括号内的是什么东东?

@大道至精 你好,想跟你请教个问题: 在《亲测:ThinkPHP 调用微信JS-SDK 开发详解》一文中, appId: '{suetech:$signPackage.appId}',大括号内的是什么东东?...

urgreat
2015/06/09
560
1
PHP学习路线图 最全PHP自学指南

对于广大零基础的PHP自学者,往往不知道如何系统的学习PHP,导致平白浪费了很多时间。本文将为大家带来最详细的php学习路线图,同时还会附上相应的权威教程,让广大PHP自学者少走许多弯路。 ...

W3Cschool小编
2018/04/24
0
0
ThinkPHP中类的构造函数_construct()与_initialize()的区别详解

1当THINKPHP的父类有构造函数而子类没有时,THINKPHP不会去执行子类的_initialize();2当THINKPHP的父类子类均有构造函数时,要调用父类的构造函数必须使用parent::construct()------------...

15834278076
03/14
0
0
类美团餐饮微信公众号应用——前端招募

【业务需求】 项目是一个类美团形态的在线点菜下单、基于微信公众号的应用。 【人员要求】 目前只需移动端开发经验丰富的前端开发者(图都已经切好了,就等你来) 因项目涉及到微信定位、微信...

MerlinX
2016/07/25
2
0
Thinkphp怎样修改模板标签定界符

大家都知道在thinkphp里面,我们是通过在控制器里面给模板分配变量,然后在模板里面通过标签的方式来获取变量,假设有一个变量为$name,那么我们在模板里面就应该是通过 {$name}的方式来获取...

汤圆
2012/12/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

代理模式

//分静态代理和动态代理,区别:是否再编译时知道被被代理的对象 //思想,被代理类将自己的处理交给代理类,代理类可以添加一些新的功能,之后有代理类和客户端交互 https://www.cnblogs.co...

南桥北木
25分钟前
1
0
Spring系列教程七: Spring 整合mybatis的四种方式

一、使用注解实现整合mybatis 项目目录如下 第一步、导入jar包 <build> <resources> <!-- mapper.xml文件在java目录下 --> <resource> ......

我叫小糖主
31分钟前
5
0
阿里P7架构师:这些技术点没搞懂,我劝你不要跳槽!

阿里P7架构师架构师:这些技术点没搞懂,我劝你不要跳槽! 哪些技术点呢? 废话不多说,技术点全在下面这6张图里面了! 1.怎么看源码? 2.分布式 3.微服务 4.性能优化 5.工程化 粉丝福利:一...

别打我会飞
49分钟前
4
0
易错题

父类必须有一个无参构造,不然会报Implicit super constructor Parent() is undefined. Must explicitly invoke another constructor...

architect刘源源
54分钟前
1
0
使用Json4s 将带有Timestamp的对象转json时 变为所在时区

在有Timestamp属性的对象转json时 最后出来的时间会减小8小时,是因为变成了0时区,需要将隐式转换中添加设置本地时区 import org.json4s.{DefaultFormats, Formats}import org.json4s.jac...

可达鸭Go
56分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部