这篇文章以讲解的方式,帮助大家来理解微信官方的文档,同时给出调用扫一扫的例子。

微信官方技术文档jssdk:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html

打开技术文档,看到一个大目录,我们只需要关注下面几部分目录即可。

图1

图2

图1所示的目录是使用任何js接口页面都要配置的。下面结合官方文档介绍配置方法,其中绿色字体是自己写的批注,黑色的是复制官方文档:

JSSDK使用步骤

步骤一:绑定域名

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

备注:登录后可在“开发者中心”查看对应的接口权限。

这里注意域名不要带http:// 等前缀。(顺便推荐做微信开发测试时,使用花生壳账号,映射出公网ip。)比如网址:http://test.wicp.net 那么它的域名就是 test.wicp.net。

步骤二:引入JS文件

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

请注意,如果你的页面启用了https,务必引入 https://res.wx.qq.com/open/js/jweixin-1.0.0.js ,否则将无法在iOS9.0以上系统中成功使用JSSDK

如需使用摇一摇周边功能,请引入 jweixin-1.1.0.js

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

这个就是jsp页面直接引入即可

<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>

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

所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用,目前Android微信客户端不支持pushState的H5新特性,所以使用pushState来实现web app的页面会导致签名失败,此问题会在Android6.2中修复)。

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

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

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

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

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

基础接口

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

wx.checkJsApi({jsApiList: ['chooseImage'], // 需要检测的JS接口列表,所有JS接口列表见附录2,success: function(res) {// 以键值对的形式返回,可用的api值true,不可用为false// 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}}
});

备注:checkJsApi接口是客户端6.0.2新引入的一个预留接口,第一期开放的接口均可不使用checkJsApi来检测。

微信扫一扫

调起微信扫一扫接口

wx.scanQRCode({needResult: 0, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,scanType: ["qrCode","barCode"], // 可以指定扫二维码还是一维码,默认二者都有success: function (res) {var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
}
});

前面的官方文档写的很详细,但有人会疑问,具体写到网页中是怎么样?直接复制就可以吗?其实大部分直接复制就可以,针对jsp我们只需要做一点小改变。

  1. <script type="text/javascript">
  2. wx.config({
  3. debug: false,
  4. appId: '<%=ret.get("appId")%>',
  5. timestamp:'<%=ret.get("timestamp")%>',
  6. nonceStr:'<%=ret.get("nonceStr")%>',
  7. signature:'<%=ret.get("signature")%>',
  8. jsApiList : [ 'checkJsApi', 'scanQRCode' ]
  9. });//end_config
  10. wx.error(function(res) {
  11. alert("出错了:" + res.errMsg);
  12. });
  13. wx.ready(function() {
  14. wx.checkJsApi({
  15. jsApiList : ['scanQRCode'],
  16. success : function(res) {
  17. }
  18. });
  19. //扫描二维码
  20. document.querySelector('#scanQRCode').onclick = function() {
  21. wx.scanQRCode({
  22. needResult : 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
  23. scanType : [ "qrCode", "barCode" ], // 可以指定扫二维码还是一维码,默认二者都有
  24. success : function(res) {
  25. var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
  26. document.getElementById("wm_id").value = result;//将扫描的结果赋予到jsp对应值上
  27. alert("扫描成功::扫描码=" + result);
  28. }
  29. });
  30. };//end_document_scanQRCode
  31. });//end_ready
  32. </script>

wx.config 里面的各个属性ret.get("XXX")。是我们需要使用一个<% %>内部的java语言来获取的。具体如下:

  1. <pre name="code" class="html"><%
  2. Map<String, String> ret = new HashMap<String, String>();
  3. ret = JsSignUtil.sign(url);
  4. %>

其中JsSignUtil 是获取js ticket的文件。这个文件的雏形,微信官方在jssdk技术文档底部给了demo,有三个版本,java, php,python。这里我对它做了一些微调:

  1. package util;
  2. import java.util.UUID;
  3. import java.util.Map;
  4. import java.util.HashMap;
  5. import java.util.Formatter;
  6. import java.security.MessageDigest;
  7. import java.security.NoSuchAlgorithmException;
  8. import java.io.UnsupportedEncodingException;
  9. /**
  10. * 官方给的使用js的验证工具
  11. * @author Administrator
  12. *
  13. */
  14. public class JsSignUtil {
  15. public static String accessToken = null;
  16. public static Map<String, String> sign(String url) {
  17. accessToken = WeixinUtil.getAccessToken("appid", "appsecret").getToken();
  18. String jsapi_ticket = WeixinUtil.getJsApiTicket(accessToken);
  19. Map<String, String> ret = new HashMap<String, String>();
  20. String nonce_str = create_nonce_str();
  21. String timestamp = create_timestamp();
  22. String string1;
  23. String signature = "";
  24. //注意这里参数名必须全部小写,且必须有序
  25. string1 = "jsapi_ticket=" + jsapi_ticket +
  26. "&noncestr=" + nonce_str +
  27. "×tamp=" + timestamp +
  28. "&url=" + url;
  29. System.out.println("string1="+string1);
  30. try
  31. {
  32. MessageDigest crypt = MessageDigest.getInstance("SHA-1");
  33. crypt.reset();
  34. crypt.update(string1.getBytes("UTF-8"));
  35. signature = byteToHex(crypt.digest());
  36. }
  37. catch (NoSuchAlgorithmException e)
  38. {
  39. e.printStackTrace();
  40. }
  41. catch (UnsupportedEncodingException e)
  42. {
  43. e.printStackTrace();
  44. }
  45. ret.put("url", url);
  46. ret.put("jsapi_ticket", jsapi_ticket);
  47. ret.put("nonceStr", nonce_str);
  48. ret.put("timestamp", timestamp);
  49. ret.put("signature", signature);
  50. ret.put("appId", "wxcbba33f6b9ce1286");
  51. System.out.println("1.ticket(原始)="+jsapi_ticket);
  52. System.out.println("2.url="+ret.get("url"));
  53. System.out.println("3.jsapi_ticket(处理后)="+ret.get("jsapi_ticket"));
  54. System.out.println("4.nonceStr="+ret.get("nonceStr"));
  55. System.out.println("5.signature="+ret.get("signature"));
  56. System.out.println("6.timestamp="+ret.get("timestamp"));
  57. return ret;
  58. }
  59. /**
  60. * 随机加密
  61. * @param hash
  62. * @return
  63. */
  64. private static String byteToHex(final byte[] hash) {
  65. Formatter formatter = new Formatter();
  66. for (byte b : hash)
  67. {
  68. formatter.format("%02x", b);
  69. }
  70. String result = formatter.toString();
  71. formatter.close();
  72. return result;
  73. }
  74. /**
  75. * 产生随机串--由程序自己随机产生
  76. * @return
  77. */
  78. private static String create_nonce_str() {
  79. return UUID.randomUUID().toString();
  80. }
  81. /**
  82. * 由程序自己获取当前时间
  83. * @return
  84. */
  85. private static String create_timestamp() {
  86. return Long.toString(System.currentTimeMillis() / 1000);
  87. }
  88. }

接下来介绍

wx.ready(function(){ wx.XXX});

放在wx.ready 里面的内容,会等到相关信息全部加载完毕后才可以被触发。如果用户引入的接口是需要点击才会调用的,则放不放在里面都无所谓。比如上面例子的接口是用来检验当前配置信息是否合法的,那么这个功能是不需要用户来点击的,当你打开网页时,自动就会调用该接口,那么它就必须放在ready里面。再比如我们打算调用的扫一扫,这个必须(最好是)是用户进入页面后点击某个按钮才触发,这么就不必放到ready里面。

下面再解释扫一扫接口的代码:

  1. //扫描二维码
  2. document.querySelector('#scanQRCode').onclick = function() {
  3. wx.scanQRCode({
  4. needResult : 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
  5. scanType : [ "qrCode", "barCode" ], // 可以指定扫二维码还是一维码,默认二者都有
  6. success : function(res) {
  7. var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
  8. document.getElementById("wm_id").value = result;//将扫描的结果赋予到jsp对应值上
  9. alert("扫描成功::扫描码=" + result);
  10. }
  11. });
  12. };//end_document_scanQRCode

我们看到官方的文档只有一个
wx.scanQRCode({ XXX });,我们给他套上一个document.querySelector()。这个作用就是用户点击才会触发该事件。如果不套document,直接放在外面那么一旦进入该网页,系统就自动调用了接口。
#scanQRCode这个值去掉#后,就是我们按钮的id,拥有该id的按钮即可调用接口。这个id是官方给的,不可以自己随意改。

<button id="scanQRCode" >扫描二维码</button>

水平有限,如有错误,多多指正

微信调用jssdk在网页端实现调用扫一扫,java+jsp相关推荐

  1. 图书管理系统(微信、后台、网页端)总结

    Web课程技术总结--个人项目 网页前端 基本框架 vue 1.值存储问题 需要变更属性时(update),需要先获取属性(get),这里在返回时需要在服务端将值设为null,在更新时需要采用sele ...

  2. html如何调用特殊字体,网页中如何调用一些特殊字体或艺术字体?

    在国内,中文网站显示的字体主要是以微软雅黑或宋体为主,而英文网站上显示的字体就丰富多样,毕竟英文字体类型容量比较小,网页加载比较快.网站上由于不同用户对特殊字体或艺术字体显示样式的青睐,网页上会调用用 ...

  3. php调用jssdk转发_微信分享调用jssdk实例

    [导读]这篇文章主要为大家详细介绍了微信分享调用jssdk实例 网页在微信中打开,进行分享,详细过程 1.问题说明 搞了半天,终于搞定.说下基本需求,很简单,网页在微信中打开,分享. 网页是html格 ...

  4. 如何用html调用网页中的视频,如何将网页视频播放器调用换成西瓜影音 西瓜影音网页调用说明以及网页调用代码...

    西瓜影音可以调用在任何程序的视频网站中,那么如何将网页视频播放器调用换成西瓜影音呢?西瓜影音网页控件调用代码是什么?接下来就来看看西瓜影音网页调用说明以及网页调用代码. 网页控件调用说明: 获取西瓜影 ...

  5. flutter 调用原生安卓插件_Flutter 如何调用Android和iOS原生代码

    分3个大步骤: 1.在flutter中调用原生方法 2.在Android中实现被调用的方法 3.在iOS中实现被调用的方法 在flutter中调用原生方法 场景,这里你希望调用原生方法告诉你一个boo ...

  6. flutter 调用原生安卓插件_Flutter 如何调用Android和iOS原生代码-阿里云开发者社区...

    分3个大步骤: 1.在flutter中调用原生方法 2.在Android中实现被调用的方法 3.在iOS中实现被调用的方法 在flutter中调用原生方法 场景,这里你希望调用原生方法告诉你一个boo ...

  7. 微信文件传输助手网页版

    链接:微信文件传输助手网页版 打开链接后即可扫码登录,从而无需登录pc端微信实现文件传输.但大文件传输会受限,无法发送超过1g的文件 参考文献:微信文件传输助手上线网页版!

  8. .NET微信网页开发之使用微信JS-SDK调用微信扫一扫功能

    前言: 之前有个项目需要调用微信扫描二维码的功能,通过调用微信扫码二维码功能,然后去获取到系统中生成的二维码信息.正好微信JS-SDK提供了调用微信扫一扫的功能接口,下面让我们来看看是如何实现的吧. ...

  9. 公众号开发-移动端h5页面调用微信扫一扫

    前言: 大家好,我是前端小陈.今天为大家讲一下微信公众号开发,调用微信的JSSDK的案例. 前不久,接到这么一个需求:在H5网页实现扫一扫功能.  要求:微信端以及浏览器均可以实现扫一扫功能,而且不能 ...

最新文章

  1. 暗黑三使用服务器维护,《暗黑3》本周更新修复内容及维护时间公布
  2. java包装类方法_Java包装类
  3. 爬虫-ProxyHandler代理类-通过代理发起请求
  4. php implode key,PHP Implode关联数组
  5. 一篇由Google Trend引发的Post
  6. 7. Shell 脚本编写
  7. python线程池threadpool
  8. m126a linux驱动下载,惠普HP LaserJet Pro M126a MFP 驱动
  9. GitHub 优秀的 Android 开源项目
  10. keil MDK5 无法 Go To Definition Of
  11. buuctf [GhostScript]CVE-2018-16509
  12. 华为设备MAC地址配置命令
  13. Joint 3D Proposal Generation and Object Detection from View Aggregation论文学习
  14. uview ui与element ui的区别和用法
  15. 如何获取网页flash游戏的资源?
  16. 数据结构与算法课程设计之五子棋(人机)
  17. wince 之临时宏控制 bib 和 reg
  18. 《鸟哥的Linux私房菜》chapter7 20180827~20180831
  19. 物联网、消费物联网、工业物联网与云计算、大数据服务综合分析报告
  20. mysql数据库众数查询_拼多多面经分享:24个「数据分析

热门文章

  1. maven配置阿里云仓库地址
  2. 密码学基础(二)算法和密钥
  3. Eagleware.Genesys.Premier.v7.52_Win9xNT2K 1CD
  4. android 炫酷进度条,Android打造炫酷进度条效果
  5. 网络爬虫-爬取京东商品评价数据
  6. C语言 const详解
  7. vscode常用配置
  8. 流加密算法之Java RC4算法应用 附可用工具类
  9. 【华为OD机试 2023】货币单位换算(C++ Java JavaScript Python)
  10. 【无标题】楔子第一章