SiteController.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. <?php
  2. namespace addons\TinyShop\api\modules\v1\controllers;
  3. use Yii;
  4. use yii\web\NotFoundHttpException;
  5. use common\helpers\ResultHelper;
  6. use common\helpers\ArrayHelper;
  7. use common\models\member\Member;
  8. use common\models\extend\SmsLog;
  9. use common\enums\StatusEnum;
  10. use api\controllers\OnAuthController;
  11. use addons\TinyShop\api\modules\v1\forms\UpPwdForm;
  12. use addons\TinyShop\api\modules\v1\forms\LoginForm;
  13. use addons\TinyShop\api\modules\v1\forms\RefreshForm;
  14. use addons\TinyShop\api\modules\v1\forms\MobileLogin;
  15. use addons\TinyShop\api\modules\v1\forms\SmsCodeForm;
  16. use addons\TinyShop\api\modules\v1\forms\RegisterForm;
  17. use addons\TinyShop\api\modules\v1\forms\RegisterEmailForm;
  18. use addons\TinyShop\api\modules\v1\forms\EmailCodeForm;
  19. use addons\TinyShop\common\enums\AccessTokenGroupEnum;
  20. use yii\web\UnprocessableEntityHttpException;
  21. /**
  22. * Class SiteController
  23. * @package addons\TinyShop\api\controllers
  24. * @author jianyan74 <751393839@qq.com>
  25. */
  26. class SiteController extends OnAuthController
  27. {
  28. public $modelClass = '';
  29. /**
  30. * 不用进行登录验证的方法
  31. *
  32. * 例如: ['index', 'update', 'create', 'view', 'delete']
  33. * 默认全部需要验证
  34. *
  35. * @var array
  36. */
  37. protected $authOptional = ['login', 'refresh', 'mobile-login', 'sms-code', 'register', 'up-pwd', 'verify-access-token'];
  38. /**
  39. * @var Member
  40. */
  41. protected $member;
  42. /**
  43. * @param $action
  44. * @return bool
  45. * @throws UnprocessableEntityHttpException
  46. * @throws \yii\base\InvalidConfigException
  47. * @throws \yii\web\BadRequestHttpException
  48. * @throws \yii\web\ForbiddenHttpException
  49. */
  50. public function beforeAction($action)
  51. {
  52. $config = Yii::$app->tinyShopService->config->setting();
  53. switch ($action->id) {
  54. case 'login' :
  55. case 'mobile-login' :
  56. if ($config['member_login'] == StatusEnum::DISABLED) {
  57. throw new UnprocessableEntityHttpException('账号密码/手机验证码登录已关闭');
  58. }
  59. break;
  60. case 'register' :
  61. if ($config['member_register'] == StatusEnum::DISABLED) {
  62. throw new UnprocessableEntityHttpException('会员注册已关闭');
  63. }
  64. break;
  65. }
  66. return parent::beforeAction($action);
  67. }
  68. /**
  69. * 登录根据用户信息返回accessToken
  70. *
  71. * @return array|bool
  72. * @throws NotFoundHttpException
  73. * @throws \yii\base\Exception
  74. */
  75. public function actionLogin()
  76. {
  77. $model = new LoginForm();
  78. $model->attributes = Yii::$app->request->post();
  79. if ($model->validate()) {
  80. $this->member = $model->getUser();
  81. return $this->regroupMember(Yii::$app->services->apiAccessToken->getAccessToken($model->getUser(), $model->group));
  82. }
  83. // 返回数据验证失败
  84. return ResultHelper::json(422, $this->getError($model));
  85. }
  86. /**
  87. * 手机验证码登录
  88. *
  89. * @return array|mixed
  90. * @throws \yii\base\Exception
  91. */
  92. public function actionMobileLogin()
  93. {
  94. $model = new MobileLogin();
  95. $model->attributes = Yii::$app->request->post();
  96. if (!$model->validate()) {
  97. return ResultHelper::json(422, $this->getError($model));
  98. }
  99. // 已有用户
  100. if (!empty($model->getUser())) {
  101. $this->member = $model->getUser();
  102. return $this->regroupMember(Yii::$app->services->apiAccessToken->getAccessToken($model->getUser(), $model->group));
  103. }
  104. $setting = Yii::$app->tinyShopService->config->setting();
  105. if ($setting->member_mobile_login_be_register == StatusEnum::DISABLED) {
  106. throw new UnprocessableEntityHttpException('找不到用户');
  107. }
  108. return $this->register($model);
  109. }
  110. /**
  111. * 登出
  112. *
  113. * @return array|mixed
  114. */
  115. public function actionLogout()
  116. {
  117. if (Yii::$app->services->apiAccessToken->disableByAccessToken(Yii::$app->user->identity->access_token)) {
  118. return ResultHelper::json(200, '退出成功');
  119. }
  120. return ResultHelper::json(422, '退出失败');
  121. }
  122. /**
  123. * 重置令牌
  124. *
  125. * @param $refresh_token
  126. * @return array
  127. * @throws NotFoundHttpException
  128. * @throws \yii\base\Exception
  129. */
  130. public function actionRefresh()
  131. {
  132. $model = new RefreshForm();
  133. $model->attributes = Yii::$app->request->post();
  134. if (!$model->validate()) {
  135. return ResultHelper::json(422, $this->getError($model));
  136. }
  137. return $this->regroupMember(Yii::$app->services->apiAccessToken->getAccessToken($model->getUser(), $model->group));
  138. }
  139. /**
  140. * 获取验证码
  141. *
  142. * @return int|mixed
  143. * @throws \yii\web\UnprocessableEntityHttpException
  144. */
  145. public function actionSmsCode()
  146. {
  147. $setting = Yii::$app->tinyShopService->config->setting();
  148. $model = new SmsCodeForm();
  149. $model->attributes = Yii::$app->request->post();
  150. $model->member_mobile_login_be_register = $setting->member_mobile_login_be_register;
  151. if (!$model->validate()) {
  152. return ResultHelper::json(422, $this->getError($model));
  153. }
  154. // 测试
  155. if (YII_DEBUG) {
  156. $code = rand(1000, 9999);
  157. $log = new SmsLog();
  158. $log = $log->loadDefaultValues();
  159. $log->attributes = [
  160. 'mobile' => $model->mobile,
  161. 'code' => $code,
  162. 'member_id' => 0,
  163. 'usage' => $model->usage,
  164. 'error_code' => 200,
  165. 'error_msg' => 'ok',
  166. 'error_data' => '',
  167. ];
  168. $log->save();
  169. return $code;
  170. }
  171. return $model->send();
  172. }
  173. /**
  174. * 注册
  175. *
  176. * @return array|mixed
  177. * @throws \yii\base\Exception
  178. */
  179. public function actionRegister()
  180. {
  181. $model = new RegisterForm();
  182. $model->attributes = Yii::$app->request->post();
  183. if (!$model->validate()) {
  184. return ResultHelper::json(422, $this->getError($model));
  185. }
  186. return $this->register($model);
  187. }
  188. /**
  189. * 邮箱注册
  190. *
  191. * @return array|mixed
  192. * @throws \yii\base\Exception
  193. */
  194. protected function actionRegisterEmail()
  195. {
  196. $model = new RegisterEmailForm();
  197. $model->attributes = Yii::$app->request->post();
  198. if (!$model->validate()) {
  199. return ResultHelper::json(422, $this->getError($model));
  200. }
  201. return $this->register($model);
  202. }
  203. /**
  204. * 获取邮箱验证码
  205. *
  206. * @return int|mixed
  207. * @throws \yii\web\UnprocessableEntityHttpException
  208. */
  209. protected function actionEmailCode()
  210. {
  211. $setting = Yii::$app->tinyShopService->config->setting();
  212. $model = new EmailCodeForm();
  213. $model->attributes = Yii::$app->request->post();
  214. $model->member_mobile_login_be_register = $setting->member_mobile_login_be_register;
  215. if (!$model->validate()) {
  216. return ResultHelper::json(422, $this->getError($model));
  217. }
  218. return $model->send();
  219. }
  220. /**
  221. * 密码重置
  222. *
  223. * @return array|mixed
  224. * @throws \yii\base\Exception
  225. */
  226. public function actionUpPwd()
  227. {
  228. $model = new UpPwdForm();
  229. $model->attributes = Yii::$app->request->post();
  230. if (!$model->validate()) {
  231. return ResultHelper::json(422, $this->getError($model));
  232. }
  233. $member = $model->getUser();
  234. $member->password_hash = Yii::$app->security->generatePasswordHash($model->password);
  235. if (!$member->save()) {
  236. return ResultHelper::json(422, $this->getError($member));
  237. }
  238. return $this->regroupMember(Yii::$app->services->apiAccessToken->getAccessToken($member, $model->group));
  239. }
  240. /**
  241. * 校验token有效性
  242. *
  243. * @return bool[]
  244. */
  245. public function actionVerifyAccessToken()
  246. {
  247. $token = Yii::$app->request->post('token');
  248. if (!$token || !($apiAccessToken = Yii::$app->services->apiAccessToken->findByAccessToken($token))) {
  249. return [
  250. 'token' => false
  251. ];
  252. }
  253. // 判断验证token有效性是否开启
  254. if (Yii::$app->params['user.accessTokenValidity'] === true) {
  255. $timestamp = (int)substr($token, strrpos($token, '_') + 1);
  256. $expire = Yii::$app->params['user.accessTokenExpire'];
  257. // 验证有效期
  258. if ($timestamp + $expire <= time()) {
  259. return [
  260. 'token' => true
  261. ];
  262. }
  263. }
  264. return [
  265. 'token' => true
  266. ];
  267. }
  268. /**
  269. * 注册
  270. *
  271. * @param RegisterForm|RegisterEmailForm|MobileLogin $model
  272. * @param Member $parent
  273. * @return array|mixed
  274. * @throws NotFoundHttpException
  275. * @throws \yii\base\Exception
  276. * @throws \yii\web\UnprocessableEntityHttpException
  277. */
  278. protected function register($model)
  279. {
  280. $parent = $model->getParent();
  281. $member = new Member();
  282. $member->attributes = ArrayHelper::toArray($model);
  283. $member->promoter_code = '';
  284. $member->source = AccessTokenGroupEnum::relevance($model->group);
  285. $member->merchant_id = !empty($this->getMerchantId()) ? $this->getMerchantId() : 0;
  286. isset($model->password) && $member->password_hash = Yii::$app->security->generatePasswordHash($model->password);
  287. // 未开启分销商不支持绑定上下级关系
  288. $member->pid = 0;
  289. if (!$member->save()) {
  290. return ResultHelper::json(422, $this->getError($member));
  291. }
  292. return $this->regroupMember(Yii::$app->services->apiAccessToken->getAccessToken($member, $model->group));
  293. }
  294. /**
  295. * 重组数据
  296. *
  297. * @param $data
  298. * @return mixed
  299. */
  300. protected function regroupMember($data)
  301. {
  302. // 优惠券数量
  303. $data['couponNum'] = Yii::$app->tinyShopService->marketingCoupon->findCountByMemberId($data['member']['id']);
  304. // 订单数量统计
  305. $data['orderNum'] = Yii::$app->tinyShopService->order->getOrderStatusCountByMemberId($data['member']['id']);
  306. // 购物车数量
  307. $data['cartNum'] = Yii::$app->tinyShopService->memberCartItem->findCountByMemberId($data['member']['id']);
  308. // 开启分销商
  309. $data['promoter'] = '';
  310. $data['promoterAccount'] = '';
  311. // 记录登录时间次数
  312. !empty($this->member) && Yii::$app->services->member->lastLogin($this->member);
  313. return $data;
  314. }
  315. /**
  316. * 权限验证
  317. *
  318. * @param string $action 当前的方法
  319. * @param null $model 当前的模型类
  320. * @param array $params $_GET变量
  321. * @throws \yii\web\BadRequestHttpException
  322. */
  323. public function checkAccess($action, $model = null, $params = [])
  324. {
  325. // 方法名称
  326. if (in_array($action, ['index', 'view', 'update', 'create', 'delete'])) {
  327. throw new \yii\web\BadRequestHttpException('权限不足');
  328. }
  329. }
  330. }
粤ICP备19079148号