接受微信推送消息踩过的坑

接受微信消息推送需要在微信后台配置推送的url,配置的地址需要先校验url,接口需要支付post和get请求,token和encodingAESkey,自定义,配置在代码里,加密解密时使用
官方文件:消息推送 | 微信开放文档 (qq.com)

    @RequestMapping(value = "/getWexinMessage",method = {RequestMethod.POST, RequestMethod.GET})
    @ApiOperation(value = "接受微信消息推送")
    public JsonResult<Object> getWexinMessage(HttpServletRequest request , HttpServletResponse response){
        return appCustomMessageService.getWexinMessage(request,response);
    }
@Override
    public JsonResult<Object> getWexinMessage(HttpServletRequest request, HttpServletResponse response) {
        log.info("微信消息推送");
        JsonResult<Object> jsonResult = new JsonResult<>();
        boolean isGetPost = request.getMethod().toLowerCase().equals("get");
        log.info("请求方式:"+isGetPost);
        //微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
        String signature = request.getParameter("signature");
        String timestamp = request.getParameter("timestamp");
        String nonce = request.getParameter("nonce");
        String echostr = request.getParameter("echostr");
        ServletInputStream inputStream = null;
        log.info("----------------取微信推送信息-----------------");
        log.info("signature----:{}", signature);
        log.info("时间戳timestamp----:{}", timestamp);
        log.info("随机数nonce----:{}", nonce);
        log.info("随机字符串echostr----:{}", echostr);
        PrintWriter out = null;
        WXBizMsgCrypt pc = null;
        try {
            pc = new WXBizMsgCrypt(token, encodingAesKey, appId);
        } catch (AesException e) {
            log.info("AesException{}",e.getMessage());
            e.printStackTrace();
        }
        if(isGetPost){
            log.info("微信消息推送校验url");
            StringBuffer buffer = new StringBuffer();
            try {
                 out = response.getWriter();
                if(pc.verifyUrl(signature, timestamp, nonce, echostr)){
                    out.println(echostr);
                    out.flush();
                }else {
                    out.println("");
                    out.flush();
                }
            } catch (AesException e) {
                e.printStackTrace();
                log.info("校验url失败", e);
                jsonResult.error(e.getMessage());
            }catch (IOException e) {
                throw new CommunityCustomException("io失败");
            }finally {
                out.close();
            }
        }else  {
            log.info("微信发送消息数据");
            String w = "";
            try {
                request.setCharacterEncoding("UTF-8");
                response.setCharacterEncoding("UTF-8");
                out = response.getWriter();
                inputStream = request.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
                StringBuffer stringBuffer = new StringBuffer();
                String line = new String("");
                while ((line = bufferedReader.readLine()) != null) {
                    stringBuffer.append(line);
                }
                log.info("stringBuffer{}",stringBuffer);
                if(StringUtils.hasLength(stringBuffer)){
                    //处理微信推送内容
                    JSONObject jsonObject = decode(stringBuffer);
                    log.info("----jsonObject{}", jsonObject);
                    if(jsonObject != null){
                        String openId = (String) jsonObject.get("FromUserName");
                        log.info("------sessionFrom:{}", jsonObject.get("SessionFrom"));
                        log.info("------openId:{}", openId);
                        log.info("------toUserName:{}", jsonObject.get("ToUserName"));
                        log.info("------msgType:{}", jsonObject.get("MsgType"));
                        log.info("------createTime:{}", jsonObject.get("CreateTime"));
                        log.info("------msgId:{}", jsonObject.get("MsgId"));
                        if(StringUtils.hasLength(openId)){
                            log.info("进入发送客服消息");
                            JsonResult<Object> customMessage = sendCustomMessage(openId);
                            if(customMessage.getCode().equals("200")){
                                w = "success";
                                jsonResult.success("客服发送消息成功");
                            }
                        }
                    }
                }
                out.println(w);
                out.flush();
            }catch (IOException e) {
                throw new CommunityCustomException("io失败");
            }catch (AesException e) {
                log.info("AesException{}",e.getMessage());
                e.printStackTrace();
                jsonResult.error(e.getMessage());
            } finally {
                out.close();
            }
        }
        return jsonResult;
    }
    @Override
    public JSONObject decode(StringBuffer stringBuffer) throws AesException {
        WXBizMsgCrypt wxBizMsgCrypt = new WXBizMsgCrypt(token, encodingAesKey, appId);
        JSONObject jsonObject = JSON.parseObject(stringBuffer.toString());
        log.info("全部内容转为json后:{}");
        String encrypt = (String)jsonObject.get("Encrypt");
        log.info("进入消息解密----");
        String decrypt = wxBizMsgCrypt.decrypt(encrypt);
        log.info("解密后的内容[{}]:",decrypt);
        if(StringUtils.hasLength(decrypt)){
            JSONObject afterDecode = JSON.parseObject(decrypt);
            return afterDecode;
        }else {
            return null;
        }

    }

接受消息时我用的json,加密数据 需要在得到后转为json  在getkey: Encrypt里,一开始不知道,接到数据就解密,发送消息不成功

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值