微信公众号调起扫码功能

朱雀 2022-05-15 00:37 540阅读 0赞

偶然接触到了公众号开发。说需要调起微信扫一扫。便查看了公众号开发文档

70

看完文档后,发现js是相对简单的。唯一的难点是在java后台编写的秘钥生成代码。

70 1

也就是说。首先需要获取access_token,然后在根据access_token生成签名并返回。

以下是代码

  1. private static String GAPPID = "XXXXXXXXX";
  2. private static String GSECRET = "XXXXXXXXXXXXXX";
  3. private static String GRANTTYPE2 = "client_credential";// 获取 access-token 的
  4. @RequestMapping("/api/wx/getWxJsKey")
  5. @ResponseBody
  6. public String getWxJsKey(HttpServletRequest request) {
  7. HttpSession session = request.getSession();
  8. Map<String, Object> map = new HashMap<>();
  9. map.put("code", "1");
  10. map.put("errorMsg", "请求成功");
  11. String access_token = null;
  12. String jsapi_ticket = null;
  13. String timestamp = Long.toString(System.currentTimeMillis() / 1000);
  14. String noncestr = UUID.randomUUID().toString();
  15. System.out.println("timestamp:" + timestamp);
  16. System.out.println("noncestr:" + noncestr);
  17. // 获取 access_token
  18. {
  19. Object val = session.getAttribute("wx_access_token");
  20. if (val == null) {
  21. String requestUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type="
  22. + GRANTTYPE2 + "&appid=" + GAPPID + "&secret="
  23. + GSECRET;
  24. JSONObject json = CommonUtil.httpsRequest(requestUrl, "GET",
  25. null);
  26. logger.info(json);
  27. access_token = json.getString("access_token");
  28. session.setAttribute("wx_access_token", access_token);
  29. session.setMaxInactiveInterval(7200);
  30. } else {
  31. access_token = val.toString();
  32. }
  33. }
  34. // 获取 ticket
  35. {
  36. Object val = session.getAttribute("jsapi_ticket");
  37. if (val == null) {
  38. String requestUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="
  39. + access_token + "&type=jsapi";
  40. JSONObject json = CommonUtil.httpsRequest(requestUrl, "GET",
  41. null);
  42. jsapi_ticket = json.getString("ticket");
  43. session.setAttribute("jsapi_ticket", jsapi_ticket);
  44. session.setMaxInactiveInterval(7200);
  45. } else {
  46. jsapi_ticket = val.toString();
  47. }
  48. System.out.println("jsapi_ticket:" + jsapi_ticket);
  49. }
  50. // 签名
  51. String jsKey = new StringBuffer()//
  52. .append("jsapi_ticket=").append(jsapi_ticket)//
  53. .append("&noncestr=").append(noncestr)//
  54. .append("&timestamp=").append(timestamp).append("&url=")//
  55. .append("https://hktest.ricepon.com/member-web/preOrderMeal/html/pre_order_meal.html")//
  56. .toString();
  57. // 加密 生成签名
  58. jsKey = DigestUtils.shaHex(jsKey);
  59. // 返回值
  60. Map<String, Object> param = new HashMap<>();
  61. param.put("jsKey", jsKey);
  62. param.put("timestamp", timestamp);
  63. param.put("noncestr", noncestr);
  64. param.put("appId", GAPPID);
  65. map.put("data", param);
  66. return JSONObject.fromObject(map).toString();
  67. }

然后在js中用ajax请求接口,处理即可。

  1. var jsKey, noncestr, timestamp, appId, ajaxHeader = {};
  2. $(document).ready(function () {
  3. //组装头部信息
  4. ajaxHeader = {
  5. Accept: "application/json; charset=utf-8",
  6. }
  7. // 获取 秘钥
  8. $.ajax({
  9. url: "../api/wx/getWxJsKey",
  10. type: "POST",
  11. headers: ajaxHeader,
  12. success: function (res) {
  13. if (res.code == 1) {
  14. var data = res.data;
  15. jsKey = data.jsKey; // 签名
  16. noncestr = data.noncestr; // 随机字符串
  17. timestamp = data.timestamp; // 时间戳
  18. appId = data.appId; // 小程序apId
  19. wx.config({
  20. debug: false,
  21. appId: appId,
  22. timestamp: timestamp,
  23. nonceStr: noncestr,
  24. signature: jsKey,
  25. jsApiList: ['scanQRCode']
  26. })
  27. } else {
  28. layer.msg(res.errorMsg);
  29. }
  30. },
  31. error: function (res) {
  32. layer.msg('error');
  33. layer.msg(res);
  34. }
  35. })
  36. });
  37. wx.error(function (res) {
  38. layer.msg(res.errorMsg);
  39. });
  40. wx.ready(function () {
  41. wx.checkJsApi({
  42. jsApiList: ['scanQRCode'],
  43. success: function (res) {}
  44. });
  45. });
  46. //调起扫码
  47. function openScanDialog() {
  48. wx.scanQRCode({
  49. needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
  50. scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是一维码,默认二者都有
  51. success: function (res) {
  52. //自行处理
  53. }
  54. });
  55. }

就是这样!

发表评论

表情:
评论列表 (有 0 条评论,540人围观)

还没有评论,来说两句吧...

相关阅读

    相关 【一】公众登录

    微信公众号之扫码登录 > ​ 原来公司的官网就支持账号密码、手机验证码、QQ扫码授权、微信扫码授权等多种登录方式。今天要分享的就是关于微信扫码授权登录的原理。 一、准

    相关 公众功能

    偶然接触到了公众号开发。说需要调起微信扫一扫。便查看了公众号开发文档   ![70][]   看完文档后,发现js是相对简单的。唯一的难点是在java后台编写的秘钥生成