WeChat 企業號開發心得 (Part 1: 企業會話CallBack機制的建立 )

如何開發微信企業號的「企業會話」應用 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機制建立的過程,提供給大家參考