前言
功能要点,关注公众号之后,进行给关注用户发一条消息和自己blog 需要一个关注公众号之后,在验证码之后,输入正确的验证码之后,才能进行进行下去。
所以涉及到公众号Api 接口的使用和开发。
开发账号准备
1、开通一个公众号,可以是服务号,企业号或订阅号,都是可以的。
微信公众平台:https://mp.weixin.qq.com/
开发者文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432
说明: 点击右上角立即注册,选择“服务号”或“订阅号”注册(服务号仅限机构用户注册,个人用户只能选择订阅号)
2、进入公众号与开发里面的公众号设置。
image.png
找到设置,设置号自己的域名。
3、找到设置与开发中的基本配置
获取和保存好下面信息
开发者ID(AppID)
开发者密码(AppSecret)
令牌(Token)
消息加解密密钥(EncodingAESKey)
服务器地址(URL)
然后拿着 这个接口值,开始写代码了。
这个会用到两个方法,一个get 方法,一个是post 方法。因为URL 地址只有一个。
我发现了get 是用于微信验证码,返回去任性信息即可。另一个是消息post 来的数据,然后我们出来,返回出去就是为消息了。
期间配置还有一个 文件放入项目里面去,是一个txt 文件。
@GetMapping("/MP_verify_EdATxxxIn.txt")
public String verify() {
return "EdAxxx";
}
我一般这样写,这样写的目的是为了,保证方法放入到域名下了。少配置一个nginx 了。
接着配置第一个 和微信公账号里面 验证的时候需要
/**
* 认证需要
*
* @param request
* @return
*/
@SaIgnore
@GetMapping("/getToken")
public String getToken(HttpServletRequest request) {
return checkToken(request, token);
}
public static String checkToken(HttpServletRequest request, String token) {
String method = request.getMethod();
//微信token验证get请求
if ("GET".equals(method)) {
//微信加密签名
String echostr = request.getParameter("echostr");//时阅鲛
String signature = request.getParameter("signature");//随机宁符串
String timestamp = request.getParameter("timestamp");//随机数
String nonce = request.getParameter("nonce");
String[] str = {token, timestamp, nonce};
//字典排序
Arrays.sort(str);
String bigStr = str[0] + str[1] + str[2];// SHA1加密
String digest = SecureUtil.sha1(bigStr);//对比签名
if (digest.equals(signature)) {
return echostr;
} else {
return "";
}
}
return "";
}
这里的token 就是公众号里面配置的。
通过就可以进行下一部分。
回复方法。我们这里填写了一个方法,用户发送来消息,是post 请求,所以他会走一个post 请求过来。
/**
* 自动回复用
*
* @param requestBody
* @return
*/
@SaIgnore
@PostMapping("/getToken")
public String getToken(@RequestBody String requestBody) {
ReceiveMessage receiveMessage = XMLTOModel(requestBody);
return parseMsgToXML(receiveMessage);
}
我这里写了两个方法,也可以写一个方法,然后判断是get 还是post 请求,在进入不同的方法。
先进行 数据获取,获取数据是做什么,然后再返回去参数,微信公众号里面的参数是xml 的
需要我们对xml 解析和生成了。
这里我用到了xstream
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.9</version>
</dependency>
对xml 解析和生成操作了。
这里生返回数据
private String parseMsgToXML(ReceiveMessage receiveMessage) {
String content = receiveMessage.getContent();
String message = null;
String msgType = receiveMessage.getMsgType();
String toUserName = receiveMessage.getToUserName();
String fromUserName = receiveMessage.getFromUserName();
//判断发送的类型是文本
if (MpMessageUtil.MESSAGE_TEXT.equals(msgType)) {
//发送的内容为???时
if ("0".equals(content)) {
后面的可以为空
message = MpMessageFormat.initText(toUserName, fromUserName, MpMessageUtil.menuText());
} else if ("1".equals(content)) {
Random random = new Random();
message = MpMessageFormat.initText(toUserName, fromUserName, String.format("您本次的验证码为:%s%s%s%s", random.nextInt(10), random.nextInt(10), random.nextInt(10), random.nextInt(10)));//模拟验证码
} else if ("验证码".equals(content)) {
Random random = new Random();
message = MpMessageFormat.initText(toUserName, fromUserName, String.format("您本次的验证码为:%s%s%s%s", random.nextInt(10), random.nextInt(10), random.nextInt(10), random.nextInt(10)));//模拟验证码
} else {
message = MpMessageFormat.initText(toUserName, fromUserName, "感谢您的来电,我们会尽快处理,请按提示信息操作[回复'0'显示主菜单]。");
}
} else if (MpMessageUtil.MESSAGE_EVENT.equals(msgType)) {//验证是关注/取消事件
String eventType = receiveMessage.getEvent();//获取是关注还是取消
//关注
if (MpMessageUtil.MESSAGE_SUBSCRIBE.equals(eventType)) {
message = MpMessageFormat.initText(toUserName, fromUserName, "欢迎关注乐观开发者,回复[0]即可调出功能菜单");
}
}
return message;
}
这里是解析
public static ReceiveMessage XMLTOModel(String str) {
ReceiveMessage receiveMessage = new ReceiveMessage();
try {
Document document = DocumentHelper.parseText(String.valueOf(str));
Element root = document.getRootElement();
receiveMessage.setToUserName(root.elementText("ToUserName"));
receiveMessage.setFromUserName(root.elementText("FromUserName"));
receiveMessage.setMsgType(root.elementText("MsgType"));
receiveMessage.setContent(root.elementText("Content"));
receiveMessage.setCreateTime(root.elementText("CreateTime"));
receiveMessage.setMsgId(root.elementText("MsgId"));
// 关注
receiveMessage.setEvent(root.elementText("Event"));
} catch (Exception e) {
e.printStackTrace();
}
return receiveMessage;
}
public static final String MESSAGE_TEXT = "text";//文本
这里只讲text 文本哦。其他参数先不给了哈。
返回去,需要注意的是,发送人和接受人,是要相互交互的哦。否则不成功。
测试一下哦
回复一下可以用哦。
网友评论