UserController.php 14 KB

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