如何開發微信企業號的「企業會話」應用 Part 1. 企業會話Callback機制建立
WeChat 企業號提供非常多的功能,如企業會話、搖一搖、微信支付 與 企業客服
會話服務主要提供企業號的成員進行內部溝通(對個人 或 對群組)
WeChat 提供Callback 機制讓管理者能針對企業對話內的事件進行記錄 (ex. 群聊群組建立、群聊群組成員的增減、傳送的訊息內容...等)
此篇文章主要記錄企業會話的Callback機制建立
Step 1: 程式開發
Callback程式我使用Java Servlet 進行開發
Step 1.1 驗證Callback URL 是否有效 (對WeChat傳送的request進行解密,得到echostr並輸出)
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("UTF-8");
String msgSignature=null,timeStamp=null,nonce=null,echoStr=null;
if(request.getParameter("msg_signature")!=null)
msgSignature=request.getParameter("msg_signature");
if(request.getParameter("timestamp")!=null)
timeStamp=request.getParameter("timestamp");
if(request.getParameter("nonce")!=null)
nonce=request.getParameter("nonce");
if(request.getParameter("echostr")!=null)
echoStr=request.getParameter("echostr");
PrintWriter out=response.getWriter();
try{
//驗證URL是否有效
WXBizMsgCrypt wxcpt=new WXBizMsgCrypt(token,encodingAESKey,corpID);
if(echoStr!=null && echoStr!=""){
System.out.println("------ 顯示WeChat CallBack Infos -----");
System.out.println("request="+request.getRequestURL());
System.out.println("msg_signature:"+msgSignature+" Time Stamp:"+timeStamp+" Nonce:"+nonce+" echoStr");
//將WeChat傳送過來的字串進行解密,得到echstr
String result=wxcpt.VerifyURL(msgSignature, timeStamp, nonce, echoStr);
System.out.println(result);
logger.info(result);
if(result==null)
result=token;
//輸出解密後的echostr
out.print(result);
}
}
catch(AesException e){
e.printStackTrace();
}
catch(Exception ex){
logger.error(ex);
}
finally{
out.close();
out=null;
}
}
Step 1.2 處理WeChat Callback 事件(發送訊息的內容、群組的新增/刪除、成員的新增/刪除...等)
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("UTF-8");
String msgSignature=null,timeStamp=null,nonce=null;
if(request.getParameter("msg_signature")!=null)
msgSignature=request.getParameter("msg_signature");
if(request.getParameter("timestamp")!=null)
timeStamp=request.getParameter("timestamp");
if(request.getParameter("nonce")!=null)
nonce=request.getParameter("nonce");
try{
WXBizMsgCrypt wxcpt=new WXBizMsgCrypt(token,encodingAESKey,corpID);
FormatXmlAnswer formatXML=new FormatXmlAnswer();
response.setCharacterEncoding("UTF-8");
InputStream inStream=request.getInputStream();
//從Request擷取XML訊息
String sReqData=formatXML.getStringFromInputStream(inStream);
//將擷取的XML訊息進行解密得到明文
String sMsg = wxcpt.DecryptMsg(msgSignature, timeStamp, nonce, sReqData);
logger.info("Parsing XML Content: "+sMsg);
//啟用另一個Thread處理XML Parsing
new Thread(new XMLParser(dbURL,dbUser, dbPassword,sMsg)).start();
//注意!!當擷取到XML訊息後必須要返回PackageId(可由XML訊息內得到);若沒有返回PackageId,WeChat 5分鐘後會重送訊息
String PackageId=formatXML.getPackageID(sMsg);
System.out.println("Package ID: "+PackageId);
response.getWriter().print(PackageId);
}
catch(Exception ex){
logger.error(ex);
ex.printStackTrace();
}
}
Step2: 登入WeChat管理平台 -->服務中心-->企業會話 點選「設置」
Step 3: 輸入Callback 的 URL (此URL主要是讓WeChat將企業會話內的事件透過Http POST的方式傳到你的Server)、Token 與 EncodingAESKey
按下確認後,WeChat Server會針對此URL傳送一個HTTP GET 的request,用於驗證此URL是否有效
請注意!!此處時常會發生echostr調適錯誤的問題
遇到此問題請先參閱WeChat 開發者文件 http://qydev.weixin.qq.com/wiki/index.php?title=加解密库下载与返回码
有可能是java.security.InvalidKeyException:illegal Key Size 的Exception
請參照開發者文件的說明進行JCE文件的更新
以上為WeChat企業會話Callback機制建立的過程,提供給大家參考