微信公众账号登陆授权开发——5(解决使用官方获获取第三方平台方获取预授权码)
            时间:2015-08-30 11:26:43  
            收藏:0  
            阅读:4184
        
        
        开始对于component_verify_ticket这个参数我一直没弄明白,所以使用这种post请求方式获取第三方平台的access_token就没能成功。
经过仔细阅读文档后解决了这一问题:
----------------------------------------------------------------------官方文档---开始---------------------------------------------------------------
8、推送component_verify_ticket协议
在公众号第三方平台创建审核通过后,微信服务器会向其“授权事件接收URL”每隔10分钟定时推送component_verify_ticket。第三方平台方在收到ticket推送后也需进行解密(详细请见【消息加解密接入指引】),接收到后必须直接返回字符串success。
POST数据示例
<xml>     
<AppId> </AppId>
<CreateTime>1413192605 </CreateTime>
<InfoType> </InfoType>
<ComponentVerifyTicket> </ComponentVerifyTicket>
</xml>
字段说明
| 字段名称 | 字段描述 | 
|---|---|
| Appid | 第三方平台appid | 
| CreateTime | 时间戳 | 
| InfoType | component_verify_ticket | 
| ComponentVerifyTicket | Ticket内容 | 
----------------------------------------------------------------------官方文档----结束--------------------------------------------------------------
/**
     * 在公众号第三方平台创建审核通过后,微信服务器会向其“授权事件接收URL”每隔10分钟定时推送component_verify_ticket。
     * 第三方平台方在收到ticket推送后也需进行解密(详细请见【消息加解密接入指引】),接收到后必须直接返回字符串success。
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String msgSignature = request.getParameter("msg_signature");
        String timeStamp = request.getParameter("timestamp");
        String nonce = request.getParameter("nonce");
        String token = "yangchao";
        String encodingAesKey = "*****";
        String appId = "*********";
        /*
         * byte[] data = Request.BinaryRead(Request.TotalBytes); 
         * 
         * string postData * = Encoding.Default.GetString(data);
         */
        BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream()));
        StringBuffer sb = new StringBuffer();
        String line = null;
        while ((line=br.readLine()) != null) {
            sb = sb.append(line);
        }
        String postData = sb.toString();
        
        System.out.println(msgSignature+"------"+ timeStamp+"------"+ nonce+"------"+ postData);
        
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            StringReader sr = new StringReader(postData);
            InputSource is = new InputSource(sr);
            Document document = db.parse(is);
            Element root = document.getDocumentElement();
            NodeList nodelist1 = root.getElementsByTagName("Encrypt");
            NodeList nodelist2 = root.getElementsByTagName("MsgSignature");
            String encrypt = nodelist1.item(0).getTextContent();
//            String msgSignature = nodelist2.item(0).getTextContent();
            String format = "<xml><ToUserName><![CDATA[toUser]]></ToUserName><Encrypt><![CDATA[%1$s]]></Encrypt></xml>";
            String fromXML = String.format(format, encrypt);
            /**
             * 构造函数
             * 
             * @param token
             *            公众平台上,开发者设置的token
             * @param encodingAesKey
             *            公众平台上,开发者设置的EncodingAESKey
             * @param appId
             *            公众平台appid
             * 
             * @throws AesException
             *             执行失败,请查看该异常的错误码和具体的错误信息
             */
            WXBizMsgCrypt pc = new WXBizMsgCrypt(token, encodingAesKey, appId);
            String result = pc.decryptMsg(msgSignature, timeStamp, nonce, fromXML);
            System.out.println(result + ".................");
            Component_verify_ticket c = new Component_verify_ticket();
            c = c.getComponent_verify_ticket(result);
            System.out.println(c.getComponentVerifyTicket()+"...............");
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 响应消息
        PrintWriter out = response.getWriter();
        out.print("success");
    }--------------------------------------------------------
/**
 * 8、推送component_verify_ticket协议
 * 
 * 
 * 在公众号第三方平台创建审核通过后,微信服务器会向其“授权事件接收URL”每隔10分钟定时推送component_verify_ticket。
 * 第三方平台方在收到ticket推送后也需进行解密(详细请见【消息加解密接入指引】),接收到后必须直接返回字符串success。
 * 
 * @author YangChao
 * 
 */
public class Component_verify_ticket {
    // 第三方平台appid
    private String AppId;
    // 时间戳
    private String CreateTime;
    // component_verify_ticket
    private String InfoType;
    // Ticket内容
    private String ComponentVerifyTicket;
    // 获取其对应的xml数据串
    public String getXML() {
        XStream xStream = new XStream(new DomDriver());
        xStream.alias("xml", this.getClass());
        // 设置成员的别名
        xStream.aliasField("AppId", this.getClass(), "AppId");
        xStream.aliasField("CreateTime", this.getClass(), "CreateTime");
        xStream.aliasField("InfoType", this.getClass(), "InfoType");
        xStream.aliasField("ComponentVerifyTicket", this.getClass(), "ComponentVerifyTicket");
        return xStream.toXML(this);
    }
    /**
     * 根据xml数据获取Component_verify_ticket对象
     * @param xml
     * @return
     */
    public Component_verify_ticket getComponent_verify_ticket(String xml){
        XStream xStream = new XStream(new DomDriver());
        xStream.alias("xml", this.getClass());
        // 设置成员的别名
        xStream.aliasField("AppId", this.getClass(), "AppId");
        xStream.aliasField("CreateTime", this.getClass(), "CreateTime");
        xStream.aliasField("InfoType", this.getClass(), "InfoType");
        xStream.aliasField("ComponentVerifyTicket", this.getClass(), "ComponentVerifyTicket");
        
        Component_verify_ticket component_verify_ticket = (Component_verify_ticket) xStream.fromXML(xml);
        return component_verify_ticket;
    }
版权声明:本文为博主原创文章,未经博主允许不得转载。
            评论(0)