微信生成带参数二维码(用户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
     */
    @Override
    public 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请求获取ticket
        RestTemplate restTemplate = new RestTemplate();
        // {"ticket":"gQGi8TwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyNGN1TzRPaU5jSkgxMDAwMHcwMzUAAgRoga9lAwQAAAAA","url":"http:\/\/weixin.qq.com\/q\/024cuO4OiNcJH10000w035"}
        String ticketResponse = restTemplate.postForObject(url, data, String.class);

        // 解析ticket
        JSONObject jsonObject = JSONObject.parseObject(ticketResponse);
        String ticket = jsonObject.getString("ticket");

        //  根据ticket获取二维码图片URL
        String ticketUrl = String.format("https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=%s", ticket);

        // 上传oss
        String 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格式的字符串
     */
    @Override
    public 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}
相关推荐
lhldsg5 小时前
全民健身解决方案小程序开发:从0到1的技术实战
java·数据库·需求分析
jason成都5 小时前
Spring WebFlux 适配达梦新方案|dm‑r2dbc:Netty 异步传输的实验性 R2DBC 驱动
java·后端·spring
泡海椒5 小时前
内置SPI函数库详解:JQuick-Java Builtin工具类实战用法
java·开发语言·python
辰烨chenye6 小时前
LeetCode Hot 100 题解 · 二分篇
java·算法·leetcode
小羊没烦恼!6 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
小荷才露尖尖角,早有蜻蜓立上头7 小时前
过滤器的4种创建方式
java
大圣编蚕7 小时前
Java ByteArrayInputStream 详解:从入门到实战
java·开发语言·算法
程序员阿明8 小时前
idea把插件啥的不默认放在C盘
java·ide·intellij-idea
linweidong8 小时前
中科闻歌Java面试题及参考答案
java·python·大模型·提示词·ai agent·mcp·rag原理
OpenAnolis小助手8 小时前
一句话看透 JVM,SysOM 诊断 Skill 新增 Java 应用诊断能力
java·开发语言·jvm·阿里云·操作系统控制台·sysom