Login.php 23 KB

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