2018-02-24 17:19:29 ckk_0821 阅读数 16710
  • 微信公众平台深度开发v2.0第1季——微信公众号基础...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    78957 人正在学习 去看看 翟东平

关于微信开放平台如何申请,如何配置,如何全网发布的文章,大神们已经写了很多,不想再造轮子,特针对微信授权事件的处理这一个点,对自己遇到的坑进行总结,也希望能给着手做微信开放平台的小伙伴们提供一份简单的参考资料,在写这篇文章之前,先吐槽一下微信开放平台的API文档,烂,真烂。

 

  1. 首先申请一个微信开放平台的账号,申请过程不赘述,很简单的流程,但再次吐槽一次,需要交审核费用(每年),中国大陆地区:300元,非中国大陆地区:120美元(不能理解微信的套路,难道真的有非大陆地区的国家在用微信?)
  2. 交完钱之后,等待审核,审核很快,大概一周时间即可
  3. 审核通过之后,即可创建第三方平台:创建过程如下:
     
    在开放平台的官网,点击管理中心父菜单,
     点击创建第三方平台按钮,即可打开创建第三方平台页面
     根据自己的需要,填写基本信息:包括平台名称,选择业务标签,填写平台介绍,官方网站包括上传Logo等
     点击下一步,选择公众号权限,一点儿小提示:如果选择了消息通知以及自定义菜单权限之后,如果用户公众号授权之   后,将会导致用户无法自定义菜单以及设置消息回复
     最后一步,填写开发资料,包括:授权页发起页域名,授权测试公众号列表(在全网发布审核通过之前,该列表中的公众   号可用于测试授权),授权事件接收Url(本文主要对该Url的填写以及如何接收微信授权通知参数进行阐述)授权后实现   业务,主要包括:消息校验Token以及消息加解密Key(这两个字段可自定义,微信授权通知后,接收的消息用该字段进   行  加密解密,下文会对这俩字段如何使用进行详细说明)消息与事件接收URL,公众号开发域名(第三方平台在代公众号   做网页授权、调用JS SDK等网页开发工作时所用的域名) 做过微信公众号开发的小伙伴肯定很清楚,使用微信扫一扫以   及微信转发,分享等功能的JS时,微信需要验证是否拥有该域名权限
  4. 关于如何配置授权事件接收Url
     
    二话不说,先贴图


    首先域名必须为,授权页发起页域名中填写的域名,我采用的C#,MVC的开发模式,在开放平台发布成功之后,微信会每隔10分钟,推送授权信息给该域名,所以在填写时,一定要保证该方法可以被访问
  5. 关于ReceiveController下的SysMessage方法的代码如下:仅供参考
    首先微信会推送6个参数给该方法,贴代码:
    创建对象ReceiveRequestData

     
     public class ReceiveRequestData
        {
            /// <summary>
            /// 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
            /// </summary>
            public string signature { get; set; }
    
    
            /// <summary>
            /// 时间戳
            /// </summary>
            public string timestamp { get; set; }
    
    
            /// <summary>
            /// 随机数
            /// </summary>
            public string nonce { get; set; }
    
    
            /// <summary>
            /// 
            /// </summary>
            public string encrypt_type { get; set; }
    
            /// <summary>
            /// 
            /// </summary>
            public string msg_signature { get; set; }
        }
    在ReceiveController中的方法接收微信推送的参数并赋值给该对象,代码如下:

     
     ReceiveRequestData postModel = new ReceiveRequestData();
     postModel.signature = HttpContext.Current.Request["signature"];
     postModel.timestamp = HttpContext.Current.Request["timestamp"];
     postModel.nonce = HttpContext.Current.Request["nonce"];
     postModel.encrypt_type = HttpContext.Current.Request["encrypt_type"];
     postModel.msg_signature = HttpContext.Current.Request["msg_signature"];
    请注意,除这些参数外,微信还会推送文件流给该方法,接收方式如下:

     
    HttpContext.Current.Request.InputStream
    对接收到的参数进行解密处理
    首先声明对象ResponseAuthEventReceiveMsg,代码如下
 public class ResponseAuthEventReceiveMsg
    {
        /// <summary>
        /// 第三方平台appid
        /// </summary>
        public string AppId { get; set; }


        /// <summary>
        /// 时间戳
        /// </summary>
        public int CreateTime { get; set; }


        /// <summary>
        /// none,代表该消息推送给服务
        /// component_verify_ticket 推送component_verify_ticket协议
        /// </summary>
        public string InfoType { get; set; }


        /// <summary>
        /// Ticket内容
        /// </summary>
        public string ComponentVerifyTicket { get; set; }


        /// <summary>
        /// 取消授权的公众号
        /// </summary>
        public string AuthorizerAppid { get; set; }
    }

        对接收到的参数进行解密:

        ResponseAuthEventReceiveMsg response = _logic.Component_verify_ticket(postModel, HttpContext.Current.Request.InputStream);

        Component_verify_ticket方法如下:

           /// <summary>
        /// 接收component_verify_ticket协议
        /// </summary>
        /// <param name="postModel"></param>
        /// <param name="inputStream"></param>
        /// <returns></returns>
        public ResponseAuthEventReceiveMsg Component_verify_ticket(ReceiveRequestData postModel,
            Stream inputStream)
        {
            if (inputStream != null)
            {
                inputStream.Seek(0, SeekOrigin.Begin);//强制调整指针位置
                using (XmlReader xr = XmlReader.Create(inputStream))
                {
                    var postDataDocument = XDocument.Load(xr);
                    var result = Init(postDataDocument, postModel);
                    var resultMessage = new ResponseAuthEventReceiveMsg();
                    //xml to model
                    EntityHelper.FillEntityWithXml(resultMessage, result);
                    return resultMessage;
                }
            }
            return null;
        }

          Init方法如下:

 private XDocument Init(XDocument postDataDocument, ReceiveRequestData postModel)
  {
            //进行加密判断并处理

            var postDataStr = postDataDocument.ToString();
            XDocument decryptDoc = postDataDocument;

            if (postModel != null && postDataDocument.Root.Element("Encrypt") != null && !string.IsNullOrEmpty(postDataDocument.Root.Element("Encrypt").Value))
            {
                //使用了加密
                string sToken = WeiXinConfig.ThirdPartToken;
                string sAppId = WeiXinConfig.ComponentAppId;
                string sEncodingAesKey = WeiXinConfig.ThirdPartMsgSign;
                WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(sToken, sEncodingAesKey, sAppId);
                string msgXml = null;
                var result = wxcpt.DecryptMsg(postModel.msg_signature, postModel.timestamp, postModel.nonce, postDataStr, ref msgXml);
                //判断result类型
                if (result != 0)
                {
                    DevelopFileLog4Net.Instance.Info("方法:Init,验证没有通过");
                    //验证没有通过,取消执行
                    return null;
                }

                decryptDoc = XDocument.Parse(msgXml);//完成解密
            }
            return decryptDoc;
     }

          着重介绍一下Init方法中的sToken参数、sEncodingAesKey参数、sAppId参数

           sAppId参数:开放平台发布成功之后,微信会为用户分配一个AppId,此处即为该参数
           sToken参数:在申请开放平台时,填写开发资料时,填写的消息校验Token
           sEncodingAesKey参数:在申请开放平台时,填写开发资料时,填写的消息加解密Key

           至于WXBizMsgCrypt对象中的DecryptMsg方法,废话不说,贴图:
          

                      根据开发语言下载加解密对象即可。



 

2018-01-15 22:14:46 MYTLJP 阅读数 4949
  • 微信公众平台深度开发v2.0第1季——微信公众号基础...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    78957 人正在学习 去看看 翟东平

用了好几个小时的时间,整理了一下关于公众号的思维导图,由于CSDN不能上传相对应的文件,所以萍子一一的分解开的截图附上来,希望对大家有所帮助哦~
因为是电脑设备自动截图,又鉴于内容比较多,可能不是太清楚,需要的小伙伴们,可以联系我,我可以随时发给你。

学习微信公众号需要的配置

这里写图片描述


微信开发的主体、请求方式、数据类型和环境

主体

这里写图片描述

请求方式

这里写图片描述
这里写图片描述

数据类型和环境

这里写图片描述


开始开发

获取access_token值并存储

这里写图片描述
这里写图片描述


账号管理

生成带参数的二维码

这里写图片描述

长链接转短链接

这里写图片描述


消息管理

获取微信服务器的IP地址

接收普通消息

接收事件推送

被动回复用户消息

这里写图片描述


微信网页授权

微信网页授权步骤

第一步:跳转页面,用户同意授权,获取code

这里写图片描述

第二步:通过code换取网页授权access_token(与普通的access_token不一样,具体见下方)
第三步:如果需要,刷新access_token值

这里写图片描述

第四步:拉取用户信息(需要scope为snsapi_userinfo)
第五步:附,检验授权凭证access_token是否有效,一般用不到

这里写图片描述


微信JS-SDK

说明

这里写图片描述

JS-SDK使用步骤

这里写图片描述

上传图片素材

这里写图片描述


微信公众号

握手协议

这里写图片描述

自定义菜单

自定义菜单类型

这里写图片描述

自定义菜单的设置

这里写图片描述

自定义菜单参数说明

这里写图片描述

获取自定义菜单

这里写图片描述


自定义菜单事件推送/被动回复用户信息

自定义事件推送

这里写图片描述

被动回复用户信息

这里写图片描述

根据菜单类型的点击,被动回复

点击按钮事件

这里写图片描述

公众号首次被某个用户关注的推送

这里写图片描述

微信扫一扫,并展示扫的内容

这里写图片描述

推送图文消息

这里写图片描述

回复图片消息
没有点击按钮

这里写图片描述

2019-07-30 17:53:18 weixin_40341171 阅读数 26
  • 微信公众平台深度开发v2.0第1季——微信公众号基础...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    78957 人正在学习 去看看 翟东平

需求

单位想完善微信公众号场景二维码的功能,又不想原微信公众平台设置的自动回复失效,只能曲线救国,利用微信第三方平台,实现微信公众号,事件接收。

总流程

整体流程,首先甲方爸爸,微信公众平台(公众号),需要授权给微信开放平台(第三方)。甲方爸爸:嗯。我的用户关注取关事件,你给我处理一下。第三方:好的。达成协议之后,第三方平台拿到公众号的相关权限和参数,就可以进行开发啦,微信也会将事件推送推送给第三方平台服务器。

授权

流程

1.公众号管理员登录我们的授权网站

第三方平台授权网站
没错。我的网站就是这么简陋

2. 进入微信官方授权网站

点击链接,进入微信官方授权网站。嗯。
在这里插入图片描述

3. 公众号管理员微信扫描二维码。

在这里插入图片描述
权限可以自行选择。具体可参照 第三方平台的权限说明

4.点击授权

微信就会变成酱紫。微信还会推送给第三方服务器,公众号的授权信息。
在这里插入图片描述
web页就会变成酱紫
在这里插入图片描述
嗯。还是一样简陋。

授权流程就走完啦。

开发

开发嘛。首先你需要有一个第三方平台的账号 申请网址。需要填写一些基本信息,还有几个容易蒙蒙的点。
在这里插入图片描述

  1. 登录授权的发起页域名 :就是那两个 简陋 的页面的域名;
  2. 授权测试公众号列表 :测试用的公众号,可以填在里面。主义是原始 ID喔;
  3. 授权事件接收url :就是当有甲方爸爸公众号 申请授权(取消授权/更新授权),微信通知你的url。微信每隔10分钟还会推送一次 component_verify_ticket
  4. 消息与事件接受url:公众号授权之后,第三方平台代为开发,这是微信推送给原公众号的消息,就会推送到第三方服务器上。为了开放平台区分各个消息的来源,url上需要鞋带公众号的appid,格式为 www.abc.com/aaa/APPID/bbb/cgi,需要用路由处理一下。

1.平台class

这次开发用的EasyWeChat SDK,不需要考虑微信繁琐的 开发流程。一定要看文档哦,这里就不再赘述了。

首先,创建平台。

 use EasyWeChat\Foundation\Application;

class Platform extends Controller{
	protected $openPlatform;
    public function __construct()
    {
        $options = ['open_platform' => config('open_platform')];//open_platform 微信开放平台配置 app_id、secret、token、aes_key
        $app = new Application($options);
        $this->openPlatform = $app->open_platform;
    }
    
}

2.登录授权的发起页

  //预授权页面 
    public function auth(){
        $openPlatform = $this->openPlatform;
        $response = $openPlatform->pre_auth->redirect(config('open_redirect'));//open_redirect 授权回调url 第二个丑丑的页面url
        $url = $response->getTargetUrl();//获得授权url 

        echo ' <meta name="referrer"    content="origin-when-cross-origin" >
        <a style="color: inherit" href="'.$url.'"><p>微信平台绑定</p></a>';
    }

直接用浏览器打开授权url无效喔,会报如下错误。一定要从授权页跳转才行
在这里插入图片描述

3.开放平台信息接收

接收授权通知以及component_verify_ticket 的接口了

方法

    //微信通知,主要是component_verify_ticket等信息 
    public function notify(){
    
        $openPlatform = $this->openPlatform;

        $openPlatform->server->setMessageHandler(function($event) use($openPlatform){
            switch ($event->InfoType) {
                case Guard::EVENT_AUTHORIZED: // 授权成功 
                    $res = $openPlatform->getAuthorizationInfo($event->AuthorizationCode);
                    //Save to DB
                    $appid = $res->authorization_info['authorizer_appid'];
                    $refresh_token = $res->authorization_info['authorizer_refresh_token'];
                    DB::table("weixin")->insert(['appid' => $appid,'refresh_token' => $refresh_token,'res'=>json_encode($res)]);
                    break;
                case Guard::EVENT_UPDATE_AUTHORIZED:    // 更新授权
                    //todo
                    break;
                case Guard::EVENT_UNAUTHORIZED: // 取消授权
                    //删除授权信息
                    Db::table('weixin')->where(['appid'=>$event['AuthorizerAppid']])->delete();
                    break;

            }
        });

        $response = $openPlatform->server->serve();
        $response->send();



    }

授权后的appidauthorizer_refresh_token 以后还需要用,保存起来

4.回调页面

第二个丑丑的页面

  public function callback(){

        $openPlatform = $this->openPlatform;
        try{
            return 'Success';
        }catch (Exception $ex){
            abort(404,$ex->getMessage());
        }
    }

以上,授权的相关代码,就写完啦,可根据自己需求完善。
在这里插入图片描述

功能开发

以用户关注取关公众号为例

首先,需要处理下url,加路由,让 APPID 以id参数 接收

Route::rule('weixin/Platform/openindex/:id','weixin/Platform/openindex');

然后就是代码啦

    //公众号消息验证
    public function openindex($id = 0){
        //验证是否有该appid 并取出
        $info = Db::table('weixin')->where(['appid'=>$id])->find();


        if(!$info){
            return false;
        }

        $openPlatform = $this->openPlatform;

        $authorizerAppId = $info['appid'];
        $authorizerRefreshToken = $info['refresh_token'];

        $app = $openPlatform->createAuthorizerApplication($authorizerAppId, $authorizerRefreshToken);
        $app->server->setMessageHandler(function($message) use($app){

            switch($message->ToUserName){
   				//根据不同的appid 写不同的逻辑
                case 'APPID1':
                    if ($message->MsgType == 'event') {//消息类型 为 事件
                        # code...
                        try{
                            switch ($message->Event) {
                                case 'subscribe'://订阅   带参数订阅  不带参数订阅
                                    //todo
                                    break;
                                case 'unsubscribe'://取关
                                    //todo
                                    break;
                                case 'SCAN'://扫描二维码 带参
                 					//todo
                                    break;
                            }
                        }catch (Exception $ex){
                            Log::debug('try:'.json_encode($ex->getMessage()));
                        }
                    }
                    break;
                case 'APPID2':
                   	//todo
                   	break;
            }

        });


        $response = $app->server->serve();

        $response->send(); // Laravel 里请使用:return $response;




    }

至此。就搞定啦!
在这里插入图片描述

2020-01-10 16:06:32 qq_28200505 阅读数 11
  • 微信公众平台深度开发v2.0第1季——微信公众号基础...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    78957 人正在学习 去看看 翟东平

一、验证票据

1.1 官方说明:

验证票据(component_verify_ticket):在第三方平台创建审核通过后,微信服务器会向其“授权事件接收URL” 每隔 10 分钟以 POST 的方式推送 component_verify_ticket

接收 POST 请求后,只需直接返回字符串 success。为了加强安全性,postdata 中的 xml 将使用服务申请时的加解密 key 来进行加密,具体请见《加密解密技术方案》, 在收到推送后需进行解密(详细请见《消息加解密接入指引》

作用:获取令牌时,需要使用票据值作为参数(component_verify_ticket)。

1.2 获取流程及示意代码

微信服务器会向其 ”授权事件接收URL” 每隔 10 分钟以 POST 的方式推送( component_verify_ticket)

授权事件接收URL:“在开放平台管理中心”中寻找,如下图。填写完整的URL请求路径。

(比如请求路径填写为:http://登录授权的发起页域名/项目名/api/wx/open/getComponentVerifyTicket

 

获取票据(componentVerifyTicket),示意代码:

SpringMVC形式的Controller层:

    /**
     * 接收微信服务器发送的component_verify_ticket
     */
    @PostMapping("/getComponentVerifyTicket")
    public String getComponentVerifyTicket(HttpServletRequest request, HttpServletResponse response) throws Exception {
        log.info("接收微信服务器发送的component_verify_ticket  begin");
        try {
            request.setCharacterEncoding("UTF-8");
            response.setCharacterEncoding("UTF-8");
            // 微信加密签名
            String msg_signature = request.getParameter("msg_signature");
            // 时间戳
            String timestamp = request.getParameter("timestamp");
            // 随机数
            String nonce = request.getParameter("nonce");
            // 从请求中读取整个post数据
            InputStream inputStream;
            String postData = null;
            inputStream = request.getInputStream();
            postData=IOUtils.toString(inputStream, "UTF-8");    //获取接收到消息里的XML密文,存放在postData中
            log.info("postData:"+postData);

            WXBizMsgCrypt wxcpt = null;
            log.info("postData:"+postData);
            log.info("msg_signature:"+msg_signature);
            log.info("timestamp:"+timestamp);
            log.info("nonce:"+nonce);
            log.info("getServetoken:"+ComponentConfig.TOKEN);        //token
            log.info("getServeencodingaeskey:"+ComponentConfig.AESKEY);       //aeskey
            log.info("getServeappid:"+ComponentConfig.APPID);         //appid
            log.info("ip:"+ NetworkUtil.getIpAddress(request));

            //从XML中获取<Encrypt></Encrypt>标签内的密文文本
            String encrypt = XMLUtil2.getLabelFromXml(postData,"Encrypt");
            log.info("Encrypt:"+encrypt);
            //格式化密文文本,否则没有<ToUserName>标签,会解密失败,参考官方的加解密代码JAVA版本
            String format = "<xml><ToUserName><![CDATA[toUser]]></ToUserName><Encrypt><![CDATA[%1$s]]></Encrypt></xml>";
            String fromXML = String.format(format, encrypt);

            String msg = "";   //解密后的明文
            if(StringUtil.isEmpty(encrypt)) {
                msg = fromXML;
            } else {
                wxcpt = new WXBizMsgCrypt(ComponentConfig.TOKEN,ComponentConfig.AESKEY,ComponentConfig.APPID);
                // 解密消息
                msg = wxcpt.decryptMsg(msg_signature, timestamp, nonce, fromXML);
            }
            log.info("msg:"+msg);
            //将XML格式字符串转为Map类型
            Map<String, String> msgMap = XMLUtil.xmlToMap(msg);
            String infotype = msgMap.get("InfoType");  //获取infotype,注:微信开放平台文档中标明固定为:"component_verify_ticket",但参考其他代码,还包含authorized???
            log.info(infotype);
            switch (infotype){
                case "component_verify_ticket":   //验证票据
                    String ComponentVerifyTicket = msgMap.get("ComponentVerifyTicket");  
                    webChatCatchUtil.setWeixinOpenComponentVerifyTicket(ComponentVerifyTicket);   //将票据值写入Redis缓存中
                    log.info("component_verify_ticket:"+ComponentVerifyTicket);
                    break;
                case "unauthorized"://用户取消授权
                    break;
            }
        } catch (Exception e) {
            log.error("Exception",e);
        }
        return "success";
    }

使用wxcpt.decryptMsg获取到的解密后的result示例:

<xml>
<
AppId>some_appid</AppId>
<
CreateTime>1413192605</CreateTime>
<
InfoType>component_verify_ticket</InfoType>
<
ComponentVerifyTicket>some_verify_ticket</ComponentVerifyTicket>
</
xml>

注意:

component_verify_ticket 的有效时间较 component_access_token 更长,建议保存最近可用的component_verify_ticket,在 component_access_token 过期之前可以直接使用该 component_verify_ticket 进行更新,避免出现因为 component_verify_ticket 接收失败而无法更新 component_access_token 的情况。

 

2018-09-17 11:55:45 Donatello_Jiang 阅读数 514
  • 微信公众平台深度开发v2.0第1季——微信公众号基础...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    78957 人正在学习 去看看 翟东平

这一段时间集成了微信第三方平台,坑还是蛮多的,记录一下集成过程和遇到的坑

授权流程

这里写图片描述
首先说一下过程,这个过程再微信开放平台上有。开放平台链接戳这
授权给第三方平台首先要获取预授权码,然后用预授权码引导用户授权,最后成功授权返回授权码。
这地方分三部分:
第一部分,如何获取预授权码。
第二部分,通过预授权码引导用户授权。
第三部分,返回授权码获取公众号信息。

一、如何获取预授权码

1、在第三方平台创建审核通过后,微信服务器会向其“授权事件接收URL”每隔10分钟定时推送component_verify_ticket。第三方平台方在收到ticket推送后也需进行解密(详细请见【消息加解密接入指引】),接收到后必须直接返回字符串success。

首先需要了解一个加解密,微信平台会有一个官方demo。接下来就是我遇到的第一个坑了。传过来的xml解析失败。
官网上解析的结果是这样的:
这里写图片描述
想要解析,你得获取微信服务器传过来的xml(传来的timestamp,nonce,encrypt_type,msg_signature可以直接用request.getParameter获取,但是xml需要读取request的body部分)。然后按照demo上那样解析。下面是我的方法:

/**
     * 微信第三方解码
     * @param msgMap
     * @param token
     * @param encodingAesKey
     * @param appId
     * @param timestamp
     * @param nonce
     * @return
     */
    public static String DecryptMsg(Map<String,Object> msgMap, String token, String encodingAesKey, String appId, String timestamp, String nonce){
        String result = null;
        try{
            WXBizMsgCrypt pc = new WXBizMsgCrypt(token, encodingAesKey, appId);
            String msgSignature = (String)msgMap.get("msg_signature");
            String encrypt = (String)msgMap.get("encrypt_type");
            String postXml = (String)msgMap.get("post_xml");
            String format = postXml;
            String fromXML = String.format(format, encrypt);
            result = pc.decryptMsg(msgSignature, timestamp, nonce, fromXML);
        }catch (Exception e){
            e.printStackTrace();
        }
        return result;
    }

接收到的xml:

<xml>
    <AppId><![CDATA[xxxxxxxxxxxxxx]]></AppId>
    <Encrypt><![CDATA[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]]></Encrypt>
</xml>

解析出来之后:

<xml><AppId><![CDATA[xxxxxxxxxxxxxx]]></AppId>
<CreateTime>1537153589</CreateTime>
<InfoType><![CDATA[component_verify_ticket]]></InfoType>
<ComponentVerifyTicket><![CDATA[xxxxxxxxxxxxxxxxxxxxxxxxxxx]]></ComponentVerifyTicket>
</xml>

然后一直报一个空指针的错误,我发现下面的代码解析失败,因为XMLParse那个类找不到ToUserName的标签。
这里写图片描述
这里写图片描述

就没有<ToUserName>这个页签,所以最后我改成了<AppId>

2、第三方平台component_access_token是第三方平台的下文中接口的调用凭据,也叫做令牌(component_access_token)。每个令牌是存在有效期(2小时)的,且令牌的调用不是无限制的,请第三方平台做好令牌的管理,在令牌快过期时(比如1小时50分)再进行刷新。

这里没啥说的,就是需要做的就是维护好令牌(持久化,启动加载等)。到这就可以获取到预授权码(pre_auth_code)。

二、引导用户授权

这里写图片描述
走到这,你会忽然发现,你跳转的页面完全不能授权,一直提示你的域名不对。因为这就是我遇见的第二个坑。
这边的操作应该是这样的:你需要写一个页面来授权,让用户去点击那个授权按钮,按钮的链接就是你拼接的那个url,废话不多说,代码伺候:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<div>
    <input id="tolink" type="button" name="" value="授权跳转" /></div>
<script>
    var btn=document.getElementById("tolink");
    btn.onclick=function(){
        var ajax = new XMLHttpRequest();
        ajax.open('get','http://abcd.com/authorizedurl');
        ajax.send();
        ajax.onreadystatechange = function () {
            if (ajax.status==200) {
                window.location.href=ajax.responseText
            }
        }
    }
</script>
</body>
</html>

这个url:http://abcd.com/authorizedurl是用来获取拼接后的url的
这里写图片描述
方式二:点击移动端链接快速授权
第三方平台方可以生成授权链接,将链接通过移动端直接发给授权管理员,管理员确认后即授权成功。
这里写图片描述
然后点击页面的授权按钮,就可以正常进行授权了,授权的必须是公众的管理员(绑定公众号的那个),然后就可以授权了。

三、授权码获取公众号信息

该API用于获取授权方的基本信息,包括头像、昵称、帐号类型、认证类型、微信号、原始ID和二维码图片URL。

需要特别记录授权方的帐号类型,在消息及事件推送时,对于不具备客服接口的公众号,需要在5秒内立即响应;而若有客服接口,则可以选择暂时不响应,而选择后续通过客服接口来发送消息触达粉丝。
这里写图片描述
这里写图片描述
这里写图片描述

微信授权和支付

阅读数 3394

没有更多推荐了,返回首页