[TOC]
# 什么是JSSDK
就是微信帮助我们完成的JS一个工具的封装,直接调用这些接口就可以完成相应的功能。
作用:
* 自定义分享的链接(此链接也是有规定,如公众后台设置有效域名一致)
* 调用一些手机底层应用,摄像头,获取网络制式
开发5步骤:
* 平台绑定授权域名
* 引入公众平台jssdk的js文件
* 根据官方签名算法编写出对就的签名字符串
* 设置前台script中的config接口配置注入权限验证
* 通过前台script中的接口提供的ready方法处理成功验证
# JSSDK绑定域名
在开发测试平台添加绑定域名
![](https://box.kancloud.cn/bdd9b5df5206a2842be10b3cdfeb2129_750x138.png)
一定要添加上授权域名,不然不能进行下一步的操作
# JSSDK使用步骤
## 引入js文件
![](https://box.kancloud.cn/a039d4880cfd275cd4f492c813e2775f_858x169.png)
![](https://box.kancloud.cn/e7cc6f386bbb3e470af188f067f95583_626x186.png)
## 生成签名算法
### 得到jsapi_ticket
![](https://box.kancloud.cn/18588162e333e151c759c9d321f6b777_621x206.png)
在主动模式那写
~~~
// 得到jsapi_ticket
public function getTicket(){
$url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token='.$this->getAccessToken();
//http_request是封装的
$json = $this->http_request($url);
$arr = json_decode($json,true);
//这就是jsapi_ticket
// echo $arr['ticket'];
return $arr['ticket'];
}
~~~
我们主动访问这个方法
## 生成签名
![](https://box.kancloud.cn/940de0acde14a7777f8bf90f55419414_1072x489.png)
~~~
// 生成随机字符串
private function noncestr(int $len = 16)
{
$str = 'abcdefghigklmfsafjw;fjwefwefh';
$str = md5($str);
$str = str_shuffle($str);
return substr($str, 0, $len);
}
// 获取当前的url地址
private function getCurrentUrl()
{
//$_SERVER['REQUEST_SCHEME']只在部分环境里被支持
// return $_SERVER['REQUEST_SCHEME'].'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
//添加逻辑,先检测$_SERVER['REQUEST_SCHEME']存不存在isset($_SERVER['REQUEST_SCHEME']),然后不存在的时候怎么处理
return 'http' . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
}
// 完成签名
public function signature()
{
$ticket = $this->getTicket();
$noncestr = $this->noncestr();
$time = time();
$url = $this->getCurrentUrl();
$str = 'jsapi_ticket=%s&noncestr=%s×tamp=%s&url=%s';
$str = sprintf($str, $ticket, $noncestr, $time, $url);
$signature = sha1($str);
// print_r([
// 'appid' => self::APPID,
// 'ticket' => $ticket,
// 'noncestr' => $noncestr,
// 'time' => $time,
// 'url' => $url,
// 'signature' => $signature,
// ]);
return [
'appid' => self::APPID,
'ticket' => $ticket,
'noncestr' => $noncestr,
'time' => $time,
'url' => $url,
'signature' => $signature,
];
}
~~~
~~~
/**
* 主动模式
*/
$wx = new Wechat();
$wx->signature();
~~~
## 通过config接口注入权限验证
![](https://box.kancloud.cn/8aaeb243265b2b51c780ae5250f8d492_1120x237.png)
我们在一个页面中写
~~~
<?php
include '../Wechat.php';
$wx = new Wechat();
$config = $wx->signature();
?>
<!doctype html>
<html lang="zh-Hans">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>砍一刀</title>
<script src = "./js/jweixin-1.4.0.js"></script>
<script>
// 权限配置验证
wx.config({
debug: true, // 开启调试模式,开debug会弹窗,false就看控制台了
appId: '<?php echo $config['appid']; ?>', // 必填,公众号的唯一标识
timestamp: <?php echo $config['time']; ?>, // 必填,生成签名的时间戳
nonceStr: '<?php echo $config['noncestr']; ?>', // 必填,生成签名的随机串
signature: '<?php echo $config['signature']; ?>',// 必填,签名
jsApiList: [ // 权限
] // 必填,需要使用的JS接口列表,我们先不填先看一下
});
</script>
</head>
<body>
</body>
</html>
~~~
我们先不注入权限,我们把调试模式设置为true,false的话就要在控制台看,然后在微信调试工具那,输入这个页面的地址,会看到
![](https://box.kancloud.cn/e6c4644ee1b5ef755648f33fa9e4763f_1098x563.png)
## 通过ready接口处理成功验证
注意要注入权限了
~~~
<?php
include '../Wechat.php';
$wx = new Wechat();
$config = $wx->signature();
?>
<!doctype html>
<html lang="zh-Hans">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>砍一刀</title>
<script src = "./js/jweixin-1.4.0.js"></script>
<script>
// 权限配置验证
wx.config({
debug: false, // 开启调试模式
appId: '<?php echo $config['appid']; ?>', // 必填,公众号的唯一标识
timestamp: <?php echo $config['time']; ?>, // 必填,生成签名的时间戳
nonceStr: '<?php echo $config['noncestr']; ?>', // 必填,生成签名的随机串
signature: '<?php echo $config['signature']; ?>',// 必填,签名
jsApiList: [ // 权限
'onMenuShareAppMessage',
'onMenuShareTimeline',
'chooseImage'
] // 必填,需要使用的JS接口列表
});
// 验证成功后我们要处理的动作
wx.ready(function(){
// 分享给好友
wx.onMenuShareAppMessage({
title: '分享给好友标题', // 分享标题
desc: '享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致', // 分享描述
link: '<?php echo $config['url']; ?>', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl: 'http://ns9aum.natappfree.cc/qrcode.jpg', // 分享图标
type: 'link', // 分享类型,music、video或link,不填默认为link
dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
success: function () {
// 用户点击了分享后执行的回调函数
alert('成功');
}
});
// 自定义分享到朋友圈
wx.onMenuShareTimeline({
title: '自定义分享到朋友圈标题', // 分享标题
link: '<?php echo $config['url']; ?>',
imgUrl: 'http://ns9aum.natappfree.cc/qrcode.jpg', // 分享图标
success: function () {
// 设置成功
alert('分享成功');
}
});
wx.chooseImage({
count: 1, // 默认9
sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
success: function (res) {
var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
alert(localIds);
}
});
});
</script>
</head>
<body>
<h1>微信分享,jssdk</h1>
</body>
</html>
~~~
- 配置
- composer安装
- composer用法
- composer版本约束表达
- phpstorm
- sftp文件同步
- php类型约束
- laradock
- 配置文件缓存详解
- git
- 自定义函数
- 核心概念
- IOC
- 服务提供者
- Facade
- 契约
- 生命周期
- 路由
- 请求
- 命名路由
- 路由分组
- 资源路由
- 控制器路由
- 响应宏
- 响应
- Command
- 创建命令
- 定时任务
- console路由
- 执行用户自定义的定时任务
- artisan命令
- 中间件
- 创建中间件
- 使用中间件
- 前置和后置
- 详细介绍
- 访问次数限制
- 为 VerifyCsrfToken 添加过滤条件
- 单点登录
- 事件
- 创建
- ORM
- 简介
- DB类
- 配置
- CURD
- queryScope和setAttribute
- 查看sql执行过程
- 关联关系
- 一对一
- 一对多
- 多对多
- 远程关联
- 多态一对多
- 多态多对多
- 关联数据库的调用
- withDefault
- 跨模型更新时间戳
- withCount,withSum ,withAvg, withMax,withMin
- SQL常见操作
- 模型事件
- 模型事件详解
- 模型事件与 Observer
- deleted 事件未被触发
- model validation
- ORM/代码片段
- Repository模式
- 多重where语句
- 中间表类型转换
- Collection集合
- 新增的一些方法
- 常见用法
- 求和例子
- 机场登机例子
- 计算github活跃度
- 转化评论格式
- 计算营业额
- 创建lookup数组
- 重新组织出表和字段关系并且字段排序
- 重构循环
- 其他例子
- 其他问题一
- 去重
- 第二个数组按第一个数组的键值排序
- 搜索ES
- 安装
- 表单
- Request
- sessiom
- Response
- Input
- 表单验证
- 简介
- Validator
- Request类
- 接口中的表单验证
- Lumen 中自定义表单验证返回消息
- redis
- 广播事件
- 发布订阅
- 队列
- 守护进程
- redis队列的坑
- beanstalkd
- rabbitmq
- redis队列
- 日志模块
- 错误
- 日志详解
- 数据填充与迁移
- 生成数据
- 数据填充seed
- migrate
- 常见错误
- Blade模板
- 流程控制
- 子视图
- URL
- 代码片段
- Carbon时间类
- 一些用法
- 邮件
- 分页
- 加密解密
- 缓存
- 文件上传
- 优化
- 随记
- 嵌套评论
- 判断字符串是否是合法的 json 字符串
- 单元测试
- 计算出两个日期的diff
- 自定义一个类文件让composer加载
- 时间加减
- 对象数组互转方法
- 用户停留过久自动退出登录
- optional 辅助方法
- 文件下载
- Api
- Dingo api
- auth.basic
- api_token
- Jwt-Auth
- passport
- Auth
- Authentication 和 Authorization
- Auth Facade
- 授权策略
- Gates
- composer包
- debug包
- idehelp包
- image处理
- 验证码
- jq插件
- 第三方登录
- 第三方支付
- log显示包
- 微信包
- xss过滤
- Excel包
- MongoDB
- php操作
- 聚合查询
- 发送带附件邮件
- 中文转拼音包
- clockwork网页调试
- emoji表情
- symfony组件
- swooletw/laravel-swoole
- 常见问题
- 跨域问题
- Laravel队列优先级的一个坑
- cache:clear清除缓存问题
- .env无法读取
- 源码相关基础知识
- __set和__get
- 依赖注入、控制反转和依赖倒置原则
- 控制反转容器(Ioc Container)
- 深入服务容器
- call_user_func
- compact
- 中间件简易实现
- array_reduce
- 中间件实现代码
- Pipeline管道操作
- composer自动加载
- redis延时队列
- 了解laravel redis队列
- cli
- 源码解读
- Facade分析
- Facade源码分析
- IOC服务容器
- 中间件原理
- 依赖注入浅析
- 微信
- 微信公众号
- 常用接收消息
- 6大接收接口
- 常用被动回复消息
- 接口调用凭证
- 自定义菜单
- 新增素材
- 客服消息
- 二维码
- 微信语音
- LBS定位
- 网页授权
- JSSDK
- easywechat
- 小程序
- 小程序配置app.json