微信公众号H5页面开发–微信JS-SDK引用

微信提供了微信公众号开发者手册,官方地址:https://mp.weixin.qq.com/

公众号内许多复杂的业务场景,都是通过网页形式来提供服务,这时需要用到: 微信JS-SDK。以地理位置接口为例进行阐述。

写在前面 非常重要!
  • 微信公众号接口必须以http://或https://开头,分别支持80端口和443端口。
  • 由于微信7.0版本升级了对https的安全限制,在微信7.0版本及以上版本使用http协议访问定位组件会导致定位失败。尤其是安卓,所以必须升级https。

1. 域名绑定

微信公众号请求网页授权之前,开发者需要先登记授权回调域名。
注意:这里填写的是域名,且为全域名。授权后该域名下的其他页面都可以授权,例如:www.qq.com为回调域名,配置以后此域名下面的页面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以进行OAuth2.0鉴权。
官方:微信公众平台 >> 微信网页开发 >> 微信网页授权

2.js文件引入

官方:
在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.4.0.js
如需进一步提升服务稳定性,当上述资源不可访问时,可改访问:http://res2.wx.qq.com/open/js/jweixin-1.4.0.js (支持https)。
备注:支持使用 AMD/CMD 标准模块加载方法加载

3.通过config接口注入权限验证配置信息

所有引用微信JS-SDK的页面都需要提供权限验证信息,否则无法调用。同样的URL只需要配置一次即可,URL发生变化时需要重新调用配置信息进行验证。

wx.config({debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。appId: '', // 必填,公众号的唯一标识timestamp: , // 必填,生成签名的时间戳nonceStr: '', // 必填,生成签名的随机串signature: '',// 必填,签名jsApiList: [] // 必填,需要使用的JS接口列表
});

这里涉及到两类配置信息的获取,一类是appId所属的公众号标识类配置信息,另一类是签名。JS接口列表可以根据需求在微信公众平台附录中获取。这里所写的是两个地理接口的相关js接口:
jsApiList: ['openLocation','getLocation'] // 必填,需要使用的JS接口列表

  1. 公众号标识
    微信提供了微信公众帐号测试号,绑定个人微信号即可使用。申请地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
    进入后,第一行就提供了appID和appsecret。不同微信号绑定的微信公众测试号提供的appID和appsecret不同,如果多人参与开发,要注意区分。

接口配置信息主要用于消息接口的配置。公众号是以微信用户的一个联系人形式存在的,消息会话是公众号与用户交互的基础。在这里填写的URL主要用于接收用户信息,进行业务操作后返回信息,没有单独的页面链接。如果不是H5开发的话这里可以空着不写。

这里填写的域名就是上面1点提到的回调域名绑定授权,具体请看上面1. 域名绑定

  1. 签名配置信息获取

生成签名之前,我们要先获取两个参数:access_token 和 jsapi_ticket 。这两个参数的有效期为7200秒,所以一般是放在全局变量中。
官方:微信公众平台 >> 开始开发 >> 获取access_token

接口调用请求说明:

https请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

 public static String getAccessToken(String appId, String secret, String accessTokenUrl) {HttpClient client = HttpClients.createDefault();  // 获得Http客户端(可以理解为:你得先有一个浏览器;注意:实际上HttpClient与浏览器是不一样的)HttpGet get = new HttpGet(MessageFormat.format(accessTokenUrl,appId,secret));// 创建Get请求try {String accessToken = (String) CacheUtil.get("wxCache", "accessToken");//这里把accessToken放在全局变量中,通过CacheUtil缓存工具类判断accessToken是否失效if (StringUtils.isBlank(accessToken) || StringUtils.isEmpty(accessToken)) {HttpResponse response = client.execute(get);// 由客户端执行(发送)Get请求HttpEntity entity = response.getEntity();// 从响应模型中获取响应实体String result = EntityUtils.toString(entity, "UTF-8");Map<String, Object> accessTokenMap = JSON.parseObject(result);accessToken = (String)accessTokenMap.get("access_token");//将响应实体进行编码转换CacheUtil.put("wxCache", "accessToken", accessToken);//将accessToken存入缓存变量中}return accessToken;} catch (ClientProtocolException e) {log.error(e.getMessage());} catch (IOException e) {log.error(e.getMessage());}return  null;}

用同样的get请求方法,获得jsapi_ticket。与access_token性质相似,有效期为7200秒,建议放在全局变量中,便于下次请求的时候判断是否仍在有效期内。

public static String getTicket(String accessToken,String ticketUrl) {HttpClient client = HttpClients.createDefault();HttpGet get = new HttpGet(MessageFormat.format(ticketUrl,accessToken));try {String ticket = (String) CacheUtil.get("wxCache", "jsapi_ticket");if (StringUtils.isBlank(ticket) || StringUtils.isEmpty(ticket)) {HttpResponse response = client.execute(get);HttpEntity entity = response.getEntity();String result = EntityUtils.toString(entity, "UTF-8");Map<String, Object> jsApiTicketMap = JSON.parseObject(result);ticket = (String)jsApiTicketMap.get("ticket");CacheUtil.put("wxCache", "jsapi_ticket", ticket);}return ticket;} catch (ClientProtocolException e) {log.error(e.getMessage());} catch (IOException e) {log.error(e.getMessage());}return null;
}

获得jsapi_ticket之后,就可以生成JS-SDK权限验证的签名了。
签名生成规则如下:
参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。

//生成时间戳和随机字符串String noncestr = UUID.randomUUID().toString().replace("-", "").substring(0, 16);String timestamp = String.valueOf(System.currentTimeMillis() / 1000);

时间戳和随机字符串都是随机生成的,但是随机生成规则不同,注意区分。

 //获取urlString url = pathUrl;

url必须与用户进入页面的url相同,从前台传入,防止因为参数不同而引起的url不同,从而获取签名失败。
对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1:

 //将参数排序并拼接字符串String sortString = WeChatCommonUtil.sort(url, timestamp, ticket, noncestr);/*** @Param [signature, timestamp, ticket, echostr]* @Return java.lang.String* @Description: 对所有待签名参数按照字段名的ASCII 码从小到大排序*/public static String sort(String url, String timestamp, String ticket, String noncestr) {return "jsapi_ticket=" + ticket + "&noncestr=" + noncestr + "&timestamp=" + timestamp + "&url=" + url;}

对string1进行sha1签名,得到signature:

至此,得到权限验证配置所有信息。

4.通过ready接口处理成功验证

以下步骤官网都有参考:

wx.ready(function(){
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作.
// 所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。
// 对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
});

这里没有写到error接口,不够严谨。

wx.error(function(res){
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
});

5.判断当前客户端版本是否支持指定JS接口

wx.checkJsApi({
jsApiList: [‘chooseImage’], // 需要检测的JS接口列表
success: function(res) {
// 以键值对的形式返回,可用的api值true,不可用为false
// 如:{“checkResult”:{“chooseImage”:true},“errMsg”:“checkJsApi:ok”}
}
});

需要检测的JS接口与config中填写的 jsApiList 基本一致。
config信息验证后,才会调用ready方法,所以将checkJsApi放在ready方法中执行。

6.参考官方文档调用所需接口

使用微信内置地图查看位置接口:用于打开导航地图,获取目的地坐标定位。

wx.openLocation({
latitude: , // 纬度,浮点数,范围为90 ~ -90
longitude: , // 经度,浮点数,范围为180 ~ -180。
name: ’ ', // 位置名
address: ’ ', // 地址详情说明
scale: 1, // 地图缩放级别,整形值,范围从1~28。默认为最大
infoUrl: ‘’ // 在查看位置界面底部显示的超链接,可点击跳转
});

获取地理位置接口:主要用于获取自身坐标定位。

wx.getLocation({
type: ‘wgs84’, // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入’gcj02’
success: function (res) {
var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
var speed = res.speed; // 速度,以米/每秒计
var accuracy = res.accuracy; // 位置精度
}
});

注意:两个接口的经纬度都是浮点数类型,否则无法调用。

总结:获取微信配置信息验证的步骤比较复杂,必须没有误差,同时要考虑配置信息具有时效性,重复获取以及放在全局变量中。调用接口的代码文档官方都有提供,可以参考。

wx.ready(function () {// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作.// 所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。// 对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。wx.checkJsApi({jsApiList: ['checkJsApi', 'openLocation', 'getLocation'], // 需要检测的JS接口列表,所有JS接口列表见附录2,success: function (res) {// 以键值对的形式返回,可用的api值true,不可用为false// 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}}});wx.getLocation({type: 'gcj02', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'dataType: "json",success: function (res) {var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。var speed = res.speed; // 速度,以米/每秒计var accuracy = res.accuracy; // 位置精度}});$(".nav-to").on ('click','a',function () {wx.openLocation({latitude: parseFloat($(".nav-to").attr("lat")), // 纬度,浮点数,范围为90 ~ -90longitude:parseFloat($(".nav-to").attr("lng")), // 经度,浮点数,范围为180 ~ -180。name: $(".nav-to").attr("name"), // 位置名address: '', // 地址详情说明scale: 10, // 地图缩放级别,整形值,范围从1~28。默认为最大infoUrl: '' // 在查看位置界面底部显示的超链接,可点击跳转});});
});

后续补充:
事实证明我真是too young too native = =

背景交代 与真正的公众号进行对接(以上都是用微信提供的测试公众号)时,除了以上步骤还有其他验证是在测试公众号上所不需要的,在此remark一下。

7.设置IP白名单


根据要求把服务器的IP加入到IP白名单中,这样就不会被拦截了。

8.设置JS接口安全域名


注意:确保可以访问!!!
不管是根目录还是路径目录,都要确保通过所填写的域名都可以访问到这个文件。同时微信所访问的其他路径也需要在这个路径目录下。
踩坑记录:如果程序设置了权限认证,则要记得放开认证,否则永远也无法访问到。

微信公众号H5页面开发--微信JS-SDK引用相关推荐

  1. 微信公众号H5页面开发怎么获取用户openid

    微信公众号里会嵌套h5页面然后跳转,有时候我们就需要用到用户的openid,今天就为大家介绍一下公众号h5页面怎么获取openid 首先,需要用到公众号的appid,其次需要去公众号里配置好h5页面的 ...

  2. RTFM:腾讯微信公众号H5页面使用微信支付爬坑记

    一. 微信公众号支付的流程 公众号的页面会在微信环境下打开,所以默认已经有登录态.openID.AppID.AppSecret 都能拿到,申请开通商家支付之后会有 PayKey 和 mch_id (商 ...

  3. 前端实现微信公众号h5页面跳转小程序-成功案例

    微信公众号h5页面跳转小程序-成功案例 微信公众号h5页面跳转小程序-成功案例,标题已经明确说明,h5页面可以正常跳转微信小程序 官网说可以,不是我说的 文章目录 微信公众号h5页面跳转小程序-成功案 ...

  4. 微信公众号h5页面跳转小程序

    微信公众号h5页面跳转小程序 文章目录 微信公众号h5页面跳转小程序 前言 一.注意 二.使用步骤 步骤一:绑定域名 步骤二:引入环境 步骤三:初始配置 前言 问:h5 页面可以跳转至微信小程序吗? ...

  5. 利用python生成微信h5_Python + Appium 微信公众号 H5 页面自动化测试

    本文内容在以下环境运行成功: Windows10 Python2.7 android-sdk_r24.4.1 Appium-windows-1.15.1 chromedriver_2.40 小米手机 ...

  6. 微信公众号H5页面支付JSAPI

    1:在微信环境下,我们需要获取到code,拿code去获取openid,在获取openid的时候有2种参数分别是:snsapi_base和snsapi_userinfo,snsapi_base只为获取 ...

  7. 微信公众号H5页面获取用户昵称头像等信息(Java)

    H5页面获取微信用户信息操作流程 (一)获取微信权限,由微信用户确认 (二)获取相应的ACCESS_TOKEN和OPENID信息 (三)根据ACCESS_TOKEN和OPENID信息获取相应的用户信息 ...

  8. 微信公众号H5页面实现扫一扫功能

    uniappH5实现扫一扫功能 最近遇到一个需求,H5页面使用扫码绑定设备功能,因为uniapp uni.scanCode API H5不支持,网上找了很多方案不合适,因为这个项目是在公众里面运行的, ...

  9. 微信公众号h5页面禁止用户调整字体大小

    微信公众号内 h5页面,使用计算后的单位 rem 时,用户调整字体大小会导致页面字体.元素的宽高变大活变小,导致页面布局错乱 使其拖拽后禁止修改页面基础字体大小 this.prohibitAndroi ...

最新文章

  1. 小狗钱钱_✅每次构建待办事项列表应用程序时,都会有一只小狗? 死了?
  2. Linux网站服务Apache+php+mysql的安装
  3. python pandas读取txt文件_python Pandas 读取txt表格的实例
  4. 「区块链+人工智能」:来自谷歌、IBM、百度的真实案例
  5. Mac下搭建react及bable
  6. 浪潮之巅--蓝色巨人读后感
  7. 多位大厂专家鼎力推荐,44个微服务架构设计模式pdf,程序员福利
  8. java 间接引用_Java中的四种引用方式的区别
  9. latex排版--插入符号数学公式常见问题
  10. 刘夏真的简历中国科学院计算机所,刘夏_广西医科大学研究生导师信息
  11. 史上最全面试题汇总,没有之一,不接受反驳
  12. 实现74LVC161的计数器功能
  13. End-to-End Object Detection with Fully Convolutional Network 论文笔记
  14. Java获得随机数的几种方法
  15. 高校社团管理系统jsp和javabean开发
  16. vue和socket.io开发简单web聊天室
  17. ad域控查看ldap端口命令_工作笔记(一)LDAP和AD介绍以及使用LDAP操作AD域
  18. 灵魂拷问:31岁拿了阿里P6的offer,要去吗?
  19. Live800:全渠道智能客服系统,助力企业打造全渠道客户中心
  20. freemarker ftl java_通过springframework的mvc返回freemarker的ftl文件ModelAndView模板内容代码示例...

热门文章

  1. 推荐本地远程连接服务器软件 | Xshell 和 Xftp 安装
  2. img图片加载出错处理
  3. 潇 洒 女 兵 分 解
  4. [备忘] 使用UltralSO制作Ubuntu的U盘启动盘
  5. 【Simulation】2 Elements of Probability-双样本均值方差的讨论
  6. java计算机毕业设计Web产品管理系统源码+mysql数据库+系统+lw文档+部署
  7. 微光图像增强的零参考深度曲线估计
  8. 世界经典英语广告词欣赏
  9. matlab gui学生成绩管理系统源码,matlab GUI 学生成绩管理系统.doc
  10. FFMPEG NVIDIA硬件加速总结