简介:本文详解Java接入企业微信客服的完整流程,涵盖API调用、消息处理、安全认证等核心环节,提供可落地的代码示例与最佳实践,助力企业快速构建高效客服系统。
接入企业微信客服需先完成开发者资质认证,包括企业主体信息提交、管理员授权及API调用权限申请。通过企业微信管理后台的「应用管理」-「创建应用」功能,生成唯一的CorpID和Secret,这两个参数是后续所有API调用的基础凭证。
通过Maven引入企业微信官方Java SDK(或使用OkHttp/HttpClient自行封装):
<dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-cp</artifactId><version>4.5.0</version></dependency>
Access Token是调用所有API的临时凭证,有效期2小时,需定时刷新:
public String getAccessToken() {String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + CORP_ID+ "&corpsecret=" + SECRET;String response = HttpClientUtil.get(url);JSONObject json = JSONObject.parseObject(response);return json.getString("access_token");}
最佳实践:将Token缓存至Redis,设置1小时50分的过期时间,避免频繁请求。
企业微信通过POST请求将用户消息推送至配置的URL,需实现以下逻辑:
msg_signature、timestamp、nonce和echostr参数,需按规则解密验证。
public String decryptMessage(String encryptedData, String msgSignature,String timestamp, String nonce) {// 1. 拼接字符串并计算SHA1签名String signature = SHA1.generate(TOKEN, timestamp, nonce, ENCRYPT_KEY);if (!signature.equals(msgSignature)) {throw new RuntimeException("签名验证失败");}// 2. AES解密(需实现AESUtil工具类)return AESUtil.decrypt(encryptedData, ENCRYPT_KEY);}
public void handleTextMessage(XmlMessage message) {String content = message.getContent();String fromUser = message.getFromUserName();// 调用客服业务逻辑String reply = customerService.processQuery(content);// 发送回复sendTextReply(fromUser, reply);}
通过/cgi-bin/message/send接口主动推送消息,示例代码:
public void sendTextReply(String toUser, String content) {String accessToken = getAccessToken();String url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token="+ accessToken;JSONObject params = new JSONObject();params.put("touser", toUser);params.put("msgtype", "text");params.put("agentid", AGENT_ID);params.put("text", new JSONObject().put("content", content));params.put("safe", 0);HttpClientUtil.postJson(url, params.toJSONString());}
通过/cgi-bin/menu/create接口配置客服菜单,支持点击事件推送:
public void createCustomMenu() {String url = "https://qyapi.weixin.qq.com/cgi-bin/menu/create?access_token="+ getAccessToken() + "&agentid=" + AGENT_ID;String menuJson = "{\"button\":[{\"type\":\"click\",\"name\":\"咨询\",\"key\":\"CONSULT\"}]}";HttpClientUtil.postJson(url, menuJson);}
通过/cgi-bin/user/getuserinfo接口获取用户OpenID,与内部系统用户ID绑定:
public UserInfo getUserInfo(String code) {String url = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token="+ getAccessToken() + "&code=" + code;String response = HttpClientUtil.get(url);return JSONObject.parseObject(response, UserInfo.class);}
@RestController@RequestMapping("/wechat")public class WeChatController {@Value("${wechat.corpId}")private String CORP_ID;@Value("${wechat.secret}")private String SECRET;@Value("${wechat.token}")private String TOKEN;@Value("${wechat.encodingAesKey}")private String ENCRYPT_KEY;@Value("${wechat.agentId}")private Integer AGENT_ID;@PostMapping("/callback")public String callback(@RequestParam String msg_signature,@RequestParam String timestamp,@RequestParam String nonce,@RequestBody String encryptData) {try {String decryptData = WxCpMessageCrypt.decrypt(encryptData, AGENT_ID.toString(), timestamp, nonce, msg_signature, ENCRYPT_KEY);XmlMessage message = XmlMessage.fromXml(decryptData);handleMessage(message);return "success";} catch (Exception e) {return "error";}}private void handleMessage(XmlMessage message) {switch (message.getMsgType()) {case "text":String reply = "您说了:" + message.getContent();sendTextReply(message.getFromUserName(), reply);break;// 其他消息类型处理...}}}
Java接入企业微信客服需重点关注三点:安全认证(Token管理、消息解密)、消息处理(异步化、类型区分)、性能优化(缓存、限流)。通过合理设计架构,可实现日均百万级消息处理能力。建议参考企业微信官方文档(https://work.weixin.qq.com/api/doc)持续跟进API更新。