1、登录微信公众号后台===》到基本配置===》服务器配置====》填写服务器配置信息
2、填写的url(1处) 是你后台代码中的接口地址,2处的token要和你后台代码中的token一致,否则点提交无法通过,
消息加解密方式一般都选的兼容模式,EncodingAESKey是随机生成,不用管;点击提交的时候微信服务器会去请求你刚写的url地址,下面会提供这个url对应的代码
3、接着就是后台代码的编写,直接上代码
@ResponseBody
@RequestMapping(value="autoAnswer",method={RequestMethod.GET,RequestMethod.POST})
public void wechatAutoAnswer(HttpServletRequest request,HttpServletResponse response)
throws IOException{
// 微信加密签名
String signature = request.getParameter("signature");
// 时间戳
String timestamp = request.getParameter("timestamp");
// 随机数
String nonce = request.getParameter("nonce");
// 随机字符串
String echostr = request.getParameter("echostr");
PrintWriter out = response.getWriter();
// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入
失败
if (null != signature && null != timestamp && null != nonce && null != echostr{
/* 接口验证 */
if (SignUtil.checkSignature(signature, timestamp, nonce)) {
out.print(echostr);
logger.info("token验证成功!");
}else {
out.write("");
out.flush();
out.close();
}
out.flush();
out.close();
}else {
/* 消息处理 */
response.reset();//重置
wechatService.sendMsg(request,response);
}
}
检验签名的方法
private static String token = "bonusWechat";
/**
* 验证签名
*
* @param signature
* @param timestamp
* @param nonce
* @return
*/
public static boolean checkSignature(String signature, String timestamp, String nonce) {
String[] arr = new String[] { token, timestamp, nonce };
// 将token、timestamp、nonce三个参数进行字典序排序
Arrays.sort(arr);
StringBuilder content = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
content.append(arr[i]);
}
MessageDigest md = null;
String tmpStr = null;
try {
md = MessageDigest.getInstance("SHA-1");
// 将三个参数字符串拼接成一个字符串进行sha1加密
byte[] digest = md.digest(content.toString().getBytes());
tmpStr = byteToStr(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
content = null;
// 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
}
/**
* 将字节数组转换为十六进制字符串
*
* @param byteArray
* @return
*/
private static String byteToStr(byte[] byteArray) {
String strDigest = "";
for (int i = 0; i < byteArray.length; i++) {
strDigest += byteToHexStr(byteArray[i]);
}
return strDigest;
}
/**
* 将字节转换为十六进制字符串
*
* @param mByte
* @return
*/
private static String byteToHexStr(byte mByte) {
char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
char[] tempArr = new char[2];
tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
tempArr[1] = Digit[mByte & 0X0F];
String s = new String(tempArr);
return s;
}
/***
* service的方法 此方法 是微信用户关注公众号后,
* 拉取微信用户到开发者数据库的操作,还有自定义菜单
* 点击事件
*
*/
public void sendMsg(HttpServletRequest request, HttpServletResponse response) throws IOException {
String respMessage = "success";
try {
// 默认返回的文本消息内容
// String respContent = "请求处理异常,请稍候尝试!";
// xml请求解析
Map<String, String> requestMap = MessageUtil.parseXml(request);
System.out.println(requestMap);
// 发送方帐号(open_id)
String fromUserName = requestMap.get("FromUserName");
System.out.println("openId================"+fromUserName);
// 公众帐号
String toUserName = requestMap.get("ToUserName");
System.out.println("to==================" + toUserName);
// 消息类型
String msgType = requestMap.get("MsgType");
System.out.println("content ++++++++++++++++++++"+requestMap.get("content"));
System.out.println("大写Content+++++++++++++++++++" + requestMap.get("Content"));
String content = requestMap.get("content");
if(com.cn.bonus.base.util.XaUtil.isEmpty(content)) {
content = requestMap.get("Content");
}
System.out.println("requestMap请求:"+requestMap);
// 事件类型
String eventType = requestMap.get("Event");
String eventKey = requestMap.get("EventKey");
String username = "";
if(XaUtil.isNotEmpty(eventKey) && eventKey.indexOf("qrscene_") == 0){
username = eventKey.replace("qrscene_", "");
}else{
username = eventKey;
}
// 文本消息
if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
}
// 图片消息
/*else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) {
respContent = "您发送的是图片消息!";
}
// 地理位置消息
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) {
respContent = "您发送的是地理位置消息!";
}
// 链接消息
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) {
respContent = "您发送的是链接消息!";
}
// 音频消息
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) {
respContent = "您发送的是音频消息!";
} */
// 事件推送
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
// Long userId = null;
// if(XaUtil.isNotEmpty(username) && isNumeric(username)){
// userId = Long.parseLong(username);
// }
UserAttentionInfo openIdUser = null;
XcxUser unionIdXcxUser = null;
// 订阅
if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) {
}
String userInfoStr = WXUtil.getUserInfo(fromUserName);
JSONObject userObj = JSONObject.parseObject(userInfoStr);
String unionid = XaUtil.isNotEmpty(userObj.getString("unionid"))?userObj.getString("unionid"):"";
logger.info("用户unionid为"+unionid);
String nickname = XaUtil.isNotEmpty(userObj.getString("nickname"))?userObj.getString("nickname"):"";
logger.info("用户名称为"+nickname);
if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
saveXcxUserAndUserAttention(openIdUser,unionIdXcxUser,fromUserName, unionid, nickname);
}else if(eventType.equals(MessageUtil.EVENT_TYPE_SCAN)){
saveXcxUserAndUserAttention(openIdUser,unionIdXcxUser,fromUserName, unionid, nickname);
}else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
// saveXcxUserAndUserAttention(fromUserName, unionid, nickname);
// 取消订阅
}
// 自定义菜单点击事件
else if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) {
logger.info("自定义菜单点击事件 :click");
logger.info("eventType = {}",eventType);
// TODO 自定义菜单权没有开放,暂不处理该类消息
logger.info("EventKey = {}",username);
if("客服热线".equals(username)) {
respMessage = "客服热线:4009286688 \r\n" +
"工作时间:周一到周五\r\n" +
" 8:00-16:30";
}
// 回复文本消息
TextMessage textMessage = new TextMessage();
textMessage.setToUserName(fromUserName);
textMessage.setFromUserName(toUserName);
textMessage.setCreateTime(new Date().getTime());
textMessage.setFuncFlag(0);
textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
textMessage.setContent("客服热线:4009286688 \r\n" +
"工作时间:周一到周五\r\n" +
" 8:00-16:30");
respMessage = MessageUtil.textMessageToXml(textMessage);
logger.info("响应的消息:msg = {}",respMessage);
}
}
} catch (Exception e) {
e.printStackTrace();
}
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
// 响应消息
PrintWriter out = response.getWriter();
out.print(respMessage);
out.close();
}