Login.php 23 KB

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