Fastadmin微信小程序授权登录插件+手机号码获取
2021.06.23更新(此更新明文传输数据时候对头像昵称的限制去掉了,因为部分用户存在头像昵称异常的情况导致不能使用小程序,):
2021.06.15更新(此更新仅在markdown补充,不改动插件代码,自行复制下面代码添加即可 )-由于授权登录可能存在解密失败的情况,特新加明文传输API,接口代码如下:
protected $noNeedLogin = ['code', 'login', 'codev2', 'loginv2'];
/**
* 登录第一步,获取openid 跟 session_key
*/
public function codev2()
{
$code = $this->request->param('code');
if (!$code) {
$this->error('code不能为空');
}
self::getOpenidv2($code);
}
/**
* @param $code 用来交换获取openid 跟 session_key
*/
public function getOpenidv2($code)
{
$url = sprintf($this->loginUrl, $this->appid, $this->secret, $code);
$result = Http::get($url);
$wxResult = json_decode($result, true);
if (empty($wxResult)) {
$this->error('获取sessin_key及openID时异常');
}
if (isset($wxResult['errcode']) && $wxResult['errcode'] != 0) {
$this->error($wxResult['errmsg']);
}
$item = [
'openid' => $wxResult['openid'],
'session_key' => $wxResult['session_key']
];
$ck = \app\admin\model\User::where(['openid' => $wxResult['openid']])->find();
if (!$ck) {
$user = new \app\admin\model\User;
$user->openid = $wxResult['openid'];
$user->status = 'normal';
$user->save();
$this->auth->direct($user->id);
$this->success('登录成功', $this->auth->getUserinfo());
} else {
$this->auth->direct($ck['id']);
$this->success('登录成功', $this->auth->getUserinfo());
}
}
/**
* 用户登录
*/
public function loginv2()
{
$nickName = $this->request->post('nickName');
$avatarUrl = $this->request->post('avatarUrl');
$gender = $this->request->post('gender');
$openid = $this->request->post('openid');
/**TODO 这个限制不能再用了 if (empty($nickName) || empty($avatarUrl) || empty($gender) || empty($openid)) {
$this->error('缺少参数');
}*/
$userinfo = \app\admin\model\User::where(['openid' => $openid])->find();
if ($userinfo) {
$userinfo->nickname = $nickName;
$userinfo->avatar = $avatarUrl;
$userinfo->gender = $gender;
$userinfo->save();
$this->auth->direct($userinfo['id']);
} else {
$user = new \app\admin\model\User();
$user->data([
'nickname' => $nickName,
'avatar' => $avatarUrl,
'gender' => $gender,
'status' => 'normal',
'openid' => $openid
]);
$user->save();
$this->auth->direct($user->id);
}
$this->success('登录成功', $this->auth->getUserinfo());
}
介绍
旨在方便自己日后做这方面的开发,直接安装就好,省事.本项目是基于2021年4月13日微信小程序授权登录做的整改进行开发的插件
软件架构
毫无架构可言
使用说明
- Install_Package目录 是打包过的插件安装包,可以直接用于安装
- 接口文档在下方已经贴出
- 前端测试demo:在application/api/minapp_v2 里面,使用时只需要修改minapp_v2/utils/api.js 里面的 http地址即可
- 使用前还记得要把插件管理里面的配置项的小程appid跟密钥配置好

参与贡献
- Fork 本仓库
- 新建 Feat_xxx 分支
- 提交代码
- 新建 Pull Request

下面是API文档
API一简要描述
请求URL
/api/Auth_login_with_wechat/code
请求方式
参数
参数名 |
必选 |
类型 |
说明 |
code |
是 |
int |
wx.login 获取的code |
返回示例
{
"code": 1,
"msg": "成功",
"time": "1618534098",
"data": {
"openid": "o5rIS5MzaMjZBz3DMzUtsosMZApU",
"session_key": "z5kYsGmcb7MaRcS0a1AGPQ=="
}
}
{
"code": 0,
"msg": "code been used, hints: [ req_id: YDHBA5yFe-i1q0RA ]",
"time": "1618534253",
"data": null
}
返回参数说明
参数名 |
类型 |
说明 |
code |
int |
状态码,1:成功;0:失败 |
msg |
string |
提示语 |
openid |
string |
openid 用于后面的登录传值 |
session_key |
string |
session_key 用于后面的登录传值 |
API二简要描述
请求URL
/api/Auth_login_with_wechat/login
请求方式
参数
参数名 |
必选 |
类型 |
说明 |
encryptedData |
是 |
string |
加密串 |
iv |
是 |
string |
偏移量 |
sessionKey |
是 |
string |
sessionKey |
openid |
是 |
string |
openid |
返回示例
{
"code": 1,
"msg": "登录成功",
"time": "1618535634",
"data": {
"id": 2,
"username": "",
"nickname": "Blustant'C 吴伟祥 可乐爸爸",
"mobile": "",
"avatar": "https://thirdwx.qlogo.cn/mmopen/vi_32/Hlq7zKcsbIXveqiaEuRI6SHbk1zSBADsf6SVMWI9VxRxmpz4R917QHfcFTlsLFC8IVhZ418LVlv3DX4VjzyKibZg/132",
"score": 0,
"token": "47b64df8-d5ee-43e7-9168-889ea48c11fb",
"user_id": 2,
"createtime": 1618535634,
"expiretime": 1621127634,
"expires_in": 2592000
}
}
返回参数说明
参数名 |
类型 |
说明 |
code |
int |
状态码,1:成功;0:失败 |
msg |
string |
提示语 |
token |
string |
用于接口请求使用 |
API三简要描述
前端示例代码
<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">获取手机号</button>
getPhoneNumber:function(e){
console.log(e.detail.errMsg)
console.log(e.detail.iv)
console.log(e.detail.encryptedData)
},
请求URL
/api/Auth_login_with_wechat/getPhone
请求方式
参数
参数名 |
必选 |
类型 |
说明 |
iv |
是 |
string |
偏移量 |
encryptedData |
是 |
string |
加密串 |
sessionKey |
是 |
string |
sessionKey |
返回示例
{
"code": 1,
"msg": "获取成功",
"time": "1613125219",
"data": {
"phoneNumber": "18712377078",
"purePhoneNumber": "18712377078",
"countryCode": "86",
"watermark": {
"timestamp": 1613124456,
"appid": "wxc17d20f5b4595397"
}
}
}
返回参数说明
参数名 |
类型 |
说明 |
code |
int |
1 成功 0 失败 -获取手机号失败就只能手动填写手机号 |
data-phoneNumber |
string |
手机号 |
解密后的数据格式,并没有openid跟unionID
{
"nickName":"Blustant'C 吴伟祥 可乐爸爸",
"gender":1,
"language":"zh_CN",
"city":"Hefei",
"province":"Anhui",
"country":"China",
"avatarUrl":"https://thirdwx.qlogo.cn/mmopen/vi_32/Hlq7zKcsbIXveqiaEuRI6SHbk1zSBADsf6SVMWI9VxRxmpz4R917QHfcFTlsLFC8IVhZ418LVlv3DX4VjzyKibZg/132",
"watermark":{
"timestamp":1618498216,
"appid":"wx9d9766d500e04dcd"
}
}
获取手机号遇到报错appid没有权限:

- 解决方案:微信小程序后台首页的微信认证通过了就有权限了
