登录流程
1、首次登录:保存openid到数据库,并把openid存入缓存;
2、非首次登录,但未授权:仅把openid存入缓存;
3、非首次登录,且已授权:从数据库读取用户信息。
授权流程
1、首次登录:点击授权按钮,调用授权函数,获得用户信息,将其与openid发送至后台,更新数据库,即可保存用户到数据库;
2、非首次登录,但未授权:和首次登录一样;
3、非首次登录,且已授权:不显示授权按钮。
微信小程序:登录
app.js
onLaunch: function () {
wx.login({
success: res => {
// 发送 res.code 到后台换取 openId, sessionKey, unionId
if(res.code){
wx.request({
url: 'http://***.com/hotpot/login',
data:{
code:res.code
},
success:function(res){
if(res.data.openid!=null){ //没授权
wx.setStorage({
key: 'openid',
data: res.data.openid,
})
}else{ //授权了
console.log(res.data);
}
}
})
}
}
})
},
Laravel:登录
composer require guzzlehttp/guzzle:~6.0 //安装^6.0的guzzle,不知道为什么^6.5的最新版本有问题
php artisan make:controller UserController
在.env文件配置APPID、SECRET、 WECHAT_GET_OPEN_ID
WECHAT_GET_OPEN_ID=https://api.weixin.qq.com/sns/jscode2session
APPID=输入你自己的appid
SECRET=输入你自己的appsecret
路由和接口
Route::get('/login','UserController@login');
use GuzzleHttp\Client;
use Illuminate\Support\Facades\DB;
class UserController extends Controller
{
public function login(Request $request){
//完整参数
$param=array();
$param[]='appid='.env('APPID');
$param[]='secret='.env('SECRET');
$param[]='js_code='.$request->code;
$param[]='grant_type=authorization_code';
$params=implode('&',$param); //用&符号连起来
$url = env('WECHAT_GET_OPEN_ID').'?'.$params;
//请求接口
$client = new \GuzzleHttp\Client([
'timeout' => 60
]);
$res = $client->request('GET',$url);
//openid和session_key
$data = json_decode($res->getBody()->getContents(),true);
//openid查重
$result = DB::table('users')->where('openid',$data['openid'])->first();
$result = json_decode(json_encode($result), true);
if($result==NULL){ //首次登录,存openid
DB::beginTransaction();
try{
DB::table('users')->insert(['openid'=>$data['openid']]);
DB::commit();
}catch(\Exception $e){
DB::rollBack();
return $e->getMessage();
}
}else if($result['nickName']!=NULL){ //非首次登录,且已授权,存用户信息
$user = array();
$user['nickName'] = $result['nickName'];
$user['avatarUrl'] = $result['avatarUrl'];
$user['isBoss'] = $result['isBoss'];
return $user;
}
return $data;
}
}
微信小程序:授权
index.wxml
<button
open-type="getUserInfo"
type="primary"
bindgetuserinfo="bindGetUserInfo">授权</button>
index.js
Page({
data: {
avatarUrl: '',
nickName: '',
},
bindGetUserInfo: function (e) {
let that = this;
let userInfo = e.detail.userInfo; //用户信息
wx.getStorage({ //获取缓存的openid
key: 'openid',
success: function (res) {
wx.request({
url: 'http://***.com/hotpot/save',
data:{
openid:res.data,
nickName: userInfo.nickName,
avatarUrl: userInfo.avatarUrl
},
success:function(e){
if(e.data == 1){ //如果更新成功
//显示头像昵称
that.setData({
avatarUrl: userInfo.avatarUrl,
nickName: userInfo.nickName
})
}
}
})
},
})
}
})
Laravel:授权
Route::get('/save','UserController@save');
public function save(Request $request){
DB::beginTransaction();
try{
DB::table('users')->where('openid',$request->openid)->update([
'avatarUrl'=>$request->avatarUrl,
'nickName'=>$request->nickName
]);
DB::commit();
}catch(\Exception $e){
DB::rollBack();
return $e->getMessage();
}
return 1;
}