login.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  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, "{$openid}:{$password},登录失败");
  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. }
  220. else
  221. {
  222. $key = self::gen_mobile_code($mobile);
  223. $ret = rcache($key, 'member');
  224. if (!empty($ret) && $ret['code'] == $code)
  225. {
  226. $success = $model->insert(array('member_mobile' => $mobile,'member_type' => 0,'member_passwd' => md5($password)));
  227. if($success) {
  228. return joutput_data(array());
  229. } else {
  230. return joutput_error(errcode::ErrDB,"DB error.");
  231. }
  232. }
  233. else
  234. {
  235. return joutput_error(errcode::ErrSmscode,"错误的验证码.");
  236. }
  237. }
  238. }
  239. public function getinfoOp()
  240. {
  241. static $field = 'member_id,member_mobile,member_name,member_truename,member_avatar,member_sex,member_birthday,member_email,member_email_bind';
  242. $token = trim($_POST['token']);
  243. if (empty($token)) {
  244. return joutput_error(errcode::ErrParamter, 'Token cannot empty.');
  245. }
  246. $userid = token_uid($token);
  247. if ($userid == -1) {
  248. return joutput_error(errcode::ErrTokenExpire);
  249. } else {
  250. $conditions = array('member_id' => $userid);
  251. $model = Model('member');
  252. $info = $model->getMemberInfoByID($userid, $field);
  253. joutput_data($info);
  254. }
  255. }
  256. /**
  257. * 登录生成token
  258. */
  259. private function _get_token($member_id, $member_name, $client)
  260. {
  261. $model_mb_user_token = Model('mb_user_token');
  262. //重新登录后以前的令牌失效
  263. //暂时停用
  264. //$condition = array();
  265. //$condition['member_id'] = $member_id;
  266. //$condition['client_type'] = $_POST['client'];
  267. //$model_mb_user_token->delMbUserToken($condition);
  268. //生成新的token
  269. $mb_user_token_info = array();
  270. $token = md5($member_name . strval(TIMESTAMP) . strval(rand(0, 999999)));
  271. $mb_user_token_info['member_id'] = $member_id;
  272. $mb_user_token_info['member_name'] = $member_name;
  273. $mb_user_token_info['token'] = $token;
  274. $mb_user_token_info['login_time'] = TIMESTAMP;
  275. $mb_user_token_info['client_type'] = $_POST['client'];
  276. $result = $model_mb_user_token->addMbUserToken($mb_user_token_info);
  277. if ($result) {
  278. return $token;
  279. } else {
  280. return null;
  281. }
  282. }
  283. public static function gen_token_code($token)
  284. {
  285. $key = 'token_code:' . $token;
  286. return $key;
  287. }
  288. public static function gen_mobile_code($mobile)
  289. {
  290. $key = 'mobile:' . $mobile;
  291. return $key;
  292. }
  293. public function getcodeOp()
  294. {
  295. $mobile = trim($_POST['mobile']);
  296. $token = trim($_POST['token']);
  297. if (empty($token)) {
  298. return joutput_error(errcode::ErrParamter, 'Token cannot empty.');
  299. }
  300. $userid = token_uid($token);
  301. if ($userid == -1) {
  302. return joutput_error(errcode::ErrTokenExpire);
  303. }
  304. $validator = new Validate();
  305. $validator->setValidate(Validate::verify_mobile($mobile));
  306. $err = $validator->validate();
  307. if ($err != '') {
  308. return joutput_error(errcode::ErrParamter, $err);
  309. }
  310. $sms = new Sms();
  311. $code = makeSmscode();
  312. $status = $sms->send($mobile, array('code' => $code, 'type' => Sms::register_code, 'time' => '5'));
  313. if ($status == 0) {
  314. $key = $this->gen_token_code($token);
  315. wcache($key, array('code' => $code, 'mobile' => $mobile), 'member', self::code_expire);
  316. joutput_data(NULL);
  317. } else {
  318. return joutput_error(errcode::ErrSms, "send error=" . $status);
  319. }
  320. }
  321. public function checkcodeOp()
  322. {
  323. $token = trim($_POST['token']);
  324. if (empty($token)) {
  325. return joutput_error(errcode::ErrParamter, 'Token cannot empty.');
  326. }
  327. $userid = token_uid($token);
  328. if ($userid == -1) {
  329. return joutput_error(errcode::ErrTokenExpire);
  330. }
  331. $validator = new Validate();
  332. $code = trim($_POST['code']);
  333. $validator->setValidate(Validate::smscode($code));
  334. $err = $validator->validate();
  335. if ($err != '') {
  336. return joutput_error(errcode::ErrParamter, $err);
  337. }
  338. $key = $this->gen_token_code($token);
  339. $ret = rcache($key, 'member');
  340. if (empty($ret)) {
  341. return joutput_error(errcode::ErrSmscodeExpire);
  342. } elseif ($ret['code'] == $code) {
  343. joutput_data(NULL);
  344. } else {
  345. return joutput_error(errcode::ErrSmscode);
  346. }
  347. }
  348. // public function registerOp()
  349. // {
  350. // $model_member = Model('member');
  351. //
  352. // $register_info = array();
  353. // $register_info['username'] = $_POST['username'];
  354. // $register_info['password'] = $_POST['password'];
  355. // $register_info['password_confirm'] = $_POST['password_confirm'];
  356. //
  357. // $register_info['checkcode'] = $_POST['password_confirm'];
  358. // $register_info['email'] = $_POST['email'];
  359. //
  360. // $member_info = $model_member->register($register_info);
  361. // if (!isset($member_info['error'])) {
  362. // $token = $this->_get_token($member_info['member_id'], $member_info['member_name'], $_POST['client']);
  363. // if ($token) {
  364. // output_data(array('username' => $member_info['member_name'], 'key' => $token));
  365. // } else {
  366. // output_error('注册失败');
  367. // }
  368. // } else {
  369. // output_error($member_info['error']);
  370. // }
  371. // }
  372. }