一、申请一个微信公众号
https://mp.weixin.qq.com/
二、接口认证(证明你是一名合法的开发者)
在微信公众平台左侧菜单找到基本配置
开发者ID是注册完就有的,这里要注意的是开发者密码,非常重要,获取密码后,建议保存在文本文档里。还有一个IP白名单是干什么的呢?
开发者访问微信服务器时会携带ID和密码和IP地址,在服务器里IP白名单上的IP地址才允许访问。
点击修改配置
URL是访问地址,借助NATAPP工具获取
https://natapp.cn/ 下载64位ZIP,解压出来运行后出现命令窗口,需输入指令。
先在NATAPP网页上找到免费隧道(需注册)
购买一个免费隧道
在命令窗口中输入 natapp -authtoken=(authtoken下的内容)
成功后显示online,http://…cc即是内网穿透后的地址(付费与免费的区别就是免费的URL每次都是不一样的)。
回到微信公众平台的配置网页,复制地址到URL栏,地址后接controller地址。Token随意取名,随机生成,明文模式。点击提交,提示失败。
打开IDEA新建工程,创建maven项目,因为与controlller交互,所以需要springmvc相关配置文件
1.pom.xml中引入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
导入springmvc.xml配置文件
web.xml中初始化配置文件
<servlet>
<servlet-name>oa</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>oa</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
创建controller进行开发者认证
//1.按字典顺序排序
TreeSet<String> set = new TreeSet<>();
set.add(TOKEN);
set.add(timestamp);
set.add(nonce);
//2.将三个参数拼接成一个字符串
StringBuilder builder = new StringBuilder();
for(String str:set){
builder.append(str);
}
//3.通过SHA1加密
String str = SHA1.encode(builder.toString());
if(str.equals(signature)){
System.out.println("接入成功");
return echostr;
}else {
System.out.println("接入失败");
return "failed";
}
返回字符串需加@ResponseBody注解
再次点击提交,提交成功。
三、利用测试号进行测试
点击开发者工具,选择开发平台测试账号,微信扫码即可。
四、接收并回复用户发送的消息
//接收用户发送过来的信息(xml)
@PostMapping(value="auth",produces = "text/xml;charset=utf-8")
@ResponseBody
public String receive(@RequestBody String strXml) throws DocumentException {
System.out.println(strXml);
//1.接收消息
//sax dom dom4j
//把xml数据变成document对象
Document document = DocumentHelper.parseText(strXml);
//得到根节点
Element rootElement = document.getRootElement();
//得到节点对象
Element toUserNameElement = rootElement.element("ToUserName");
Element fromUserNameElement = rootElement.element("FromUserName");
//得到消息类型对象
Element msgTypeElement = rootElement.element("MsgType");
//得到节点中的数据
String userNameText = toUserNameElement.getText();
String fromUserNameElementText = fromUserNameElement.getText();
String msgTypeElementText = msgTypeElement.getText();
if("event".equals(msgTypeElementText)){
Element eventElement = rootElement.element("Event");
String eventType = eventElement.getText();
if("subscribe".equals(eventType)){
//关注
return newsMessage(fromUserNameElementText,userNameText);
}else {
//取消关注
System.out.println("取消了关注");
return null;
}
}
//2.回复消息
Element contentElement = rootElement.element("Content");
String contentElementText = contentElement.getText();
String responseText = contentElementText+"hh";
StringBuilder builder = new StringBuilder();
builder.append("<xml>");
builder.append("<ToUserName><![CDATA["+fromUserNameElementText+"]]></ToUserName>");
builder.append("<FromUserName><![CDATA["+userNameText+"]]></FromUserName>");
builder.append("<CreateTime>"+System.currentTimeMillis()+"</CreateTime>");
builder.append("<MsgType><![CDATA[text]]></MsgType>");
builder.append("<Content><![CDATA["+responseText+"]]></Content>");
builder.append("</xml>");
System.out.println(builder.toString());
return builder.toString();