AuthController.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Support\Facades\Redis;
  4. use Illuminate\Http\Request;
  5. use Illuminate\Support\Facades\Http;
  6. class AuthController extends Controller
  7. {
  8. //
  9. public function login(Request $request) {
  10. //
  11. $code = $request->input("code","");
  12. if(!$code) {
  13. return [
  14. 'errno'=> 10001,
  15. "errmsg" => '参数错误',
  16. ];
  17. }
  18. // 调用接口可获取用户公开信息,例如头像,昵称,openid等
  19. $ret = $this->thirdAuth($code);
  20. if(!$ret) {
  21. return [
  22. 'errno'=> 10002,
  23. "errmsg" => '参数错误',
  24. ];
  25. }
  26. // 通过openid判断是否存在
  27. $user = \App\Models\Account::where("openid", $ret['openid'])->first();
  28. $isCreate = false;
  29. if(!$user) {
  30. $isCreate = true;
  31. $user = new \App\Models\Account();
  32. $user->coupon = 0;
  33. $user->paster = 0;
  34. $user->uid = 0;
  35. $user->code = '';
  36. }
  37. // $user->token = json_encode($token);
  38. $user->username = $ret['name'];
  39. $user->avatar = $ret['face'];
  40. $user->openid = $ret['openid'];
  41. //
  42. $user->session = md5($user->id."_".time());
  43. $user->session_expire = date("Y-m-d H:i:s", strtotime("+30 day"));
  44. $user->save();
  45. //
  46. if($isCreate) {
  47. // 把默认皮肤加入到试衣间
  48. $defaultAttireId = \App\Models\Attire::where("is_default", 1)->value("id");
  49. $objFittingRoom = new \App\Models\FittingRoom();
  50. $objFittingRoom->account_id = $user->id;
  51. $objFittingRoom->attire_id = $defaultAttireId;
  52. $objFittingRoom->curr_save = 1;
  53. $objFittingRoom->curr_upload = 1;
  54. $objFittingRoom->save();
  55. }
  56. // 判断用户时候关联Uid
  57. $status = 2; // 1:未验证 2:已登录
  58. $code = '';
  59. if(!$user->uid) {
  60. $status = 1;
  61. $code = Redis::get("auth_aid:{$user->id}");
  62. if(!$code) {
  63. while(true) {
  64. $code = mt_rand(100001,999999);
  65. $tmp = Redis::get("auth_code:{$code}");
  66. if(!$tmp) {
  67. break;
  68. }
  69. }
  70. //
  71. Redis::set("auth_aid:{$user->id}", $code);
  72. Redis::expire("auth_aid:{$user->id}", 12 * 60);
  73. Redis::set("auth_code:{$code}", $user->id);
  74. Redis::expire("auth_code:{$code}", 12 * 60);
  75. }
  76. }
  77. // 获取用户当前保存的皮肤
  78. $attire = \App\Models\FittingRoom::where("account_id",$user->id)->where("curr_save", 1)->whereHas('attire', function($q){
  79. $q->whereIn('cate', ['皮肤','套装']);
  80. })->with(['attire'])->first();
  81. //
  82. $currImg1 = \Storage::disk('cosv5')->url($attire->attire->img_1);
  83. $currImg2 = \Storage::disk('cosv5')->url($attire->attire->img_2);
  84. // 获取新手教程的图片
  85. $newTeach = \App\Models\Resource::where("name","new_teach")->value("src");
  86. // 获取二维码的图片
  87. $rqcode = \App\Models\Resource::where("name", "qr_code")->value("src");
  88. //
  89. $datas = \App\Models\Config::whereNotIn("key", ['box_level_percent','box_level_paster','coupon_configs'])->get(['key','val','val1','type'])->toArray();
  90. foreach($datas as &$v) {
  91. if($v['type'] == 1) {
  92. $v['val'] = $v['val1'];
  93. }
  94. unset($v['val1']);
  95. }
  96. //
  97. return [
  98. 'errno'=> 10000,
  99. "errmsg" => 'ok',
  100. 'data' => [
  101. 'username' => $user->username,
  102. 'avatar' => config("filesystems.disks.cosv5.url") . '/'.$user->avatar,
  103. 'coupon' => $user->coupon,
  104. 'paster' => $user->paster,
  105. 'session' => $user->session,
  106. 'curr_attire_img1' => $currImg1,
  107. 'curr_attire_img2' => $currImg2,
  108. 'code' => $code,
  109. 'status' => $status,
  110. "assets" => [
  111. 'new_teach' => \Storage::disk('cosv5')->url($newTeach),
  112. 'qr_code' => \Storage::disk('cosv5')->url($rqcode),
  113. ],
  114. 'configs' => array_column($datas, 'val','key'),
  115. ],
  116. ];
  117. }
  118. // 第三方授权获取用户基本信息
  119. // https://passport.bilibili.com/register/pc_oauth2.html#/?client_id=e17f50dbe6c84974&return_url=https%3A%2F%2Fnebulabeat.com&response_type=code&state=vvvv
  120. public function thirdAuth($code='') {
  121. //
  122. if(!$code) {
  123. return false;
  124. }
  125. //
  126. $resp = Http::timeout(3)->retry(3, 100)->post("https://api.bilibili.com/x/account-oauth2/v1/token", [
  127. 'client_id' => env('BCLIENTID'),
  128. 'client_secret' => env('BSECRET'),
  129. 'grant_type' => 'authorization_code',
  130. 'code' => $code,
  131. ])->json();
  132. if($resp['code'] == 0 && isset($resp['data']['access_token']) && $resp['data']['access_token']) {
  133. // 获取用户信息
  134. $user = Http::timeout(3)->retry(3, 100)->get("http://member.bilibili.com/arcopen/fn/user/account/info",[
  135. "client_id"=>env('BCLIENTID'),
  136. "access_token"=>$resp['data']['access_token'],
  137. ])->json();
  138. //
  139. if($user['code'] == 0 && $user['data']) {
  140. // 把头像下载下来
  141. $var = pathinfo($user['data']['face']);
  142. $md5 = time();
  143. // $tmp = $this->GrabImage($user['data']['face'], public_path("uploads/avatar/{$md5}_{$var['basename']}"));
  144. $tmp = $this->GrabImage($user['data']['face'], "avatar/{$md5}_{$var['basename']}");
  145. if($tmp) {
  146. $user['data']['face'] = "avatar/{$md5}_{$var['basename']}";
  147. }
  148. //
  149. return $user['data'];
  150. }
  151. }
  152. return false;
  153. }
  154. //
  155. function GrabImage($url, $filename="") {
  156. if($url=="") {
  157. return false;
  158. }
  159. //
  160. ob_start();
  161. readfile($url);
  162. $img = ob_get_contents();
  163. ob_end_clean();
  164. \Storage::disk("cosv5")->put($filename, $img);
  165. // $fp2 = fopen($filename, "a");
  166. // fwrite($fp2,$img);
  167. // fclose($fp2);
  168. return true;
  169. }
  170. }