基于springboot框架的微信公众号基础开发(三)----生成带参数的二维码和分别进行不同的消息推送(核心内容如下,可根据自己的需求,添加或者修改代码。)
转载需注明:https://blog.csdn.net/juan1997/article/details/90647634
一、创建一个类名为(WeChatController)
@RestController
@RequestMapping("/wechat")
@Slf4j
public class WeChatController {
@Autowired
private WxMpService wxMpService;
@Autowired
private WechatService wechatService;
@GetMapping("/createTicket")
//1、生成带参数的二维码
public String createTitcket() throws WxErrorException {
WxMpQrCodeTicket ticket = wxMpService.getQrcodeService().qrCodeCreateLastTicket("123456");//携带了场景值123456
String pictueUrl = wxMpService.getQrcodeService().qrCodePictureUrl(ticket.getTicket());
return pictueUrl;
}
//2、消息和事件推送
@RequestMapping("/wx")
public void checkToken(HttpServletRequest request, HttpServletResponse response)
throws IOException, DocumentException, WxErrorException {
response.setContentType("text/html;charset=UTF-8");
log.info(" 入参-------------");
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
log.info("signature为:{}", signature);
log.info("timestamp为:{}", timestamp);
log.info("nonce为:{}", nonce);
log.info("echostr为{}", echostr);
if (wxMpService.checkSignature(timestamp, nonce, signature)) {
// WxMpXmlMessage
// 判断请求是否事件类型.
Map<String, String> map = MessageUtil.xmlToMap(request);
wechatService.sendMsg(map);
log.info("结束了小仙女 ");
}
}
}
二、创建一个接口实现类名为(WechatService)
@Service("wechatService")
@Slf4j
public class WechatService {
@Autowired
private WxMpService wxMpService;
public void sendMsg(Map<String, String> map) throws WxErrorException {
String toUserName = map.get("ToUserName");// 开发者微信号
log.info("toUserName为{}", toUserName);
String fromUserName = map.get("FromUserName");// 发送方账号
log.info("fromUserName为{}", fromUserName);
String msgType = map.get("MsgType");// 消息类型,有:event
log.info("MsgType为{}", msgType);
if (WxConsts.XmlMsgType.TEXT.equals(msgType)) {// 文本消息
log.info("发送文本消息");
} else if (WxConsts.XmlMsgType.IMAGE.equals(msgType)) {// 图片消息
log.info("发送图片消息");
} else if (WxConsts.XmlMsgType.VOICE.equals(msgType)) {// 语音消息
log.info("发送语音消息");
} else if (WxConsts.XmlMsgType.VIDEO.equals(msgType)) {// 视频消息
log.info("发送视频消息");
} else if (WxConsts.XmlMsgType.SHORTVIDEO.equals(msgType)) {// 小视频消息
log.info("发送小视频消息");
} else if (WxConsts.XmlMsgType.LOCATION.equals(msgType)) {// 地理位置消息
log.info("发送地理位置消息");
} else if (WxConsts.XmlMsgType.LINK.equals(msgType)) {// 链接消息
log.info("发送链接消息");
} else if (WxConsts.XmlMsgType.EVENT.equals(msgType)) {// 接受事件推送
String event = map.get("Event");// 事件类型,subscribe(订阅)、unsubscribe(取消订阅)
log.info("event为{}", event);
if (event.equals(WxConsts.EventType.UNSUBSCRIBE)) {// 取消订阅
log.info("event【取消关注】为{}", event);
log.info("我取消关注了,不要忧伤哦~~~~有时间 再加~~~");
} else if (event.equals(WxConsts.EventType.SUBSCRIBE)) {// 扫描带参数二维码事件
String EventKey = map.get("EventKey");// 扫描二维码时所带的scene_id
log.info("EventKey为{}", EventKey);
log.info("event【关注公众号】为{}", event);
if (EventKey.equals("qrscene_123456")) {// 用户未关注时,进行关注后的事件推送
log.info("如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。");
} else if (EventKey.equals("123456")) {
log.info("如果用户已经关注公众号,则微信会将带场景值扫描事件推送给开发者");
}
} else if (event.equals(WxConsts.EventType.LOCATION)) {
log.info("上报地理位置事件");
} else if (event.equals(WxConsts.EventType.CLICK)) {
String EventKey = map.get("EventKey");// 事件KEY值,与自定义菜单接口中KEY值对应
log.info("EventKey为{}", EventKey);
log.info("点击菜单拉取消息时的事件推送");
} else if (event.equals(WxConsts.EventType.VIEW)) {
String EventKey = map.get("EventKey");// 事件KEY值,设置的跳转URL
log.info("EventKey为{}", EventKey);
log.info("点击菜单跳转链接时的事件推送");
}
}
}
}
三、在上面用到了一个工具类。
public class MessageUtil {
/**
* xml转为map
*
* @param request
* @return
* @throws DocumentException
* @throws IOException
*/
public static Map<String, String> xmlToMap(HttpServletRequest request) throws DocumentException, IOException {
Map<String, String> map = new HashMap<String, String>();
InputStream ins = request.getInputStream();
SAXReader reader = new SAXReader();
Document doc = reader.read(ins);
Element root = doc.getRootElement();
List<Element> list = root.elements();
for (Element e : list) {
map.put(e.getName(), e.getText());
}
ins.close();
return map;
}
}