AuthController.php 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Models\SoapUser;
  4. use App\Models\Store;
  5. use Illuminate\Http\Request;
  6. use App\Models\User;
  7. use App\Models\Smslog;
  8. use Illuminate\Support\Facades\Auth;
  9. use Illuminate\Support\Facades\Cache;
  10. use Illuminate\Support\Facades\Log;
  11. use Tymon\JWTAuth\Facades\JWTAuth;
  12. use Overtrue\EasySms\EasySms;
  13. use GuzzleHttp\Client;
  14. use Carbon\Carbon;
  15. use EasyWeChat\Factory;
  16. use Overtrue\EasySms\PhoneNumber;
  17. class AuthController extends Controller
  18. {
  19. //账号密码登录
  20. public function login(Request $request){
  21. $phone = $request->input('phone');
  22. $password = $request->input('password');
  23. $user=User::where('mobile',$phone)->first();
  24. if(!$user){
  25. return $this->error('450001','账号不存在');
  26. }
  27. if (!empty($user->deleted_at)){
  28. return $this->error('450001','账号已删除');
  29. }
  30. if ($user->status==1){
  31. return $this->error('450001','账号已禁用');
  32. }
  33. if(md5($password) != $user->password){
  34. return $this->error('450001','密码有误');
  35. }
  36. $token = Auth::guard('api')->fromUser($user);
  37. $data['token'] =$token;
  38. $data['user'] =$user;
  39. return $this->success($data);
  40. }
  41. public function sendCode(Request $request)
  42. {
  43. $phone = $request->input('phone');
  44. $area_code = $request->input('area_code','+86');
  45. $time = 10;
  46. if(strlen($phone)==11){
  47. $code = mb_substr($phone, 3, 2) . mb_substr($phone, 8, 2) . mb_substr($phone, 6, 2);
  48. }else{
  49. $code = mb_substr($phone,3,2).mb_substr($phone, 1, 2) . mb_substr($phone, 6, 2);
  50. }
  51. $number = new PhoneNumber($phone, $area_code);
  52. try {
  53. $sms = new EasySms(config('easysms'));
  54. $sms->send($number, [
  55. 'content' => "【大卫博士】您的验证码为{$code},请在{$time}分钟内输入验证码!如非本人操作,请忽略此条短信。"
  56. ]);
  57. $data = ['phone' => $phone, 'code' => $code,'area_code'=>$area_code];
  58. Smslog::create($data);
  59. $key = 'verificationCode_' . MD5($area_code.'-'.$phone);
  60. $expiredAt = Carbon::now()->addMinutes(10);
  61. Cache::put($key, ['phone' => $phone, 'code' => $code], $expiredAt); // 缓存验证码 10分钟过期。
  62. return $this->success($code);
  63. } catch (\Overtrue\EasySms\Exceptions\NoGatewayAvailableException $exception) {
  64. $message = $exception->getException('qcloud')->getMessage();
  65. Log::error('{短信发送错误------------}' . $message . '{---------------短信发送错误}');
  66. return $this->error('450001', $message);
  67. }
  68. }
  69. public function verifyLogin(Request $request){
  70. $phone = $request->input('phone');
  71. $area_code = $request->input('area_code','+86');
  72. $verify_code = $request->input('verify_code');
  73. $openid = $request->input('openid',null);
  74. if(SoapUser::where('phone',$phone)->exists()){
  75. return $this->error('450001','该手机号已被绑定');
  76. }
  77. $user=User::where('mobile',$phone)->first();
  78. if(empty($user)){
  79. return $this->error('450001','账号不存在');
  80. }
  81. if (!empty($user->deleted_at)){
  82. return $this->error('450001','账号已删除');
  83. }
  84. if ($user->status==1){
  85. return $this->error('450001','账号已禁用');
  86. }
  87. //短信登录
  88. $verify_key = 'verificationCode_' . MD5($area_code.'-'.$phone);
  89. $verifyData = Cache::get($verify_key);
  90. if (!$verifyData) {
  91. return $this->error('450001','验证码失效');
  92. }
  93. if(!hash_equals($verifyData['code'], $verify_code)){
  94. return $this->error('450001','验证码有误');
  95. }
  96. Cache::forget($verify_key);
  97. if($openid){
  98. $soap_user=SoapUser::where('openid',$openid)->first();
  99. if($soap_user){
  100. if($soap_user->phone){
  101. return $this->error('450001','该微信号已被绑定');
  102. }else{
  103. $soap_user->area_code = $area_code;
  104. $soap_user->phone = $phone;
  105. $soap_user->nickname = $user->nickname;
  106. $soap_user->headimgurl = $user->headimgurl;
  107. $soap_user->level = $user->level;
  108. $soap_user->user_id = $user->id;
  109. $soap_user->recom_id = $user->recom_id;
  110. $soap_user->agent_id = $user->agent_id;
  111. $soap_user->crown_id = $user->crown_id;
  112. $soap_user->warea_id = $user->warea_id;
  113. $soap_user->save();
  114. }
  115. }else{
  116. $soap_user = SoapUser::create([
  117. 'area_code'=>$area_code,
  118. 'phone'=>$phone,
  119. 'openid'=>$openid,
  120. 'nickname'=>$user->nickname,
  121. 'headimgurl'=>$user->headimgurl,
  122. 'level'=>$user->level,
  123. 'user_id'=>$user->id,
  124. 'recom_id'=>$user->recom_id,
  125. 'agent_id'=>$user->agent_id,
  126. 'crown_id'=>$user->crown_id,
  127. 'warea_id'=>$user->warea_id,
  128. ]);
  129. }
  130. }else{
  131. return $this->error('450001','请关注公众号并登录公众号的个人中心');
  132. }
  133. $token = Auth::guard('api')->fromUser($soap_user);
  134. $data['token'] =$token;
  135. $data['user'] =$soap_user;
  136. return $this->success($data);
  137. }
  138. /*
  139. * 获取openid
  140. */
  141. public function getUserOpenid($Code){
  142. $client=new Client();
  143. $AppId=config('wechat.official_account.default.app_id');
  144. $Secret=config('wechat.official_account.default.secret');
  145. $url='https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$AppId.'&secret='.$Secret.'&code='.$Code.'&grant_type=authorization_code';
  146. $data=$client->request('get',$url);
  147. $da=$data->getBody()->getContents();
  148. $da=json_decode($da,true);
  149. $da=(array)$da;
  150. return $da;
  151. }
  152. // 微信登陆
  153. public function wxLogin(Request $request){
  154. $code=$request->input('code');
  155. $info = $this->getUserOpenid($code);
  156. Log::info($info);
  157. if(isset($info['openid'])){
  158. $soap_user = SoapUser::where('openid',$info['openid'])->first();
  159. if($soap_user){
  160. if(empty($soap_user->phone)){
  161. return $this->success(['openid'=>$info['openid'],'msg'=>'请绑定手机号']);
  162. }
  163. $user=User::where('mobile',$soap_user->phone)->first();
  164. if(empty($user)){
  165. return $this->error('450001','账号不存在');
  166. }
  167. if (!empty($user->deleted_at)){
  168. return $this->error('450001','账号已删除');
  169. }
  170. if ($user->status==1){
  171. return $this->error('450001','账号已禁用');
  172. }
  173. $token = Auth::guard('api')->fromUser($soap_user);
  174. $data['token'] =$token;
  175. $data['user'] =$soap_user;
  176. return $this->success($data);
  177. }else{
  178. return $this->success(['openid'=>$info['openid'],'msg'=>'请使用验证码登录']);
  179. }
  180. }else{
  181. return $this->error('450001','请关注公众号并登录公众号的个人中心');
  182. }
  183. }
  184. public function logout(){
  185. $id = Auth::user()->id;
  186. try{
  187. SoapUser::where('id',$id)->update([
  188. 'area_code' => null,
  189. 'phone' => null,
  190. 'nickname' => null,
  191. 'headimgurl' => null,
  192. 'level' => null,
  193. 'user_id' => null,
  194. 'recom_id' => null,
  195. 'agent_id' => null,
  196. 'crown_id' => null,
  197. 'warea_id' => null
  198. ]);
  199. auth('api')->logout();
  200. return $this->success([]);
  201. }catch(\Exception $e){
  202. return $this->error();
  203. }
  204. }
  205. public function getToken(Request $request){
  206. $phone = $request->input('phone');
  207. $user=SoapUser::where('phone',$phone)->first();
  208. if(empty($user)){
  209. return $this->error('450001','账号不存在');
  210. }
  211. $token = Auth::guard('api')->fromUser($user);
  212. $data['token'] =$token;
  213. $data['user'] =$user;
  214. return $this->success($data);
  215. }
  216. }