login.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  1. <?php
  2. /**
  3. * 用户身份认证相关操作
  4. */
  5. //use Shopnc\Tpl;
  6. defined('InShopNC') or exit('Access Invalid!');
  7. require_once(BASE_DATA_PATH . '/model/member.model.php');
  8. require_once(BASE_CORE_PATH . '/framework/libraries/sms.php');
  9. require_once(BASE_CORE_PATH . '/framework/function/core.php');
  10. class loginControl extends mobileHomeControl
  11. {
  12. const token_expire = 600;
  13. const code_expire = 5;
  14. public function __construct()
  15. {
  16. parent::__construct();
  17. }
  18. /**
  19. * 登录
  20. */
  21. public function indexOp()
  22. {
  23. if (!in_array($_POST['client'], $this->client_type_array)) {
  24. return joutput_error(errcode::ErrApptype);
  25. }
  26. $type = trim($_POST['type']);
  27. if (!isset($type) || !in_array($type, $this->client_login_type_array)) {
  28. return joutput_error(errcode::ErrParamter, 'type error.');
  29. }
  30. $validate = new Validate();
  31. if ($type == memberModel::mobile_login) {
  32. $openid = trim($_POST['mobile']);
  33. $password = trim($_POST['password']);
  34. $validate->setValidate(Validate::verify_mobile($openid));
  35. $validate->setValidate(Validate::verify_password($password));
  36. } else {
  37. $openid = trim($_POST['openid']);
  38. $validate->setValidate(Validate::verify_openid($openid));
  39. }
  40. $error = $validate->validate();
  41. if ($error != '') {
  42. return joutput_error(errcode::ErrParamter, $error);
  43. }
  44. $model_member = Model('member');
  45. $userid = $model_member->getMemberID($openid, $type, $password);
  46. if ($userid == -1) {
  47. return joutput_error(errcode::ErrLogin, "用户名或密码错误");
  48. } else {
  49. $key = memberModel::gen_uid_token($userid);
  50. $ret = rcache($key, 'member');
  51. if (empty($ret)) {
  52. $token = $this->_get_token($userid, $openid, 'lrlz');
  53. wcache($key, array('token' => $token), 'member', self::token_expire);
  54. $key_token_uid = memberModel::gen_token_uid($token);
  55. wcache($key_token_uid, array('userid' => $userid), 'member', self::token_expire);
  56. $ret['cache_expiration_time'] = TIMESTAMP + self::token_expire * 60;
  57. $ret['token'] = $token;
  58. }
  59. $ret['systime'] = TIMESTAMP;
  60. joutput_data($ret);
  61. }
  62. }
  63. /**
  64. * 注销
  65. */
  66. public function logoutOp()
  67. {
  68. $token = trim($_POST['token']);
  69. if (empty($token)) {
  70. return joutput_error(errcode::ErrParamter, 'Token cannot empty.');
  71. }
  72. $userid = token_uid($token);
  73. if ($userid == -1) {
  74. return joutput_error(errcode::ErrTokenExpire);
  75. }
  76. $uid_token = memberModel::gen_uid_token($userid);
  77. $token_uid = memberModel::gen_token_uid($token);
  78. dcache($uid_token, 'member');
  79. dcache($token_uid, 'member');
  80. }
  81. public function genuserOp()
  82. {
  83. if (!in_array($_POST['client'], $this->client_type_array)) {
  84. return joutput_error(errcode::ErrApptype);
  85. }
  86. $type = $_POST['type'];
  87. if (!isset($type) || !in_array($type, $this->client_login_type_array)) {
  88. return joutput_error(errcode::ErrParamter, 'type error.');
  89. }
  90. $validator = new Validate();
  91. if ($type == memberModel::anonymous_login) {
  92. $info = $_POST['info'];
  93. if (!empty($info)) {
  94. $openid = md5(uniqid(mt_rand(), true));
  95. }
  96. $validator->setValidate(Validate::notnull($info));
  97. } elseif ($type == memberModel::wxopen_login) {
  98. $openid = $_POST['openid'];
  99. $validator->setValidate(Validate::verify_openid($openid));
  100. } else {
  101. return joutput_error(errcode::ErrUsertype, '错误的获取用户类型,目前只支持匿名获取和微信公众号获取身份.');
  102. }
  103. $err = $validator->validate();
  104. if ($err != '') {
  105. return joutput_error(errcode::ErrParamter, $err);
  106. }
  107. $model_member = Model('member');
  108. $userid = $model_member->getMemberID($openid, $type);
  109. if ($userid == -1) {
  110. $baseinfo = array();
  111. if ($type == memberModel::anonymous_login) {
  112. $baseinfo['anonymous_id'] = $openid;
  113. $baseinfo['member_name'] = 'anonymous';
  114. $baseinfo['member_type'] = memberModel::anonymous_login;
  115. } elseif ($type == memberModel::wxopen_login) {
  116. $baseinfo['member_wxopenid'] = $openid;
  117. $baseinfo['member_name'] = 'wxuser';
  118. $baseinfo['member_type'] = memberModel::wxopen_login;
  119. } else {
  120. //不会走到这儿,
  121. }
  122. $ret = $model_member->addMember($baseinfo);
  123. if ($ret != false) {
  124. return joutput_data(array('userid' => $openid));
  125. } else {
  126. return joutput_error(errcode::ErrorDB, '插入数据库错误.');
  127. }
  128. } else {
  129. return joutput_data(array('userid' => $openid));
  130. }
  131. }
  132. public function bindOp()
  133. {
  134. static $bind_types = array('mobile', 'wx', 'mobilenewpassword');
  135. $type = trim($_POST['type']);
  136. if (!isset($type) || !in_array($type, $bind_types)) {
  137. return joutput_error(errcode::ErrParamter, 'Bind type error,only support mobile and wx.');
  138. }
  139. $token = trim($_POST['token']);
  140. if (empty($token)) {
  141. return joutput_error(errcode::ErrParamter, 'Token cannot empty.');
  142. }
  143. $userid = token_uid($token);
  144. if ($userid == -1) {
  145. return joutput_error(errcode::ErrTokenExpire);
  146. }
  147. $validator = new Validate();
  148. $data = array();
  149. if ($type == 'mobile' || $type == 'mobilenewpassword') {
  150. $code = trim($_POST['code']);
  151. $password = trim($_POST['password']);
  152. $validator->setValidate(Validate::smscode($code));
  153. $validator->setValidate(Validate::verify_password($password));
  154. $data['member_passwd'] = md5($password);
  155. } elseif ($type == 'wx') {
  156. $openid = trim($_POST['openid']);
  157. $data['member_wxopenid'] = $openid;
  158. $validator->setValidate(Validate::verify_openid($openid));
  159. $cond = array('member_wxopenid' => $openid);
  160. } else {
  161. return;
  162. }
  163. $err = $validator->validate();
  164. if ($err != '') {
  165. return joutput_error(errcode::ErrParamter, $err);
  166. }
  167. if ($type == 'mobile') {
  168. $key = $this->gen_token_code($token);
  169. $ret = rcache($key, 'member');
  170. if (!empty($ret) && $ret['code'] == $code) {
  171. $mobile = $ret['mobile'];
  172. $cond = array('member_mobile' => $mobile);
  173. $data['member_mobile'] = $mobile;
  174. $data['member_type'] = 0;
  175. } else {
  176. return false;
  177. }
  178. } elseif ($type == 'mobilenewpassword') {
  179. $key = $this->gen_token_code($token);
  180. $ret = rcache($key, 'member');
  181. if (!empty($ret) && $ret['code'] == $code) {
  182. $mobile = $ret['mobile'];
  183. $cond = array('member_mobile' => $mobile);
  184. $data['member_type'] = 0;
  185. } else {
  186. return false;
  187. }
  188. }
  189. $model = Model('member');
  190. $ret = $model->where($cond)->find();
  191. if (empty(ret) || count($ret) == 0) {
  192. $model->where(array('member_id' => $userid))->update($data);
  193. dcache($userid, 'member');
  194. joutput_data(NULL);
  195. } elseif ($type == 'mobilenewpassword') {
  196. $model->where($cond)->update($data);
  197. joutput_data(NULL);
  198. } else {
  199. return joutput_error(errcode::ErrIDbinded);
  200. }
  201. }
  202. public function registerOp()
  203. {
  204. $mobile = trim($_POST['mobile']);
  205. $password = trim($_POST['password']);
  206. $code = trim($_POST['code']);
  207. $validator = new Validate();
  208. $validator->setValidate(Validate::verify_mobile($mobile));
  209. $validator->setValidate(Validate::verify_password($password));
  210. $validator->setValidate(Validate::smscode($code));
  211. $err = $validator->validate();
  212. if ($err != '') {
  213. return joutput_error(errcode::ErrParamter, $err);
  214. }
  215. $model = Model('member');
  216. $ret = $model->where(array('member_mobile' => $mobile))->find();
  217. if (!empty($ret)) {
  218. return joutput_error(errcode::ErrUserExisted, "用户已经存在.");
  219. } else {
  220. $key = self::gen_mobile_code($mobile);
  221. $ret = rcache($key, 'member');
  222. if (!empty($ret) && $ret['code'] == $code) {
  223. $success = $model->insert(array('member_mobile' => $mobile, 'member_type' => 0, 'member_passwd' => md5($password)));
  224. if ($success) {
  225. return joutput_data(NULL);
  226. } else {
  227. return joutput_error(errcode::ErrDB, "DB error.");
  228. }
  229. } else {
  230. return joutput_error(errcode::ErrSmscode, "错误的验证码.");
  231. }
  232. }
  233. }
  234. public function resetpassOp()
  235. {
  236. $mobile = trim($_POST['mobile']);
  237. $password = trim($_POST['password']);
  238. $code = trim($_POST['code']);
  239. $validator = new Validate();
  240. $validator->setValidate(Validate::verify_mobile($mobile));
  241. $validator->setValidate(Validate::verify_password($password));
  242. $validator->setValidate(Validate::smscode($code));
  243. $err = $validator->validate();
  244. if ($err != '') {
  245. return joutput_error(errcode::ErrParamter, $err);
  246. }
  247. $model = Model('member');
  248. $member_info = $model->where(array('member_mobile' => $mobile))->find();
  249. if (empty($member_info) || count($member_info) == 0) {
  250. return joutput_error(errcode::ErrUserExisted, "用户不存在.");
  251. } else {
  252. $key = self::gen_mobile_code($mobile);
  253. $ret = rcache($key, 'member');
  254. if (!empty($ret) && $ret['code'] == $code) {
  255. $success = $model->where(array('member_mobile' => $mobile))->update(array('member_type' => 0, 'member_passwd' => md5($password)));
  256. if ($success) {
  257. $key = $this->gen_openid_uid($mobile, 0);
  258. dcache($key, 'member');
  259. return joutput_data(NULL);
  260. } else {
  261. return joutput_error(errcode::ErrDB, "DB error.");
  262. }
  263. } else {
  264. return joutput_error(errcode::ErrSmscode, "错误的验证码.");
  265. }
  266. }
  267. }
  268. public function getinfoOp()
  269. {
  270. static $field = 'member_id,member_mobile,member_name,member_truename,member_avatar,member_sex,member_birthday,member_email,member_email_bind';
  271. $token = trim($_POST['token']);
  272. if (empty($token)) {
  273. return joutput_error(errcode::ErrParamter, 'Token cannot empty.');
  274. }
  275. $userid = token_uid($token);
  276. if ($userid == -1) {
  277. return joutput_error(errcode::ErrTokenExpire);
  278. } else {
  279. $conditions = array('member_id' => $userid);
  280. $model = Model('member');
  281. $info = $model->getMemberInfoByID($userid, $field);
  282. joutput_data($info);
  283. }
  284. }
  285. /**
  286. * 登录生成token
  287. */
  288. private function _get_token($member_id, $member_name, $client)
  289. {
  290. $model_mb_user_token = Model('mb_user_token');
  291. //重新登录后以前的令牌失效
  292. //暂时停用
  293. //$condition = array();
  294. //$condition['member_id'] = $member_id;
  295. //$condition['client_type'] = $_POST['client'];
  296. //$model_mb_user_token->delMbUserToken($condition);
  297. //生成新的token
  298. $mb_user_token_info = array();
  299. $token = md5($member_name . strval(TIMESTAMP) . strval(rand(0, 999999)));
  300. $mb_user_token_info['member_id'] = $member_id;
  301. $mb_user_token_info['member_name'] = $member_name;
  302. $mb_user_token_info['token'] = $token;
  303. $mb_user_token_info['login_time'] = TIMESTAMP;
  304. $mb_user_token_info['client_type'] = $_POST['client'];
  305. $result = $model_mb_user_token->addMbUserToken($mb_user_token_info);
  306. if ($result) {
  307. return $token;
  308. } else {
  309. return NULL;
  310. }
  311. }
  312. public static function gen_openid_uid($openid, $type)
  313. {
  314. $key = 'openid_uid:' . $openid . ':' . $type;
  315. return $key;
  316. }
  317. public static function gen_token_code($token)
  318. {
  319. $key = 'token_code:' . $token;
  320. return $key;
  321. }
  322. public static function gen_mobile_code($mobile)
  323. {
  324. $key = 'mobile:' . $mobile;
  325. return $key;
  326. }
  327. public function getcodeOp()
  328. {
  329. static $types = array('register', 'resetpass', 'getbonus');
  330. $mobile = trim($_POST['mobile']);
  331. $type = trim($_POST['type']);
  332. $validator = new Validate();
  333. $validator->setValidate(Validate::verify_mobile($mobile));
  334. $err = $validator->validate();
  335. if ($err != '') {
  336. return joutput_error(errcode::ErrParamter, $err);
  337. }
  338. if (!in_array($type, $types)) {
  339. return joutput_error(errcode::ErrParamter, "错误的类型参数: type={$type}");
  340. }
  341. if ($type == 'register') {
  342. $itype = Sms::register_code;
  343. } elseif ($type == 'resetpass') {
  344. $itype = Sms::resetpass_code;
  345. } elseif ($type == 'getbonus') {
  346. $itype = Sms::bonus_code;
  347. }
  348. $itype = Sms::register_code;
  349. $sms = new Sms();
  350. $code = makeSmscode();
  351. $status = $sms->send($mobile, array('code' => $code, 'type' => $itype, 'time' => '5'));
  352. if ($status == 0) {
  353. $key = $this->gen_mobile_code($mobile);
  354. $ret = wcache($key, array('code' => $code, 'mobile' => $mobile), 'member', self::code_expire);
  355. joutput_data(NULL);
  356. } else {
  357. return joutput_error(errcode::ErrSms, "send error={$status}.");
  358. }
  359. }
  360. public function checkcodeOp()
  361. {
  362. $token = trim($_POST['token']);
  363. if (empty($token)) {
  364. return joutput_error(errcode::ErrParamter, 'Token cannot empty.');
  365. }
  366. $userid = token_uid($token);
  367. if ($userid == -1) {
  368. return joutput_error(errcode::ErrTokenExpire);
  369. }
  370. $validator = new Validate();
  371. $code = trim($_POST['code']);
  372. $validator->setValidate(Validate::smscode($code));
  373. $err = $validator->validate();
  374. if ($err != '') {
  375. return joutput_error(errcode::ErrParamter, $err);
  376. }
  377. $key = $this->gen_token_code($token);
  378. $ret = rcache($key, 'member');
  379. if (empty($ret)) {
  380. return joutput_error(errcode::ErrSmscodeExpire);
  381. } elseif ($ret['code'] == $code) {
  382. joutput_data(NULL);
  383. } else {
  384. return joutput_error(errcode::ErrSmscode);
  385. }
  386. }
  387. // public function registerOp()
  388. // {
  389. // $model_member = Model('member');
  390. //
  391. // $register_info = array();
  392. // $register_info['username'] = $_POST['username'];
  393. // $register_info['password'] = $_POST['password'];
  394. // $register_info['password_confirm'] = $_POST['password_confirm'];
  395. //
  396. // $register_info['checkcode'] = $_POST['password_confirm'];
  397. // $register_info['email'] = $_POST['email'];
  398. //
  399. // $member_info = $model_member->register($register_info);
  400. // if (!isset($member_info['error'])) {
  401. // $token = $this->_get_token($member_info['member_id'], $member_info['member_name'], $_POST['client']);
  402. // if ($token) {
  403. // output_data(array('username' => $member_info['member_name'], 'key' => $token));
  404. // } else {
  405. // output_error('注册失败');
  406. // }
  407. // } else {
  408. // output_error($member_info['error']);
  409. // }
  410. // }
  411. }