# 4.0 第三方登录接入流程 以下已做好的微信登录为例 ## 第一步,配置微信第三方登录 修改 根目录的config/app.php文件,找到authorization_app填写需要接入的第三方登录: ```php //第三方登录总开关 'authorization_app'=>array( //自己编写获取第三方登录链接对应的方法 'weChat'=>[ 'icon' => '/images/login_wechat.png', // 第三方应用的图标 'app_callback_url'=>'\Base\Domain\Authorization', //自己编写获取第三方微信登录链接的类---包含命名空间 'desc'=>'微信', //第三方应用的描述 'sort_id'=>1, //排序字段 'type'=>1, //用于解绑的 'can_unbind'=>1, //可以解绑的 'authorization_type'=>1, 'can_bing'=>1, //可以在个人中心进行绑定 'can_bing_url_class'=>'\Base\Domain\Authorization',//自己编写获取第三方登录绑定链接的类--包含命名空间 'can_bing_url_fun'=>'weChat', //自己编写获取第三方登录绑定链接的类对应的方法 //以下根据自己申请得到的资料进行填写 'appid'=>'wx9b33877e791de406', //appid 'secret'=>'04b99c4526076e6d8ffbc6a5e6619bd2', //密钥 'login_redirect_uri'=>'http://www.yesdev.cn/server_callback/wechat_login.php', //登录回调地址配置 ], ), ``` ### 下面是详细配置步骤: 一般第三方登录都涉及了几个配置: 注:每个配置合起来是上面的配置,为清晰,把每个配置单独分开,便于理解 #### 1、配置生成用于第三方登录的url的类和方法: ```php //key是自己编写用于获取第三方登录链接对应的方法 'weChat'=>[ 'app_callback_url'=>'\Base\Domain\Authorization', //自己编写获取第三方登录链接的类---包含命名空间 ), ``` #### 2、填写配置申请到第三方登录得到的资料: ```php //key是自己编写用于获取第三方登录链接对应的方法 'weChat'=>[ //以下根据自己申请得到的资料进行填写 'icon' => '/images/login_wechat.png', // 第三方应用的图标 'desc'=>'微信', //第三方应用的描述 'appid'=>'', //appid 'secret'=>'', //密钥 'login_redirect_uri'=>'http://*****', ), ``` #### 3、填写用于个人中心进行绑定所生成的url的类和方法: ```php //key是自己编写用于获取第三方登录链接对应的方法 'weChat'=>[ 'can_bing'=>1, //可以在个人中心进行绑定 'can_bing_url_class'=>'\Base\Domain\Authorization',//自己编写获取第三方登录绑定链接的类--包含命名空间 'can_bing_url_fun'=>'weChat', //自己编写获取第三方登录绑定链接的类对应的方法 ), ``` #### 4、其它配置: ```php //key是自己编写用于获取第三方登录链接对应的方法 'weChat'=>[ 'type'=>1, //用于解绑的,值跟下面的authorization_type值一样 'authorization_type'=>1,//对应于pp_authorization表中的authorization_type类型 ), ``` ## 第二步,根据配置新建或者编写对应的文件类和方法 ### 1、根据配置编写用于第三方登录的url的类和方法: 如:配置编写了 ```php //key是自己编写用于获取第三方登录链接对应的方法 'weChat'=>[ 'app_callback_url'=>'\Base\Domain\Authorization', //自己编写获取第三方登录链接的类---包含命名空间 ), ``` 那么需要在路径/Base/Domain/下新建Authorization.php文件及编写weChat方法: ![](http://cd7.okayapi.com/E13E3E82379A58F69373E47373CFEE16_20210708115518_f0b9d534160583f35a474b6119dcb5fc.png) ### 2、根据配置编写用于个人中心进行绑定所生成的url的类和方法: 如:配置编写了 ```php 'weChat'=>[ 'can_bing'=>1, //可以在个人中心进行绑定 'can_bing_url_class'=>'\Base\Domain\Authorization',//自己编写获取第三方登录绑定链接的类--包含命名空间 'can_bing_url_fun'=>'weChat', //自己编写获取第三方登录绑定链接的类对应的方法 ), ``` 那么需要在路径Base/Domain/下新建Authorization.php文件及编写weChat方法: ![](http://cd7.okayapi.com/E13E3E82379A58F69373E47373CFEE16_20210708115518_f0b9d534160583f35a474b6119dcb5fc.png) ### 3、根据配置编写用于回调地址及业务逻辑 如:配置编写了 ```php //key是自己编写用于获取第三方登录链接对应的方法 'weChat'=>[ 'login_redirect_uri'=>'http://www.xxx.cn/server_callback/wechat_login.php', //登录回调地址配置 ), ``` 那么需新建/public/server_callback/wechat_login.php 进行回调业务逻辑编写 ![](http://cd7.okayapi.com/E13E3E82379A58F69373E47373CFEE16_20210708121011_7f826d6ad2ca7a35b9c8f47d7bac4143.png) ### 第四步,编写具体业务逻辑前,先进行第三方登录数据库分析 以下是涉及第三方登录的三张表数据结构: ```sql CREATE TABLE `pp_authorization` ( `id` int(11) NOT NULL AUTO_INCREMENT, `openid` varchar(10000) NOT NULL DEFAULT '0' COMMENT '第三方平台对应用户的唯一id', `unionid` varchar(1000) NOT NULL DEFAULT '0' COMMENT '微信开放平台对应的unionidid', `authorization_type` int(11) NOT NULL DEFAULT '0' COMMENT '第三登录类型:0无 1微信 2微信小程序 3qq 4是短信 5程序员客栈 等等', `member_id` int(11) NOT NULL DEFAULT '0' COMMENT '版本的用户id', `add_time` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=357 DEFAULT CHARSET=utf8mb4 COMMENT='第三方授权表'; CREATE TABLE `pp_authorization_details` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nickname` varchar(255) NOT NULL DEFAULT '' COMMENT '昵称', `sex` tinyint(2) unsigned NOT NULL DEFAULT '0' COMMENT '性别:1未知 2男 3女', `headimgurl` varchar(10000) NOT NULL DEFAULT '' COMMENT '用户头像url', `province` varchar(255) NOT NULL DEFAULT '' COMMENT '省', `city` varchar(255) NOT NULL DEFAULT '' COMMENT '城市', `country` varchar(255) NOT NULL DEFAULT '' COMMENT '国家', `privilege` varchar(1000) NOT NULL DEFAULT '' COMMENT '用户特权信息', `add_time` datetime DEFAULT NULL, `authorization_id` int(11) NOT NULL DEFAULT '0' COMMENT '关联第三方表', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=355 DEFAULT CHARSET=utf8mb4 COMMENT='授权详情表'; CREATE TABLE `pp_member` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL COMMENT '账号', `salt` varchar(64) NOT NULL COMMENT '盐值', `password` varchar(64) DEFAULT NULL COMMENT '密码', `register_time` datetime DEFAULT NULL COMMENT '注册时间', `avatar` varchar(500) DEFAULT '' COMMENT '头像', `nickname` varchar(100) DEFAULT '' COMMENT '昵称', `email` varchar(100) DEFAULT '' COMMENT '邮箱', `sex` varchar(10) DEFAULT '' COMMENT '性别,0未知1男2女', `mobile` varchar(20) DEFAULT '' COMMENT '手机号', `ip` varchar(30) DEFAULT '' COMMENT '注册IP', `uuid` varchar(64) DEFAULT '' COMMENT 'UUID,全局唯一ID', `member_level` smallint(4) NOT NULL DEFAULT '0' COMMENT '用户等级(0~99区间表示用户,100~199区间表示开发者, 200~255区间表示内部管理员)', `member_status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '用户状态(0表示禁止,1表示正常)', `wx_openid` text COMMENT '微信openid ', `wx_type` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '0微信公众号 1是微信小程序', `balance` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '余额', `from_channel` varchar(100) NOT NULL DEFAULT '' COMMENT '来源', PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=50 DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; ``` 第三方登录主要业务逻辑是: 首次进行登录把第三方信息写入pp_authorization表和pp_authorization_details表 个人绑定主要是pp_authorization表中的字段member_id对应pp_member的id ## 第三步,本框架的第三方登录业务编写规范 如有更成熟的编写规范可以自行编写,可以不往下看,只要配置正确就可以。 下面提供本框架的接入的三方登录规范 ### 1、本框架第三方登录核心目录结构介绍 核心目录结构路径在/src/base路径下的Authorization目录和lib目录 ![](http://cd7.okayapi.com/E13E3E82379A58F69373E47373CFEE16_20210708141621_ea5bad045e64b8564a0c7f2d3ccd95b7.png) ### 2、WeChat.php 代码分析 ![](http://cd7.okayapi.com/E13E3E82379A58F69373E47373CFEE16_20210708144158_ba6abf80fa59805df3e622eab7bc0e59.png) ### 3、WeChatBusiness.php 代码分析 ![](http://cd7.okayapi.com/E13E3E82379A58F69373E47373CFEE16_20210708150538_c9264823d39f247eec4050195932212c.png) ### 4、WeChatBusiness.php 代码分析 主要是准备数据,如何首次登录写入 ![](http://cd7.okayapi.com/E13E3E82379A58F69373E47373CFEE16_20210708150538_c9264823d39f247eec4050195932212c.png) ### 4、AuthorizationLogin.php 代码分析 主要是进行成员注册或绑定登逻辑 ![](http://cd7.okayapi.com/E13E3E82379A58F69373E47373CFEE16_20210708151143_59d74133625615d5d25fde3ec8ca61a5.png) ### 5、借鉴并进行开发 到这里就可以借鉴想应的写法进行开发了