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

image.png

整体流程

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


    image.png
  • 进入授权页面


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


    image.png
  • 帐号管理员扫码,选择要授权的账号,进行授权(可自定义权限)
    image.png
  • 是否授权成功,回调页面显示

技术实现

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

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

  • 调用接口地址

POST https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token=COMPONENT_ACCESS_TOKEN

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

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

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

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

image.png

  • 后端返回的参数
  '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?component_appid=xxxx&pre_auth_code=xxxxx&redirect_uri=xxxx&auth_type=xxx

用户授权,同意授权

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

回调地址处理授权信息

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

  • 调用接口为:

POST https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token=COMPONENT_ACCESS_TOKEN

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

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

  • 调用接口为:

POST https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_info?component_access_token==COMPONENT_ACCESS_TOKEN

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

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

代码示例

$this->request()->getParams() 是封装好的获取参数的方法,可自行替代
getComAccessToken() 是封装好的获取第三方接口调用凭证的方法,可自行替代
httpsCurl() 是封装好的请求微信的方法,可自行替代
WX_APP_ID 是全局参数第三方平台的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);
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343