当前位置: 首页 > news >正文

微信生成带参数二维码(用户id), 扫码可获取用户id

生成带参数的二维码: https://developers.weixin.qq.com/doc/offiaccount/Account_Management/Generating_a_Parametric_QR_Code.html

示例代码: 

    /*** 生成带参数的二维码** @param userId    用户id* @return*/@GetMapping@RequestMapping("/createTicket/{userId}")public AjaxResult createTicket(@PathVariable Long userId){String ossUrl = ticketService.createTicket(userId);Map<String, String> map = new HashMap<>();map.put("ossUrl", ossUrl);return AjaxResult.success("操作成功", map);}

    /*** 生成带参数的二维码** @param userId    用户id* @return*/@Overridepublic String createTicket(Long userId) {if (userId == null) {userId = 0L;}String url = String.format("https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=%s",SpringUtils.getBean(AccessTokenUtils.class).getAccessToken());// 生成永久二维码String data = String.format("{\"action_name\": \"QR_LIMIT_SCENE\", \"action_info\": {\"scene\": {\"scene_id\": %d}}}", userId);// 发送POST请求获取ticketRestTemplate restTemplate = new RestTemplate();// {"ticket":"gQGi8TwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyNGN1TzRPaU5jSkgxMDAwMHcwMzUAAgRoga9lAwQAAAAA","url":"http:\/\/weixin.qq.com\/q\/024cuO4OiNcJH10000w035"}String ticketResponse = restTemplate.postForObject(url, data, String.class);// 解析ticketJSONObject jsonObject = JSONObject.parseObject(ticketResponse);String ticket = jsonObject.getString("ticket");//  根据ticket获取二维码图片URLString ticketUrl = String.format("https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=%s", ticket);// 上传ossString ossUrl = ossUtils.strToInputStreamUpload(ticketUrl);log.info("生成的带参数二维码URL:" + ossUrl);return ossUrl;}

扫码接收事件推送:
https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_event_pushes.html

示例代码: 

    /*** 接收用户消息并回复消息** @param request       xml内容* @return              xml格式的字符串*/@PostMapping("/validateWeChatServer")public String receiveMessage(HttpServletRequest request) {return weChatService.receiveMessage(request);}

  /*** 接收用户消息并回复消息** @param request       xml内容* @return              xml格式的字符串*/@Overridepublic String receiveMessage(HttpServletRequest request) {ServletInputStream inputStream = null;try {inputStream = request.getInputStream();HashMap<String, String> map = new HashMap<>();SAXReader reader = new SAXReader();try {// 读取request输入流, 获取Document对象Document document = reader.read(inputStream);// 获取root节点Element root = document.getRootElement();// 获取所有的子节点List<Element> elements = root.elements();for (Element element : elements) {map.put(element.getName(), element.getText());}log.info("接收到的用户消息: {}", map);} catch (DocumentException e) {e.printStackTrace();} finally {if (inputStream != null) {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}// 关注用户, 保存到数据库ResUser user = SpringUtils.getBean(IResUserService.class).attentionMedia(map.get("FromUserName"));// 回复消息String message = getReplyTextMessage(map, user);log.info("回复消息: {}", message);return message;} catch (IOException e) {e.printStackTrace();}return null;}

private String getReplyTextMessage(HashMap<String, String> map, ResUser user) {// 未关注用户时Event=subscribe, EventKey=qrscene_4(事件KEY值,qrscene_为前缀,后面是自定义的用户id)// 获取 "qrscene_" 后面的值Long userId = Long.valueOf(map.get("EventKey").substring("qrscene_".length()));// TODO}

接收到的用户消息: {Ticket=gQFC8TwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyaWplQzQzaU5jSkgxMDAwME0wM3oAAgR6r7BlAwQAAAAA, CreateTime=1706078168, EventKey=qrscene_4, Event=subscribe, ToUserName=gh_da9c697c8555, FromUserName=oUjEt6xFAs2ABHsmLyJeSUe-WVXI, MsgType=event}

相关文章:

  • 免费开源的微信小程序源码、小游戏源码精选70套!
  • Python一行命令搭建HTTP服务器并外网访问 - 内网穿透
  • Unity——八叉树的原理与实现
  • 算法每日一题: 最大合金数 | 二分
  • 概念抽取:构建认知基础的关键步骤
  • 面试经典 150 题 ---- 移除元素
  • 方玲老师谈中国传统祭祖深远的意义
  • 计算机网络之NAT
  • arm 汇编调用C
  • Go黑帽子(第二章)
  • Go语言常用标准库fmt、格式化占位符、获取输入
  • UE5在VisualStudio升级后产生C++无法编译的问题
  • Keil-C语言小总结
  • MySQL(下)
  • 【Java】SpringMVC参数接收(一)
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 【刷算法】从上往下打印二叉树
  • Brief introduction of how to 'Call, Apply and Bind'
  • eclipse的离线汉化
  • Gradle 5.0 正式版发布
  • Hexo+码云+git快速搭建免费的静态Blog
  • jquery ajax学习笔记
  • JSONP原理
  • js学习笔记
  • Puppeteer:浏览器控制器
  • React16时代,该用什么姿势写 React ?
  • Vue 重置组件到初始状态
  • XForms - 更强大的Form
  • 阿里云Kubernetes容器服务上体验Knative
  • 高度不固定时垂直居中
  • 给github项目添加CI badge
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 警报:线上事故之CountDownLatch的威力
  • 全栈开发——Linux
  • 如何解决微信端直接跳WAP端
  • 如何选择开源的机器学习框架?
  • 深入浅出Node.js
  • 使用 QuickBI 搭建酷炫可视化分析
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 用Python写一份独特的元宵节祝福
  • 怎样选择前端框架
  • 智能合约开发环境搭建及Hello World合约
  • NLPIR智能语义技术让大数据挖掘更简单
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​iOS实时查看App运行日志
  • ​第20课 在Android Native开发中加入新的C++类
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #### go map 底层结构 ####
  • #数学建模# 线性规划问题的Matlab求解
  • $forceUpdate()函数
  • (2)STL算法之元素计数
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...