步骤
- 编写公众号接口程序–采用SpringBoot编写
- 部署程序
- 申请公众号和配置公众号
- 参考资料
编写公众号接口程序
公众号官方接口说明
- 验证服务器配置是否正确接口
- 接受文本信息接口
编写程序接口
- 验证服务器配置是否正确接口
@GetMapping("/gong")
public void getGong(HttpServletRequest request , HttpServletResponse response){
// 微信加密签名
String signature = request.getParameter("signature");
// 时间戳
String timestamp = request.getParameter("timestamp");
// 随机数
String nonce = request.getParameter("nonce");
// 随机字符串
String echostr = request.getParameter("echostr");
List<String> params = new ArrayList<String>();
params.add("english");
params.add(timestamp);
params.add(nonce);
// 1. 将token、timestamp、nonce三个参数进行字典序排序
Collections.sort(params, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
// 2. 将三个参数字符串拼接成一个字符串进行sha1加密
Digester sha1 = new Digester(DigestAlgorithm.SHA1);
String temp = sha1.digestHex(params.get(0) + params.get(1) + params.get(2));
if (temp.equals(signature)) {
try {
response.getWriter().write(echostr);
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 接受文本信息接口
@PostMapping("/gong")
public void postGong(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 解决乱码
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
// 处理接收消息
ServletInputStream in = request.getInputStream();
// 将流转换为字符串
StringBuilder xmlMsg = new StringBuilder();
byte[] b = new byte[4096];
for (int n; (n = in.read(b)) != -1;) {
xmlMsg.append(new String(b, 0, n, "UTF-8"));
}
// 将POST流转换为XStream对象
XStream xs = new XStream();
xs.processAnnotations(TencentVO.class);
// 将xml内容转换为InputMessage对象,![CDATA[]]会自动被去掉
TencentVO tencentVO = (TencentVO) xs.fromXML(xmlMsg.toString());
// 服务端
String servername = tencentVO.getToUserName();
// 客户端
String custermname = tencentVO.getFromUserName();
// 接收时间
long createTime = tencentVO.getCreateTime();
// 返回时间
Long returnTime = Calendar.getInstance().getTimeInMillis() / 1000;
// 取得消息类型
String msgType = tencentVO.getMsgType();
// 根据消息类型获取对应的消息内容
if (msgType.equals("text")) {
StringBuffer str = new StringBuffer();
str.append("<xml>");
str.append("<ToUserName><![CDATA[" + custermname + "]]></ToUserName>");
str.append("<FromUserName><![CDATA[" + servername + "]]></FromUserName>");
str.append("<CreateTime>" + returnTime + "</CreateTime>");
str.append("<MsgType><![CDATA[" + msgType + "]]></MsgType>");
// 回复信息
String outContent = "欢迎访问我的公众号";
str.append("<Content><![CDATA[" + outContent + "]]></Content>");
str.append("</xml>");
response.getWriter().write(str.toString());
} else {
StringBuffer str = new StringBuffer();
str.append("<xml>");
str.append("<ToUserName><![CDATA[" + custermname + "]]></ToUserName>");
str.append("<FromUserName><![CDATA[" + servername + "]]></FromUserName>");
str.append("<CreateTime>" + returnTime + "</CreateTime>");
str.append("<MsgType><![CDATA[" + msgType + "]]></MsgType>");
str.append("<Content><![CDATA[" + "不支持的多媒体" + "]]></Content>");
str.append("</xml>");
response.getWriter().write(str.toString());
}
}
}
@XStreamAlias("xml")
class TencentVO implements Serializable {
private static final long serialVersionUID = 1L;
@XStreamAlias("ToUserName")
private String ToUserName;
@XStreamAlias("FromUserName")
private String FromUserName;
@XStreamAlias("CreateTime")
private Long CreateTime;
@XStreamAlias("MsgType")
private String MsgType = "text";
@XStreamAlias("MsgId")
private Long MsgId;
// 文本消息
@XStreamAlias("Content")
private String Content;
public String getToUserName() {
return ToUserName;
}
public void setToUserName(String toUserName) {
ToUserName = toUserName;
}
public String getFromUserName() {
return FromUserName;
}
public void setFromUserName(String fromUserName) {
FromUserName = fromUserName;
}
public Long getCreateTime() {
return CreateTime;
}
public void setCreateTime(Long createTime) {
CreateTime = createTime;
}
public String getMsgType() {
return MsgType;
}
public void setMsgType(String msgType) {
MsgType = msgType;
}
public Long getMsgId() {
return MsgId;
}
public void setMsgId(Long msgId) {
MsgId = msgId;
}
public String getContent() {
return Content;
}
public void setContent(String content) {
Content = content;
}
@Override
public String toString() {
return "TencentVO{" +
"ToUserName='" + ToUserName + '\'' +
", FromUserName='" + FromUserName + '\'' +
", CreateTime=" + CreateTime +
", MsgType='" + MsgType + '\'' +
", MsgId=" + MsgId +
", Content='" + Content + '\'' +
'}';
}
}
部署程序
我是购买阿里云的云服务器来部署,然后操作系统是centos7,使用springboot自带的tomcat部署
申请公共号和公众号配置
公众号配置
注意:端口号只能是80和443