开启企业微信应用API接收信息
- 第一步登录企业微信后台
找到自己要开启的应用,里面有一个开启API接收信息
然后就是开启中所要用到的一些参数说明,
这些东西官方文档也说的特别清楚的
当你点击保存的时候,微信官方会进行一个请求发送到你所填写的url上
所以点击保存的时候必须项目要启动,并且可以进行访问 - 现在开始说代码层面
对接这个接口主要要给官方提供两个接口
一个get请求的校验接口:验证你的项目官方是不是可以调通
一个是post请求的内容发送接口:是给微信官方发送每个用户所发送的内容
下次就展示代码,说的有点啰嗦,我这边用的是springBoot项目
给你们看一下我的项目结构以及要用到的那些类
weixin.mp.aes里面的类都是官方提供的
下载地址:https://work.weixin.qq.com/api/doc/90000/90138/90307
我这边是java的所以只展示Java的,可以点击下面直接下载
xml版本(2018年10月11日更新,点击下载)
Controller层
注解比较多,主要让小白看清楚每步都干了什么,
后面可以自己进行删除
package com.tian.spring_boot.controller;
import cn.hutool.core.util.XmlUtil;
import com.tian.spring_boot.service.WxService;
import com.tian.spring_boot.utils.WeiXinParamesUtil;
import com.tian.spring_boot.weixin.mp.aes.AesException;
import com.tian.spring_boot.weixin.mp.aes.WXBizMsgCrypt;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @ProjectName: spring_boot
* @Package: com.tian.spring_boot.controller
* @ClassName: WxController
* @Author: TZQ
* @Date: 2021/5/14 16:22
* @Version: 1.0
*/
@RestController
public class WxController {
@Autowired
private WxService wxService;
@GetMapping("/WxReceiveMessage")
public void coreJoinGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
// 微信加密签名
String msg_signature = request.getParameter("msg_signature");
// 时间戳
String timestamp = request.getParameter("timestamp");
// 随机数
String nonce = request.getParameter("nonce");
// 随机字符串
String echostr = request.getParameter("echostr");
System.out.println("msg_signature = " + msg_signature);
System.out.println("timestamp = " + timestamp);
System.out.println("nonce = " + nonce);
System.out.println("echostr = " + echostr);
System.out.println("request=" + request.getRequestURL());
PrintWriter out = response.getWriter();
// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
String result = null;
try {
WXBizMsgCrypt crypt = new WXBizMsgCrypt(WeiXinParamesUtil.token, WeiXinParamesUtil.encodingAESKey, WeiXinParamesUtil.corpId);
result = crypt.verifyUrl(msg_signature, timestamp, nonce, echostr);
} catch (AesException e) {
e.printStackTrace();
}
if (result == null) {
result = WeiXinParamesUtil.token;
}
out.write(result);
out.close();
out = null;
}
@PostMapping("/WxReceiveMessage")
public void coreJoinPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String timeMillis = System.currentTimeMillis() + "";
// 微信加密签名
String msg_signature = request.getParameter("msg_signature");
// 时间戳
String timestamp = request.getParameter("timestamp");
// 随机数
String nonce = request.getParameter("nonce");
PrintWriter out = response.getWriter();
String result = null;
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(request.getInputStream());
Element root = document.getDocumentElement();
String corpID = root.getElementsByTagName("ToUserName").item(0).getTextContent();
String agentID = root.getElementsByTagName("AgentID").item(0).getTextContent();
String encrypt = root.getElementsByTagName("Encrypt").item(0).getTextContent();//用户发送的内容
System.out.println("CorpID = " + corpID);
System.out.println("agentID = " + agentID);
System.out.println("encrypt = " + encrypt);
WXBizMsgCrypt crypt = new WXBizMsgCrypt(WeiXinParamesUtil.token, WeiXinParamesUtil.encodingAESKey, WeiXinParamesUtil.corpId);
result = crypt.verifyUrl(msg_signature, timestamp, nonce, encrypt);
System.out.println("result = " + result);
Document parse = XmlUtil.readXML(result);
String fromUserName = parse.getElementsByTagName("FromUserName").item(0).getTextContent();
String createTime = parse.getElementsByTagName("CreateTime").item(0).getTextContent();
String msgType = parse.getElementsByTagName("MsgType").item(0).getTextContent();
String content = parse.getElementsByTagName("Content").item(0).getTextContent();
String msgId = parse.getElementsByTagName("MsgId").item(0).getTextContent();
System.out.println("FromUserName = " + fromUserName);
System.out.println("CreateTime = " + createTime);
System.out.println("MsgType = " + msgType);
System.out.println("Content = " + content);
System.out.println("MsgId = " + msgId);
String msg = "";
//对用户发送过来的内容选择要回复的内容
//PS:这边你就可以对用户传过来的参数进行一个除了根据回复的内容配合自己的业务
if (content.contains("df")) {
content = content.substring(2);
if (wxService.confirmPayment(fromUserName, content)) {
msg = "党费确认成功!";
}
}
String replyMsg = "<xml>"
+ "<ToUserName><![CDATA[" + fromUserName + "]]></ToUserName>"//成员UserID
+ "<FromUserName><![CDATA[" + corpID + "]]></FromUserName>"//企业微信CorpID
+ "<CreateTime>" + timeMillis + "</CreateTime>"//消息创建时间(整型)
+ "<MsgType><![CDATA[text]]></MsgType>"//消息类型,此时固定为:text
+ "<Content><![CDATA[" + msg + "]]></Content>"//文本消息内容,最长不超过2048个字节,超过将截断
+ " </xml>";
System.out.println("replyMsg = " + replyMsg);//打印出来
//这里可以存放你要自动回复给用户的信息
String encryptMsg = crypt.encryptMsg(replyMsg, timeMillis, nonce);
System.out.println("encryptMsg = " + encryptMsg);
out.println(encryptMsg);//回复
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
WeiXinParamesUtil类
package com.tian.spring_boot.utils;
/**
* @ProjectName: spring_boot
* @Package: com.tian.spring_boot.utils
* @ClassName: WeiXinParamesUtil
* @Author: TZQ
* @Date: 2021/5/16 14:49
* @Version: 1.0
*/
public class WeiXinParamesUtil {
//token
public final static String token = "ttzzqq";
// encodingAESKey
public final static String encodingAESKey = "aJx22afLihLkcLdTQJg0C4wB5qUApoDg3tS6KOvUSCj";
//企业ID,可以在企业微信后台->我的企业->企业信息->拉到最下面能看见
public final static String corpId = "ww0971b514e055647b";
//应用的凭证密钥
public final static String corpsecret = "7LFu67ghtdsQGaJOcc_y4RLX61y0qqYXZ8O39x6J46I";
}
大致的代码就这些,然后主要说一下里面的坑
有些时候你本地进行测试的时候发送官方给的请求例子可以访问成功
但是放在官方测试的时候就不可以,这个时候你要试一下你本地项目能不能被外网进行访问
如果不能访问的话可以关闭防火墙试试,也可以进行内网穿透来完成
我这边用的是内网穿透,如果有小伙伴要跟我一样方法解决可以看下面这个文章
有其他问题也可以进行留言和私聊,主要看网上没有一个最新的教程,就想着自己琢磨出来的就记录一下,供大家进行一个参考