php 微信JS-SDK封装类
JSSDK使用步骤:
步骤一:绑定域名
步骤二:引入JS文件
步骤三:通过config接口注入权限验证配置
步骤四:通过ready接口处理成功验证
步骤五:通过error接口处理失败验证
具体步骤方法说明给查看官方给出的微信开发者文档
https://mp.weixin.qq.com/wiki/11/74ad127cc054f6b80759c40f77ec03db.html
所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用
wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: '', // 必填,公众号的唯一标识 timestamp: , // 必填,生成签名的时间戳 nonceStr: '', // 必填,生成签名的随机串 signature: '',// 必填,签名 jsApiList: [] // 必填,需要使用的JS接口列表 });
其中要保证能正常使用接口的一个重要条件就是获取签名,那么签名是什么,有什么用,怎么获取签名就是今天我今天要讲的重点了。
签名,在我们日常生活中经常用到,在一些核实、审查信息,结案等时候需要某个人的亲笔签名,在网站开发中也一样,签名是否正确是能否调用微信接口的重要条件,可以理解为就是票据。
签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。
即signature=sha1(string1)。 示例:
- noncestr=Wm3WZYTPz0wzccnW
- jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg
- timestamp=1414587457
- url=http://mp.weixin.qq.com?params=value
步骤1. 对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1:
jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW×tamp=1414587457&url=http://mp.weixin.qq.com?params=value
对string1进行sha1签名,得到signature:
0f9de62fce790f9a083d5c99e95740ceb90c27ed
好了 我们已经看到了 获得签名需要4个参数,其中timestamp时间戳和url页面完整url都很容易获得,现在就需要获得noncestr随机字符串和jsapi_ticket。
生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取.
好了说了这么多 我们直接来看一段代码实例:
class jsControl{
//$store_id是店铺id用来去数据库中查询这个店铺当前的微信公众号信息,appid,appsecret等信息
/**
*@param int $store_id 店铺id用于到数据库中获取店铺微信公众号的配置信息
*@return 返回config接口注入权限验证配置信息
**/
public function getJsConfigInfo($store_id = 0){
if(!$this->checkIsInWeixin()){
return [];
}
if(!$store_id){
$store_id = intval($_SESSION['store_member_info_ID'] ?: ($_SESSION['route_store_id'] ?: ($_GET['store_id'] ?: $_SESSION['store_id'])));
}
if(empty($store_id)){
return [];
}
$store_info = Model()->table('store_wxinfo')->where(['store_id' => $store_id])->find();//查询店铺公众号配置信息
if(empty($store_info)){
return [];
}
$tickets = $this->get_jsapi_ticket($store_info['store_id'], $store_info['appid'], $store_info['appsecret']);
if(empty($tickets)){
return [];
}
$nonceStr = $this->getNonceStr();
$timestamp = TIMESTAMP;
$url = $this->getSelfLink();
$string1 = "jsapi_ticket={$tickets}&noncestr={$nonceStr}×tamp={$timestamp}&url={$url}";
$signature = sha1($string1);
return [
'debug' => false,
'appId' => $store_info['appid'],
'timestamp' => $timestamp,
'nonceStr' => $nonceStr,
'signature' => $signature,
'jsApiList' => ['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone','startRecord','stopRecord','onVoiceRecordEnd','playVoice','pauseVoice','stopVoice','onVoicePlayEnd','uploadVoice','downloadVoice','chooseImage','previewImage','uploadImage','downloadImage','translateVoice','getNetworkType','openLocation','getLocation','hideOptionMenu','showOptionMenu','hideMenuItems','showMenuItems','hideAllNonBaseMenuItem','showAllNonBaseMenuItem','closeWindow','scanQRCode','chooseWXPay','openProductSpecificView','addCard','chooseCard','openCard']
];
} public function getSelfLink(){
$protocol = strpos(strtolower($_SERVER['SERVER_PROTOCOL']), 'https') !== false ? 'https://' : 'http://';
$host = $protocol . $_SERVER['HTTP_HOST'];
$url = $host . $_SERVER['REQUEST_URI'];
return $url;
}
public function getNonceStr(){
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$str = '';
for ($i = 0; $i < 16; $i++) {
$str .= $chars{mt_rand(0, strlen($chars) - 1)};
}
return $str;
}
public function _get_access_token($store_id,$appid,$appsecret){
$token = rkcache("access_token_$store_id");
if(!empty($token)){
$token = unserialize($token);
}else{
$token = array();
}
if(empty($token) || time()-$token['create_time'] > 7200){
$uri = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$appsecret;
$token = curl($uri);
$token = json_decode($token,true);
if(!isset($token['access_token']) || empty($token['access_token'])){
return '';
}
$token['create_time']=time();
wkcache("access_token_$store_id",serialize($token));
}
return $token['access_token'];
}
function get_jsapi_ticket($store_id,$appid,$appsecret) {
$tickets = rkcache("jsapi_ticket_$store_id");
if ($tickets) {
$tickets = unserialize($tickets);
}
if (empty($tickets) || time() - $tickets['create_time'] >= 7200) {
$access_token = $this->_get_access_token($store_id,$appid,$appsecret);
if ('' == $access_token) {
return '';
}
$uri = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=' . $access_token . '&type=jsapi';
$tickets = curl($uri);
$tickets = json_decode($tickets, true);
if (empty($tickets['ticket'])) {
return '';
}
$tickets['create_time'] = time();
wkcache("jsapi_ticket_$store_id", serialize($tickets));
}
return $tickets['ticket'];
} protected function checkIsInWeixin() {
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false) {
return true;
}
return false;
} }
给出一个前端js调用的方法:
<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<script type="javascript/text" > var wx_data = <?php echo json_encode($output['jsapi_config']); ?>;
var member_info = <?php echo json_encode($output['member_info']);?>;
var goods_img = $("#goods_img").find("img").attr("src");
wx.config(wx_data);
if($.isEmptyObject(wx_data.appId)){
alert('请在微信中打开分享');
}
var sharedata = {
title : "<?php echo $output['goods_info'][0]['goods_name'];?>",
desc :'你的朋友:' + member_info.member_name + ' 给你分享了好商品,快来看看吧',
imgUrl : goods_img,
link :"<?php echo $output['link_url']; ?>",
success: function(){
},
cancel: function(){
}
};
wx.ready(function () {
wx.onMenuShareAppMessage(sharedata);
wx.onMenuShareTimeline(sharedata);
});
</script>
总结一下:
通过config接口注入权限验证配置:
var config_info = {};
config_info对象中需要的属性有5个 :
1获取qppid,2获取生成签名的时间戳(timestamp),3获取生成签名的随机字符串(noncestr),4获取签名(signature),5调动的接口列表。
其中获取签名需要4个参数:1随机字符串noncestr,2时间戳(timestamp),3调用票据jsapi_ticket,4当前页面完整url
其中获取调用票据jsapi_ticket需要一个携带access_token的请求获取:https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
所以完整的流程就是:库中查询appid,appsecret,然后获取access_token,通过access_token获取票据jsapi_ticket,得到票据jsapi_ticket后生成签名,然后完成全线验证配置
原创作品,转载请注明出处!
php 微信JS-SDK封装类的更多相关文章
- 实战微信JS SDK开发:贺卡制作与播放(1)
前段时间忙于CanTK 2.0的开发,所以博客一直没有更新.CanTK 2.0主要增强了游戏和富媒体的开发,现在编码和测试基本完成了,等文档完成了再正式发布,里面有不少激动人心的功能,等发布时再一一细 ...
- 微信JS SDK接入的几点注意事项
微信JS SDK接入,主要可以先参考官网说明文档,总结起来有几个步骤: 1.绑定域名:先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”.备注:登录后可在“开发者中心”查看对 ...
- 微信js sdk上传多张图片
微信js sdk上传多张图片,微信上传多张图片 该案例已tp3.2商城为例 直接上代码: php代码: public function ind(){ $appid="111111111111 ...
- 调用微信js sdk
场景:需要调用微信获取当前位置的借口. 途径:查看微信 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115 .后 ...
- 微信JS SDK配置授权,实现分享接口
微信开放的JS-SDK面向网页开发者提供了基于微信内的网页开发工具包,最直接的好处就是我们可以使用微信分享.扫一扫.卡券.支付等微信特有的能力.7月份的时候,因为这个分享的证书获取问题深深的栽了一坑, ...
- 微信js SDK接口
微信JS-SDK说明文档 http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html 一.微信登录功能 在进行微信OAut ...
- 微信JS SDK使用权限签名算法
jsapi_ticket 生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时票据.正常情况下,jsapi_ticket的有效期为7200秒, ...
- 微信js sdk分享开发摘记java版
绑定域名和引入js的就不说了 废话不说直接上代码 public void share(HttpServletRequest request) throws Exception { StringBuff ...
- 微信js sdk动态引用
一般情况下,微信的js-sdk只需要直接引用script即可 <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js&qu ...
- 微信JS SDK Demo 官方案例[转]
摘要: 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以直接使用 ...
随机推荐
- [问与答]怎样在 Android Stuido中删除一个project
sof Remove Project from Android Studio 问 第一次用Android Stuido,建立一个项目,却不知道怎么删除? 答 大概有3种方式 方式一 (简单实用) 点击 ...
- 【linux】mkfifo 命令创建命名管道实现进程之间通信
mkfifo 命令 mkfifo命令创建一个FIFO特殊文件,是一个命名管道(可以用来做进程之间通信的桥梁) 管道也是一种文件,一般是linux中的一个页大小,4k,管道数据一旦被读取就没了.(管道大 ...
- 基于Retrofit2.0+RxJava+Dragger2实现不一样的Android网络构架搭建(转载)
转载请注明出处:http://blog.csdn.net/finddreams/article/details/50849385#0-qzone-1-61707-d020d2d2a4e8d1a374a ...
- 用m4 macros创建文本文件
用m4 macros创建文本文件 原文链接: http://ldp.linux.no/linuxfocus/ChineseGB/September1999/article111.html 补充阅读 ...
- 命令行界面的C/S聊天室应用 (Socket多线程实现)
命令行界面即在Eclipe控制台输入数据. 服务器端包含多个线程,每个Socket对应一条线程,该线程负责读取对应输入流的数据(从客户端发送过来的数据),并将读到的数据向每个Socket输出流发送一遍 ...
- 【一天一道LeetCode】#16. 3Sum Closest
一天一道LeetCode系列 (一)题目: Given an array S of n integers, find three integers in S such that the sum is ...
- Gradle 1.12用户指南翻译——第二十五章. Scala 插件
其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...
- "《算法导论》之‘排序’":线性时间排序
本文参考自一博文与<算法导论>. <算法导论>之前介绍了合并排序.堆排序和快速排序的特点及运行时间.合并排序和堆排序在最坏情况下达到O(nlgn),而快速排序最坏情况下达到O( ...
- Myexclipse创建Junit测试
. 下载JUnit的jar文件,下载地址在这里 2. 在MyEclipse中新建一个要测试的项目HelloJUnit 3. 添加一个要测试的类HelloJUnit,代码如下,注意需要先建package ...
- 第一个Polymer应用 - (3)使用数据绑定
原文链接: Step 3: Using data binding翻译日期: 2014年7月7日翻译人员: 铁锚我们创建的个人信息卡还算漂亮,但对整个应用来说,只有一张卡片看起来有点空荡荡的感觉.在本节 ...