微信开发交流群:148540125

欢迎留言、转发、打赏

系列文章参考地址 极速开发微信公众号

项目源码参考地址 点我点我--欢迎Start

查看公众号是否有使用JSSDK的权限

服务号、订阅号可以通过登录微信公众平台查看开发>接口权限

使用JSSDK主要包括

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

2、分享接口(微信认证)

3、图像接口

4、音频接口

5、智能接口(识别语音并返回结果)

6、设备信息(获取网络状态)

7、地理位置

8、界面操作

9、微信扫一扫

10、微信小店(服务号必须通过微信认证)

11、微信卡券 (微信认证)

12、微信支付(服务号必须通过微信认证)

使用JSSDK步骤

官方参考文档

步骤一:绑定域名

先登录微信公众平台进入公众号设置功能设置里填写JS接口安全域名

步骤二:引入JS文件

在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.0.0.js

如需使用摇一摇周边功能,请引入 http://res.wx.qq.com/open/js/jweixin-1.1.0.js

备注:支持使用 AMD/CMD 标准模块加载方法加载

步骤三:通过config接口注入权限验证配置

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

签名算法生成规则

官方参考文档

下面具体来讲讲 开源项目weixin_guide中的封装。

使用的时候只要在Controller方法上添加一个拦截器 JSSDKInterceptor 来实现签名验证再将wx.config需要的参数设置对应的属性在页面上进行获取。

拦截器实现如下:

  1. public class JSSDKInterceptor implements Interceptor{
  2. /**
  3. * 如果要支持多公众账号,只需要在此返回各个公众号对应的 ApiConfig 对象即可 可以通过在请求 url 中挂参数来动态从数据库中获取
  4. * ApiConfig 属性值
  5. */
  6. public ApiConfig getApiConfig() {
  7. ApiConfig ac = new ApiConfig();
  8. // 配置微信 API 相关常量
  9. ac.setToken(PropKit.get("token"));
  10. ac.setAppId(PropKit.get("appId"));
  11. ac.setAppSecret(PropKit.get("appSecret"));
  12. /**
  13. * 是否对消息进行加密,对应于微信平台的消息加解密方式: 1:true进行加密且必须配置 encodingAesKey
  14. * 2:false采用明文模式,同时也支持混合模式
  15. */
  16. ac.setEncryptMessage(PropKit.getBoolean("encryptMessage", false));
  17. ac.setEncodingAesKey(PropKit.get("encodingAesKey",
  18. "setting it in config file"));
  19. return ac;
  20. }
  21. @Override
  22. public void intercept(Invocation inv) {
  23. inv.invoke();
  24. Controller controller = inv.getController();
  25. ApiConfigKit.setThreadLocalApiConfig(getApiConfig());
  26. JsTicket jsApiTicket = JsTicketApi.getTicket(JsApiType.jsapi);
  27. String jsapi_ticket = jsApiTicket.getTicket();
  28. String nonce_str = create_nonce_str();
  29. // 注意 URL 一定要动态获取,不能 hardcode.
  30. String url = "http://" + controller.getRequest().getServerName() // 服务器地址
  31. // + ":"
  32. // + getRequest().getServerPort() //端口号
  33. + controller.getRequest().getContextPath() // 项目名称
  34. + controller.getRequest().getServletPath();// 请求页面或其他地址
  35. String qs = controller.getRequest().getQueryString(); // 参数
  36. if (qs != null) {
  37. url = url + "?" + (controller.getRequest().getQueryString());
  38. }
  39. System.out.println("url>>>>" + url);
  40. String timestamp = create_timestamp();
  41. // 这里参数的顺序要按照 key 值 ASCII 码升序排序
  42. //注意这里参数名必须全部小写,且必须有序
  43. String str = "jsapi_ticket=" + jsapi_ticket +
  44. "&noncestr=" + nonce_str +
  45. "&timestamp=" + timestamp +
  46. "&url=" + url;
  47. String signature = HashKit.sha1(str);
  48. System.out.println("appId " + ApiConfigKit.getApiConfig().getAppId()
  49. + " nonceStr " + nonce_str + " timestamp " + timestamp);
  50. System.out.println("url " + url + " signature " + signature);
  51. System.out.println("nonceStr " + nonce_str + " timestamp " + timestamp);
  52. System.out.println(" jsapi_ticket " + jsapi_ticket);
  53. System.out.println("nonce_str " + nonce_str);
  54. controller.setAttr("appId", ApiConfigKit.getApiConfig().getAppId());
  55. controller.setAttr("nonceStr", nonce_str);
  56. controller.setAttr("timestamp", timestamp);
  57. controller.setAttr("url", url);
  58. controller.setAttr("signature", signature);
  59. controller.setAttr("jsapi_ticket", jsapi_ticket);
  60. }
  61. private static String create_timestamp() {
  62. return Long.toString(System.currentTimeMillis() / 1000);
  63. }
  64. private static String create_nonce_str() {
  65. return UUID.randomUUID().toString();
  66. }
  67. }

在Controller中使用

  1. /**
  2. * 对整个Controller或者其中的方法添加JSSDK签名验证拦截器
  3. */
  4. @Before(JSSDKInterceptor.class)
  5. public class JSSDKController extends Controller{
  6. //@Before(JSSDKInterceptor.class)
  7. public void index(){
  8. render("share.jsp");
  9. }
  10. public void customer(){
  11. render("customer.jsp");
  12. }
  13. public void pic(){
  14. render("pic.jsp");
  15. }
  16. }

JSP页面上面使用

  1. <script type="text/javascript">
  2. wx.config({
  3. debug: true,
  4. appId:'${appId}',
  5. timestamp: '${timestamp}',
  6. nonceStr: '${nonceStr }',
  7. signature: '${signature}',
  8. jsApiList: [
  9. 'checkJsApi',
  10. 'onMenuShareTimeline',
  11. 'onMenuShareAppMessage',
  12. 'onMenuShareQQ',
  13. 'onMenuShareWeibo',
  14. ...
  15. ]
  16. });
  17. </script>

测试结果

在AppConfig 中添加路由me.add("/jssdk", JSSDKController.class,"/view");手机中访问 http://域名[/项目名称]/jssdk ,如果设置了 debug= true 成功了就会弹出

如果出现 {"errorMsg":"config:invalid url domian"} 请检查步骤一:绑定域名 与你访问的域名是否在安全域名列表当中

步骤四:通过ready接口处理成功验证

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

  1. wx.ready(function(){
  2. // 1 判断当前版本是否支持指定 JS 接口,支持批量判断
  3. document.querySelector('#checkJsApi').onclick = function () {
  4. wx.checkJsApi({
  5. jsApiList: [
  6. 'getNetworkType',
  7. 'previewImage'
  8. ],
  9. success: function (res) {
  10. alert(JSON.stringify(res));
  11. }
  12. });
  13. };
  14. //下面就可以写一系列的接口了
  15. ......
  16. });

步骤五:通过error接口处理失败验证

  1. wx.error(function (res) {
  2. alert(res.errMsg);
  3. });

步骤六:接口调用

拦截器具体实现 参考地址 点这里

js 接口调用参考地址 点这里

以上就是JSSDK使用的介绍。

欢迎留言、转发、打赏项目

源码参考地址 点我点我--欢迎Start

微信公众号开发之如何使用JSSDK的更多相关文章

  1. 微信公众号开发《三》微信JS-SDK之地理位置的获取,集成百度地图实现在线地图搜索

    本次讲解微信开发第三篇:获取用户地址位置信息,是非常常用的功能,特别是服务行业公众号,尤为需要该功能,本次讲解的就是如何调用微信JS-SDK接口,获取用户位置信息,并结合百度地铁,实现在线地图搜索,与 ...

  2. 微信公众号开发《三》微信JS-SDK之地理位置的获取与在线导航,集成百度地图实现在线地图搜索

    本次讲解微信开发第三篇:获取用户地址位置信息,是非常常用的功能,特别是服务行业公众号,尤为需要该功能,本次讲解的就是如何调用微信JS-SDK接口,获取用户位置信息,并结合百度地铁,实现在线地图搜索,与 ...

  3. 微信公众号开发--微信JS-SDK分享到朋友圈和分享给朋友

    之前写过一篇使用微信JS-SDK来实现扫一扫功能的博客 微信公众号开发–微信JS-SDK扫一扫功能 在该博客里介绍了微信JS-SDK的基本用法,其中包括以下几个步骤 还详细介绍了通过config接口注 ...

  4. .NET开发者如何愉快的进行微信公众号开发

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:这篇文章只是一个如何提高开发效率的简单指导和记录,不会涉及具体的微信公众号开发内容. ...

  5. Nodejs微信公众号开发

    概览 key value 项目名称 node微信公众号开发 项目描述 使用node编写接口,前后端分离获取签名数据 开发者 leinov 发布日期 2018-11-07 仓库 github地址 安装& ...

  6. python之微信公众号开发(基本配置和校验)

    前言 最近有微信公众号开发的业务,以前没有用python做过微信公众号开发,记录一下自己的学习和开发历程,共勉! 公众号类型 订阅号 普通订阅号 认证订阅号 服务号 普通服务号 认证服务号 服务方式 ...

  7. Java微信公众号开发梳理

    Java微信公众号开发梳理 现在微信公众平台的开发已经越来越普遍,这次开发需要用到微信公众平台.因此做一个简单的记录,也算是给那些没踩过坑的童鞋一些启示吧.我将分几块来简单的描述一下,之后会做详细的说 ...

  8. 微信公众号开发(一)--验证服务器地址的Java实现

    现在主流上都用php写微信公众号后台,其实作为后端语言之一的java也可以实现. 这篇文章将对验证服务器地址这一步做出实现. 参考资料:1.慕课网-<初识java微信公众号开发>,2.微信 ...

  9. C#微信公众号开发系列教程三(消息体签名及加解密)

    http://www.cnblogs.com/zskbll/p/4139039.html C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C ...

随机推荐

  1. Java并发(二十二):定时任务ScheduledThreadPoolExecutor

    需要在理解线程池原理的基础上学习定时任务:Java并发(二十一):线程池实现原理 一.先做总结 通过一个简单示例总结: public static void main(String[] args) { ...

  2. python日常碎碎念

    关于取命令行中参数的方法 1,sys.argv 这个方法自动获取参数,并split.一般情况下第一个元素是程序的名字.即 python script.py arg1 arg2 然后sys.argv返回 ...

  3. 【Codeforces528D】Fuzzy Search FFT

    D. Fuzzy Search time limit per test:3 seconds memory limit per test:256 megabytes input:standard inp ...

  4. BZOJ 4421: [Cerc2015] Digit Division 排列组合

    4421: [Cerc2015] Digit Division 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4421 Descripti ...

  5. Oracle常见的查询代码

    /** * 分页查询 */ int currentPage=3;//当前页码 int pageSize=5;//每页的记录条数 String sql=" select * from &quo ...

  6. 华为S5300系列升级固件S5300SI-V100R003C00SPC301.cc

    这个固件是升级V100R005的中间件,所以是必经的,注意,这个固件带有http的服务,但现在无论官网还是外面,几乎找不到这个固件的web功能,如果非要实现,可以拿V100R005的web文件改名为w ...

  7. js删除字符串的最后一个字符三种方法

    字符串 var basic = "abc,def,ghi,"; 第一种 basic = basic.substr(0, basic.length - 1); 第二种 basic = ...

  8. .Net高级技术——IDisposable

    IDisposable概述 GC(垃圾收集器)只能回收托管(Managed)内存资源,对于数据库连接.文件句柄.Socket连接等这些资源(非托管资源,UnManaged)就无能为例,必须程序员自己控 ...

  9. 使用stream(流)实现多表数据传输

    使用stream(流)实现多表数据传输 几乎所有的TCP和HTTP通信控件都支持stream(流)的传输. 使用stream(流)是可以实现多表数据传输的. 但这需要自定义协议了: 合并后的strea ...

  10. C# 结构体定义 转换字节数组 z

    客户端采用C++开发,服务端采用C#开发,所以双方必须保证各自定义结构体成员类型和长度一致才能保证报文解析的正确性. [StructLayoutAttribute(LayoutKind.Sequent ...