| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- <?php
- namespace App\Http\Controllers;
- use Illuminate\Support\Facades\Redis;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\Http;
- class AuthController extends Controller
- {
- //
- public function login(Request $request) {
- //
- $code = $request->input("code","");
- if(!$code) {
- return [
- 'errno'=> 10001,
- "errmsg" => '参数错误',
- ];
- }
- // 调用接口可获取用户公开信息,例如头像,昵称,openid等
- $ret = $this->thirdAuth($code);
- if(!$ret) {
- return [
- 'errno'=> 10002,
- "errmsg" => '参数错误',
- ];
- }
- // 通过openid判断是否存在
- $user = \App\Models\Account::where("openid", $ret['openid'])->first();
- $isCreate = false;
- if(!$user) {
- $isCreate = true;
- $user = new \App\Models\Account();
- $user->coupon = 0;
- $user->paster = 0;
- $user->uid = 0;
- $user->code = '';
- }
- // $user->token = json_encode($token);
- $user->username = $ret['name'];
- $user->avatar = $ret['face'];
- $user->openid = $ret['openid'];
- //
- $user->session = md5($user->id."_".time());
- $user->session_expire = date("Y-m-d H:i:s", strtotime("+30 day"));
- $user->save();
- //
- if($isCreate) {
- // 把默认皮肤加入到试衣间
- $defaultAttireId = \App\Models\Attire::where("is_default", 1)->value("id");
- $objFittingRoom = new \App\Models\FittingRoom();
- $objFittingRoom->account_id = $user->id;
- $objFittingRoom->attire_id = $defaultAttireId;
- $objFittingRoom->curr_save = 1;
- $objFittingRoom->curr_upload = 1;
- $objFittingRoom->save();
- }
- // 判断用户时候关联Uid
- $status = 2; // 1:未验证 2:已登录
- $code = '';
- if(!$user->uid) {
- $status = 1;
- $code = Redis::get("auth_aid:{$user->id}");
- if(!$code) {
- while(true) {
- $code = mt_rand(100001,999999);
- $tmp = Redis::get("auth_code:{$code}");
- if(!$tmp) {
- break;
- }
- }
- //
- Redis::set("auth_aid:{$user->id}", $code);
- Redis::expire("auth_aid:{$user->id}", 12 * 60);
- Redis::set("auth_code:{$code}", $user->id);
- Redis::expire("auth_code:{$code}", 12 * 60);
- }
- }
- // 获取用户当前保存的皮肤
- $attire = \App\Models\FittingRoom::where("account_id",$user->id)->where("curr_save", 1)->whereHas('attire', function($q){
- $q->whereIn('cate', ['皮肤','套装']);
- })->with(['attire'])->first();
- //
- $currImg1 = \Storage::disk('cosv5')->url($attire->attire->img_1);
- $currImg2 = \Storage::disk('cosv5')->url($attire->attire->img_2);
- // 获取新手教程的图片
- $newTeach = \App\Models\Resource::where("name","new_teach")->value("src");
- // 获取二维码的图片
- $rqcode = \App\Models\Resource::where("name", "qr_code")->value("src");
- //
- $datas = \App\Models\Config::whereNotIn("key", ['box_level_percent','box_level_paster','coupon_configs'])->get(['key','val','val1','type'])->toArray();
- foreach($datas as &$v) {
- if($v['type'] == 1) {
- $v['val'] = $v['val1'];
- }
- unset($v['val1']);
- }
- //
- return [
- 'errno'=> 10000,
- "errmsg" => 'ok',
- 'data' => [
- 'username' => $user->username,
- 'avatar' => config("filesystems.disks.cosv5.url") . '/'.$user->avatar,
- 'coupon' => $user->coupon,
- 'paster' => $user->paster,
- 'session' => $user->session,
- 'curr_attire_img1' => $currImg1,
- 'curr_attire_img2' => $currImg2,
- 'code' => $code,
- 'status' => $status,
- "assets" => [
- 'new_teach' => \Storage::disk('cosv5')->url($newTeach),
- 'qr_code' => \Storage::disk('cosv5')->url($rqcode),
- ],
- 'configs' => array_column($datas, 'val','key'),
- ],
- ];
- }
- // 第三方授权获取用户基本信息
- // https://passport.bilibili.com/register/pc_oauth2.html#/?client_id=e17f50dbe6c84974&return_url=https%3A%2F%2Fnebulabeat.com&response_type=code&state=vvvv
- public function thirdAuth($code='') {
- //
- if(!$code) {
- return false;
- }
- //
- $resp = Http::timeout(3)->retry(3, 100)->post("https://api.bilibili.com/x/account-oauth2/v1/token", [
- 'client_id' => env('BCLIENTID'),
- 'client_secret' => env('BSECRET'),
- 'grant_type' => 'authorization_code',
- 'code' => $code,
- ])->json();
- if($resp['code'] == 0 && isset($resp['data']['access_token']) && $resp['data']['access_token']) {
- // 获取用户信息
- $user = Http::timeout(3)->retry(3, 100)->get("http://member.bilibili.com/arcopen/fn/user/account/info",[
- "client_id"=>env('BCLIENTID'),
- "access_token"=>$resp['data']['access_token'],
- ])->json();
- //
- if($user['code'] == 0 && $user['data']) {
- // 把头像下载下来
- $var = pathinfo($user['data']['face']);
- $md5 = time();
- // $tmp = $this->GrabImage($user['data']['face'], public_path("uploads/avatar/{$md5}_{$var['basename']}"));
- $tmp = $this->GrabImage($user['data']['face'], "avatar/{$md5}_{$var['basename']}");
- if($tmp) {
- $user['data']['face'] = "avatar/{$md5}_{$var['basename']}";
- }
- //
- return $user['data'];
- }
- }
- return false;
- }
- //
- function GrabImage($url, $filename="") {
- if($url=="") {
- return false;
- }
- //
- ob_start();
- readfile($url);
- $img = ob_get_contents();
- ob_end_clean();
- \Storage::disk("cosv5")->put($filename, $img);
- // $fp2 = fopen($filename, "a");
- // fwrite($fp2,$img);
- // fclose($fp2);
- return true;
- }
- }
|