Login.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507
  1. <?php
  2. namespace app\api\controller;
  3. use think\facade\Db;
  4. use think\facade\Lang;
  5. /**
  6. * 登录控制器
  7. */
  8. class Login extends MobileMall
  9. {
  10. public function initialize()
  11. {
  12. parent::initialize();
  13. Lang::load(base_path() . 'home/lang/' . config('lang.default_lang') . '/login.lang.php');
  14. }
  15. /**
  16. * @api {POST} api/Login/index 用户登录
  17. * @apiVersion 1.0.0
  18. * @apiGroup Login
  19. *
  20. * @apiParam {String} username 用户名
  21. * @apiParam {String} password 密码
  22. * @apiParam {String} client_type 客户端类型 android wap wechat ios windows jswechat
  23. *
  24. * @apiSuccess {String} code 返回码,10000为成功
  25. * @apiSuccess {String} message 返回消息
  26. * @apiSuccess {Object} result 返回数据
  27. * @apiSuccess {String} result.token 用户token
  28. * @apiSuccess {Object} result.info 用户信息
  29. * @apiSuccess {Int} result.info.member_id 用户ID
  30. * @apiSuccess {String} result.info.member_name 用户名称
  31. * @apiSuccess {String} result.info.member_truename 真实姓名
  32. * @apiSuccess {String} result.info.member_avatar 头像
  33. * @apiSuccess {Int} result.info.member_points 积分
  34. * @apiSuccess {String} result.info.member_email 邮箱
  35. * @apiSuccess {String} result.info.member_mobile 手机号
  36. * @apiSuccess {String} result.info.member_qq QQ
  37. * @apiSuccess {String} result.info.member_ww 旺旺
  38. * @apiSuccess {String} result.seller_token 卖家token
  39. * @apiSuccess {Object} result.seller_info 卖家信息
  40. * @apiSuccess {Int} result.seller_info.store_id 店铺ID
  41. * @apiSuccess {Int} result.seller_info.member_id 用户ID
  42. * @apiSuccess {Int} result.seller_info.seller_id 卖家ID
  43. * @apiSuccess {String} result.seller_info.seller_name 卖家账号
  44. * @apiSuccess {String} result.seller_info.store_avatar 店铺头像
  45. * @apiSuccess {Int} result.seller_info.is_platform_store 是否自营店铺 0否1是
  46. * @apiSuccess {Int} result.seller_info.storeclass_id 店铺分类ID
  47. */
  48. public function index()
  49. {
  50. $username = input('param.username');
  51. $password = input('param.password');
  52. $client = input('param.client_type');
  53. $prefix = 'login-times';
  54. $ip = request()->ip();
  55. $data = rkcache($prefix . $ip);
  56. if (!empty($data) && $data['times'] > 5) {
  57. ds_json_encode(10001, lang('frequent_operation'));
  58. }
  59. if (empty($username) || empty($password) || !in_array($client, $this->client_type_array)) {
  60. ds_json_encode(10001, lang('param_error'));
  61. }
  62. // if (config('ds_config.captcha_status_login') == 1 && !captcha_check(input('post.captcha'))) {
  63. // ds_json_encode(10001, lang('image_verification_code_error'));
  64. // }
  65. $member_model = model('member');
  66. $array = array();
  67. $array['member_name'] = $username;
  68. $array['member_password'] = md5($password);
  69. $member_info = $member_model->getMemberInfo($array);
  70. if (empty($member_info) && preg_match('/^0?(13|15|17|18|14)[0-9]{9}$/i', $username)) { //根据会员名没找到时查手机号
  71. $array = array();
  72. $array['member_mobile'] = $username;
  73. $array['member_mobilebind'] = 1; //已绑定了的手机
  74. $array['member_password'] = md5($password);
  75. $member_info = $member_model->getMemberInfo($array);
  76. }
  77. if (empty($member_info) && (strpos($username, '@') > 0)) { //按邮箱和密码查询会员
  78. $array = array();
  79. $array['member_email'] = $username;
  80. $array['member_password'] = md5($password);
  81. $member_info = $member_model->getMemberInfo($array);
  82. }
  83. if (is_array($member_info) && !empty($member_info)) {
  84. if (!$member_info['member_state']) {
  85. ds_json_encode(10001, lang('login_index_account_stop'));
  86. }
  87. //执行登录,赋值操作
  88. $member_model->createSession($member_info);
  89. $this->getUserToken($member_info, $client);
  90. } else {
  91. if (empty($data)) {
  92. $data = array('times' => 0);
  93. }
  94. $data['times']++;
  95. wkcache($prefix . $ip, $data, 3600 * 24);
  96. ds_json_encode(10001, lang('password_error'));
  97. }
  98. }
  99. public function get_inviter()
  100. {
  101. $inviter_id = intval(input('param.inviter_id'));
  102. $member = Db::name('member')->where('member_id', $inviter_id)->field('member_id,member_name')->find();
  103. ds_json_encode(10000, '', array('member' => $member));
  104. }
  105. /**
  106. * @api {POST} api/Login/register 普通注册
  107. * @apiVersion 1.0.0
  108. * @apiGroup Login
  109. *
  110. * @apiParam {String} username 用户名
  111. * @apiParam {String} password 密码
  112. * @apiParam {String} password_confirm 确认密码
  113. * @apiParam {Int} inviter_id 推荐人id
  114. * @apiParam {String} client 客户端类型
  115. *
  116. * @apiSuccess {String} code 返回码,10000为成功
  117. * @apiSuccess {String} message 返回消息
  118. * @apiSuccess {Object} result 返回数据
  119. * @apiSuccess {Int} result.userid 用户ID
  120. * @apiSuccess {String} result.username 用户名称
  121. * @apiSuccess {String} result.token 用户token
  122. * @apiSuccess {Object} result.info 用户信息
  123. * @apiSuccess {Int} result.info.member_id 用户ID
  124. * @apiSuccess {Object} result.info.member_name 用户名称
  125. * @apiSuccess {Object} result.info.member_truename 真实姓名
  126. * @apiSuccess {Object} result.info.member_avatar 头像
  127. * @apiSuccess {Object} result.info.member_points 积分
  128. * @apiSuccess {Object} result.info.member_email 邮箱
  129. * @apiSuccess {Object} result.info.member_mobile 手机号
  130. * @apiSuccess {Object} result.info.member_qq QQ
  131. * @apiSuccess {Object} result.info.member_ww 旺旺
  132. */
  133. public function register()
  134. {
  135. if (config('ds_config.member_normal_register') != 1) {
  136. ds_json_encode(10001, lang('login_register_cancel'));
  137. }
  138. $username = trim(input('param.username'));
  139. $password = input('param.password');
  140. $password_confirm = input('param.password_confirm');
  141. $client = input('param.client');
  142. $inviter_id = intval(input('param.inviter_id'));
  143. if ($password_confirm != $password) {
  144. ds_json_encode(10001, lang('login_register_password_not_same'));
  145. }
  146. // if (config('ds_config.captcha_status_register') == 1 && !captcha_check(input('post.captcha'))) {
  147. // ds_json_encode(10001,lang('image_verification_code_error'));
  148. // }
  149. $member_model = model('member');
  150. $register_info = array();
  151. $register_info['member_name'] = $username;
  152. $register_info['member_password'] = $password;
  153. $res = word_filter($register_info['member_name']);
  154. if (!$res['code']) {
  155. ds_json_encode(10001, $res['msg']);
  156. }
  157. if ($res['data']['if_sensitive']) {
  158. ds_json_encode(10001, implode('、', $res['data']['sensitive_msg']));
  159. }
  160. //添加奖励积分
  161. if ($inviter_id) {
  162. $register_info['inviter_id'] = $inviter_id;
  163. }
  164. $member_validate = ds_validate('member');
  165. if (!$member_validate->scene('register')->check($register_info)) {
  166. ds_json_encode(10001, $member_validate->getError());
  167. }
  168. $member_info = $member_model->register($register_info);
  169. if (!isset($member_info['error'])) {
  170. $token = $member_model->getBuyerToken($member_info['member_id'], $member_info['member_name'], $client);
  171. if ($token) {
  172. ds_json_encode(10000, '', array('info' => $this->getMemberUser($member_info), 'username' => $member_info['member_name'], 'userid' => $member_info['member_id'], 'token' => $token));
  173. } else {
  174. ds_json_encode(10001, lang('login_usersave_regist_fail'));
  175. }
  176. } else {
  177. ds_json_encode(10001, $member_info['error']);
  178. }
  179. }
  180. /**
  181. * @api {POST} api/Login/bind 绑定用户
  182. * @apiVersion 1.0.0
  183. * @apiGroup Login
  184. *
  185. * @apiParam {Int} type 类型 1注册 0绑定
  186. * @apiParam {String} user 用户名
  187. * @apiParam {String} username 用户名
  188. * @apiParam {String} password 密码
  189. * @apiParam {String} password2 确认密码
  190. * @apiParam {String} openid openid
  191. * @apiParam {String} unionid unionid
  192. * @apiParam {String} nickname 昵称
  193. * @apiParam {String} headimgurl 头像
  194. * @apiParam {String} from 来源 wx微信
  195. * @apiParam {Int} inviter_id 推荐人id
  196. * @apiParam {String} client_type 客户端类型 android wap wechat ios windows jswechat
  197. *
  198. * @apiSuccess {String} code 返回码,10000为成功
  199. * @apiSuccess {String} message 返回消息
  200. * @apiSuccess {Object} result 返回数据
  201. * @apiSuccess {Int} result.userid 用户ID
  202. * @apiSuccess {String} result.username 用户名称
  203. * @apiSuccess {String} result.token 用户token
  204. * @apiSuccess {Object} result.info 用户信息
  205. * @apiSuccess {Int} result.info.member_id 用户ID
  206. * @apiSuccess {Object} result.info.member_name 用户名称
  207. * @apiSuccess {Object} result.info.member_truename 真实姓名
  208. * @apiSuccess {Object} result.info.member_avatar 头像
  209. * @apiSuccess {Object} result.info.member_points 积分
  210. * @apiSuccess {Object} result.info.member_email 邮箱
  211. * @apiSuccess {Object} result.info.member_mobile 手机号
  212. * @apiSuccess {Object} result.info.member_qq QQ
  213. * @apiSuccess {Object} result.info.member_ww 旺旺
  214. */
  215. public function bind()
  216. {
  217. $member_model = model('member');
  218. $type = input('param.type');
  219. $user = input('param.user');
  220. $password = input('param.password');
  221. $password2 = input('param.password2');
  222. $from = input('param.from');
  223. $openid = input('param.openid');
  224. $unionid = input('param.unionid');
  225. $nickname = input('param.nickname');
  226. $headimgurl = input('param.headimgurl');
  227. $client = input('param.client_type');
  228. $inviter_id = intval(input('param.inviter_id'));
  229. $reg_info = array();
  230. $data = array(
  231. 'member_name' => $user,
  232. 'member_password' => $password,
  233. );
  234. switch ($from) {
  235. case 'wx':
  236. $reg_info = array(
  237. 'member_wxopenid' => $openid, #开发者帐号唯一标识,与公众号标识不同
  238. 'member_wxunionid' => $unionid,
  239. 'nickname' => $nickname,
  240. 'headimgurl' => $headimgurl,
  241. );
  242. $data = array_merge($data, array(
  243. 'member_wxopenid' => $openid,
  244. 'member_wxunionid' => $unionid,
  245. 'member_wxinfo' => serialize($reg_info),
  246. ));
  247. break;
  248. case 'qq':
  249. $reg_info = array(
  250. 'member_qqopenid' => $openid, #开发者帐号唯一标识,与公众号标识不同
  251. 'member_qqunionid' => $unionid,
  252. 'nickname' => $nickname,
  253. 'headimgurl' => $headimgurl,
  254. );
  255. $data = array_merge($data, array(
  256. 'member_qqopenid' => $openid,
  257. 'member_qqunionid' => $unionid,
  258. 'member_qqinfo' => serialize($reg_info),
  259. ));
  260. break;
  261. case 'sina':
  262. $reg_info = array(
  263. 'member_sinaopenid' => $openid, #开发者帐号唯一标识,与公众号标识不同
  264. 'member_sinaunionid' => $unionid,
  265. 'nickname' => $nickname,
  266. 'headimgurl' => $headimgurl,
  267. );
  268. $data = array_merge($data, array(
  269. 'member_sinaopenid' => $openid,
  270. 'member_sinaunionid' => $unionid,
  271. 'member_sinainfo' => serialize($reg_info),
  272. ));
  273. break;
  274. }
  275. if ($type == 1) { //注册
  276. $data = array_merge($data, array(
  277. 'member_nickname' => $reg_info['nickname'],
  278. 'inviter_id' => $inviter_id,
  279. ));
  280. $login_validate = ds_validate('member');
  281. if (!$login_validate->scene('register')->check($data)) {
  282. ds_json_encode(10001, $login_validate->getError());
  283. }
  284. $member_info = $member_model->register($data);
  285. if (!isset($member_info['error'])) {
  286. $token = $member_model->getBuyerToken($member_info['member_id'], $member_info['member_name'], $client);
  287. if ($token) {
  288. ds_json_encode(10000, '', array('info' => $this->getMemberUser($member_info), 'username' => $member_info['member_name'], 'userid' => $member_info['member_id'], 'token' => $token));
  289. } else {
  290. ds_json_encode(10001, lang('login_fail'));
  291. }
  292. // $headimgurl = $reg_info['headimgurl'];
  293. // $avatar = @copy($headimgurl, BASE_UPLOAD_PATH . '/' . ATTACH_AVATAR . "/avatar_" . $member_info['member_id'] . ".jpg");
  294. // if ($avatar) {
  295. // $member_model->editMember(array('member_id' => $member_info['member_id']), array('member_avatar' => "avatar_" . $member_info['member_id'] . ".jpg"),$member_info['member_id']);
  296. // }
  297. } else {
  298. ds_json_encode(10001, $member_info['error']);
  299. }
  300. } else { //绑定
  301. $login_validate = ds_validate('member');
  302. if (!$login_validate->scene('login')->check($data)) {
  303. ds_json_encode(10001, $login_validate->getError());
  304. }
  305. $map = array(
  306. 'member_name' => $data['member_name'],
  307. 'member_password' => md5($data['member_password']),
  308. );
  309. $member_info = $member_model->getMemberInfo($map);
  310. if ($member_info) {
  311. $member_model->editMember(array('member_id' => $member_info['member_id']), array('member_wxopenid' => $data['member_wxopenid'], 'member_wxunionid' => $data['member_wxunionid'], 'member_wxinfo' => $data['member_wxinfo']), $member_info['member_id']);
  312. } else {
  313. ds_json_encode(10001, lang('password_error'));
  314. }
  315. $this->getUserToken($member_info, $client);
  316. }
  317. }
  318. /**
  319. * @api {POST} api/Login/get_user_by_openid 第三方通过openid获取用户信息
  320. * @apiVersion 1.0.0
  321. * @apiGroup Login
  322. *
  323. * @apiParam {String} from 来源 wx微信 qq sina新浪
  324. * @apiParam {String} openid openid
  325. * @apiParam {String} unionid unionid
  326. * @apiParam {String} avatar 头像
  327. * @apiParam {String} nickname 昵称
  328. * @apiParam {Int} inviter_id 推荐人ID
  329. * @apiParam {String} client_type 客户端类型 android wap wechat ios windows jswechat
  330. *
  331. * @apiSuccess {String} code 返回码,10000为成功
  332. * @apiSuccess {String} message 返回消息
  333. * @apiSuccess {Object} result 返回数据
  334. * @apiSuccess {String} result.token 用户token
  335. * @apiSuccess {Object} result.info 用户信息
  336. * @apiSuccess {Int} result.info.member_id 用户ID
  337. * @apiSuccess {String} result.info.member_name 用户名称
  338. * @apiSuccess {String} result.info.member_truename 真实姓名
  339. * @apiSuccess {String} result.info.member_avatar 头像
  340. * @apiSuccess {Int} result.info.member_points 积分
  341. * @apiSuccess {String} result.info.member_email 邮箱
  342. * @apiSuccess {String} result.info.member_mobile 手机号
  343. * @apiSuccess {String} result.info.member_qq QQ
  344. * @apiSuccess {String} result.info.member_ww 旺旺
  345. * @apiSuccess {String} result.seller_token 卖家token
  346. * @apiSuccess {Object} result.seller_info 卖家信息
  347. * @apiSuccess {Int} result.seller_info.store_id 店铺ID
  348. * @apiSuccess {Int} result.seller_info.member_id 用户ID
  349. * @apiSuccess {Int} result.seller_info.seller_id 卖家ID
  350. * @apiSuccess {String} result.seller_info.seller_name 卖家账号
  351. * @apiSuccess {String} result.seller_info.store_avatar 店铺头像
  352. * @apiSuccess {Int} result.seller_info.is_platform_store 是否自营店铺 0否1是
  353. * @apiSuccess {Int} result.seller_info.storeclass_id 店铺分类ID
  354. */
  355. public function get_user_by_openid()
  356. {
  357. $from = input('param.from');
  358. $openid = input('param.openid');
  359. $unionid = input('param.unionid');
  360. $client = input('param.client_type');
  361. $avatar = input('param.avatar');
  362. $nickname = input('param.nickname');
  363. $inviter_id = intval(input('param.inviter_id'));
  364. if (!$from || !$openid || !in_array($client, $this->client_type_array)) {
  365. ds_json_encode(10001, lang('param_error'));
  366. }
  367. $condition = array();
  368. switch ($from) {
  369. case 'wx':
  370. if ($unionid) {
  371. $condition[] = array('member_wxunionid', '=', $unionid);
  372. } else {
  373. $condition[] = array('member_wxopenid', '=', $openid);
  374. }
  375. break;
  376. case 'qq':
  377. $condition[] = array('member_qqopenid', '=', $openid);
  378. break;
  379. case 'sina':
  380. $condition[] = array('member_sinaopenid', '=', $openid);
  381. break;
  382. default:
  383. ds_json_encode(10001, lang('param_error'));
  384. break;
  385. }
  386. $member_model = model('member');
  387. $member_info = $member_model->getMemberInfo($condition);
  388. if (!$member_info) {
  389. //自动注册
  390. if (config('ds_config.auto_register')) { //如果开启了自动注册
  391. $logic_connect_api = model('connectapi', 'logic');
  392. //注册会员信息 返回会员信息
  393. $reg_info = array(
  394. 'member_wxopenid' => $openid,
  395. 'member_wxunionid' => $unionid,
  396. 'nickname' => $nickname,
  397. 'inviter_id' => $inviter_id, #推荐人ID
  398. // 'headimgurl' => $avatar,#提高体验暂时不对图片进行处理
  399. );
  400. $wx_member = $logic_connect_api->wx_register($reg_info, $from);
  401. if (!empty($wx_member)) {
  402. $token = $member_model->getBuyerToken($wx_member['member_id'], $wx_member['member_name'], $client);
  403. ds_json_encode(10000, '', array('token' => $token, 'info' => $this->getMemberUser($wx_member)));
  404. } else {
  405. ds_json_encode(10001, lang('login_usersave_regist_fail'));
  406. }
  407. } else {
  408. ds_json_encode(10000); //没有用户,进入绑定页
  409. }
  410. } else {
  411. if ($member_info['member_state'] == 0) {
  412. ds_json_encode(10001, lang('member_state_0'));
  413. }
  414. $this->getUserToken($member_info, $client);
  415. }
  416. }
  417. private function getUserToken($member_info, $client)
  418. {
  419. $member_model = model('member');
  420. $token = $member_model->getBuyerToken($member_info['member_id'], $member_info['member_name'], $client);
  421. if ($token) {
  422. $result = array();
  423. $result['token'] = $token;
  424. $result['info'] = $this->getMemberUser($member_info);
  425. //是否有卖家账户
  426. $seller_model = model('seller');
  427. $seller_info = $seller_model->getSellerInfo(array('member_id' => $member_info['member_id']));
  428. if ($seller_info) {
  429. $token = Sellerlogin::_get_seller_token($seller_info['seller_id'], $seller_info['seller_name'], $client);
  430. if (!$token) {
  431. ds_json_encode(10001, lang('login_fail'));
  432. }
  433. //读取店铺信息
  434. $store_model = model('store');
  435. $store_info = $store_model->getStoreInfoByID($seller_info['store_id']);
  436. $result['seller_token'] = $token;
  437. $result['seller_info'] = $this->getSellerUser($seller_info, $store_info);
  438. $result['info']['store_id'] = $store_info['store_id'];
  439. }
  440. ds_json_encode(10000, '', $result);
  441. } else {
  442. ds_json_encode(10001, lang('login_fail'));
  443. }
  444. }
  445. public function third_login()
  446. {
  447. $id = input('param.id');
  448. if ($id) {
  449. $res = rkcache($id);
  450. $user_info = (is_array($res) && isset($res['user_info'])) ? $res['user_info'] : '';
  451. $key = (is_array($res) && isset($res['key'])) ? $res['key'] : '';
  452. $wxinfo = (is_array($res) && isset($res['wxinfo'])) ? $res['wxinfo'] : '';
  453. $result = array('key' => $key, 'user_info' => $user_info, 'wxinfo' => $wxinfo);
  454. if ($user_info) {
  455. //是否有卖家账户
  456. $seller_model = model('seller');
  457. $seller_info = $seller_model->getSellerInfo(array('member_id' => $user_info['member_id']));
  458. if ($seller_info) {
  459. $token = Sellerlogin::_get_seller_token($seller_info['seller_id'], $seller_info['seller_name'], 'wap');
  460. if (!$token) {
  461. ds_json_encode(10001, lang('login_fail'));
  462. }
  463. //读取店铺信息
  464. $store_model = model('store');
  465. $store_info = $store_model->getStoreInfoByID($seller_info['store_id']);
  466. $result['seller_token'] = $token;
  467. $result['seller_info'] = $this->getSellerUser($seller_info, $store_info);
  468. $result['user_info']['store_id'] = $store_info['store_id'];
  469. }
  470. }
  471. ds_json_encode(10000, '', $result, '', false);
  472. } else {
  473. ds_json_encode(10000);
  474. }
  475. }
  476. }