关键词:微信小程序、登录
事先声明:
- 微信经常改接口是正常操作,一切以微信最新文档为主。
- php 代码都会整合在 icy2003/php 里,如果正式版里没有相关代码,就先使用开发版。
- 正式版:
composer require icy2003/php ~1.0
- 开发版:
composer require icy2003/php dev-dev
- 正式版:
思路
小程序登录流程:传送门。
- 使用 wx.login() 获取 code。
- 拿到 code 后,服务端调用 code2Session 获得 session_key。
- 服务端调用 getAccessToken,解密后获得 UnionID 作为开发者系统里用户的唯一标识。
- 通过 UnionID 查询开发者系统里的用户进行登录。
代码
前端以 uniapp 为例子。
参考接口:
- uni.getUserInfo uniapp 获取小程序用户信息。
- 微信日常改接口操作 改成了开发者自定义按钮进行授权登录。
- UnionID 机制
模板代码
<template>
<view class="container">
<view class="wrapper">
<view class="info-item">
<open-data type="userAvatarUrl" class="avatarurl"></open-data>
</view>
<view class="info-item">
<open-data type="userNickName"></open-data>
</view>
<button open-type="getUserInfo" @getuserinfo="getUserInfo">授权</button>
</view>
</view>
</template>
javascript
methods: {
getUserInfo() {
wx.login({
success: (loginResult => {
wx.getUserInfo({
success: (userInfoResult => {
uni.request({
url: url,// 服务端获取 UnionID 请求
data:{
code: loginResult.code,
encryptedData: userInfoResult.encryptedData,
iv: userInfoResult.iv,
},
success: (res => {
this.login(res.data); // 保存自定义的登录信息
})
})
}),
})
})
})
}
}
php
以下涉及的类都在 icy2003/php 里。
该类命名空间为:icy2003\php\iapis\wechat\miniprogram\Auth
。
$auth = new Auth($appid, $secret);
先从数据库或者缓存里检查 access_token 是否过期,如果过期,重新获取并保存最新的。
$auth->getAccessToken();
$accessArray = $auth->toArray(); // 'access_token', 'expires_in'
根据 code 获取 session_key。
$auth->code2Session($code);
// 此处可能有 UnionID,但可能没有。
$codeArray = $auth->toArray(); // 'openid', 'session_key', 'unionid'
该类命名空间为:icy2003\php\iapis\wechat\miniprogram\DataCrypt
。
$dataCrypt = new DataCrypt($appid);
$dataCrypt->decrypt($encryptedData, $iv, $sessionKey); // 这几个前端都有传。
$data = $dataCrypt->toArray();
返回数据里有用户的头像昵称等信息,并且稳定获得 UnionID,可用于创建或者登录用户。
到这里,微信小程序的登录就完成了。