- 安装必要的第三方包
$ composer require tymon/jwt-auth | |
$ composer require overtrue/wechat:~5.0 -vvv |
注意: 第一次安装jwt包后需要执行
$ php artisan jwt:secret
- 在控制器中添加用户验证方法
public function auth(Request $request) | |
{ | |
$code = $request->get('code'); | |
$rawData = $request->get('rawData'); | |
$config = Configs::first()->toArray(); | |
$config = [ | |
'app_id' => $config['app_id'] ?? env('WECHAT_APP_ID'), // 这里需要自行修改 | |
'secret' => $config['secret'] ?? env('WECHAT_APP_SECRET'), // 这里需要自行修改 | |
]; | |
$app = Factory::miniProgram($config); | |
$data = $app->auth->session($code); | |
//判断code是否过期 | |
if (isset($data['errcode'])) { | |
return ['code' => 404, 'massage' => 'code已过期或不正确']; | |
} | |
$weappOpenid = $data['openid']; | |
$weixinSessionKey = $data['session_key']; | |
$wechat = json_decode($rawData, true); | |
$user = Members::UpdateOrCreate(['openid' => $weappOpenid], [ | |
'openid' => $weappOpenid, | |
'nickname' => $wechat['nickName'], | |
// 'gender' => $wechat['gender'], | |
// 'city' => $wechat['city'], // 'Wenzhou', | |
// 'province' => $wechat['province'], // 'Zhejiang', | |
// 'country' => $wechat['country'], // 'China', | |
'avatar' => $wechat['avatarUrl'], | |
'session_key' => $weixinSessionKey, | |
'mobile' => $wechat['mobile'] ?? '--', | |
'created_at' => date('Y-m-d H:i:s'), | |
'updated_at' => date('Y-m-d H:i:s'), | |
]); | |
$customClaims = ['sub' => ["openid" => $user->openid, 'session_key' => $user->session_key]]; | |
$payload = JWTFactory::customClaims($customClaims)->make(); | |
if (!$token = JWTAuth::encode($payload)->get()) { | |
return ['code' => 401, 'massage' => 'Unauthorized']; | |
} | |
// $ttl = $request->out_time ?? config('jwt.ttl'); # 设置token 过期时间 | |
// if (!$token = Auth::guard('api')->setTTL($ttl)->tokenById($user->id)) { | |
// return ['code' => 500, 'massage' => 'token 过期']; | |
// } | |
// return apiJson($this->respondWithToken($token)); | |
return ['code' => 200, 'token' => $token]; | |
} |
- 添加创建中间件
CheckMemberToken
$ php artisan make:middleware CheckMemberToken
4.在创建的中间件中完善handle代码
public function handle($request, Closure $next) | |
{ | |
try { | |
$token = JWTAuth::getToken(); | |
if (empty($token)) { | |
return response()->json(['status_code' => 40 1, 'message' => '未登录']); | |
} | |
$user_info = JWTAuth::setToken($token)->getPayload()->get('sub'); | |
if ($user_info) { | |
$user = Members::where('openid', $user_info->openid)->first(); | |
if (!$user) { | |
response()->json(['status_code' => 402, 'message' => '用户异常']); | |
} | |
//如果想向控制器里传入用户信息,将数据添加到$request里面 | |
$request->attributes->add(['memberId' => $user->id]); //添加参数 | |
} | |
//其他地方获取用户值 | |
// var_dump($request->attributes->get('memberId'));exit(); | |
return $next($request); | |
} catch (TokenExpiredException $e) { | |
try { | |
$token = JWTAuth::refresh(); | |
if ($token) { | |
return response()->json(['status_code' => 403, 'message' => '新token', 'token' => $token]); | |
} | |
} catch (JWTException $e) { | |
return response()->json(['status_code' => 404, 'message' => 'token无效', 'token' => '']); | |
} | |
} | |
} |
- 在
App\Http\Kernel
中注册中间件路由
protected $routeMiddleware = [ | |
'auth' => \App\Http\Middleware\Authenticate::class, | |
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, | |
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, | |
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, | |
'can' => \Illuminate\Auth\Middleware\Authorize::class, | |
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, | |
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, | |
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, | |
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, | |
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, | |
'wechat.auth' => \Overtrue\LaravelWeChat\Middleware\OAuthAuthenticate::class, | |
// 添加这一行 | |
'jwt.user' => \App\Http\Middleware\CheckMemberToken::class | |
]; |
6.设置路由
// 授权登录 | |
Route::any('wechat/auth', 'WechatController@auth'); | |
Route::group([ | |
'middleware' => 'jwt.user', | |
'prefix' => 'orders', | |
], function (Router $router) { | |
// 创建订单 | |
$router->post('create', 'OrderController@create'); | |
// 核销订单 | |
$router->post('verification/{id}', 'OrderController@verification'); | |
// 订单详情页 | |
$router->get('{id}/detail', 'OrderController@orderDetail'); | |
// 确认订单页 | |
$router->get('confirm_order', 'OrderController@confirmOrder'); | |
// 订单支付 | |
$router->any('pay', 'OrderController@payOrder'); | |
}); |
- 小程序端测试代码
// 微信授权登陆 | |
wx.login({ | |
success:function (res){ | |
var code = res.code; | |
wx.request({ | |
url: 'http://fiveyears.cc/wechat/auth', | |
header: { | |
'content-type': 'application/json' | |
}, | |
data: { | |
code: code, | |
rawData: rawData | |
}, | |
success(res) { | |
console.log(res) | |
} | |
}) | |
var token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9maXZlLmdhb3lhbmFuLnRvcFwvd2VjaGF0XC9hdXRoIiwiaWF0IjoxNjEzNzI0ODA2LCJleHAiOjE2MTM3Mjg0MDYsIm5iZiI6MTYxMzcyNDgwNiwianRpIjoic3haaUV4Y1Bhb0pIa29VUiIsInN1YiI6eyJvcGVuaWQiOiJvVnZLVjVEN1hvRFFlM2c3M2V2Yk5kczJka05ZIiwic2Vzc2lvbl9rZXkiOm51bGx9fQ.y5PrJH1lPHCSNy7EqKGM6qhMRcdqeaBqu8JGIhMf07k'; | |
wx.request({ | |
url: 'http://fiveyears.cc/orders/create', | |
header: { | |
'content-type': 'application/json' | |
}, | |
data: { | |
token: token, | |
id: 1, | |
type: 1, | |
}, | |
method: 'post', | |
success(res) { | |
console.log(res) | |
console.log(res.data) | |
console.log(res.data.data.timestamp) | |
// 微信支付 | |
// wx.requestPayment({ | |
// 'timeStamp':res.data.data.timestamp,// | |
// 'nonceStr': res.data.data.nonceStr, | |
// 'package': res.data.data.package, | |
// 'signType': 'MD5', | |
// 'paySign': res.data.data.paySign, | |
// 'success':function(res){ | |
// console.log(res); | |
// }, | |
// 'fail':function(res){ | |
// console.log('fail:'+JSON.stringify(res)); | |
// } | |
// }) | |
} | |
}) | |
} | |
}) | |
授权登录成功
创建订单成功
正文完
可以使用微信扫码关注公众号(ID:xzluomor)