微信生成带参数二维码(用户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}
相关推荐
渣哥9 分钟前
有一天,我和 CopyOnWriteArrayList 杯“线程安全”的咖啡
java
叽哥16 分钟前
Kotlin学习第 3 课:Kotlin 流程控制:掌握逻辑分支与循环的艺术
android·java·kotlin
杨杨杨大侠16 分钟前
第5章:实现Spring Boot集成
java·github·eventbus
华仔啊19 分钟前
工作5年没碰过分布式锁,是我太菜还是公司太稳?网友:太真实了!
java·后端
尚久龙23 分钟前
安卓学习 之 图片控件和图片按钮
android·java·学习·手机·android studio·安卓
摸鱼仙人~24 分钟前
深入理解 MyBatis-Plus 的 `BaseMapper`
java·开发语言·mybatis
杨杨杨大侠26 分钟前
第6章:高级特性与性能优化
java·github·eventbus
Dcs1 小时前
代码评审还能更好!
java
刃神太酷啦1 小时前
C++ 异常处理机制:从基础到实践的全面解析----《Hello C++ Wrold!》(20)--(C/C++)
java·c语言·开发语言·c++·qt·算法·leetcode
蓝倾9761 小时前
小红书获取用户作品列表API接口操作指南
java·服务器·前端·python·电商开放平台·开放api接口