Login.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552
  1. <?php
  2. // +—————————————————————————————————————————————————————————————————————
  3. // | Created by Yunbao
  4. // +—————————————————————————————————————————————————————————————————————
  5. // | Copyright (c) 2013~2022 http://www.yunbaokj.com All rights reserved.
  6. // +—————————————————————————————————————————————————————————————————————
  7. // | Author: https://gitee.com/yunbaokeji
  8. // +—————————————————————————————————————————————————————————————————————
  9. // | Date: 2022-02-17
  10. // +—————————————————————————————————————————————————————————————————————
  11. /**
  12. * 登录、注册
  13. */
  14. if (!session_id()) session_start();
  15. class Api_Login extends PhalApi_Api {
  16. public function getRules() {
  17. return array(
  18. 'userLogin' => array(
  19. 'user_login' => array('name' => 'user_login', 'type' => 'string', 'require' => true, 'min' => '6', 'max'=>'30', 'desc' => '账号'),
  20. 'user_pass' => array('name' => 'user_pass', 'type' => 'string','require' => true, 'min' => '1', 'max'=>'30', 'desc' => '密码'),
  21. ),
  22. 'userReg' => array(
  23. 'user_login' => array('name' => 'user_login', 'type' => 'string','require' => true, 'min' => '6', 'max'=>'30', 'desc' => '账号'),
  24. 'user_pass' => array('name' => 'user_pass', 'type' => 'string','require' => true, 'min' => '1', 'max'=>'30', 'desc' => '密码'),
  25. 'user_pass2' => array('name' => 'user_pass2', 'type' => 'string', 'require' => true, 'min' => '1', 'max'=>'30', 'desc' => '确认密码'),
  26. 'code' => array('name' => 'code', 'type' => 'string', 'min' => 1, 'require' => true, 'desc' => '验证码'),
  27. 'source' => array('name' => 'source', 'type' => 'string', 'default'=>'pc', 'desc' => '来源设备'),
  28. ),
  29. 'userFindPass' => array(
  30. 'user_login' => array('name' => 'user_login', 'type' => 'string', 'require' => true, 'min' => '6', 'max'=>'30', 'desc' => '账号'),
  31. 'user_pass' => array('name' => 'user_pass', 'type' => 'string', 'require' => true, 'min' => '1', 'max'=>'30', 'desc' => '密码'),
  32. 'user_pass2' => array('name' => 'user_pass2', 'type' => 'string', 'require' => true, 'min' => '1', 'max'=>'30', 'desc' => '确认密码'),
  33. 'code' => array('name' => 'code', 'type' => 'string', 'min' => 1, 'require' => true, 'desc' => '验证码'),
  34. ),
  35. 'userLoginByThird' => array(
  36. 'openid' => array('name' => 'openid', 'type' => 'string', 'min' => 1, 'require' => true, 'desc' => '第三方openid'),
  37. 'type' => array('name' => 'type', 'type' => 'string', 'min' => 1, 'require' => true, 'desc' => '第三方标识'),
  38. 'nicename' => array('name' => 'nicename', 'type' => 'string', 'default'=>'', 'desc' => '第三方昵称'),
  39. 'avatar' => array('name' => 'avatar', 'type' => 'string', 'default'=>'', 'desc' => '第三方头像'),
  40. 'sign' => array('name' => 'sign', 'type' => 'string', 'default'=>'', 'desc' => '签名'),
  41. 'source' => array('name' => 'source', 'type' => 'string', 'default'=>'pc', 'desc' => '来源设备'),
  42. ),
  43. 'getCode' => array(
  44. 'mobile' => array('name' => 'mobile', 'type' => 'string', 'min' => 1, 'require' => true, 'desc' => '手机号'),
  45. 'sign' => array('name' => 'sign', 'type' => 'string', 'default'=>'', 'desc' => '签名'),
  46. ),
  47. 'getForgetCode' => array(
  48. 'mobile' => array('name' => 'mobile', 'type' => 'string', 'min' => 1, 'require' => true, 'desc' => '手机号'),
  49. 'sign' => array('name' => 'sign', 'type' => 'string', 'default'=>'', 'desc' => '签名'),
  50. ),
  51. 'getUnionid' => array(
  52. 'code' => array('name' => 'code', 'type' => 'string','desc' => '微信code'),
  53. ),
  54. );
  55. }
  56. /**
  57. * 会员登陆 需要密码
  58. * @desc 用于用户登陆信息
  59. * @return int code 操作码,0表示成功
  60. * @return array info 用户信息
  61. * @return string info[0].id 用户ID
  62. * @return string info[0].user_nicename 昵称
  63. * @return string info[0].avatar 头像
  64. * @return string info[0].avatar_thumb 头像缩略图
  65. * @return string info[0].sex 性别
  66. * @return string info[0].signature 签名
  67. * @return string info[0].coin 用户余额
  68. * @return string info[0].login_type 注册类型
  69. * @return string info[0].level 等级
  70. * @return string info[0].province 省份
  71. * @return string info[0].city 城市
  72. * @return string info[0].birthday 生日
  73. * @return string info[0].token 用户Token
  74. * @return string msg 提示信息
  75. */
  76. public function userLogin() {
  77. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  78. $user_login=checkNull($this->user_login);
  79. $user_pass=checkNull($this->user_pass);
  80. $domain = new Domain_Login();
  81. $info = $domain->userLogin($user_login,$user_pass);
  82. if($info==1001){
  83. $rs['code'] = 1001;
  84. $rs['msg'] = '账号或密码错误';
  85. return $rs;
  86. }
  87. $rs['info'][0] = $info;
  88. return $rs;
  89. }
  90. /**
  91. * 会员注册
  92. * @desc 用于用户注册信息
  93. * @return int code 操作码,0表示成功
  94. * @return array info 用户信息
  95. * @return string info[0].id 用户ID
  96. * @return string info[0].user_nicename 昵称
  97. * @return string info[0].avatar 头像
  98. * @return string info[0].avatar_thumb 头像缩略图
  99. * @return string info[0].sex 性别
  100. * @return string info[0].signature 签名
  101. * @return string info[0].coin 用户余额
  102. * @return string info[0].login_type 注册类型
  103. * @return string info[0].level 等级
  104. * @return string info[0].province 省份
  105. * @return string info[0].city 城市
  106. * @return string info[0].birthday 生日
  107. * @return string info[0].token 用户Token
  108. * @return string msg 提示信息
  109. */
  110. public function userReg() {
  111. $rs = array('code' => 0, 'msg' => '注册成功', 'info' => array());
  112. $user_login=checkNull($this->user_login);
  113. $user_pass=checkNull($this->user_pass);
  114. $user_pass2=checkNull($this->user_pass2);
  115. $source=checkNull($this->source);
  116. $code=checkNull($this->code);
  117. if(!$_SESSION['reg_mobile'] || !$_SESSION['reg_mobile_code']){
  118. $rs['code'] = 1001;
  119. $rs['msg'] = '请先获取验证码';
  120. return $rs;
  121. }
  122. if($user_login!=$_SESSION['reg_mobile']){
  123. $rs['code'] = 1001;
  124. $rs['msg'] = '手机号码不一致';
  125. return $rs;
  126. }
  127. if($code!=$_SESSION['reg_mobile_code']){
  128. $rs['code'] = 1002;
  129. $rs['msg'] = '验证码错误';
  130. return $rs;
  131. }
  132. if($user_pass!=$user_pass2){
  133. $rs['code'] = 1003;
  134. $rs['msg'] = '两次输入的密码不一致';
  135. return $rs;
  136. }
  137. $check = passcheck($user_pass);
  138. if(!$check){
  139. $rs['code'] = 1004;
  140. $rs['msg'] = '密码为6-20位字母数字组合';
  141. return $rs;
  142. }
  143. $domain = new Domain_Login();
  144. $info = $domain->userReg($user_login,$user_pass,$source);
  145. if($info==1006){
  146. $rs['code'] = 1006;
  147. $rs['msg'] = '该手机号已被注册!';
  148. return $rs;
  149. }else if($info==1007){
  150. $rs['code'] = 1007;
  151. $rs['msg'] = '注册失败,请重试';
  152. return $rs;
  153. }
  154. $rs['info'][0] = $info;
  155. $_SESSION['reg_mobile'] = '';
  156. $_SESSION['reg_mobile_code'] = '';
  157. $_SESSION['reg_mobile_expiretime'] = '';
  158. return $rs;
  159. }
  160. /**
  161. * 会员找回密码
  162. * @desc 用于会员找回密码
  163. * @return int code 操作码,0表示成功,1表示验证码错误,2表示用户密码不一致,3短信手机和登录手机不一致 4、用户不存在 801 密码6-12位数字与字母
  164. * @return array info
  165. * @return string msg 提示信息
  166. */
  167. public function userFindPass() {
  168. $rs = array('code' => 0, 'msg' => '密码找回成功', 'info' => array());
  169. $user_login=checkNull($this->user_login);
  170. $user_pass=checkNull($this->user_pass);
  171. $user_pass2=checkNull($this->user_pass2);
  172. $code=checkNull($this->code);
  173. if(!$_SESSION['forget_mobile'] || !$_SESSION['forget_mobile_code']){
  174. $rs['code'] = 1001;
  175. $rs['msg'] = '请先获取验证码';
  176. return $rs;
  177. }
  178. if($user_login!=$_SESSION['forget_mobile']){
  179. $rs['code'] = 1001;
  180. $rs['msg'] = '手机号码不一致';
  181. return $rs;
  182. }
  183. if($code!=$_SESSION['forget_mobile_code']){
  184. $rs['code'] = 1002;
  185. $rs['msg'] = '验证码错误';
  186. return $rs;
  187. }
  188. if($user_pass!=$user_pass2){
  189. $rs['code'] = 1003;
  190. $rs['msg'] = '两次输入的密码不一致';
  191. return $rs;
  192. }
  193. $check = passcheck($user_pass);
  194. if(!$check){
  195. $rs['code'] = 1004;
  196. $rs['msg'] = '密码为6-20位字母数字组合';
  197. return $rs;
  198. }
  199. $domain = new Domain_Login();
  200. $info = $domain->userFindPass($user_login,$user_pass);
  201. if($info==1006){
  202. $rs['code'] = 1006;
  203. $rs['msg'] = '该帐号不存在';
  204. return $rs;
  205. }else if($info===false){
  206. $rs['code'] = 1007;
  207. $rs['msg'] = '重置失败,请重试';
  208. return $rs;
  209. }
  210. $_SESSION['forget_mobile'] = '';
  211. $_SESSION['forget_mobile_code'] = '';
  212. $_SESSION['forget_mobile_expiretime'] = '';
  213. return $rs;
  214. }
  215. /**
  216. * 第三方登录
  217. * @desc 用于用户登陆信息
  218. * @return int code 操作码,0表示成功
  219. * @return array info 用户信息
  220. * @return string info[0].id 用户ID
  221. * @return string info[0].user_nicename 昵称
  222. * @return string info[0].avatar 头像
  223. * @return string info[0].avatar_thumb 头像缩略图
  224. * @return string info[0].sex 性别
  225. * @return string info[0].signature 签名
  226. * @return string info[0].coin 用户余额
  227. * @return string info[0].login_type 注册类型
  228. * @return string info[0].level 等级
  229. * @return string info[0].province 省份
  230. * @return string info[0].city 城市
  231. * @return string info[0].birthday 生日
  232. * @return string info[0].token 用户Token
  233. * @return string msg 提示信息
  234. */
  235. public function userLoginByThird() {
  236. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  237. $openid=checkNull($this->openid);
  238. $type=checkNull($this->type);
  239. $nicename=checkNull($this->nicename);
  240. $avatar=checkNull($this->avatar);
  241. $source=checkNull($this->source);
  242. $sign=checkNull($this->sign);
  243. $checkdata=array(
  244. 'openid'=>$openid
  245. );
  246. $issign=checkSign($checkdata,$sign);
  247. if(!$issign){
  248. $rs['code']=1001;
  249. $rs['msg']='签名错误';
  250. return $rs;
  251. }
  252. $domain = new Domain_Login();
  253. $info = $domain->userLoginByThird($openid,$type,$nicename,$avatar,$source);
  254. if($info==1003){
  255. $rs['code'] = 1003;
  256. $rs['msg'] = '该账号已被禁用';
  257. return $rs;
  258. }
  259. $rs['info'][0] = $info;
  260. return $rs;
  261. }
  262. /**
  263. * 获取注册短信验证码
  264. * @desc 用于注册获取短信验证码
  265. * @return int code 操作码,0表示成功,2发送失败
  266. * @return array info
  267. * @return string msg 提示信息
  268. */
  269. public function getCode() {
  270. $rs = array('code' => 0, 'msg' => '发送成功', 'info' => array(),"verificationcode"=>0);
  271. $mobile = checkNull($this->mobile);
  272. $sign = checkNull($this->sign);
  273. $ismobile=checkMobile($mobile);
  274. if(!$ismobile){
  275. $rs['code']=1001;
  276. $rs['msg']='请输入正确的手机号';
  277. return $rs;
  278. }
  279. $checkdata=array(
  280. 'mobile'=>$mobile
  281. );
  282. $issign=checkSign($checkdata,$sign);
  283. if(!$issign){
  284. $rs['code']=1001;
  285. $rs['msg']='签名错误';
  286. return $rs;
  287. }
  288. $where="user_login='{$mobile}'";
  289. $checkuser = checkUser($where);
  290. if($checkuser){
  291. $rs['code']=1004;
  292. $rs['msg']='该手机号已注册';
  293. return $rs;
  294. }
  295. if($_SESSION['reg_mobile']==$mobile && $_SESSION['reg_mobile_expiretime']> time() ){
  296. $rs['code']=1002;
  297. $rs['msg']='验证码5分钟有效,请勿多次发送';
  298. return $rs;
  299. }
  300. $limit = ip_limit();
  301. if( $limit == 1){
  302. $rs['code']=1003;
  303. $rs['msg']='您当日已发送次数过多';
  304. return $rs;
  305. }
  306. $mobile_code = random(6,1);
  307. /* 发送验证码 */
  308. $result=sendCode($mobile,$mobile_code);
  309. if($result['code']==0){
  310. $rs['verificationcode']=$mobile_code;
  311. $_SESSION['reg_mobile'] = $mobile;
  312. $_SESSION['reg_mobile_code'] = $mobile_code;
  313. $_SESSION['reg_mobile_expiretime'] = time() +60*5;
  314. }else if($result['code']==667){
  315. $_SESSION['reg_mobile'] = $mobile;
  316. $_SESSION['reg_mobile_code'] = $result['msg'];
  317. $_SESSION['reg_mobile_expiretime'] = time() +60*5;
  318. $rs['verificationcode']='123456';
  319. $rs['code']=1002;
  320. $rs['msg']='验证码为:'.$result['msg'];
  321. }else{
  322. $rs['code']=1002;
  323. $rs['msg']=$result['msg'];
  324. }
  325. return $rs;
  326. }
  327. /**
  328. * 获取找回密码短信验证码
  329. * @desc 用于找回密码获取短信验证码
  330. * @return int code 操作码,0表示成功,2发送失败
  331. * @return array info
  332. * @return string msg 提示信息
  333. */
  334. public function getForgetCode() {
  335. $rs = array('code' => 0, 'msg' => '发送成功', 'info' => array(),"verificationcode"=>0);
  336. $mobile = checkNull($this->mobile);
  337. $sign = checkNull($this->sign);
  338. $ismobile=checkMobile($mobile);
  339. if(!$ismobile){
  340. $rs['code']=1001;
  341. $rs['msg']='请输入正确的手机号';
  342. return $rs;
  343. }
  344. $checkdata=array(
  345. 'mobile'=>$mobile
  346. );
  347. $issign=checkSign($checkdata,$sign);
  348. if(!$issign){
  349. $rs['code']=1001;
  350. $rs['msg']='签名错误';
  351. return $rs;
  352. }
  353. $where="user_login='{$mobile}'";
  354. $checkuser = checkUser($where);
  355. if(!$checkuser){
  356. $rs['code']=1004;
  357. $rs['msg']='该手机号未注册';
  358. return $rs;
  359. }
  360. if($_SESSION['forget_mobile']==$mobile && $_SESSION['forget_mobile_expiretime']> time() ){
  361. $rs['code']=1002;
  362. $rs['msg']='验证码5分钟有效,请勿多次发送';
  363. return $rs;
  364. }
  365. $limit = ip_limit();
  366. if( $limit == 1){
  367. $rs['code']=1003;
  368. $rs['msg']='您已当日发送次数过多';
  369. return $rs;
  370. }
  371. $mobile_code = random(6,1);
  372. /* 发送验证码 */
  373. $result=sendCode($country_code,$mobile,$mobile_code);
  374. if($result['code']==0){
  375. $rs['verificationcode']=$mobile_code;
  376. $_SESSION['forget_mobile'] = $mobile;
  377. $_SESSION['forget_mobile_code'] = $mobile_code;
  378. $_SESSION['forget_mobile_expiretime'] = time() +60*5;
  379. }else if($result['code']==667){
  380. $_SESSION['forget_mobile'] = $mobile;
  381. $_SESSION['forget_mobile_code'] = $result['msg'];
  382. $_SESSION['forget_mobile_expiretime'] = time() +60*5;
  383. $rs['verificationcode']='123456';
  384. $rs['code']=1002;
  385. $rs['msg']='验证码为:'.$result['msg'];
  386. }else{
  387. $rs['code']=1002;
  388. $rs['msg']=$result['msg'];
  389. }
  390. return $rs;
  391. }
  392. /**
  393. * 获取微信登录unionid
  394. * @desc 用于获取微信登录unionid
  395. * @return int code 操作码,0表示成功,2发送失败
  396. * @return array info
  397. * @return string info[0].unionid 微信unionid
  398. * @return string msg 提示信息
  399. */
  400. public function getUnionid(){
  401. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  402. $code=checkNull($this->code);
  403. if($code==''){
  404. $rs['code']=1001;
  405. $rs['msg']='参数错误';
  406. return $rs;
  407. }
  408. $configpri=getConfigPri();
  409. $AppID = $configpri['wx_mini_appid'];
  410. $AppSecret = $configpri['wx_mini_appsecret'];
  411. /* 获取token */
  412. $url="https://api.weixin.qq.com/sns/jscode2session?appid={$AppID}&secret={$AppSecret}&js_code={$code}&grant_type=authorization_code";
  413. $ch = curl_init();
  414. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  415. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  416. curl_setopt($ch, CURLOPT_URL, $url);
  417. $json = curl_exec($ch);
  418. curl_close($ch);
  419. $arr=json_decode($json,1);
  420. //file_put_contents('./getUnionid.txt',date('Y-m-d H:i:s').' 提交参数信息 code:'.json_encode($code)."\r\n",FILE_APPEND);
  421. //file_put_contents('./getUnionid.txt',date('Y-m-d H:i:s').' 提交参数信息 arr:'.json_encode($arr)."\r\n",FILE_APPEND);
  422. if($arr['errcode']){
  423. $rs['code']=1003;
  424. $rs['msg']='配置错误';
  425. //file_put_contents('./getUnionid.txt',date('Y-m-d H:i:s').' 提交参数信息 arr:'.json_encode($arr)."\r\n",FILE_APPEND);
  426. return $rs;
  427. }
  428. /* 小程序 绑定到 开放平台 才有 unionid 否则 用 openid */
  429. $unionid=$arr['unionid'];
  430. if(!$unionid){
  431. //$rs['code']=1002;
  432. //$rs['msg']='公众号未绑定到开放平台';
  433. //return $rs;
  434. $unionid=$arr['openid'];
  435. }
  436. $rs['info'][0]['unionid'] = $unionid;
  437. $rs['info'][0]['openid'] = $arr['openid'];
  438. return $rs;
  439. }
  440. }