微信公众账号登陆授权开发——5(解决使用官方获获取第三方平台方获取预授权码)

开始对于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;
    }

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-22 17:12:59

微信公众账号登陆授权开发——5(解决使用官方获获取第三方平台方获取预授权码)的相关文章

微信公众账号登陆授权开发——1

关于微信公众账号授权,简单看完微信开放平台给的文档后就上手了.但是遇到很多问题....... 开通流程 1 通过开发者资质认证 必须先通过开发者资质认证,才可以开始公众号第三方平台开发 2 创建公众号第三方平台 认证后,在管理中心可以创建公众号第三方平台,创建前请先仔细阅读资源中心中的开发文档 3 测试公众号第三方平台 创建并实现公众号第三方平台的功能后,只能利用测试公众号进行测试,确保授权托管有效 4 申请全网发布 在测试完成后,需为公众号第三方平台提交全网发布,全网发布后,才能被其他公众号授

微信公众账号登陆授权开发——4

获取预授权码 获取到access_token后就可以获取pre_auth_code预授权码了 -------------------------------------------------------------------------官方文档说明开始----------------------------------------------------------------------------------- 2.获取预授权码 该API用于获取预授权码.预授权码用于公众号授权时的第三方

微信公众账号登陆授权开发——3

/** * 1.获取第三方平台access_token * * 这种方法不是官方支持的方式,官方提议的事post方式获取 * * @return */ public static String getToken() { String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=***&secret=****"; JSONObject jsonObjec

公众号一键登录授权给第三方平台方的技术流程

总体流程 1.用户进入第三方平台方网站 一般而言,用户需要先进入第三方平台方网站,如www.ABC.com 2.第三方平台方获取预授权码 预授权码是第三方平台方实现授权托管的必备信息 3.发布后修改和覆盖现网 第三方平台方可以在自己的网站首页中放置"微信公众号登录授权"的入口,引导公众号运营者进入第三方平台授权页.网址为https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=xxxx&pre_aut

微信开发回复消息收不到的最大罪魁祸首,微信公众账号为什么回复消息不成功的原因解决办法

上一篇文章讲到如何配置微信开发,以及.NET平台使用MVC做一个小DEMO的流程,还有常见收不到消息的问题,本篇文章讲的是一个很容易让人忽略但又是很重要的问题导致用户收不到响应的消息原因. 上一篇文章链接:[C#开发微信.NET平台MVC微信开发 发送普通消息Demo以及收不到消息的问题] (如果你是通过搜索引擎进来的建议你看下上篇文章,说不定就解决你的问题了) 这个问题出在代码 首先我们的C#代码是这么写的: 1 //接收/回复 消息接口 2 [HttpPost] 3 public Actio

微信公众账号开发教程

微信公众账号开发教程 一.第1篇-引言 本文转载来自柳峰老师的博客,在这里非常感谢柳峰老师的分享和贡献! 内容方面,大概会涉及到: 1)前沿知识:微信公众帐号的分类.两种模式各自的特点和区别.开发模式的配置使用等: 2)API中各类消息的使用(我已经对api进行封装并打成了jar包,到时候会考虑分享出来): 3)微信公众帐号开发中的小技巧(如换行.通过代码发送表情.屏幕飘雪花.表情的接收识别.在Android和iOS上表现不一致等等): 4)与业务系统对接的方法(链接.短信等,除了技术讲解还会做

【转】微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引

微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引 Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享.也欢迎大家的补充! SDK还在不断优化升级中,开源项目见:https://github.com/JeffreySu/WeiXinMPSDK 微信技术交流社区:http://www.weiweihi.com/QA Senparc

微信公众账号开发教程(四)自定义菜单

转自http://www.cnblogs.com/yank/p/3418194.html 一.概述: 如果只有输入框,可能太简单,感觉像命令行.自定义菜单,给我们提供了很大的灵活性,更符合用户的操作习惯.在一个小小的微信对话页面,可以实现更多的功能.菜单直观明了,不仅能提供事件响应,还支持URL跳转,如果需要的功能比较复杂,我们大可以使用URL跳转,跳转至我们的网页即可. 注意:自定义菜单,只有服务号才有此功能 如何注册,见第一章:微信公众账号开发教程(一) 基本原理及微信公众账号注册 效果如下

微信公众账号 Senparc.Weixin.MP SDK 开发教程

http://www.cnblogs.com/szw/archive/2013/05/14/weixin-course-index.html 微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引 Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享.也欢迎大家的补充! SDK还在不断优化升级中,开源项目见:https://githu