Login.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace app\model\member;
  11. use addon\wechat\model\Message as WechatMessage;
  12. use app\model\BaseModel;
  13. use app\model\message\Sms;
  14. /**
  15. * 登录
  16. *
  17. * @author Administrator
  18. *
  19. */
  20. class Login extends BaseModel
  21. {
  22. /**
  23. * 用户登录
  24. * @param unknown $data 必然传输username
  25. */
  26. public function login($data)
  27. {
  28. //必然传输usern
  29. $info = model("member")->getInfo(
  30. [
  31. ['username|mobile|email', '=', $data['username']],
  32. ['password', '=', data_md5($data['password'])],
  33. ['site_id', '=', $data['site_id']],
  34. ['is_delete', '=', 0]
  35. ], 'member_id,
  36. username, nickname, mobile, email, status,last_login_time,can_receive_registergift'
  37. );
  38. if (empty($info)) {
  39. return $this->error('', 'USERNAME_OR_PASSWORD_ERROR');
  40. } elseif ($info['status'] == 0) {
  41. return $this->error('', 'MEMBER_IS_LOCKED');
  42. } else {
  43. if($info['can_receive_registergift'] == 1){
  44. event("MemberReceiveRegisterGift", [ 'member_id' => $info['member_id'], 'site_id' => $data[ 'site_id' ] ]);
  45. }
  46. //更新登录时间
  47. model("member")->update([
  48. 'login_time' => time(),
  49. 'last_login_time' => time(),
  50. 'can_receive_registergift' => 0,
  51. 'login_ip' => request()->ip(),
  52. 'login_type' => $data['app_type'] ?? '',
  53. 'login_type_name' => $data['app_type_name'] ?? '',
  54. ], [['member_id', '=', $info['member_id']]]);
  55. //执行登录奖励
  56. event("MemberLogin", ['member_id' => $info['member_id'], 'site_id' => $data['site_id']], true);
  57. //用户第三方信息刷新
  58. $this->refreshAuth($info['member_id'], $data);
  59. return $this->success($info);
  60. }
  61. }
  62. /**
  63. * 第三方登录
  64. * @param array $data 必然传输auth_tag, auth_openid
  65. */
  66. public function authLogin($data)
  67. {
  68. $info = [];
  69. $auth_tag = '';
  70. foreach ($data as $key => $value) {
  71. if (in_array($key, ['wx_unionid', 'wx_openid', 'weapp_openid', 'qq_openid', 'ali_openid', 'baidu_openid', 'toutiao_openid'])) {
  72. $auth_tag = $key;
  73. if (empty($value)) return $this->error('', 'PARAMETER_ERROR');
  74. $info = model("member")->getInfo(
  75. [
  76. [$key, '=', $value],
  77. ['site_id', '=', $data['site_id']],
  78. ['is_delete', '=', 0]
  79. ], 'member_id,username, nickname, mobile, email, status, last_login_time, can_receive_registergift'
  80. );
  81. if (!empty($info)) break;
  82. }
  83. }
  84. if (empty($auth_tag)) return $this->error('', 'PARAMETER_ERROR');
  85. if (empty($info)) {
  86. // 会员不存在 第三方自动注册开启 未开启绑定手机 则进行自动注册
  87. $config = new Config();
  88. $config_info = $config->getRegisterConfig($data[ 'site_id' ], 'shop');
  89. if ($config_info['data']['value']['third_party'] && !$config_info['data']['value']['bind_mobile']) {
  90. $register = new Register();
  91. $register_res = $register->authRegister($data);
  92. if ($register_res['code'] == 0) {
  93. $info = model("member")->getInfo([ [ 'member_id', '=', $register_res['data'] ]], 'member_id,username, nickname, mobile, email, status, last_login_time,can_receive_registergift');
  94. $info['is_register'] = 1;
  95. }
  96. }
  97. }
  98. if (empty($info)) {
  99. return $this->error('', 'MEMBER_NOT_EXIST');
  100. } elseif ($info['status'] == 0) {
  101. return $this->error('', 'MEMBER_IS_LOCKED');
  102. } else {
  103. if($info['can_receive_registergift'] == 1){
  104. event("MemberReceiveRegisterGift", [ 'member_id' => $info['member_id'], 'site_id' => $data[ 'site_id' ] ]);
  105. }
  106. //更新登录时间
  107. model("member")->update([
  108. 'login_time' => time(),
  109. 'last_login_time' => time(),
  110. 'can_receive_registergift' => 0,
  111. 'login_ip' => request()->ip(),
  112. 'login_type' => $data['app_type'] ?? '',
  113. 'login_type_name' => $data['app_type_name'] ?? '',
  114. ], [['member_id', '=', $info['member_id']]]);
  115. //执行登录奖励
  116. event("MemberLogin", ['member_id' => $info['member_id'], 'site_id' => $data['site_id']], true);
  117. //用户第三方信息刷新
  118. if (!isset($info['is_register'])) $this->refreshAuth($info['member_id'], $data);
  119. return $this->success($info);
  120. }
  121. }
  122. /**
  123. * 授权登录仅登录
  124. * @param $data
  125. * @return array
  126. */
  127. public function authOnlyLogin($data)
  128. {
  129. $info = [];
  130. $auth_tag = '';
  131. foreach ($data as $key => $value) {
  132. if (in_array($key, ['wx_unionid', 'wx_openid', 'weapp_openid', 'qq_openid', 'ali_openid', 'baidu_openid', 'toutiao_openid'])) {
  133. $auth_tag = $key;
  134. if (empty($value)) return $this->error('', 'PARAMETER_ERROR');
  135. $info = model("member")->getInfo(
  136. [
  137. [$key, '=', $value],
  138. ['site_id', '=', $data['site_id']],
  139. ['is_delete', '=', 0]
  140. ], 'member_id,username, nickname, mobile, email, status, last_login_time, can_receive_registergift'
  141. );
  142. if (!empty($info)) break;
  143. }
  144. }
  145. if (empty($auth_tag)) return $this->error('', 'PARAMETER_ERROR');
  146. if (empty($info)) {
  147. return $this->error('', 'MEMBER_NOT_EXIST');
  148. } elseif ($info['status'] == 0) {
  149. return $this->error('', 'MEMBER_IS_LOCKED');
  150. } else {
  151. //更新登录时间
  152. model("member")->update([
  153. 'login_time' => time(),
  154. 'last_login_time' => time(),
  155. 'can_receive_registergift' => 0,
  156. 'login_ip' => request()->ip(),
  157. 'login_type' => $data['app_type'] ?? '',
  158. 'login_type_name' => $data['app_type_name'] ?? '',
  159. ], [['member_id', '=', $info['member_id']]]);
  160. //执行登录奖励
  161. event("MemberLogin", ['member_id' => $info['member_id'], 'site_id' => $data['site_id']], true);
  162. //用户第三方信息刷新
  163. $this->refreshAuth($info['member_id'], $data);
  164. return $this->success($info);
  165. }
  166. }
  167. /**
  168. * 刷新第三方信息
  169. * @param unknown $member_id
  170. * @param unknown $data
  171. * @return multitype:string
  172. */
  173. private function refreshAuth($member_id, $data)
  174. {
  175. Member::modifyLastVisitTime($member_id);
  176. $data = [
  177. 'qq_openid' => isset($data['qq_openid']) ? $data['qq_openid'] : '',
  178. 'wx_openid' => isset($data['wx_openid']) ? $data['wx_openid'] : '',
  179. 'weapp_openid' => isset($data['weapp_openid']) ? $data['weapp_openid'] : '',
  180. 'wx_unionid' => isset($data['wx_unionid']) ? $data['wx_unionid'] : '',
  181. 'ali_openid' => isset($data['ali_openid']) ? $data['ali_openid'] : '',
  182. 'baidu_openid' => isset($data['baidu_openid']) ? $data['baidu_openid'] : '',
  183. 'toutiao_openid' => isset($data['toutiao_openid']) ? $data['toutiao_openid'] : '',
  184. 'site_id' => $data['site_id']
  185. ];
  186. if (!empty($data['qq_openid'])) {
  187. model("member")->update(['qq_openid' => ''], [ ['qq_openid', '=', $data['qq_openid'] ], ['site_id', '=', $data['site_id']] ]);
  188. model("member")->update(['qq_openid' => $data['qq_openid']], [['member_id', '=', $member_id], ['site_id', '=', $data['site_id']]]);
  189. }
  190. if (!empty($data['wx_openid'])) {
  191. model("member")->update(['wx_openid' => ''], [ ['wx_openid', '=', $data['wx_openid']], ['site_id', '=', $data['site_id']] ]);
  192. model("member")->update(['wx_openid' => $data['wx_openid']], [['member_id', '=', $member_id], ['site_id', '=', $data['site_id']]]);
  193. }
  194. if (!empty($data['weapp_openid'])) {
  195. model("member")->update(['weapp_openid' => ''], [ ['weapp_openid', '=', $data['weapp_openid']], ['site_id', '=', $data['site_id']] ]);
  196. model("member")->update(['weapp_openid' => $data['weapp_openid']], [['member_id', '=', $member_id], ['site_id', '=', $data['site_id']]]);
  197. }
  198. if (!empty($data['wx_unionid'])) {
  199. model("member")->update(['wx_unionid' => ''], [ ['wx_unionid', '=', $data['wx_unionid']], ['site_id', '=', $data['site_id']] ]);
  200. model("member")->update(['wx_unionid' => $data['wx_unionid']], [['member_id', '=', $member_id], ['site_id', '=', $data['site_id']]]);
  201. }
  202. if (!empty($data['ali_openid'])) {
  203. model("member")->update(['ali_openid' => ''], [ ['ali_openid', '=', $data['ali_openid']], ['site_id', '=', $data['site_id']] ]);
  204. model("member")->update(['ali_openid' => $data['ali_openid']], [['member_id', '=', $member_id], ['site_id', '=', $data['site_id']]]);
  205. }
  206. if (!empty($data['baidu_openid'])) {
  207. model("member")->update(['baidu_openid' => ''], [ ['baidu_openid', '=', $data['baidu_openid']], ['site_id', '=', $data['site_id']] ]);
  208. model("member")->update(['baidu_openid' => $data['baidu_openid']], [['member_id', '=', $member_id], ['site_id', '=', $data['site_id']]]);
  209. }
  210. if (!empty($data['toutiao_openid'])) {
  211. model("member")->update(['toutiao_openid' => ''], [ ['toutiao_openid', '=', $data['toutiao_openid']], ['site_id', '=', $data['site_id']] ]);
  212. model("member")->update(['toutiao_openid' => $data['toutiao_openid']], [['member_id', '=', $member_id], ['site_id', '=', $data['site_id']]]);
  213. }
  214. return $this->success();
  215. }
  216. /**
  217. * 检测openid是否存在
  218. * @param array $data
  219. */
  220. public function openidIsExits(array $data)
  221. {
  222. if (isset($data['wx_unionid']) && !empty($data['wx_unionid'])) {
  223. $count = model("member")->getCount([['wx_unionid', '=', $data['wx_unionid']], ['site_id', '=', $data['site_id']], ['is_delete', '=', 0]]);
  224. if ($count) return $this->success($count);
  225. }
  226. if (isset($data['wx_openid']) && !empty($data['wx_openid'])) {
  227. $count = model("member")->getCount([['wx_openid', '=', $data['wx_openid']], ['site_id', '=', $data['site_id']], ['is_delete', '=', 0]]);
  228. if ($count) return $this->success($count);
  229. }
  230. if (isset($data['weapp_openid']) && !empty($data['weapp_openid'])) {
  231. $count = model("member")->getCount([['weapp_openid', '=', $data['weapp_openid']], ['site_id', '=', $data['site_id']], ['is_delete', '=', 0]]);
  232. if ($count) return $this->success($count);
  233. }
  234. if (isset($data['qq_openid']) && !empty($data['qq_openid'])) {
  235. $count = model("member")->getCount([['qq_openid', '=', $data['qq_openid']], ['site_id', '=', $data['site_id']], ['is_delete', '=', 0]]);
  236. if ($count) return $this->success($count);
  237. }
  238. if (isset($data['ali_openid']) && !empty($data['ali_openid'])) {
  239. $count = model("member")->getCount([['ali_openid', '=', $data['ali_openid']], ['site_id', '=', $data['site_id']], ['is_delete', '=', 0]]);
  240. if ($count) return $this->success($count);
  241. }
  242. if (isset($data['baidu_openid']) && !empty($data['baidu_openid'])) {
  243. $count = model("member")->getCount([['baidu_openid', '=', $data['baidu_openid']], ['site_id', '=', $data['site_id']], ['is_delete', '=', 0]]);
  244. if ($count) return $this->success($count);
  245. }
  246. if (isset($data['toutiao_openid']) && !empty($data['toutiao_openid'])) {
  247. $count = model("member")->getCount([['toutiao_openid', '=', $data['toutiao_openid']], ['site_id', '=', $data['site_id']], ['is_delete', '=', 0]]);
  248. if ($count) return $this->success($count);
  249. }
  250. return $this->success(0);
  251. }
  252. /**
  253. * 用户登录
  254. * @param unknown $data 必然传输username
  255. */
  256. public function mobileLogin($data)
  257. {
  258. //必然传输usern
  259. $info = model("member")->getInfo(
  260. [
  261. ['mobile', '=', $data['mobile']],
  262. ['site_id', '=', $data['site_id']],
  263. ['is_delete','=',0]
  264. ],
  265. 'member_id,username, nickname, mobile, email, status,last_login_time, can_receive_registergift'
  266. );
  267. if (empty($info)) {
  268. return $this->error('', 'MEMBER_NOT_EXIST');
  269. } elseif ($info['status'] == 0) {
  270. return $this->error('', 'MEMBER_IS_LOCKED');
  271. } else {
  272. if($info['can_receive_registergift'] == 1){
  273. event("MemberReceiveRegisterGift", [ 'member_id' => $info['member_id'], 'site_id' => $data[ 'site_id' ] ]);
  274. }
  275. //更新登录时间
  276. model("member")->update([
  277. 'login_time' => time(),
  278. 'last_login_time' => time(),
  279. 'can_receive_registergift' => 0,
  280. 'login_ip' => request()->ip(),
  281. 'login_type' => $data['app_type'] ?? '',
  282. 'login_type_name' => $data['app_type_name'] ?? '',
  283. ], [['member_id', '=', $info['member_id']]]);
  284. event("MemberLogin", ['member_id' => $info['member_id'], 'site_id' => $data['site_id']], true);
  285. //用户第三方信息刷新
  286. $this->refreshAuth($info['member_id'], $data);
  287. return $this->success($info);
  288. }
  289. }
  290. /**
  291. * 登录动态码
  292. * @param $data
  293. */
  294. public function loginCode($data)
  295. {
  296. //发送短信
  297. $sms_model = new Sms();
  298. $var_parse = array(
  299. "code" => $data["code"],
  300. );
  301. $data["sms_account"] = $data["mobile"] ?? '';//手机号
  302. $data["var_parse"] = $var_parse;
  303. $sms_result = $sms_model->sendMessage($data);
  304. if ($sms_result["code"] < 0)
  305. return $sms_result;
  306. return $this->success();
  307. }
  308. /**
  309. * 登录通知
  310. * @param $data
  311. * @return array|mixed|void
  312. */
  313. public function loginSuccess($data)
  314. {
  315. $member_model = new Member();
  316. $member_info_result = $member_model->getMemberInfo([["member_id", "=", $data["member_id"]]], "username,mobile,email,reg_time,wx_openid,last_login_type,login_time, nickname");
  317. $member_info = $member_info_result["data"];
  318. //发送短信
  319. $sms_model = new Sms();
  320. $name = $member_info["nickname"] == '' ? $member_info["mobile"] : $member_info["nickname"];
  321. $var_parse = array(
  322. "name" => replaceSpecialChar($name),//验证码
  323. );
  324. $data["sms_account"] = $member_info["mobile"] ?? '';//手机号
  325. $data["var_parse"] = $var_parse;
  326. $sms_result = $sms_model->sendMessage($data);
  327. // if($sms_result["code"] < 0)
  328. // return $sms_result;
  329. //发送模板消息
  330. $wechat_model = new WechatMessage();
  331. $data["openid"] = $member_info["wx_openid"];
  332. // if(!empty($member_info["username"])){
  333. // $user_account = $member_info["username"];
  334. // }else{
  335. // if(!empty($member_info["mobile"])){
  336. // $user_account = $member_info["mobile"];
  337. // }else{
  338. // $user_account = $member_info["email"];
  339. // }
  340. // }
  341. $data["template_data"] = [
  342. 'keyword1' => !empty($member_info["nickname"]) ? $member_info["nickname"] : $member_info["mobile"],
  343. 'keyword2' => '登录成功',
  344. 'keyword3' => time_to_date($member_info["login_time"]),
  345. ];
  346. $data["page"] = '';
  347. $wechat_model->sendMessage($data);
  348. return $this->success();
  349. }
  350. }