1.获取用户code 传入后台
2.后台(php)中接收参数验证 第三方获取openid以及 session_key ,openid
验证数据库是否存在该用户 如果存在 则修改session_key 不存在则新增用户。
public function wxLogin(Request $request)
{
//code
$code = $request->get('code');
$nick_name = $request->get('nick_name');
$avatar_url = $request->get('avatar_url');
$appid = '微信平台获取';
$appsecret = '微信平台获取';
$url = "https://api.weixin.qq.com/sns/jscode2session?appid={$appid}&secret={$appsecret}&js_code={$code}&grant_type=authorization_code";
//返回openid 以及 session_key 并解码 否则无法取出数据
$userInfo = json_decode(file_get_contents($url),true);
$userInfo['nickname'] = $nick_name;
$userInfo['avatar'] = $avatar_url;
//通过openid查询表中是否有数据 有则更新session_key 无则添加数据入库
$data = Rentings::where('openid',$userInfo['openid'])->first();
//dd($data['id']);die();
if ($data)
{
//有数据修改session_key
Rentings::where('openid',$userInfo['openid'])->update(['session_key'=>$userInfo['session_key']]);
}else{
//没有数据新增用户
$createResult = Rentings::createData($userInfo);
$userInfo['user_id'] = $data['id'];
}
//生成token
$token = BaseController::createToken($data['id']);
$userData['user_id'] = $data['id'];
$userData['token'] = $token;
return json_encode(['code'=>200,'msg'=>'成功','data'=>$userData]);
}
3.生成token 并返回 前端存入session
composer下载JWT
composer require lcobucci/jwt 3.3
4.创建BaseController控制器 写入 生成token以及验证解码token的方法
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Lcobucci\JWT\Builder;
use Lcobucci\JWT\Parser;
use Lcobucci\JWT\Signer\Hmac\Sha256;
use Lcobucci\JWT\ValidationData;
class BaseController extends Controller
{
/**
* @param null $uid
* @return string
* 生成token
*/
public static function createToken($uid = null)
{
$signer = new Sha256();//加密规则
$time = time();//当前时间
$token = (new Builder())
->issuedBy('teacher')//签发人
->canOnlyBeUsedBy('student')//接收人
->identifiedBy('MarsLei', true) //标题id
->issuedAt($time)//发出令牌的时间
->canOnlyBeUsedAfter($time) //生效时间(即时生效)
->expiresAt($time + 3600) //过期时间
->with('uid', $uid) //用户id
->sign($signer, 'my') //签名
->getToken(); //得到token
return (string)$token;
}
/**
* @param null $token
* @return int|mixed
* 验证token
*/
public static function verifyToken($token=null){
//检测是否接收到了token
if(empty($token)){
return 0;
}
//转化为可以验证的token
$token = (new Parser())->parse((string) $token);
//验证基本设置
$data = new ValidationData();
$data->setIssuer('teacher');
$data->setAudience('student');
$data->setId('MarsLei');
if(!$token->validate($data)){
return 0;
}
//验证签名
$signer = new Sha256();
if(!$token->verify($signer, 'my')){
return 0;
}
//验证通过,返回用户id
return $token->getClaim('uid');
}
}