接受微信消息推送需要在微信后台配置推送的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里,一开始不知道,接到数据就解密,发送消息不成功