member_security.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. <?php
  2. /**
  3. * 账户安全
  4. *
  5. *
  6. *
  7. ***/
  8. defined('InShopNC') or exit('Access Invalid!');
  9. class member_securityControl extends BaseMemberControl {
  10. public function __construct() {
  11. parent::__construct();
  12. }
  13. /**
  14. * 安全列表
  15. */
  16. public function indexOp() {
  17. self::profile_menu('index','index');
  18. $member_info = $this->member_info;
  19. $member_info['security_level'] = Model('member')->getMemberSecurityLevel($member_info);
  20. Tpl::output('member_info',$member_info);
  21. Tpl::showpage('member_security.index');
  22. }
  23. /**
  24. * 绑定邮箱 - 发送邮件
  25. */
  26. public function send_bind_emailOp() {
  27. $obj_validate = new Validator();
  28. $obj_validate->validateparam = array(
  29. array("input"=>$_POST["email"], "require"=>"true", 'validator'=>'email',"message"=>'请正确填写邮箱')
  30. );
  31. $error = $obj_validate->validate();
  32. if ($error != ''){
  33. showValidateError($error);
  34. }
  35. $model_member = Model('member');
  36. $condition = array();
  37. $condition['member_email'] = $_POST['email'];
  38. $condition['member_id'] = array('neq',$_SESSION['member_id']);
  39. $member_info = $model_member->getMemberInfo($condition,'member_id');
  40. if ($member_info) {
  41. showDialog('该邮箱已被使用');
  42. }
  43. $data = array();
  44. $data['member_email'] = $_POST['email'];
  45. $data['member_email_bind'] = 0;
  46. $update = $model_member->editMember(array('member_id'=>$_SESSION['member_id']),$data);
  47. if (!$update) {
  48. showDialog('系统发生错误,如有疑问请与管理员联系');
  49. }
  50. $seed = random(6);
  51. $data = array();
  52. $data['auth_code'] = $seed;
  53. $data['send_acode_time'] = TIMESTAMP;
  54. $update = $model_member->editMemberCommon($data,array('member_id'=>$_SESSION['member_id']));
  55. if (!$update) {
  56. showDialog('系统发生错误,如有疑问请与管理员联系');
  57. }
  58. $uid = base64_encode(encrypt($_SESSION['member_id'].' '.$_POST["email"]));
  59. $verify_url = SHOP_SITE_URL.'/index.php?act=login&op=bind_email&uid='.$uid.'&hash='.md5($seed);
  60. $model_tpl = Model('mail_templates');
  61. $tpl_info = $model_tpl->getTplInfo(array('code'=>'bind_email'));
  62. $param = array();
  63. $param['site_name'] = C('site_name');
  64. $param['user_name'] = $_SESSION['member_name'];
  65. $param['verify_url'] = $verify_url;
  66. $subject = ncReplaceText($tpl_info['title'],$param);
  67. $message = ncReplaceText($tpl_info['content'],$param);
  68. $email = new Email();
  69. $result = $email->send_sys_email($_POST["email"],$subject,$message);
  70. showDialog('验证邮件已经发送至您的邮箱,请于24小时内登录邮箱并完成验证!','index.php?act=member_security&op=index','succ','',5);
  71. }
  72. /**
  73. * 统一身份验证入口
  74. */
  75. public function authOp() {
  76. $model_member = Model('member');
  77. if (chksubmit(false,true)) {
  78. if (!in_array($_POST['type'],array('modify_pwd','modify_mobile','modify_email','modify_paypwd','pd_cash'))) {
  79. redirect('index.php?act=member_security&op=index');
  80. }
  81. $member_common_info = $model_member->getMemberCommonInfo(array('member_id'=>$_SESSION['member_id']));
  82. if (empty($member_common_info) || !is_array($member_common_info)) {
  83. showMessage('验证失败','','html','error');
  84. }
  85. if ($member_common_info['auth_code'] != $_POST['auth_code'] || TIMESTAMP - $member_common_info['send_acode_time'] > 1800) {
  86. showMessage('验证码已被使用或超时,请重新获取验证码','','html','error');
  87. }
  88. $data = array();
  89. $data['auth_code'] = '';
  90. $data['send_acode_time'] = 0;
  91. $update = $model_member->editMemberCommon($data,array('member_id'=>$_SESSION['member_id']));
  92. if (!$update) {
  93. showMessage('系统发生错误,如有疑问请与管理员联系',SHOP_SITE_URL,'html','error');
  94. }
  95. setNcCookie('seccode'.$_POST['nchash'], '',-3600);
  96. $_SESSION['auth_'.$_POST['type']] = TIMESTAMP;
  97. self::profile_menu($_POST['type'],$_POST['type']);
  98. if ($_POST['type'] == 'pd_cash') {
  99. Tpl::showpage('member_pd_cash.add');
  100. } else {
  101. Tpl::showpage('member_security.'.$_POST['type']);
  102. }
  103. } else {
  104. if (!in_array($_GET['type'],array('modify_pwd','modify_mobile','modify_email','modify_paypwd','pd_cash'))) {
  105. redirect('index.php?act=member_security&op=index');
  106. }
  107. //继承父类的member_info
  108. $member_info = $this->member_info;
  109. if (!$member_info){
  110. $member_info = $model_member->getMemberInfo(array('member_id'=>$_SESSION['member_id']),'member_email,member_email_bind,member_mobile,member_mobile_bind');
  111. }
  112. self::profile_menu($_GET['type'],$_GET['type']);
  113. //第一次绑定邮箱,不用发验证码,直接进下一步
  114. //第一次绑定手机,不用发验证码,直接进下一步
  115. if (($_GET['type'] == 'modify_email' && $member_info['member_email_bind'] == '0') ||
  116. ($_GET['type'] == 'modify_mobile' && $member_info['member_mobile_bind'] == '0')) {
  117. $_SESSION['auth_'.$_GET['type']] = TIMESTAMP;
  118. Tpl::showpage('member_security.'.$_GET['type']);
  119. exit;
  120. }
  121. //修改密码、设置支付密码时,必须绑定邮箱或手机
  122. if (in_array($_GET['type'],array('modify_pwd','modify_paypwd')) && $member_info['member_email_bind'] == '0' &&
  123. $member_info['member_mobile_bind'] == '0') {
  124. showMessage('请先绑定邮箱或手机','index.php?act=member_security&op=index','html','error');
  125. }
  126. Tpl::output('member_info',$member_info);
  127. Tpl::showpage('member_security.auth');
  128. }
  129. }
  130. /**
  131. * 统一发送身份验证码
  132. */
  133. public function send_auth_codeOp() {
  134. if (!in_array($_GET['type'],array('email','mobile'))) exit();
  135. $model_member = Model('member');
  136. $member_info = $model_member->getMemberInfoByID($_SESSION['member_id'],'member_email,member_mobile');
  137. $verify_code = rand(100,999).rand(100,999);
  138. $data = array();
  139. $data['auth_code'] = $verify_code;
  140. $data['send_acode_time'] = TIMESTAMP;
  141. $update = $model_member->editMemberCommon($data,array('member_id'=>$_SESSION['member_id']));
  142. if (!$update) {
  143. exit(json_encode(array('state'=>'false','msg'=>'系统发生错误,如有疑问请与管理员联系')));
  144. }
  145. $model_tpl = Model('mail_templates');
  146. $tpl_info = $model_tpl->getTplInfo(array('code'=>'authenticate'));
  147. $param = array();
  148. $param['send_time'] = date('Y-m-d H:i',TIMESTAMP);
  149. $param['verify_code'] = $verify_code;
  150. $param['site_name'] = C('site_name');
  151. $subject = ncReplaceText($tpl_info['title'],$param);
  152. $message = ncReplaceText($tpl_info['content'],$param);
  153. if ($_GET['type'] == 'email') {
  154. $email = new Email();
  155. $result = $email->send_sys_email($member_info["member_email"],$subject,$message);
  156. } elseif ($_GET['type'] == 'mobile') {
  157. $sms = new Sms();
  158. $result = $sms->send($member_info["member_mobile"],$message);
  159. }
  160. if ($result) {
  161. exit(json_encode(array('state'=>'true','msg'=>'验证码已发出,请注意查收')));
  162. } else {
  163. exit(json_encode(array('state'=>'false','msg'=>'验证码发送失败')));
  164. }
  165. }
  166. /**
  167. * 修改密码
  168. */
  169. public function modify_pwdOp() {
  170. $model_member = Model('member');
  171. //身份验证后,需要在30分钟内完成修改密码操作
  172. if (TIMESTAMP - $_SESSION['auth_modify_pwd'] > 1800) {
  173. showMessage('操作超时,请重新获得验证码','index.php?act=member_security&op=auth&type=modify_pwd','html','error');
  174. }
  175. if(!chksubmit()) exit();
  176. $obj_validate = new Validator();
  177. $obj_validate->validateparam = array(
  178. array("input"=>$_POST["password"], "require"=>"true", "message"=>'请正确输入密码'),
  179. array("input"=>$_POST["confirm_password"], "require"=>"true", "validator"=>"Compare","operator"=>"==","to"=>$_POST["password"],"message"=>'两次密码输入不一致'),
  180. );
  181. $error = $obj_validate->validate();
  182. if ($error != ''){
  183. showValidateError($error);
  184. }
  185. $update = $model_member->editMember(array('member_id'=>$_SESSION['member_id']),array('member_passwd'=>md5($_POST['password'])));
  186. $message = $update ? '密码修改成功' : '密码修改失败';
  187. unset($_SESSION['auth_modify_pwd']);
  188. showDialog($message,'index.php?act=member_security&op=index',$update ? 'succ' : 'error');
  189. }
  190. /**
  191. * 设置支付密码
  192. */
  193. public function modify_paypwdOp() {
  194. $model_member = Model('member');
  195. //身份验证后,需要在30分钟内完成修改密码操作
  196. if (TIMESTAMP - $_SESSION['auth_modify_paypwd'] > 1800) {
  197. showMessage('操作超时,请重新获得验证码','index.php?act=member_security&op=auth&type=modify_paypwd','html','error');
  198. }
  199. if(!chksubmit()) exit();
  200. $obj_validate = new Validator();
  201. $obj_validate->validateparam = array(
  202. array("input"=>$_POST["password"], "require"=>"true", "message"=>'请正确输入密码'),
  203. array("input"=>$_POST["confirm_password"], "require"=>"true", "validator"=>"Compare","operator"=>"==","to"=>$_POST["password"],"message"=>'两次密码输入不一致'),
  204. );
  205. $error = $obj_validate->validate();
  206. if ($error != ''){
  207. showValidateError($error);
  208. }
  209. $update = $model_member->editMember(array('member_id'=>$_SESSION['member_id']),array('member_paypwd'=>md5($_POST['password'])));
  210. $message = $update ? '密码设置成功' : '密码设置失败';
  211. unset($_SESSION['auth_modify_paypwd']);
  212. showDialog($message,'index.php?act=member_security&op=index',$update ? 'succ' : 'error');
  213. }
  214. /**
  215. * 绑定手机
  216. */
  217. public function modify_mobileOp() {
  218. $model_member = Model('member');
  219. $member_info = $model_member->getMemberInfoByID($_SESSION['member_id'],'member_mobile_bind');
  220. if (chksubmit()) {
  221. $obj_validate = new Validator();
  222. $obj_validate->validateparam = array(
  223. array("input"=>$_POST["mobile"], "require"=>"true", 'validator'=>'mobile',"message"=>'请正确填写手机号'),
  224. array("input"=>$_POST["vcode"], "require"=>"true", 'validator'=>'number',"message"=>'请正确填写手机验证码'),
  225. );
  226. $error = $obj_validate->validate();
  227. if ($error != ''){
  228. showValidateError($error);
  229. }
  230. $condition = array();
  231. $condition['member_id'] = $_SESSION['member_id'];
  232. $condition['auth_code'] = intval($_POST['vcode']);
  233. $member_common_info = $model_member->getMemberCommonInfo($condition,'send_acode_time');
  234. if (!$member_common_info) {
  235. showDialog('手机验证码错误,请重新输入');
  236. }
  237. if (TIMESTAMP - $member_common_info['send_acode_time'] > 1800) {
  238. showDialog('手机验证码已过期,请重新获取验证码');
  239. }
  240. $data = array();
  241. $data['auth_code'] = '';
  242. $data['send_acode_time'] = 0;
  243. $update = $model_member->editMemberCommon($data,array('member_id'=>$_SESSION['member_id']));
  244. if (!$update) {
  245. showDialog('系统发生错误,如有疑问请与管理员联系');
  246. }
  247. $update = $model_member->editMember(array('member_id'=>$_SESSION['member_id']),array('member_mobile_bind'=>1));
  248. if (!$update) {
  249. showDialog('系统发生错误,如有疑问请与管理员联系');
  250. }
  251. showDialog('手机号绑定成功','index.php?act=member_security&op=index','succ');
  252. }
  253. }
  254. /**
  255. * 修改手机号 - 发送验证码
  256. */
  257. public function send_modify_mobileOp() {
  258. $obj_validate = new Validator();
  259. $obj_validate->validateparam = array(
  260. array("input"=>$_GET["mobile"], "require"=>"true", 'validator'=>'mobile',"message"=>'请正确填写手机号码'),
  261. );
  262. $error = $obj_validate->validate();
  263. if ($error != ''){
  264. exit(json_encode(array('state'=>'false','msg'=>$error)));
  265. }
  266. $model_member = Model('member');
  267. $condition = array();
  268. $condition['member_mobile'] = $_GET['mobile'];
  269. $condition['member_id'] = array('neq',$_SESSION['member_id']);
  270. $member_info = $model_member->getMemberInfo($condition,'member_id');
  271. if ($member_info) {
  272. exit(json_encode(array('state'=>'false','msg'=>'该手机号已被使用,请更换其它手机号')));
  273. }
  274. $update = $model_member->editMember(array('member_id'=>$_SESSION['member_id']),array('member_mobile'=>$_GET['mobile']));
  275. if (!$update) {
  276. exit(json_encode(array('state'=>'false','msg'=>'系统发生错误,如有疑问请与管理员联系')));
  277. }
  278. $verify_code = rand(100,999).rand(100,999);
  279. $data = array();
  280. $data['auth_code'] = $verify_code;
  281. $data['send_acode_time'] = TIMESTAMP;
  282. $update = $model_member->editMemberCommon($data,array('member_id'=>$_SESSION['member_id']));
  283. if (!$update) {
  284. exit(json_encode(array('state'=>'false','msg'=>'系统发生错误,如有疑问请与管理员联系')));
  285. }
  286. $model_tpl = Model('mail_templates');
  287. $tpl_info = $model_tpl->getTplInfo(array('code'=>'modify_mobile'));
  288. $param = array();
  289. $param['site_name'] = C('site_name');
  290. $param['send_time'] = date('Y-m-d H:i',TIMESTAMP);
  291. $param['verify_code'] = $verify_code;
  292. $message = ncReplaceText($tpl_info['content'],$param);
  293. $sms = new Sms();
  294. $result = $sms->send($_GET["mobile"],$message);
  295. if ($result) {
  296. exit(json_encode(array('state'=>'true','msg'=>'发送成功')));
  297. } else {
  298. exit(json_encode(array('state'=>'false','msg'=>'发送失败')));
  299. }
  300. }
  301. /**
  302. * 用户中心右边,小导航
  303. *
  304. * @param string $menu_type 导航类型
  305. * @param string $menu_key 当前导航的menu_key
  306. * @return
  307. */
  308. private function profile_menu($menu_type,$menu_key='') {
  309. $menu_array = array();
  310. switch ($menu_type) {
  311. case 'index':
  312. $menu_array = array(
  313. array('menu_key'=>'index', 'menu_name'=>'账户安全','menu_url'=>'index.php?act=member_security&op=index'),
  314. );
  315. break;
  316. case 'modify_pwd':
  317. $menu_array = array(
  318. array('menu_key'=>'index', 'menu_name'=>'账户安全','menu_url'=>'index.php?act=member_security&op=index'),
  319. array('menu_key'=>'modify_pwd','menu_name'=>'修改登录密码','menu_url'=>'index.php?act=member_security&op=auth&type=modify_pwd'),
  320. );
  321. break;
  322. case 'modify_email':
  323. $menu_array = array(
  324. array('menu_key'=>'index', 'menu_name'=>'账户安全','menu_url'=>'index.php?act=member_security&op=index'),
  325. array('menu_key'=>'modify_email', 'menu_name'=>'邮箱验证','menu_url'=>'index.php?act=member_security&op=auth&type=modify_email'),
  326. );
  327. break;
  328. case 'modify_mobile':
  329. $menu_array = array(
  330. array('menu_key'=>'index', 'menu_name'=>'账户安全','menu_url'=>'index.php?act=member_security&op=index'),
  331. array('menu_key'=>'modify_mobile','menu_name'=>'手机验证','menu_url'=>'index.php?act=member_security&op=auth&type=modify_mobile'),
  332. );
  333. break;
  334. case 'modify_paypwd':
  335. $menu_array = array(
  336. array('menu_key'=>'index', 'menu_name'=>'账户安全','menu_url'=>'index.php?act=member_security&op=index'),
  337. array('menu_key'=>'modify_paypwd','menu_name'=>'设置支付密码','menu_url'=>'index.php?act=member_security&op=auth&type=modify_paypwd'),
  338. );
  339. break;
  340. case 'pd_cash':
  341. $menu_array = array(
  342. array('menu_key'=>'loglist','menu_name'=>'账户余额', 'menu_url'=>'index.php?act=predeposit&op=pd_log_list'),
  343. array('menu_key'=>'recharge_list','menu_name'=>'充值明细', 'menu_url'=>'index.php?act=predeposit&op=index'),
  344. array('menu_key'=>'cashlist','menu_name'=>'余额提现', 'menu_url'=>'index.php?act=predeposit&op=pd_cash_list'),
  345. array('menu_key'=>'pd_cash','menu_name'=>'提现申请','menu_url'=>'index.php?act=member_security&op=auth&type=pd_cash'),
  346. );
  347. break;
  348. }
  349. Tpl::output('member_menu',$menu_array);
  350. Tpl::output('menu_key',$menu_key);
  351. }
  352. }