企业回调验证、消息交互、审批状态回调及审批查询审批接⼝调⽤总是伴随着状态回调的通知,设置接收消息,可以让⾃建应⽤和企业之间进⾏双向通信。
当然在此之前,我们需要确定,企业后台是否开启了审批状态通知。
⼆. 企业消息交互(重要)
三. 审批状态回调
四. 查询审批状态
注意: 想要成功接收到企业回调的信息 ,Encrypt,得到明⽂的消息结构体尤为重要,当然解密后得到的是xml格式⽂件,我们还需要解析xml⽂件,才能得到我们想要拿到的字段。
⼀. 企业回调验证
点击保存即会开始验证url的有效性。官⽅⽂档关于验证url有效性也是介绍的很仔细。(回想当时,⼀步⼀个坑)
验证URL有效性
名族舞蹈当点击“保存”提交以上信息时,企业会发送⼀条验证消息到填写的URL,发送⽅法为GET。
企业的接收消息服务器接收到验证请求后,需要作出正确的响应才能通过URL验证。
企业在获取请求时需要做Urldecode处理,否则可能会验证不成功
你可以访问进⾏调试,依次选择 建⽴连接 > 接收消息。
参数必须说明
msg_signature是企业加密签名,msg_signature结合了企业填写的token、请求中的timestamp、nonce参数、加密的消息体
timestamp是时间戳
参数必须说明
nonce是随机数
echostr是加密的字符串。需要,解密后有random、msg_len、msg、receiveid四个字段,其中msg即为消息内容明⽂
企业后台收到请求后,需要做如下操作:
1. 对收到的请求做Urldecode处理
2. 通过参数msg_signature,确认调⽤者的合法性。
3. 参数得到消息内容(即msg字段)
4. 在1秒内响应GET请求,响应内容为上⼀步得到的明⽂消息内容(不能加引号,不能带bom头,不能带换⾏符)
以上2~3步骤可以直接使⽤⼀步到位。
腾冲旅游介绍之后接⼊验证⽣效,接收消息开启成功。
(以上来⾃企业官⽅⽂档)
//企业回调验证
@RequestMapping(value = "callback",method = RequestMethod.GET)
public void connect(HttpServletRequest request, HttpServletResponse response){
//当你提交以上信息时,企业号将发送GET请求到填写的URL上,GET请求携带四个参数,企业在获取时需要做urldecode处理,否则会验证不成功 // 加密签名
String msg_signature = Parameter("msg_signature");
// 时间戳
String timestamp = Parameter("timestamp");
// 随机数
String nonce = Parameter("nonce");
// 随机字符串
String echoStr = Parameter("echostr");
//回调key值时空伴随风险
String sEchoStr = null;
String contacts_token = Property("contacts_token");
String contacts_encodingaeskey = Property("contacts_encodingaeskey");
String corpId = Property("corpid");
try {
PrintWriter out = Writer();
WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(contacts_token,contacts_encodingaeskey,corpId);
sEchoStr = wxcpt.VerifyURL(msg_signature,timestamp,nonce,echoStr);
if(StringUtils.isBlank(sEchoStr)){
<("URL验证失败");
}
中国十大悍匪排行榜out.write(sEchoStr);
out.flush();
}catch (Exception e){
<("企业回调url验证错误",e);
}
}
验证url有效性,按照步骤⾛,⼀般没什么⼤问题。
⼆. 企业消息交互
使⽤接收消息
开启接收消息模式后,企业会将消息发送给企业填写的URL,企业后台需要做正确的响应。
接收消息协议的说明
企业服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。如果企业在调试中,发现成员⽆法收到被动回复的消息,可以检查是否消息处理超时。
当接收成功后,http头部返回200表⽰接收ok,其他错误码企业后台会⼀律当做失败并发起重试。
关于重试的消息排重,有msgid的消息推荐使⽤msgid排重。推荐使⽤FromUserName + CreateTime排重。
假如企业⽆法保证在五秒内处理并回复,或者不想回复任何内容,可以直接返回200(即以空串为返回包)。企业后续可以使⽤主动发消息接⼝进⾏异步回复。
接收消息请求的说明
接收数据格式 :
1. <xml>
2. <ToUserName><![CDATA[toUser]]></ToUserName>
3. <AgentID><![CDATA[toAgentID]]></AgentID>
4. <Encrypt><![CDATA[msg_encrypt]]></Encrypt>
5. </xml>
参数说明
参数说明
ToUserName企业的CorpID,当为第三⽅套件回调事件时,CorpID的内容为suiteid
AgentID接收的应⽤id,可在应⽤的设置页⾯获取
Encrypt消息结构体加密后的字符串
企业收到消息后,需要作如下处理:
1. 对msg_signature进⾏
2. Encrypt,得到明⽂的消息结构体(消息结构体后⾯章节会详说)
3. 如果需要被动回复消息,构造被动响应包
4. 正确响应本次请求
以上1~2步骤可以直接使⽤⼀步到位。
3步骤其实包含加密被动回复消息、⽣成新签名、构造被动响应包三个步骤,可以直接使⽤⼀步到位。
(以上来⾃企业官⽅⽂档)
//企业消息交互
@RequestMapping(value = "callback",method = RequestMethod.POST)
public void acceptMessage(HttpServletRequest request, RedirectAttributes attributes, HttpSession session){
logger.debug("企业信息交互");
// 加密签名
String sMsgSignature = Parameter("msg_signature");
// 时间戳
String sTimestamp = Parameter("timestamp");
// 随机数
String sNonce = Parameter("nonce");
String sMsg = "";
String contacts_token = Property("contacts_token");
String contacts_encodingaeskey = Property("contacts_encodingaeskey");
String corpId = Property("corpid");
try{
四级作文句型InputStream inputStream = InputStream();
String sPostData = String(inputStream,"UTF-8");
WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(contacts_token,contacts_encodingaeskey,corpId);
sMsg = wxcpt.DecryptMsg(sMsgSignature,sTimestamp,sNonce,sPostData);
证书错误//将post数据转换为map
Map<String,String> dataMap = MessageUtil.parseXml(sMsg);
//成员userId
String fromUserName = ("FromUserName");
ServerResponse<EmpVo> response = iEmployeeService.updateOrInsertByUserId(fromUserName);
if(response.isSuccess()){
session.setAttribute(Common.CURRENT_Data());
}
String msgType = ("MsgType");
if(msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)){
String eventType = ("Event");
//审批状态回调通知
if(eventType.equals(MessageUtil.EVENT_TYPE_OPEN_APPROVAL_CHANGE)){
ServerResponse approvalCallbackResponse = iApprovalService.approvalChangeCallback(dataMap);
if(!approvalCallbackResponse.isSuccess()){
<("审批回调通知,审批单号为:"+("ThirdNo")+",异常信息为:"+Msg());
}
}
}
}catch (Exception e){
<("企业消息交互错误",e);
}
}
请求⽅式为post,企业消息交互时⽤的是post请求,⾃⾝验证时⽤的是get⽅式。post请求⼀般⽤于接收企业端发送的消息,各类事件通知。
关于消息体Encrypt,消息结构体加密后的字符串,企业⽂档的介绍⼤概可以⽤⼀句话描述,我⼀
笔带过,你采坑⽆数。
这⾥开始时真的有点摸不着头脑,⽂档关于加密,解密介绍的很⾼⼤上,原理,算法,就是不告诉你该⽤何种⽅法进⾏接收。
所以贴⼀个,⽤于信息交互,解析xml消息体的⼯具类:
public class MessageUtil {
/**
* 返回消息类型:⽂本
*/
public static final String RESP_MESSAGE_TYPE_TEXT = "text";
/**
* 返回消息类型:⾳乐
*/
public static final String RESP_MESSAGE_TYPE_MUSIC = "music";
/**
* 返回消息类型:图⽂
*/
public static final String RESP_MESSAGE_TYPE_NEWS = "news";
/**
* 请求消息类型:⽂本
*/
public static final String REQ_MESSAGE_TYPE_TEXT = "text";
/**
* 请求消息类型:图⽚
*/
public static final String REQ_MESSAGE_TYPE_IMAGE = "image";
/**
* 请求消息类型:链接
*/
public static final String REQ_MESSAGE_TYPE_LINK = "link";
/**
* 请求消息类型:地理位置
*/
public static final String REQ_MESSAGE_TYPE_LOCATION = "location";
/**
* 请求消息类型:⾳频
*/
public static final String REQ_MESSAGE_TYPE_VOICE = "voice";
/**
* 请求消息类型:推送
*/
public static final String REQ_MESSAGE_TYPE_EVENT = "event";
/**
* 事件类型:subscribe(订阅)
*/
public static final String EVENT_TYPE_SUBSCRIBE = "subscribe";
/
**
* 事件类型:unsubscribe(取消订阅)
*/
public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe";
/**
* 事件类型:CLICK(⾃定义菜单点击事件)
*/
public static final String EVENT_TYPE_CLICK = "CLICK";
/**
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论