Java實現企業(yè)微信回調配置的詳細步驟與測試
在使用前閱讀官方文檔:回調配置文檔
一、配置回調服務
一、在企業(yè)微信管理后臺配置三個配置
分別是:URL, Token, EncodingAESKey。打開企業(yè)微信后臺-->管理工具-->通訊錄同步配置回調地址如下所示


1.1、URL為回調服務地址,由開發(fā)者搭建(直白點就是后臺回調域名地址,你給企業(yè)微信的URL,例如http://127.0.0.1:8085/qiyewx/getCallBack)服務器如果是云服務要配置域名
1.2、Token用于計算簽名,由英文或數字組成且長度不超過32位的自定義字符串。(可隨機獲取,但要復制到本地代碼,后面會用到)
1.3、EncodingAESKey用于消息內容加密,由英文或數字組成且長度為43位的自定義字符串。(可隨機獲取,但要復制到本地代碼,后面會用到)
二、在代碼中配置Token和EncodingAESKey

# 企業(yè)微信配置 qiyewx: url: corpid: corpsecret: #回調配置 token: XXXXXX encodingAESKey: XXXXXX
三、官方加解密庫下載
1、點擊如下鏈接自行下載,下載后結構如下圖所示:
有json版本和xml版本
json版本:

xml版本:

加解密庫下載與返回碼 - 接口文檔 - 企業(yè)微信開發(fā)者中心
2、將下載的示例代碼復制到你的項目代碼中
二、編碼實現
一、引入相關項目依賴
<!--企業(yè)微信相關-->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<!-- 企業(yè)微信json格式包-->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20200518</version>
</dependency>
<!-- dom4j解析xml -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>二、支持Http Get請求驗證URL有效性與支持Http Post請求接收業(yè)務數據
切記:將將下載的示例代碼復制到你的項目代碼中,下面的代碼中有使用。
1、coontroller
/**
* 企業(yè)微信回調
* 3.1 支持Http Get請求驗證URL有效性
* 3.2 支持Http Post請求接收業(yè)務數據
*
* @return
*/
@RequestMapping(value = "/getCallBack", method = {RequestMethod.GET, RequestMethod.POST})
public Object CompanyWeChatChangeNotice(HttpServletRequest request, @RequestBody(required = false) String body) {
Map<String, String[]> parameterMap = request.getParameterMap();
String jsonString = JSONObject.toJSONString(parameterMap);
log.info("企業(yè)微信回調參數:{}, 解析參數:{}", jsonString, body);
if (body == null) {
Object result = qyWxService.verificationUrl(request);
return result;
}
Map<String, String> resultMap = qyWxService.getRequestParameter(request, body);
System.err.println(resultMap);
return "success";
}2、驗證URL有效性
/**
* 驗證回調URL
*
* @param request
* @return
*/
public Object verificationUrl(HttpServletRequest request) {
log.info("=========驗證URL有效性開始=========");
String sEchoStr; //需要返回的明文
try {
WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(qyWxConfig.getToken(), qyWxConfig.getEncodingAESKey(), qyWxConfig.getCorpid());
String msgSignature = request.getParameter("msg_signature");
String timeStamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
log.info("企業(yè)微信加密簽名: {},時間戳: {},隨機數: {},加密的字符串: {}", msgSignature, timeStamp, nonce, echostr);
sEchoStr = wxcpt.VerifyURL(msgSignature,
timeStamp,
nonce,
echostr);
log.info("給企業(yè)微信返回的明文,{}", sEchoStr);
log.info("=========驗證URL有效性結束=========");
return sEchoStr;
} catch (AesException e) {
log.error("驗證URL失敗,錯誤原因請查看異常:{}", e.getCode());
throw new AesException(e.getCode());
}
}3、回調參數解析
/**
* 企業(yè)微信回調參數解析
*
* @param request
* @param body
* @return
*/
public Map<String, String> getRequestParameter(HttpServletRequest request, String body) {
log.info("=========參數解析開始=========");
try {
WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(qyWxConfig.getToken(), qyWxConfig.getEncodingAESKey(), qyWxConfig.getCorpid());
String msgSignature = request.getParameter("msg_signature");
String timeStamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
log.info("企業(yè)微信加密簽名: {},時間戳: {},隨機數: {}", msgSignature, timeStamp, nonce);
String sMsg = wxcpt.DecryptMsg(msgSignature, timeStamp, nonce, body);
Map<String, String> resultMap = new HashMap<String, String>(16);
resultMap = ConstantUtil.parseXmlToMap(sMsg, resultMap);
log.info("decrypt密文轉為map結果為{}", resultMap);
log.info("=========參數解析結束=========");
return resultMap;
} catch (AesException e) {
log.error("密文參數解析失敗,錯誤原因請查看異常:{}", e.getMessage());
throw new AesException(e.getCode());
}
}4、XML轉map工具
package com.ruoyi.system.qiwechat.utils;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.StringReader;
import java.util.Iterator;
import java.util.Map;
/**
* @author XiYuan
* @date 2023/2/20
* @Description: XML轉換Map
*/
public class ConstantUtil {
/**
* 將xml轉換為Map。 支持xml標簽多層嵌套,并以"."分隔多級標簽(不包括根節(jié)點)。 不支持XML標簽重復時的情況
*
* @param xml
* @param map
* @return
*/
public static Map<String, String> parseXmlToMap(String xml, Map<String, String> map) {
try {
SAXReader reader = new SAXReader();
Document doc = reader.read(new StringReader(xml));
Element root = doc.getRootElement();
String path = "";
if (map.containsKey(root.getName().trim())) {
path = map.get(root.getName().trim());
map.remove(root.getName().trim());
}
for (Iterator i = root.elementIterator(); i.hasNext();) {
Element element = (Element) i.next();
if (element.isTextOnly()) {
if (path.length() > 0) {
map.put(path + element.getName().trim(), element.getTextTrim());
} else {
map.put(element.getName().trim(), element.getTextTrim());
}
} else {
map.put(element.getName().trim(), path+ element.getName().trim() + ".");
parseXmlToMap(element.asXML(), map);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
}
5、配置文件config
package com.ruoyi.common.config;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
@Data
@Configuration
public class QyWxConfig {
/**
* 請求路徑
*/
@Value("${qiyewx.url}")
private String url;
/**
* 企業(yè)微信ID
*/
@Value("${qiyewx.corpid}")
private String corpid;
/**
* 企業(yè)應用的憑證密鑰
*/
@Value("${qiyewx.corpsecret}")
private String corpsecret;
/**
* 開發(fā)者設置的token
*/
@Value("${qiyewx.token}")
private String token;
/**
* 開發(fā)者設置的EncodingAESKey
*/
@Value("${qiyewx.encodingAESKey}")
private String encodingAESKey;
}三、測試示例
一、測試3.1 支持Http Get請求驗證URL有效性
所要參數依次寫入,測試

二、測試3.2支持Http Post請求接收業(yè)務數據
1、演示關于接收客戶變更事件回調通知,企業(yè)微信開發(fā)者中心 回調
2、通俗點就是手機企業(yè)微信添加客戶將數據回調到本地,按照文檔說明講相關參數設置好。如圖所示:

3、對返回結果按照自己需求進行處理
如下紅框所示:

備注:要根據事件的類型Event判斷回調的事件,在回調事件中根據ChangeType判斷事件性質

4、查看日志

總結
到此這篇關于Java實現企業(yè)微信回調配置的詳細步驟與測試的文章就介紹到這了,更多相關Java企業(yè)微信回調配置內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java中Stream的flatMap與map使用場景及區(qū)別詳解
這篇文章主要介紹了Java中Stream的flatMap與map使用場景及區(qū)別詳解,Stream 流式操作,一般用于操作集合即 List 一類的數據結構,簡單來說 Stream 的 map 使得其中的元素轉為另一種元素的映射(map)方法,需要的朋友可以參考下2024-01-01
Spring 事件監(jiān)聽機制實現跨模塊調用的思路詳解
之前一個項目,有兩個模塊,A 模塊需要依賴 B 模塊,但現在 B 模塊有地方需要調用 A 模塊的方法,如果直接依賴,又會產生循環(huán)依賴問題,最終選擇使用 spring 的事件監(jiān)聽來解決該問題,下面給大家介紹Spring 事件監(jiān)聽機制實現跨模塊調用的思路,感興趣的朋友一起看看吧2024-05-05
Java 中的FileReader和FileWriter源碼分析_動力節(jié)點Java學院整理
本文給大家分享一段示例程序,通過示例代碼可以看出FileReader是基于InputStreamReader實現的,FileWriter是基于OutputStreamWriter實現的,具體程序代碼大家通過本文了解下吧2017-05-05
mybatis中mapper.xml文件的常用屬性及標簽講解
這篇文章主要介紹了mybatis中mapper.xml文件的常用屬性及標簽講解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
SpringBoot集成ActiveMQ的實戰(zhàn)全過程
消息隊列中間件是分布式系統(tǒng)中重要的組件,主要解決應用耦合、異步消息、流量削鋒等問題,實現高性能、高可用、可伸縮和最終一致性架構,是大型分布式系統(tǒng)不可缺少的中間件,這篇文章主要給大家介紹了關于SpringBoot集成ActiveMQ的相關資料,需要的朋友可以參考下2021-11-11

