UserController.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Mead
  5. * Date: 2019/8/19
  6. * Time: 2:11 PM
  7. */
  8. namespace App\Http\Controllers\V1;
  9. use App\Events\CardCertifiedEvent;
  10. use App\Handlers\IdCardHandler;
  11. use App\Handlers\ImageUploadHandler;
  12. use App\Http\Requests\BindMobileRequest;
  13. use App\Http\Requests\InviteNewUsersRewardRequest;
  14. use App\Http\Requests\MobileCodeRequest;
  15. use App\Http\Requests\RealNameRequest;
  16. use App\Http\Requests\UserFormIdRequest;
  17. use App\Http\Requests\UserStudentAuthRequest;
  18. use App\Http\Requests\WechatEncryptorMobileRequest;
  19. use App\Jobs\SendSMSCodeJob;
  20. use App\Models\FormId;
  21. use App\Models\InviteNewUsersConfig;
  22. use App\Models\Student;
  23. use App\Models\User;
  24. use App\Repositories\InviteNewUserRepository;
  25. use App\Repositories\InviteNewUsersConfigRepository;
  26. use App\Repositories\InviteNewUsersGiveGiftLogRepository;
  27. use App\Repositories\UserRepository;
  28. use App\Repositories\WalletLogRepository;
  29. use App\Transformers\RegisterUsersTransformer;
  30. use App\Transformers\UserStatusTransformer;
  31. use App\Transformers\WalletLogTransformer;
  32. use Carbon\Carbon;
  33. use Illuminate\Support\Facades\Cache;
  34. use Illuminate\Support\Facades\DB;
  35. use Illuminate\Support\Facades\Log;
  36. use Intervention\Image\ImageManagerStatic as Image;
  37. use Laravel\Lumen\Http\Request;
  38. use Overtrue\EasySms\Exceptions\Exception;
  39. /**
  40. * 用户模块
  41. * Class UserController
  42. * @package App\Http\Controllers\V1
  43. */
  44. class UserController extends BaseController
  45. {
  46. /**
  47. * 实名认证
  48. * @param RealNameRequest $request
  49. * @return mixed
  50. * User: Mead
  51. */
  52. public function realNameAuthentication(RealNameRequest $request)
  53. {
  54. try {
  55. $card_id = $request->get('card_id');
  56. $name = $request->get('name');
  57. $age = idCard2age($card_id);
  58. $is_match_ride_age = ($age >= 16);
  59. User::where('id', $this->user->id)->update([
  60. 'card_id' => $card_id,
  61. 'truename' => $name,
  62. 'is_card_certified' => User::CARD_NO,
  63. 'is_match_ride_age' => $is_match_ride_age
  64. ]);
  65. if (!$is_match_ride_age) {
  66. return $this->errorNoValidation('不满16周岁禁止骑车!');
  67. }
  68. $status = IdCardHandler::main($card_id, $name);
  69. if ($status['code']) {
  70. return $this->errorNoValidation($status['msg']);
  71. }
  72. $user = User::where('id', $this->user->id)->update([
  73. 'is_card_certified' => User::CARD_OK
  74. ]);
  75. event(new CardCertifiedEvent($this->user()));
  76. } catch (\Exception $exception) {
  77. return $this->errorNoValidation($exception->getMessage());
  78. }
  79. return $this->response->array([
  80. 'is_card_certified' => !!$user
  81. ]);
  82. }
  83. public function bindWechatMobile(WechatEncryptorMobileRequest $request)
  84. {
  85. try {
  86. $session = $request->get('session_key');
  87. $iv = $request->get('iv');
  88. $encryptedData = $request->get('encryptedData');
  89. $miniProgram = app('wechat.mini_program');
  90. $decryptedData = $miniProgram->encryptor->decryptData($session, $iv, $encryptedData);
  91. $mobile = $decryptedData['purePhoneNumber'];
  92. $user = User::where('id', $this->user->id)->update([
  93. 'mobile' => $mobile,
  94. 'is_bind_mobile' => User::BIND_MOBILE_OK
  95. ]);
  96. return $this->response->array([
  97. 'is_bind_mobile' => !!$user
  98. ]);
  99. } catch (\Exception $exception) {
  100. return $this->errorNoValidation($exception->getMessage());
  101. }
  102. }
  103. /**
  104. * 绑定手机号
  105. * @param BindMobileRequest $request
  106. * User: Mead
  107. */
  108. public function bindMobile(BindMobileRequest $request)
  109. {
  110. try {
  111. $mobile = $request->get('mobile');
  112. $code = $request->get('code', false);
  113. $v_code = Cache::get("verification_code_{$mobile}", '');
  114. if (empty($v_code)) {
  115. return $this->errorNoValidation('验证码已过期');
  116. }
  117. if ((string)$v_code !== (string)$code) {
  118. return $this->errorNoValidation('验证码错误');
  119. }
  120. $user = User::where('id', $this->user->id)->update([
  121. 'mobile' => $mobile,
  122. 'is_bind_mobile' => User::BIND_MOBILE_OK
  123. ]);
  124. return $this->response->array([
  125. 'is_bind_mobile' => !!$user
  126. ]);
  127. } catch (\Exception $exception) {
  128. return $this->errorNoValidation($exception->getMessage());
  129. }
  130. }
  131. /**
  132. * 发送验证码
  133. * @param MobileCodeRequest $request
  134. * @return mixed
  135. * User: Mead
  136. */
  137. public function sendVerificationCode(MobileCodeRequest $request)
  138. {
  139. $mobile = $request->get('mobile');
  140. $type = $request->get('type');
  141. $code = rand(1000, 9999);
  142. if ($type == 2) {
  143. // 仅仅表示换绑手机号
  144. if ((bool)$this->user()->is_bind_mobile) {
  145. $verify_mobile = $this->user()->mobile ?? '';
  146. if ($verify_mobile == $mobile) return $this->errorNoValidation('与旧手机号码相同,无需更改');
  147. }
  148. $verify_user = User::query()->where('mobile', $mobile)->exists();
  149. if ($verify_user) return $this->errorNoValidation('您绑定得手机号已存在,如有疑问请致电客服');
  150. } elseif ($type == 3) {
  151. // 仅仅换账号登录时
  152. $verify_user = User::query()->where('mobile', $mobile)->exists();
  153. if (!$verify_user) return $this->errorNoValidation('您登录得手机号不存在,如有疑问请致电客服');
  154. }
  155. try {
  156. // $this->dispatch(new SendSMSCodeJob($mobile, $code));
  157. app('easy_sms')->send($mobile, [
  158. 'template' => '439743',
  159. 'data' => [
  160. 'code' => $code
  161. ]
  162. ]);
  163. Cache::put("verification_code_{$mobile}", $code, Carbon::now()->addMinutes(5));
  164. return $this->response->array([
  165. 'is_send_sms' => true
  166. ]);
  167. } catch (Exception $exception) {
  168. $this->errorNoValidation($exception->getMessage());
  169. }
  170. }
  171. /**
  172. * 获取时间戳
  173. * @param UserRepository $userRepository
  174. * @return \Dingo\Api\Http\Response
  175. * User: Mead
  176. */
  177. public function userStatus(UserRepository $userRepository)
  178. {
  179. try {
  180. $user = $userRepository->byIdGetUserStatus($this->user->id);
  181. return $this->response->item($user, UserStatusTransformer::class);
  182. } catch (\Exception $exception) {
  183. return $this->errorNoValidation($exception->getMessage());
  184. }
  185. }
  186. /**
  187. * 存储用户的form_id
  188. * User: Mead
  189. */
  190. public function storeFormId(UserFormIdRequest $request)
  191. {
  192. try {
  193. $form_id = $request->get('form_id');
  194. FormId::create([
  195. 'user_id' => $this->user->id,
  196. 'form_id' => $form_id,
  197. 'timestamp' => (time() + 604800)
  198. ]);
  199. return $this->success();
  200. } catch (\Exception $exception) {
  201. return $this->errorNoValidation($exception->getMessage());
  202. }
  203. }
  204. /**
  205. * 用户钱包记录 userWallerLogList
  206. *
  207. * @param WalletLogRepository $walletLogRepository
  208. * @return \Dingo\Api\Http\Response|void
  209. * @author Fx
  210. *
  211. */
  212. public function userWallerLogList(WalletLogRepository $walletLogRepository)
  213. {
  214. try {
  215. $data = $walletLogRepository->byUserIdGetWalletLog($this->user->id);
  216. return $this->response->paginator($data, WalletLogTransformer::class);
  217. } catch (\Exception $exception) {
  218. return $this->errorNoValidation($exception->getMessage());
  219. }
  220. }
  221. public function getInviteWechatQrcode(ImageUploadHandler $imageUploadHandler)
  222. {
  223. try {
  224. $folder = storage_path('app/public/img/invite_new_users/qrcode/');
  225. $endfilename = 'qrcode.png';
  226. $user_id = $this->user->id;
  227. // $user_id = 212;
  228. $user_qrcode_file = $folder . $user_id . $endfilename;
  229. if (!file_exists($user_qrcode_file)) {
  230. if (!is_dir($folder . 'qrcode')) {
  231. mkdir($folder . 'qrcode');
  232. }
  233. if (!$imageUploadHandler->createWechatQrcode($folder, $user_id, $endfilename)) {
  234. return $this->errorNoValidation('系统错误,请稍后重试');
  235. }
  236. }
  237. return $this->response->array([
  238. 'path' => config('app.url') . '/storage/img/invite_new_users/qrcode/' . $user_id . $endfilename,
  239. ]);
  240. } catch (\Exception $e) {
  241. return $this->errorNoValidation($e->getMessage());
  242. }
  243. }
  244. public function getInvitePoster(InviteNewUsersConfigRepository $inviteNewUsersConfigRepository, ImageUploadHandler $imageUploadHandler)
  245. {
  246. try {
  247. $folder = storage_path('app/public/img/invite_new_users/');
  248. $endfilename = 'qrcode.png';
  249. $user_id = $this->user->id;
  250. $register_area_id = $this->user->register_area_id;
  251. $posterEndFileName = 'register_area_id_' . $register_area_id . '_user_id_' . $user_id . '_poster.png';
  252. $path = $folder . 'poster/' . $posterEndFileName;
  253. if (!is_dir($folder . 'poster')) {
  254. mkdir($folder . 'poster');
  255. }
  256. if (!file_exists($path)) {
  257. $user_qrcode_file = $folder . 'qrcode/' . $user_id . $endfilename;
  258. if (!file_exists($user_qrcode_file)) {
  259. if (!is_dir($folder . 'qrcode')) {
  260. mkdir($folder . 'qrcode');
  261. }
  262. if (!$imageUploadHandler->createWechatQrcode($folder . 'qrcode/', $user_id, $endfilename)) {
  263. return $this->errorNoValidation('系统错误,请稍后重试');
  264. }
  265. }
  266. $inviteConfig = $inviteNewUsersConfigRepository->getInviteNewUsersConfigByAreaId($register_area_id);
  267. if (empty($inviteConfig) || empty($inviteConfig->background_image)) return $this->errorNoValidation('系统错误,请稍后重试');
  268. $background_image = $inviteConfig->background_image;
  269. // Log::info($background_image);
  270. $img = Image::make($background_image);
  271. // Log::info(111);
  272. $watermark = Image::make($user_qrcode_file);
  273. $img->insert($watermark, 'bottom', 0, 635);
  274. $img->save($path);
  275. }
  276. return $this->response->array([
  277. 'path' => config('app.url') . '/storage/img/invite_new_users/poster/' . $posterEndFileName,
  278. ]);
  279. } catch (\Exception $e) {
  280. return $this->errorNoValidation($e->getMessage());
  281. }
  282. }
  283. public function getInviteNewUsersReward(InviteNewUsersRewardRequest $request, InviteNewUsersConfigRepository $inviteNewUsersConfigRepository, InviteNewUserRepository $inviteNewUserRepository, InviteNewUsersGiveGiftLogRepository $inviteNewUsersGiveGiftLogRepository)
  284. {
  285. try {
  286. $invite_new_users_configs_id = $request->get('invite_new_users_configs_id');
  287. $gift_type = $request->get('gift_type');
  288. $gift_id = $request->get('gift_id');
  289. $gift_num = $request->get('gift_num');
  290. $num = $request->get('num');
  291. $data = [
  292. 'user_id' => $this->user->id,
  293. 'invite_new_users_configs_id' => $invite_new_users_configs_id,
  294. 'gift_type' => $gift_type,
  295. 'gift_id' => $gift_id,
  296. 'gift_num' => $gift_num,
  297. ];
  298. $invite_new_users_configs = $inviteNewUsersConfigRepository->byIdGetModel($invite_new_users_configs_id);
  299. if (empty($invite_new_users_configs)) return $this->errorNoValidation('找不到该互动,或活动已过期');
  300. $is_repeat = $invite_new_users_configs->is_repeat;
  301. if ($is_repeat == InviteNewUsersConfig::REPEAT_NO) {
  302. // 不可重复
  303. if ($inviteNewUsersGiveGiftLogRepository->checkExist($data)) return $this->errorNoValidation('您已经领取过该礼物,不可重复领取');
  304. }
  305. $condition = $invite_new_users_configs->condition;
  306. $register_ids = $inviteNewUserRepository->isCondition($this->user->id, $condition, $num);
  307. if (!$register_ids) return $this->errorNoValidation('暂未达成条件,请稍后重试');
  308. // 达成条件
  309. $res = DB::transaction(function () use ($inviteNewUserRepository, $register_ids, $inviteNewUsersGiveGiftLogRepository, $data) {
  310. // 更新用户名额失效
  311. $inviteNewUserRepository->updateStatus($register_ids);
  312. // 送礼
  313. $logs = $inviteNewUsersGiveGiftLogRepository->logs($data);
  314. return $logs;
  315. });
  316. if ($res) {
  317. // 成功获得
  318. return $this->response->array(['status' => true]);
  319. } else {
  320. return $this->errorNoValidation('赠送失败');
  321. }
  322. } catch (\Exception $e) {
  323. return $this->errorNoValidation($e->getMessage());
  324. }
  325. }
  326. public function getInviteUsers(InviteNewUserRepository $inviteNewUserRepository)
  327. {
  328. try {
  329. $inviteUsers = $inviteNewUserRepository->getInviteUsers($this->user->id);
  330. return $this->response->collection($inviteUsers, RegisterUsersTransformer::class);
  331. } catch (\Exception $exception) {
  332. return $this->errorNoValidation($exception->getMessage());
  333. }
  334. }
  335. /**
  336. * 学生或者老师实名认证
  337. * Author: Mead
  338. */
  339. public function students(UserStudentAuthRequest $studentAuthRequest)
  340. {
  341. $data = $studentAuthRequest->all();
  342. $user_id = $this->user->id;
  343. $auth = Student::where('user_id', $user_id)->first();
  344. $re = false;
  345. if ($auth) {
  346. //已经认证
  347. if ((int)$auth->auth_status === Student::AUTH_STATUS_OK) {
  348. return $this->error('您已经认证,请勿重复认证');
  349. }
  350. $re = $auth->fill([
  351. 'user_id' => $user_id,
  352. 'name' => $data['name'],
  353. 'school' => $data['school'],
  354. 'student_no' => $data['no'],
  355. 'type' => $data['type'],
  356. 'year' => $data['year'],
  357. 'imgs' => $data['imgs'],
  358. 'auth_status' => Student::AUTH_STATUS_WAIT,
  359. ]);
  360. } else {
  361. $re = Student::create([
  362. 'user_id' => $user_id,
  363. 'name' => $data['name'],
  364. 'school' => $data['school'],
  365. 'student_no' => $data['no'],
  366. 'type' => $data['type'],
  367. 'year' => $data['year'],
  368. 'imgs' => $data['imgs'],
  369. 'auth_status' => Student::AUTH_STATUS_WAIT,
  370. ]);
  371. }
  372. if ($re) {
  373. return $this->success();
  374. }
  375. return $this->error('认证失败');
  376. }
  377. }