公众号js-sdk简
后台代码
jssdk.PHP——因sae的不可写环境,故需要将accesstoken和JsApiTicket存入数据库。
数据库字段:id(int 3),accesstoken(string 255),lasttime(int 10)
- <?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 一定要动态获取,不能 hardcode.
- $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
- $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
- $timestamp = time();
- $nonceStr = $this->createNonceStr();
- // 这里参数的顺序要按照 key 值 ASCII 码升序排序
- $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$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() {
- $accessToken = $this -> getAccesstoken();
- $lastAT = M('accesstoken')->find(2);//1:token;2:ticket
- if(!$lastAT){
- M('accesstoken') -> add(array('id'=>2,'accesstoken'=>'null','lasttime'=>0));
- $lastAT['lasttime'] = 0;
- }
- $ticket = $lastAT['accesstoken'];
- $now = NOW_TIME;
- $timecha = $now - $lastAT['lasttime'];
- if($timecha >= 7200){
- // $url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?' . http_build_query ( $param );
- // $content = file_get_contents ( $url );
- // $content = json_decode ( $content, true );
- // 如果是企业号用以下 URL 获取 ticket
- // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";
- $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=".$accessToken;
- $res = json_decode($this->httpGet($url));
- $ticket = $res->ticket;
- $data['accesstoken'] = $ticket;
- $data['lasttime'] = NOW_TIME;
- M('accesstoken')->where(array('id'=>2))->save($data);
- }
- return $ticket;
- }
- //sae无法写入操作,改从数据库获取
- private function getAccessToken() {
- $param['grant_type'] = 'client_credential';
- $param['appid'] = C("APPID");
- $param['secret'] = C("SECRET");
- $lastAT = M('accesstoken')->find(1);
- $accesstoken = $lastAT['accesstoken'];
- if(!$lastAT){
- M('accesstoken') -> add(array('id'=>1,'accesstoken'=>'null','lasttime'=>0));
- $lastAT['lasttime'] = 0;
- }
- $now = NOW_TIME;
- $timecha = $now - $lastAT['lasttime'];
- if($timecha >= 7200){
- $url = 'https://api.weixin.qq.com/cgi-bin/token?' . http_build_query ( $param );
- $content = file_get_contents ( $url );
- $content = json_decode ( $content, true );
- $data['accesstoken'] = $content['access_token'];
- $data['lasttime'] = NOW_TIME;
- M('accesstoken')->where(array('id'=>1))->save($data);
- $accesstoken = $content['access_token'];
- }
- $lastAT = M('accesstoken')->find(1);
- return $accesstoken;
- }
- private function httpGet($url) {
- $curl = curl_init();
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($curl, CURLOPT_TIMEOUT, 500);
- // 为保证第三方服务器与微信服务器之间数据传输的安全性,所有微信接口采用https方式调用,必须使用下面2行代码打开ssl安全校验。
- // 如果在部署过程中代码在此处验证失败,请到 http://curl.haxx.se/ca/cacert.pem 下载新的证书判别文件。
- curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
- curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
- curl_setopt($curl, CURLOPT_URL, $url);
- $res = curl_exec($curl);
- curl_close($curl);
- return $res;
- }
- private function get_php_file($filename) {
- return trim(substr(file_get_contents($filename), 15));
- }
- private function set_php_file($filename, $content) {
- $fp = fopen($filename, "w");
- fwrite($fp, "<?php exit();?>" . $content);
- fclose($fp);
- }
- }
如果你的服务器是可写环境,可以使用官方提供的包。
前台文件
可以使用include将此文件包含在需要页面
- <?php
- include('jssdk.php');
- $jssdk = new JSSDK(C('APPID'), C('SECRET'));
- if(isWeixinBrowser()){
- $signPackage = $jssdk->GetSignPackage();
- }
- ?>
- <script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
- <script>
- wx.config({
- debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
- appId: '<?php echo $signPackage["appId"];?>', // 必填,公众号的唯一标识
- timestamp: <?php echo $signPackage["timestamp"];?>, // 必填,生成签名的时间戳
- nonceStr: '<?php echo $signPackage["nonceStr"];?>', // 必填,生成签名的随机串
- signature: '<?php echo $signPackage["signature"];?>',// 必填,签名,见附录1
- jsApiList: [
- 'checkJsApi',
- 'onMenuShareTimeline',
- 'onMenuShareAppMessage',
- 'onMenuShareQQ',
- 'onMenuShareWeibo'
- ] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
- });
- wx.ready(function () {
- // 1 判断当前版本是否支持指定 JS 接口,支持批量判断
- wx.checkJsApi({
- jsApiList: [
- 'getNetworkType',
- 'previewImage',
- 'onMenuShareTimeline',
- 'onMenuShareAppMessage',
- 'onMenuShareQQ',
- 'onMenuShareWeibo'
- ],
- /* success: function (res) {
- alert(JSON.stringify(res));
- } */
- });
- var shareData = {
- title: document.title,
- <notempty name="page_title">
- desc: '我在'+'{:C('WEB_SITE_TITLE')}'+'发现了非常不错的宝贝:'+'{$page_title}'+'快来看看吧!',
- <else/>
- desc: '我发现了个很不错的商城'+'{:C('WEB_SITE_TITLE')}'+'快来看看吧!',
- </notempty>
- link: window.location.href,
- <notempty name="page_title">
- imgUrl: document.getElementById("detail_img").src,
- <else/>
- imgUrl: '{:get_cover(get_cover_id(34),'path')}',
- </notempty>
- /* trigger: function (res) {
- alert('用户点击发送给朋友');
- }, */
- success: function (res) {
- alert('感谢您的分享');
- },
- cancel: function (res) {
- alert('请主公三思,分享一下吧(ㄒoㄒ)~~');
- },
- 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>
出处:blog.csdn.NET/afanxingzhou
公众号js-sdk简的更多相关文章
- SAE微信公众号PHP SDK, token一直验证失败
用的是SAE,创建的是微信公众号PHP SDK框架,里面example文件夹下有server.php用来验证token的.但是问题来了,无论我怎么输入URL和token,一直告诉我token验证失败. ...
- VopSdk一个高逼格微信公众号开发SDK(源码下载)
看之前回复很多说明大家很有热情&文章被误删掉了,不想让有的朋友错失这个高逼格的东西,现在重新发布,这次就直接放出源码,文章最末下载地址. 看之前回复很多说明大家很有热情&文章被误删掉了 ...
- VopSdk一个高逼格微信公众号开发SDK:自动化生产(装逼模式开启)
VopSdk一个高逼格微信公众号开发SDK(源码下载) VopSdk一个高逼格微信公众号开发SDK:自动化生产(装逼模式开启) 针对第一版,我们搞了第二版本,老规矩先定个目标. 一 我们的目标 a.移 ...
- 最新微信公众平台js sdk整合PHP版
由于没有持续关注微信公众平台相关的开发,所以看到这个东西时,都没有耐心看完开发文档,或者不知道重点. 重点在哪呢?重点在示例代码:http://mp.weixin.qq.com/wiki/7/aaa1 ...
- 微信JS-SDK]微信公众号JS开发之卡券领取功能详解
js sdk: http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E9.99.84.E5.BD.952-.E6 ...
- VopSdk一个高逼格微信公众号开发SDK
一.我们的目标 分离基础参数和业务参数. 具有高重用和扩展性. 轻量级. 二.实现目标 (一)分离基础参数和业务参数 仔细分析所有接口,抽离出每个模块接口的公共参数. A.针对微信公众号所有接口分析( ...
- 微信支付-小程序H5 公众号 Payment SDK
前言 今天是2020年一天,去年最后一个月开发了订单和支付系统,尤其在支付系统和微信对接的时候遇到了很多坑,这里给大家总结下,以免大家遇到相同的问题还浪费大量时间 微信支付前期准备 微信商户号,需要商 ...
- 如何站在使用者的角度来设计SDK-微信公众号开发SDK(消息处理)设计之抛砖引玉
0.SDK之必备的基本素质 在项目中免不了要用到各种各样的第三方的sdk,在我现在的工作中就在公司内部积累了各种各样的的公共库(基于.net的,基于silverlight的等等),托管到了内部的nug ...
- 微信公众号 - js传入时间戳换算(以前几天、几小时...)
// 获取当前时间戳 function timestamps() { return Math.round(new Date().getTime() / 1000).toString() } // 距离 ...
- 微信JS SDK接入的几点注意事项
微信JS SDK接入,主要可以先参考官网说明文档,总结起来有几个步骤: 1.绑定域名:先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”.备注:登录后可在“开发者中心”查看对 ...
随机推荐
- Linux 之rsyslog+LogAnalyzer 日志收集系统
一.LogAnalyzer介绍 LogAnalyzer工具提供了一个易于使用,功能强大的前端,用于搜索,查看和分析网络活动数据,包括系统日志,事件日志和其他许多日志源.由于它只是将数据展示到我们用户的 ...
- 3.docker学习之docker与虚拟化
虚拟化技术是一个总称,是一系列实现虚拟技术的统称.从广义上来说,虚拟化技术包括了虚拟机技术和容器技术, 所谓虚拟化技术最大的特点就是将一个真实的机器进行虚拟地分割,然后分割出来的部分可以独立使用 ...
- centos 安装php7
yum安装php7 删除之前的版本 # yum remove php* rpm 安装 Php7 相应的 yum源 CentOS/RHEL 7.x: # rpm -Uvh https://dl.fedo ...
- 四、jenkins+postman+newman环境搭建
前提: 搭建环境之前需要先理清楚各个环境的依赖关系,jenkins只支持windows命令行跟linux shell环境执行构建命令,而postman的测试脚本不能直接在命令行或shell环境执行,p ...
- 好记性不如烂笔头-Mysql查找如何判断字段是否包含某个字符串
好记性不如烂笔头-Mysql查找如何判断字段是否包含某个字符串 利用mysql 字符串函数 find_in_set(); SELECT * FROM users WHERE find_in_set(' ...
- 函数~匿名方法~lambda的逐渐过渡思想
前提:基于委托实现 (1)使用函数名称 delegate void Printer(string s);//(1)申明委托 static void Main(string[] args) { //(3 ...
- [Z] SVN的trunk、branch、tag
Subversion有一个很标准的目录结构,是这样的.比如项目是proj,svn地址为svn://proj/,那么标准的svn布局是 svn://proj/|+-trunk+-branches+-ta ...
- Linux运维跳槽必备的40道面试精华题
过一次年,结婚.存款.父母养老,一系列向钱看的事都在碾压我们本来还挺简单的神经,但难过没有出路,唯有找到好的方法和事业方向,才能实现一步一个脚印的逆袭. 下面是一名资深Linux运维求职数十家公司总结 ...
- 如何将Excel日期快速转化为文本格式?
Excel表中日期格式其实是数值,有时候需要原样转成文本,有时候也要将文本转成日期. 我发现了一个方法,估计是最快的了.不需要用那一堆year() month()之类的函数. 快速将日期格式转化为文本 ...
- Mysql合并两列数据
实例: UPDATE x_yiyuanpinggu_nengli SET ch_yuzhongfangxiang = CONCAT(ch_yuanyuzhong,ch_mubiaoyuzhong) M ...