如何验证小程序授权登录 * * * * * 当在RhaPHP后台创建小程序成功后,系统就会分配出当前小程序请求的 API。 【系统管理】->【小程序管理】->【配置信息】:如图 ![](https://box.kancloud.cn/f72ad26bad54dc4c4b0ecbb6ea1d1c15_1200x642.png) 腾讯要求小程序请求的URL必须是HTTPS,如你是测试开发阶段,在小程序开发工具中取消不校验安全域名、TLS 版本以及 HTTPS 证书。 注意小程序请求的 Api地址(`https://xxx.rhaphp.com/api/1/`)是不能直接被访问的,例如我在《你好世界》controller 下建立了 Api.php控制器并增加index方法。 若要请求index 方法,那么小程序请求的 API 地址应为: >[success] >https://xxx.rhaphp.com/api/1/helloWorld/Api/index > 那么我们就在此实现小程序授权登录吧,小程序登录是按照微信官方要求,登录时序图机制的。 Api.php代码: ~~~ <?php namespace miniapp\helloWorld\controller; use app\common\controller\MiniappAddon; class Api extends MiniappAddon { public $isCheckLogin = true;//开启登录验证 public function initialize() { parent::initialize(); $rd_session = input('rd_session');//key可自定:可以使用token、session_id,我在此使用rd_session if ($rd_session) { //如果存在赋值 $this->rd_session $this->rd_session = $rd_session; } } public function index() { //返回小程序 return json(['rd_session' => $this->rd_session,'userInfo' => $this->userinfo]); } } ~~~ >[warning] if ($rd_session) {}这一个判断$rd_session是否存在有必要判断的,如果没有判断的话,当客户端没有传来rd_session的话,系统就会认为第一次登录返回了一个新的rd_session,这样导致看上去登录验证成功,其实是不成功的。加上这个判断就好了。 > 打开小程序开发工具创建小程序项目,若你从来都没有使用过小程序开发工具请前往微信小程序官方文档与说明。 创建小程序后,在index.js的 中的wx.getUserInfo获取用户信息成功后,使用wx.request请求`https://xxx.rhaphp.com/api/1/helloWorld/Api/index`,代码如下 ~~~ const app = getApp() Page({ data: { motto: wx.getStorageSync('rd_session'), userInfo: {}, hasUserInfo: false, canIUse: wx.canIUse('button.open-type.getUserInfo') }, onLoad: function () { var _that =this wx.login({ success: res => { var code = res.code wx.getSetting({ success: res => { if (res.authSetting['scope.userInfo']) { // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框 // 获取用户信息 wx.getUserInfo({ success: res => { // 可以将 res 发送给后台解码出 unionId wx.request({ url: 'https://mp.rhaphp.com/api/1/helloWorld/Api/index', data: { rd_session: wx.getStorageSync('rd_session'), code: code, // 发送 res.code 到后台换取 openId, sessionKey, unionId encryptedData: res.encryptedData, iv: res.iv, rawData: res.rawData, signature: res.signature }, success: function (res) { console.log(res) wx.setStorageSync('rd_session', res.data.rd_session) wx.setStorageSync('user_info', res.data.userInfo) } }) } }) } } }) } }) }, getUserInfo: function(e) { console.log(e) app.globalData.userInfo = e.detail.userInfo this.setData({ userInfo: e.detail.userInfo, hasUserInfo: true }) } }) ~~~ 那么在小程序控制台会输出: ![](https://box.kancloud.cn/5ecea84b092e2cdb5a535f0fbfb9967e_740x375.png) >[danger] 注意: >1. MiniappAddon中的$rd_session_time就是这个rd_session的有效期,那么得在小程序中做好rd_session过期或者失效后的处理工作。 >2.接收到的rd_session不存在或者清空后台缓存,都会认为rd_session失效,当rd_session失效后系统就会进入检查登录,在这个时候如果请求中没有带检查登录所需参数会引起抛出错误。 > 系统的后台的会员管理,得到了用户信息 ![](https://box.kancloud.cn/f085c217d51c17f51500730e827fa469_1200x344.png) >[danger] > 如果你的确不会使用public $isCheckLogin = true;这个方式,那么也可以使用继承MiniappAddon中的checkLogin把所需的参数传入也会验证信息以及返回用户信息。 > 常见问题 * * * * * >[warning] 核验失败、签名错误等? 请检查 APPID与APPSECRET是否正确 > >[warning] 请求域名不合法? 请前往小程序后台配置请求的API域名