Auth.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. /*
  8. * @Author: your name
  9. * @Date: 2021-03-02 09:50:20
  10. * @LastEditTime: 2021-04-29 14:40:28
  11. * @LastEditors: Please set LastEditors
  12. * @Description: In User Settings Edit
  13. * @FilePath: \admin_php\modules\client\behaviors\Auth.php
  14. */
  15. namespace app\modules\client\behaviors;
  16. use app\constants\OptionSetting;
  17. use app\models\Option;
  18. use app\models\SaasUser;
  19. use app\models\Store;
  20. use app\models\User;
  21. use app\models\UserAuditLog;
  22. use app\models\UserAuditSetting;
  23. use yii\base\ActionFilter;
  24. use Yii;
  25. use yii\base\BaseObject;
  26. use yii\helpers\Json;
  27. use yii\web\Response;
  28. /**
  29. * Class Auth
  30. * @package app\modules\client\behaviors
  31. */
  32. class Auth extends ActionFilter
  33. {
  34. // 不验证登录白名单
  35. const ALLOW_LIST = [
  36. 'client/v1/store/search-params',
  37. 'client/v1/user/index',
  38. 'client/v1/default/store',
  39. 'client/v1/diy/index',
  40. 'client/v1/default/coupon-list',
  41. 'client/v1/diy/goods',
  42. 'client/v1/diy/goods',
  43. 'client/v1/default/topic-type',
  44. 'client/v1/diy/mch',
  45. 'client/v1/default/topic-list',
  46. 'client/v1/passport/login',
  47. 'client/v1/passport/code',
  48. 'client/v1/diy/template-unit',
  49. 'client/v1/diy/template',
  50. 'client/v1/passport/login',
  51. 'client/v1/passport/send-code',
  52. 'client/v1/user/user-empower',
  53. 'client/v1/user/session-get',
  54. // 'client/v1/user/user-binding',
  55. 'client/v1/upload/upload-image',
  56. 'client/v1/upload/upload-video',
  57. 'client/v1/diy/shop',
  58. 'client/v1/default/cat-list',
  59. 'client/v1/default/goods-list',
  60. 'client/v1/goods/goods',
  61. 'client/v1/default/browse',
  62. 'client/v1/goods/address',
  63. 'client/v1/goods/goods-recommend',
  64. 'client/v1/goods/mch-recommend',
  65. 'client/v1/default/comment-list',
  66. 'client/v1/goods/get-goods-youhui',
  67. 'client/v1/default/goods-attr-info',
  68. 'client/v1/mch/index/location-info',
  69. 'client/v1/default/district',
  70. 'client/v1/mch/index/mch-list',
  71. 'client/v1/mch/index/shop',
  72. 'client/v1/shop/nearby',
  73. 'client/v1/default/get-brand-list',
  74. 'client/v1/cart/list',
  75. 'client/v1/goods/guess-like',
  76. 'client/v1/default/buy-data',
  77. 'client/v1/passport/auth-phone',
  78. 'client/v1/store/list',
  79. 'client/v1/store/search-params',
  80. 'client/v1/passport/platform-auth-phone',
  81. 'client/v1/alipay/passport/auth',
  82. 'client/v1/alipay/passport/phone',
  83. 'client/v1/saas/search-keyword',
  84. 'client/v1/saas/add-history',
  85. 'client/v1/diy/new-index',
  86. 'client/v1/diy/system-template-list',
  87. 'client/v1/goods/new-goods-recommend',
  88. 'client/v1/default/article-detail',
  89. 'client/v1/default/location-content',
  90. 'client/v1/store/mp-audit',
  91. 'client/v1/new-merchant/face-pay-config',
  92. 'client/v1/new-merchant/face-pay',
  93. 'client/v1/store/goods_list',
  94. 'client/v1/new-merchant/get-give-integral',
  95. 'client/v1/md-food/get-md-info',
  96. 'client/v1/passport/login-by-openid',
  97. 'client/v1/alipay/wifi/index',
  98. 'client/v1/alipay/wifi/query',
  99. 'client/v1/alipay/wifi/connect',
  100. 'client/v1/alipay/wifi/notify',
  101. 'client/v1/diy/seckill-activity',
  102. 'client/v1/store/get-store-by-aggregate',
  103. 'client/v1/store/get-info',
  104. 'client/v1/diy/get-store',
  105. 'client/v1/diy/get-cat',
  106. 'client/v1/md/list',
  107. 'client/v1/md/md-category',
  108. 'client/v1/coupon/share',
  109. 'client/v1/activity/new-user',
  110. 'client/v1/activity/new-user-conf',
  111. 'client/v1/activity/new-user-push-goods',
  112. 'client/v1/goods/md-address',
  113. 'client/v1/diy/get-foods-cat-list',
  114. 'client/v1/diy/get-foods-list',
  115. 'client/v1/store/js-config',
  116. 'client/v1/store/goods-list',
  117. 'client/v1/content/search-video',
  118. 'client/v1/store/store-app-info',
  119. 'client/v1/store/recommend-key',
  120. 'client/v1/worker/worker-index',
  121. 'client/v1/worker/worker-list',
  122. 'client/v1/worker/worker-info',
  123. 'client/v1/worker/worker-goods-info',
  124. 'client/v1/diy/get-worker-goods',
  125. 'client/v1/worker/worker-goods-list',
  126. 'client/v1/worker/worker-goods-cate-list',
  127. 'client/v1/passport/get-user-info-by-id',
  128. 'client/v1/passport/get-user-info-by-mobile',
  129. 'client/v1/pt/pt-activity/get-pt-goods',
  130. 'client/v1/order/goldplan',
  131. 'client/v1/store/goods-keyword',
  132. 'client/v1/passport/get-option-by-h5',
  133. 'client/v1/passport/md-food/get-qrcode-info',
  134. 'client/v1/passport/get-redirect-uri',
  135. 'client/v1/video-goods/cat-list',
  136. 'client/v1/video-goods/audit-apply-config',
  137. 'client/v1/video-goods/list',
  138. 'client/v1/question-template/list',
  139. 'client/v1/store/get-store-switch',
  140. // 'client/v1/default/goods-qrcode',
  141. 'client/v1/default/buy-goods-log',
  142. 'client/v1/goods-brand/get-brand-list',
  143. 'client/v1/goods-brand/get-md-info',
  144. 'client/v1/user/user-audit',
  145. 'client/v1/user/user-audit-setting',
  146. 'client/v1/passport/forget-password',
  147. 'client/v1/passport/user-password-regedit',
  148. //分销中心
  149. 'client/v1/share/get-info',
  150. 'client/v1/video-shop/user-sharer-list',
  151. 'client/v1/share/index',
  152. 'client/v1/quanzi/contents-list',
  153. 'client/v1/quanzi/contents-info',
  154. 'client/v1/quanzi/comment-list',
  155. 'client/v1/quanzi/cat-list',
  156. //股东合伙人中心
  157. 'client/v1/share-holder/audit-status',
  158. 'client/v1/share-holder/other-info',
  159. 'client/v1/share-holder/index',
  160. 'client/v1/share-holder/get-team-info',
  161. 'client/v1/share-holder/profit-list',
  162. 'client/v1/share-holder/frost-list',
  163. 'client/v1/alipay/order/get-freight',
  164. 'client/v1/alipay/order/create-order',
  165. 'client/v1/material/material-category',
  166. 'client/v1/material/material-list',
  167. 'client/v1/material/material-item',
  168. 'client/v1/material/get-qrcode',
  169. 'client/v1/material/download-statistics',
  170. 'client/v1/passport/captcha-gen',
  171. 'client/v1/passport/captcha-check',
  172. 'client/v1/default/get-store-category',
  173. 'client/v1/default/get-store-list',
  174. 'client/v1/user/get-geo',
  175. 'client/v1/diy/get-mch-list',
  176. 'adopt/device/play',
  177. 'client/v1/passport/get-user-info-by-invite',
  178. ];
  179. public function beforeAction($action)
  180. {
  181. $this->defaultStoreId();
  182. $access_token = input_params('access_token');
  183. $ignore_user = intval(input_params('ignore_user'));
  184. if (!in_array(Yii::$app->controller->getRoute(), [
  185. 'client/v1/store/mp-audit',
  186. 'client/v1/user/user-audit',
  187. 'client/v1/user/user-audit-setting',
  188. 'client/v1/default/store',
  189. 'client/v1/passport/login',
  190. 'client/v1/passport/auth-phone',
  191. 'client/v1/passport/code',
  192. 'client/v1/passport/send-code',
  193. 'client/v1/passport/login',
  194. 'client/v1/alipay/passport/auth',
  195. 'client/v1/alipay/passport/phone',
  196. 'client/v1/alipay/passport/login',
  197. 'client/v1/diy/template-unit',
  198. 'client/v1/upload/upload-image'
  199. ]) && !$access_token) {
  200. $result = $this->userAuditSetting();
  201. \Yii::$app->response->format = Response::FORMAT_JSON;
  202. if ($result['code'] !== 0) {
  203. \Yii::$app->response->data = $result;
  204. return false;
  205. }
  206. }
  207. if (get_params('version')) {
  208. $version = get_params('version');
  209. $cache = cacheLock();
  210. $key = 'store_' . get_store_id(). '_version';
  211. if (\Yii::$app->prod_is_dandianpu()) {
  212. $self_mini = Option::get('self_mini', get_store_id(), 'store', 0)['value'];
  213. if (!$self_mini) {
  214. $key = 'store_dandianpu_version';
  215. }
  216. }
  217. if (!cache_lock($key . '_time', 60 * 5)) {
  218. $cache->set($key, $version);
  219. }
  220. }
  221. if (!$access_token && (in_array(Yii::$app->controller->getRoute(), self::ALLOW_LIST) || in_array($_GET['callback'],self::ALLOW_LIST))) {
  222. return true;
  223. }
  224. // 支付宝依然取user表数据
  225. // if (input_params('platform') == 'alipay') {
  226. // $user = User::findIdentityByAccessToken($access_token);
  227. // if ($user) {
  228. // \Yii::$app->jwt->setUser($user);
  229. // } else {
  230. // \Yii::$app->response->format = Response::FORMAT_JSON;
  231. // \Yii::$app->response->data = [
  232. // 'code' => 401,
  233. // 'msg' => '登陆失败'
  234. // ];
  235. // return false;
  236. // }
  237. // } else {
  238. // 微信平台目前统一走saas_user表,统一用户
  239. $saas_user = SaasUser::findIdentityByAccessToken($access_token);
  240. if (empty($access_token) && $saas_user) {
  241. \Yii::$app->response->format = Response::FORMAT_JSON;
  242. \Yii::$app->response->data = [
  243. 'code' => 401,
  244. 'msg' => '登陆失败'
  245. ];
  246. return false;
  247. }
  248. if ($saas_user) {
  249. \Yii::$app->jwt->setSaasUser($saas_user);
  250. $store_id = intval(post_params('store_id')) ?: get_params('store_id');
  251. if ($store_id > 0) {
  252. //判断当前没有store_id,给绑定上
  253. if ($saas_user->store_id <= 0) {
  254. $store = Store::findOne(['id' => $store_id, 'is_delete' => 0]);
  255. if ($store) {
  256. $saas_user->store_id = $store_id;
  257. }
  258. $saas_user->save();
  259. }
  260. $user = User::findOne(['binding' => $saas_user->mobile, 'store_id' => $store_id]);
  261. if (is_alipay_platform() && !$user) {
  262. $user = User::findOne(['alipay_open_id' => $saas_user->ali_user_id, 'store_id' => $store_id]);
  263. }
  264. if (is_wechat_platform() && !$user) {
  265. $user = User::findOne(['wechat_open_id' => $saas_user->platform_open_id, 'store_id' => $store_id]);
  266. }
  267. if (!$user) {
  268. try {
  269. $user = new User();
  270. $user->access_token = \Yii::$app->security->generateRandomString();
  271. $user->binding = $saas_user->mobile;
  272. $user->type = User::USER_TYPE_NORMAL;
  273. $user->nickname = substr_replace($saas_user->mobile, '******', 3, 6);
  274. $user->avatar_url = \Yii::$app->request->hostInfo . \Yii::$app->request->baseUrl . '/web/v1/statics/images/avatar.png';
  275. $user->username = \Yii::$app->security->generateRandomString();
  276. $user->password = \Yii::$app->security->generatePasswordHash(\Yii::$app->security->generateRandomString(), 5);
  277. $user->auth_key = \Yii::$app->security->generateRandomString();
  278. $user->is_delete = User::USER_NOT_DELETE;
  279. $user->store_id = $store_id;
  280. $user->platform = input_params('platform') == 'alipay'?User::USER_FROM_ALIPAY:User::USER_FROM_WECHAT; // 微信
  281. $user->alipay_open_id = $saas_user->ali_user_id;
  282. $user->wechat_open_id = $saas_user->platform_open_id;
  283. $user->save();
  284. } catch (\Exception $e){}
  285. } else {
  286. $user->binding = $saas_user->mobile;
  287. $user->alipay_open_id = $saas_user->ali_user_id;
  288. $user->save();
  289. }
  290. // if (!$user) {
  291. // $user = User::findOne(['binding' => $saas_user->mobile, 'store_id' => input_params('store_id')]);
  292. // if (is_alipay_platform()) {
  293. // $user = User::findOne(['alipay_open_id' => $saas_user->ali_user_id, 'store_id' => input_params('store_id')]);
  294. // }
  295. //
  296. // }
  297. if ((int)$user->blacklist === 1) {
  298. \Yii::$app->response->format = Response::FORMAT_JSON;
  299. \Yii::$app->response->data = [
  300. 'code' => 401,
  301. 'msg' => '身份验证失败'
  302. ];
  303. return false;
  304. }
  305. if ($user && $user->platform == User::USER_FROM_WECHAT) {
  306. if(empty($user->wechat_open_id)){
  307. $user->wechat_open_id = $saas_user['platform_open_id'];
  308. $user->save();
  309. }
  310. }
  311. }
  312. $result = $this->userAuditSetting($user);
  313. if ($result['code'] !== 0) {
  314. \Yii::$app->response->format = Response::FORMAT_JSON;
  315. \Yii::$app->response->data = $result;
  316. return false;
  317. }
  318. if (!empty($user) && !$ignore_user) {
  319. \Yii::$app->jwt->setUser($user);
  320. }
  321. } else {
  322. if (in_array(Yii::$app->controller->getRoute(), self::ALLOW_LIST)) {
  323. return true;
  324. }
  325. $result = $this->userAuditSetting();
  326. \Yii::$app->response->format = Response::FORMAT_JSON;
  327. if ($result['code'] !== 0) {
  328. \Yii::$app->response->data = $result;
  329. return false;
  330. }
  331. \Yii::$app->response->data = [
  332. 'code' => 401,
  333. 'msg' => '登陆失败'
  334. ];
  335. return false;
  336. }
  337. // }
  338. return true;
  339. }
  340. public function userAuditSetting($user = null) {
  341. if (is_wechat_platform() || is_alipay_platform()) {
  342. //判断是否开启审核设置
  343. $userAuditSetting = UserAuditSetting::findOne(['store_id' => get_store_id()]);
  344. if ($userAuditSetting) {
  345. $is_store_audit = (int)$userAuditSetting->status;
  346. //用户提交/获取审核接口
  347. if (intval($is_store_audit) && !in_array(Yii::$app->controller->getRoute(), ['client/v1/store/mp-audit', 'client/v1/user/user-audit', 'client/v1/default/store', 'client/v1/store/get-info', 'client/v1/upload/upload-image'])) {
  348. //开启
  349. $userAuditLog = UserAuditLog::findOne(['user_id' => $user->id ?? 0, 'is_delete' => 0]);
  350. if (empty($userAuditLog)) {
  351. \Yii::$app->response->format = Response::FORMAT_JSON;
  352. return [
  353. 'code' => 402,
  354. 'msg' => '需要提交用户申请'
  355. ];
  356. }
  357. if (in_array(intval($userAuditLog->status), [UserAuditLog::STATUS_NOT_AGREE, UserAuditLog::STATUS_PASS])) {
  358. $msg = "用户申请审核暂未通过";
  359. if (intval($userAuditLog->status) === UserAuditLog::STATUS_PASS) {
  360. $msg = "用户申请审核被拒绝 " . $userAuditLog->pass_remark;
  361. }
  362. \Yii::$app->response->format = Response::FORMAT_JSON;
  363. return [
  364. 'code' => 402,
  365. 'msg' => $msg
  366. ];
  367. }
  368. }
  369. }
  370. }
  371. return [
  372. 'code' => 0
  373. ];
  374. }
  375. //解决供应链store_id为空 就给默认店铺的store_id
  376. public function defaultStoreId() {
  377. $store_id = get_store_id();
  378. if (intval($store_id) <= 0) {
  379. if (\Yii::$app->prod_is_dandianpu()) {
  380. $default_store = \app\models\Option::get('one_store_default_store', 0, 'saas', 1)['value'];
  381. debug_log(['default_store' => $default_store], 'default.log');
  382. $store_id = $default_store;
  383. }
  384. }
  385. $_GET['store_id'] = $_POST['store_id'] = $store_id;
  386. }
  387. }