1幅垮、企業(yè)微信API文檔
https://work.weixin.qq.com/api/doc/90001/90142/90595 服務(wù)商注冊應(yīng)用
https://work.weixin.qq.com/api/doc/90001/90145/90446 加解密庫下載與返回碼
下載JAVA庫json版本
image
拷貝aes文件夾到自己的工程
image
image
2、指令回調(diào)尾组、數(shù)據(jù)回調(diào)忙芒、測試安裝接口
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
/**
* 微信緩存表 前端控制器
*/
@Slf4j
@RestController
@RequestMapping("api/admin/qywechat")
public class QyWeChatController {
/**
* ------------企業(yè)微信驗(yàn)證回調(diào)URL---------------
* 企業(yè)開啟回調(diào)模式時(shí),企業(yè)微信會(huì)向驗(yàn)證url發(fā)送一個(gè)get請求
* 假設(shè)點(diǎn)擊驗(yàn)證時(shí)讳侨,企業(yè)收到類似請求:
* GET /cgi-bin/wxpush?msg_signature=5c45ff5e21c57e6ad56bac8758b79b1d9ac89fd3×tamp=1409659589&nonce=263014780&echostr=P9nAzCzyDtyTWESHep1vC5X9xho%2FqYX3Zpb4yKa9SKld1DsH3Iyt3tP3zNdtp%2B4RPcs8TgAE7OaBO%2BFZXvnaqQ%3D%3D
* HTTP/1.1 Host: qy.weixin.qq.com
* <p>
* 接收到該請求時(shí)呵萨,企業(yè)應(yīng) 1.解析出Get請求的參數(shù),包括消息體簽名(msg_signature)跨跨,時(shí)間戳(timestamp)潮峦,隨機(jī)數(shù)字串(nonce)以及企業(yè)微信推送過來的隨機(jī)加密字符串(echostr),
* 這一步注意作URL解碼。
* 2.驗(yàn)證消息體簽名的正確性
* 3. 解密出echostr原文勇婴,將原文當(dāng)作Get請求的response忱嘹,返回給企業(yè)微信
* 第2,3步可以用企業(yè)微信提供的庫函數(shù)VerifyURL來實(shí)現(xiàn)耕渴。
*/
@RequestMapping(value = "/dataCallback")
@ResponseBody
public String dataCallback(@RequestBody(required = false) String reqStr, QyWechatCallBackReq req) throws AesException {
//需要返回的明文
String sEchoStr = null;
// post 請求拘悦,用于測試安裝
if (null != reqStr) {
//第三方應(yīng)用SuiteIDID
String SuiteID = "";
String sToken = "";
String sEncodingAESKey = "";
JSONObject jsonObject = JSONUtil.xmlToJson(reqStr);
String xmlData = JSONUtil.toJsonStr(jsonObject.get("xml"));
log.info("指令回調(diào)請求參數(shù)xmlData:{}", xmlData);
// 對msg_signature進(jìn)行檢驗(yàn) 并且解密獲得消息結(jié)構(gòu)體
WXBizJsonMsgCrypt wxcpt = new WXBizJsonMsgCrypt(sToken, sEncodingAESKey, SuiteID);
// 回調(diào)的key值
String msgStructure = wxcpt.DecryptMsg(req.getMsg_signature(), req.getTimestamp(), req.getNonce(), xmlData);
log.info("指令回調(diào)獲取到的數(shù)據(jù)為:{}", msgStructure);
return "success";
} else {
// get 請求,用于驗(yàn)證回調(diào)
//服務(wù)商CORPID
String sCorpID = "";
String sToken = "";
String sEncodingAESKey = "";
WXBizJsonMsgCrypt wxcpt = new WXBizJsonMsgCrypt(sToken, sEncodingAESKey, sCorpID);
// 解析出url上的參數(shù)值如下:
String sVerifyMsgSig = req.getMsg_signature();
String sVerifyTimeStamp = req.getTimestamp();
String sVerifyNonce = req.getNonce();
String sVerifyEchoStr = req.getEchostr();
try {
sEchoStr = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp,
sVerifyNonce, sVerifyEchoStr);
log.info("verifyurl echostr: " + sEchoStr);
// 驗(yàn)證URL成功橱脸,將sEchoStr返回
return sEchoStr;
} catch (Exception e) {
//驗(yàn)證URL失敗础米,錯(cuò)誤原因請查看異常
e.printStackTrace();
}
}
return sEchoStr;
}
}
3、修改JsonParse.java工具類中慰技,json解析時(shí)的屬性名
image