专栏首页程序员的碎碎念小程序(公众号)授权给第三方平台流程梳理和实现

小程序(公众号)授权给第三方平台流程梳理和实现

整体流程

在第三方平台应用上点击授权

进入授权页面

弹出微信授权页面,下方会显示第三方应用的基本信息

帐号管理员扫码,选择要授权的账号,进行授权(可自定义权限)

是否授权成功,回调页面显示

技术实现

第三方平台方获取预授权码(preauthcode)

在第三方平台应用上点击授权的时候会获取授权的预授权码(preauthcode),有效期为10分钟。

  • 调用接口地址

POST https://api.weixin.qq.com/cgi-bin/component/apicreatepreauthcode?componentaccesstoken=COMPONENTACCESSTOKEN

在调用此接口前,需要先获取第三方平台的令牌(也叫接口调用凭证componentaccesstoken)

  • 参数
{
  "component_appid": "appid_value" 
}

后端返回参数,前端拼装请求微信url

加入授权页面的时候,前端将后端返回的数据进行组织,点击组装后的url调整按钮,就可以弹出授权窗口。(微信做了限制,只能在第三方平台在设置的回调url地址才可以访问,其他本地地址无效

  • 后端返回的参数
'component_appid' => 'XXX',  //第三方平台app_id
  'pre_auth_code'   => 'pre_auth_code'  //  预授权码
  'redirect_uri'    => 'https://mp.weixin.qq.com/cgi-bin/componentloginpage',  //拼装的URL地址
  'auth_type'       =>  1,  //1 2 3  要授权的帐号类型
  'biz_appid'       =>  'xxx'  //指定授权唯一的小程序或公众号
  • 拼装示例

https://mp.weixin.qq.com/cgi-bin/componentloginpage?componentappid=xxxx&preauthcode=xxxxx&redirecturi=xxxx&auth_type=xxx

用户授权,同意授权

用户进入第三方平台授权页后,需要确认并同意将自己的公众号或小程序授权给第三方平台方,完成授权流程。此时在微信上,公众号已经授权给第三方平台了,在公众号平台上可以看到授权平台。然后第三方平台需要拿到公众号的基本信息、授权信息和执行权限,需要回调地址进行处理、保存授权信息(accesstoken和refreshtoken)。

回调地址处理授权信息

这个回调地址是在第三方平台上设置的,拿到授权码(auth_code)后,使用授权码换取公众号或小程序的接口调用凭据和授权信息。

  • 调用接口为:

POST https://api.weixin.qq.com/cgi-bin/component/apiqueryauth?componentaccesstoken=COMPONENTACCESSTOKEN

  • 参数
{
  "component_appid":"appid_value" ,  //第三方平台 appid
  "authorization_code": "auth_code_value"  //授权码
}

返回是仅仅是授权信息(authorizationinfo)。authorizerappid,authorizeraccesstoken,expiresin,authorizerrefresh_token以及权限id集这些数据。尚未获得公众号一些基本帐号信息(公众号名称、头像等等),这时候需要去获取授权方的帐号基本信息。

  • 调用接口为:

POST https://api.weixin.qq.com/cgi-bin/component/apigetauthorizerinfo?componentaccesstoken==COMPONENTACCESS_TOKEN

  • 参数
{
  "component_appid":"appid_value" ,  //第三方平台 appid
  "authorizer_appid": "auth_code_value"  //授权方 appid
}

拿到信息后你就可以保存到数据库里了,整个微信公众号授权的流程就结束了,后续根据各自业务对授权信息和帐号信息进行其他业务处理就ok。

代码示例

$this->request()->getParams() 是封装好的获取参数的方法,可自行替代 getComAccessToken() 是封装好的获取第三方接口调用凭证的方法,可自行替代 httpsCurl() 是封装好的请求微信的方法,可自行替代 WXAPPID 是全局参数第三方平台的app_id

PS:这里的代码仅仅只是把整个业务流程写在一起,方便阅读,实际场景中代码当然不会这样子写

  • 获取预授权码
/**
     * Created by 沙蒿.
     * @desc 获取预授权码pre_auth_code,有效期10分钟
     */
    public function getWxPreAuthCode()
    {
        $authType = $this->request()->getParams('auth_type') ?? 1;
        //1公众号授权,2小程序授权
        if (empty($authType) || !in_array($authType, [1, 2])) {
            return $this->error(100201);
        }
        //获取第三方平台接口调用凭证
        $comAccToken = $this->getComAccessToken();
        //请求微信服务器获取预授权码url地址
        $url         = 'https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token=' . $comAccToken;
        // 获取授权请求二维码url地址
        $reqUrl      = 'https://mp.weixin.qq.com/cgi-bin/componentloginpage';
        $preAuthCode = CommonService::getInstance()->httpsCurl($url, 'post', 'json', [
            'component_appid' => WX_APP_ID
        ]);
        //组装格式,返回
        $result = [
            'component_appid' => WX_APP_ID,
            'pre_auth_code'   => $preAuthCode['pre_auth_code'],
            'redirect_uri'    => $reqUrl,
            'auth_type'       => $authType,
        ];
        if (!empty($bizAppId)) {
            $result['biz_appid'] = $bizAppId;
        }
        return $result;
    }
  • 回调地址处理授权信息
/**
     * Created by 沙蒿.
     * @desc 微信授权
     * 授权后回调URI,得到授权码(authorization_code)和过期时间10分钟,使用授权码换取公众号或小程序的接口调用凭据和授权信息
     */
    public function wxOAuth()
    {
        //接收授权码auth_code
        $code = $this->request()->getParams('auth_code');
        //校验参数
        if (empty($code)) {
            return $this->error(100202);
        }
        //获取第三方平台的接口调用凭证
        $comAccToken = $this->getComAccessToken();
        //使用授权码换取公众号或小程序的接口调用凭据和授权信息
        $queryAuthUrl = 'https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token=' . $comAccToken;
        $authInfo     = CommonService::getInstance()->httpsCurl($queryAuthUrl, 'post', 'json', [
            'component_appid'    => WX_APP_ID,
            'authorization_code' => $code
        ]);
        //获取授权信息
        $authInfo        = $authInfo['authorization_info'];
        $authorizerAppId = $authInfo['authorizer_appid']; //授权方appid
        //获取授权方的帐号基本信息
        $authorizerInfoUrl = 'https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_info?component_access_token=' . $comAccToken;
        $appInfo           = CommonService::getInstance()->httpsCurl($authorizerInfoUrl, 'post', 'json', [
            'component_appid'  => WX_APP_ID,
            'authorizer_appid' => $authorizerAppId
        ]);
        //保存授权信息和帐号信息
        $this->saveWxAuth($authInfo, $appInfo);
    }

本文分享自微信公众号 - 程序员的碎碎念(gh_53e607dd4782),作者:沙蒿

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • PHP 使用phpqrcode生成二维码

    今天要说的比较浅层一点,简单快速的生成一个有文字、链接内容的二维码;主要调用phpqrcode类,下载地址为: https://sourceforg...

    benny
  • 智能机器人:菜单更改,新增签到功能

    开启签到技能,设置不同规则发放奖励,订阅者可以通过连续签到获得奖励,从而培养互动习惯。

    benny
  • php防止用户重复登录

    先来理解一下session的几个设置: ini_set('session.auto_start',0); 设置关闭session的自动启动 ini_set('...

    benny
  • (10)仿写fastqc-生信菜鸟团博客2周年精选文章集

    用仿写软件的方法来学习编程 我首先仿写了fastqc软件,学会了很多基础知识: 仿写fastqc软件的一些功能-R代码 仿写fastqc软件的部分功能-perl...

    生信技能树
  • Web渗透测试之信息收集工具大全

    在SRC漏洞挖掘或渗透测试中,信息收集占很大一部分,能收集到别人收集不到的资产,就能挖到别人挖不到的洞。

    7089bAt@PowerLi
  • [日常] 算法-单链表的创建

    2.循环中创建结点,把头结点的next赋值给 新结点的next,相当于新结点的next指向了(头结点next所指向的)

    陶士涵
  • linux(十一)之初始化文件

    前面写了很多linux的知识,其实很多都是命令的,所以要去多多的练习才能学的更好,加油为了好工作。 要么现在懒惰,未来讨饭。要么现在努力,未来惬意。 一、初始化...

    用户1195962
  • 以安全产品经理的视角设计应用的登陆功能SDK(BRD篇)

    0x00、BRD商业需求文档 Business Requirements Document:用途用于产品在投入研发之前,由企业高层作为决策评估的重要依据,通过本...

    FB客服
  • 总结个人职场常用管理方式

    瀑布式开发用行业术语来解释就是,在软件定项的时候个开发阶段的准备:需求分析,组件定义,概要设计,详细设计,编码规范,冒烟测试,PRE/PRD测试等。

    用户1112962
  • 2017——国外SDK发展趋势

    本文列出了 2017 年国外增长最快的移动应用 SDK,旨在帮助开发者了解技术的发展趋势。 ? 1. 更多开发者选择应用开发平台 开发者通常会面临这样的选择:是...

    BestSDK

扫码关注云+社区

领取腾讯云代金券