UserController.php 13 KB

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