创建应用后即可测试授权应用
点击“测试授权”
确认发起授权安装测试
登陆企业号
勾选需要授权的应用
对应用进行可见范围设置
授权成功后等待跳转即可
在企业号管理员确认授权后微信后台会向开发者后台推送消息,开发者后台必须根据“第三方回调协议——授权成功推送auth_code事件”规则响应推送。
使用方式为‘线上自助注册授权使用’的套件,从企业号第三方官网发起授权时,微信服务器会向应用提供商的套件事件接收 URL(创建套件时填写)推送授权成功通知;从应用提供商网站发起的应用套件授权流程,由于授权完成时会跳转应用提供商管理后台,微信服务器不会向应用提供商推送授权成功通知。
POST数据示例
{
<xml>
<SuiteId><![CDATA[wxfc918a2d200c9a4c]]></ SuiteId>
<AuthCode><![CDATA[AUTHCODE]]></AuthCode>
<InfoType><![CDATA[create_auth]]></InfoType>
<TimeStamp>1403610513</TimeStamp>
</xml>
}
应用提供商在收到推送消息后需要返回字符串success,返回值不是 success 时,会把返回内容当作错误信息显示(需要以UTF8编码)。
字段说明
参数 | 说明 |
---|---|
SuiteId | 应用套件的SuiteId |
AuthCode | 授权的auth_code,用于获取企业的永久授权码 |
InfoType | create_auth |
TimeStamp |
时间戳 |
推送事件的推送地址是创建套件时填写的回调地址,所以在“微信企业号第三方应用开发[一]——创建套件”的代码上继续修改如下
/** * 测试微信企业号第三方应用回调协议 * @author:leap * @MethodName: testWXSaaSCallback * @Description: * @param req * @param res * @date:2016-8-9 */ @RequestMapping(value="testWXSaaSCallback") @ResponseBody public void testWXSaaSCallback( HttpServletRequest req, ServletResponse res){ //常量值 String CORP_ID = "wx9671de0651dbdxxx"; //CorpId, 企业号的普通管理组中可查看 String SUITE_ID = "tja2312bedd5086xxx"; //套件ID,在套件信息中查看 String SUITE_SECRET = "LGVT0BrN2DZ7VMTuIPOsudaWuXOE0iM67yHpIs1ofESS4l-jSC8LN9nOnmilhxxx"; String SUITE_TOKEN = "ssI2AnbgOo40eb0kOxxx"; String SUITE_ENCODING_AES_KEY = "Pmqgjzwt4yAEK9N6YZ34RKpy6onJD56r8mhCUFG9xxx"; //获取参数 String msgSignature = req.getParameter("msg_signature"); String timestamp = req.getParameter("timestamp"); String nonce = req.getParameter("nonce"); String echostr = req.getParameter("echostr"); //创建套件时验证回调url时传入 String result = ""; try { if(!Utils.isBlank(echostr)){ //=======验证回调url有效性======= WXBizMsgCrypt wxBizMsgCrypt = new WXBizMsgCrypt(SUITE_TOKEN, SUITE_ENCODING_AES_KEY, CORP_ID);//注意是CORP_ID result = wxBizMsgCrypt.VerifyURL(msgSignature, timestamp, nonce, echostr); System.out.println(result); res.getWriter().write(result); //对echostr参数解密并原样返回echostr明文(不能加引号,不能带bom头,不能带换行符) }else{ InputStream inputStream = null; inputStream = req.getInputStream(); String postData = IOUtils.toString(inputStream, "utf-8"); System.out.println("postData=" + postData); WXBizMsgCrypt wxBizMsgCrypt = new WXBizMsgCrypt(SUITE_TOKEN, SUITE_ENCODING_AES_KEY, SUITE_ID);//注意是SUITE_ID result = wxBizMsgCrypt.DecryptMsg(msgSignature, timestamp, nonce, postData); System.out.println("result=" + result); //解析xml DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); StringReader sr = new StringReader(result); InputSource is = new InputSource(sr); Document document = db.parse(is); Element root = document.getDocumentElement(); NodeList infoTypeNodeList = root.getElementsByTagName("InfoType"); if(infoTypeNodeList != null){ String infoType = infoTypeNodeList.item(0).getTextContent(); if("create_auth".equals(infoType)){ //=======授权成功推送auth_code事件======= NodeList authCodeNodeList = root.getElementsByTagName("AuthCode"); String authCode = authCodeNodeList.item(0).getTextContent(); System.out.println("authCode=" + authCode); //获取到authCode res.getWriter().write("success"); //应用提供商在收到推送消息后需要返回字符串success, //返回值不是 success 时,会把返回内容当作错误信息显示(需要以UTF8编码)。 } } res.getWriter().write("false"); } } catch (Exception e) { e.printStackTrace(); } }