index.php 68 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793
  1. <?php
  2. /**
  3. * 会员前台管理中心、账号管理、收藏操作类
  4. */
  5. defined('IN_PHPCMS') or exit('No permission resources.');
  6. pc_base::load_app_class('foreground');
  7. pc_base::load_sys_class('format', '', 0);
  8. pc_base::load_sys_class('form', '', 0);
  9. class index extends foreground {
  10. private $times_db;
  11. function __construct() {
  12. parent::__construct();
  13. $this->http_user_agent = $_SERVER['HTTP_USER_AGENT'];
  14. }
  15. public function init() {
  16. $memberinfo = $this->memberinfo;
  17. $siteid = isset($_REQUEST['siteid']) && trim($_REQUEST['siteid']) ? intval($_REQUEST['siteid']) : 1;
  18. $SEO = seo($siteid);
  19. $CATEGORYS = getcache('category_content_'.$siteid,'commons');
  20. //初始化phpsso
  21. $phpsso_api_url = $this->_init_phpsso();
  22. //获取头像数组
  23. $avatar = $this->client->ps_getavatar($this->memberinfo['phpssouid']);
  24. $grouplist = getcache('grouplist');
  25. $memberinfo['groupname'] = $grouplist[$memberinfo[groupid]]['name'];
  26. include template('member', 'index');
  27. }
  28. public function register() {
  29. $this->_session_start();
  30. //获取用户siteid
  31. $siteid = isset($_REQUEST['siteid']) && trim($_REQUEST['siteid']) ? intval($_REQUEST['siteid']) : 1;
  32. $SEO = seo($siteid);
  33. $CATEGORYS = getcache('category_content_'.$siteid,'commons');
  34. //定义站点id常量
  35. if (!defined('SITEID')) {
  36. define('SITEID', $siteid);
  37. }
  38. //加载用户模块配置
  39. $member_setting = getcache('member_setting');
  40. if(!$member_setting['allowregister']) {
  41. showmessage(L('deny_register'), 'index.php?m=member&c=index&a=login');
  42. }
  43. //加载短信模块配置
  44. $sms_setting_arr = getcache('sms','sms');
  45. $sms_setting = $sms_setting_arr[$siteid];
  46. header("Cache-control: private");
  47. if(isset($_POST['dosubmit'])) {
  48. if(empty($_SESSION['connectid'])) {
  49. //判断验证码
  50. $code = isset($_POST['code']) && trim($_POST['code']) ? trim($_POST['code']) : showmessage(L('input_code'), HTTP_REFERER);
  51. if ($_SESSION['code'] != strtolower($code)) {
  52. showmessage(L('code_error'), HTTP_REFERER);
  53. }
  54. }
  55. $userinfo = array();
  56. $userinfo['encrypt'] = create_randomstr(6);
  57. $userinfo['username'] = (isset($_POST['username']) && is_username($_POST['username'])) ? $_POST['username'] : exit('0');
  58. $userinfo['nickname'] = (isset($_POST['nickname']) && is_username($_POST['nickname'])) ? $_POST['nickname'] : '';
  59. $userinfo['email'] = (isset($_POST['email']) && is_email($_POST['email'])) ? $_POST['email'] : exit('0');
  60. $userinfo['password'] = (isset($_POST['password']) && is_badword($_POST['password'])==false) ? $_POST['password'] : exit('0');
  61. $userinfo['email'] = (isset($_POST['email']) && is_email($_POST['email'])) ? $_POST['email'] : exit('0');
  62. $userinfo['modelid'] = isset($_POST['modelid']) ? intval($_POST['modelid']) : 10;
  63. $userinfo['regip'] = ip();
  64. $userinfo['point'] = $member_setting['defualtpoint'] ? $member_setting['defualtpoint'] : 0;
  65. $userinfo['amount'] = $member_setting['defualtamount'] ? $member_setting['defualtamount'] : 0;
  66. $userinfo['regdate'] = $userinfo['lastdate'] = SYS_TIME;
  67. $userinfo['siteid'] = $siteid;
  68. $userinfo['connectid'] = isset($_SESSION['connectid']) ? $_SESSION['connectid'] : '';
  69. $userinfo['from'] = isset($_SESSION['from']) ? $_SESSION['from'] : '';
  70. //手机强制验证
  71. if($member_setting[mobile_checktype]=='1'){
  72. //取用户手机号
  73. $mobile_verify = $_POST['mobile_verify'] ? intval($_POST['mobile_verify']) : '';
  74. if($mobile_verify=='') showmessage('请提供正确的手机验证码!', HTTP_REFERER);
  75. $sms_report_db = pc_base::load_model('sms_report_model');
  76. $posttime = SYS_TIME-360;
  77. $where = "`id_code`='$mobile_verify' AND `posttime`>'$posttime'";
  78. $r = $sms_report_db->get_one($where,'*','id DESC');
  79. if(!empty($r)){
  80. $userinfo['mobile'] = $r['mobile'];
  81. }else{
  82. showmessage('未检测到正确的手机号码!', HTTP_REFERER);
  83. }
  84. }elseif($member_setting[mobile_checktype]=='2'){
  85. //获取验证码,直接通过POST,取mobile值
  86. $userinfo['mobile'] = isset($_POST['mobile']) ? $_POST['mobile'] : '';
  87. }
  88. if($userinfo['mobile']!=""){
  89. if(!preg_match('/^1([0-9]{10})$/',$userinfo['mobile'])) {
  90. showmessage('请提供正确的手机号码!', HTTP_REFERER);
  91. }
  92. }
  93. unset($_SESSION['connectid'], $_SESSION['from']);
  94. if($member_setting['enablemailcheck']) { //是否需要邮件验证
  95. $userinfo['groupid'] = 7;
  96. } elseif($member_setting['registerverify']) { //是否需要管理员审核
  97. $modelinfo_str = $userinfo['modelinfo'] = isset($_POST['info']) ? array2string(array_map("safe_replace", new_html_special_chars($_POST['info']))) : '';
  98. $this->verify_db = pc_base::load_model('member_verify_model');
  99. unset($userinfo['lastdate'],$userinfo['connectid'],$userinfo['from']);
  100. $userinfo['modelinfo'] = $modelinfo_str;
  101. $this->verify_db->insert($userinfo);
  102. showmessage(L('operation_success'), 'index.php?m=member&c=index&a=register&t=3');
  103. } else {
  104. //查看当前模型是否开启了短信验证功能
  105. $model_field_cache = getcache('model_field_'.$userinfo['modelid'],'model');
  106. if(isset($model_field_cache['mobile']) && $model_field_cache['mobile']['disabled']==0) {
  107. $mobile = $_POST['info']['mobile'];
  108. if(!preg_match('/^1([0-9]{10})$/',$mobile)) showmessage(L('input_right_mobile'));
  109. $sms_report_db = pc_base::load_model('sms_report_model');
  110. $posttime = SYS_TIME-300;
  111. $where = "`mobile`='$mobile' AND `posttime`>'$posttime'";
  112. $r = $sms_report_db->get_one($where);
  113. if(!$r || $r['id_code']!=$_POST['mobile_verify']) showmessage(L('error_sms_code'));
  114. }
  115. $userinfo['groupid'] = $this->_get_usergroup_bypoint($userinfo['point']);
  116. }
  117. //附表信息验证 通过模型获取会员信息
  118. if($member_setting['choosemodel']) {
  119. require_once CACHE_MODEL_PATH.'member_input.class.php';
  120. require_once CACHE_MODEL_PATH.'member_update.class.php';
  121. $member_input = new member_input($userinfo['modelid']);
  122. $_POST['info'] = array_map('new_html_special_chars',$_POST['info']);
  123. $user_model_info = $member_input->get($_POST['info']);
  124. }
  125. if(pc_base::load_config('system', 'phpsso')) {
  126. $this->_init_phpsso();
  127. $status = $this->client->ps_member_register($userinfo['username'], $userinfo['password'], $userinfo['email'], $userinfo['regip'], $userinfo['encrypt']);
  128. if($status > 0) {
  129. $userinfo['phpssouid'] = $status;
  130. //传入phpsso为明文密码,加密后存入phpcms_v9
  131. $password = $userinfo['password'];
  132. $userinfo['password'] = password($userinfo['password'], $userinfo['encrypt']);
  133. $userid = $this->db->insert($userinfo, 1);
  134. if($member_setting['choosemodel']) { //如果开启选择模型
  135. $user_model_info['userid'] = $userid;
  136. //插入会员模型数据
  137. $this->db->set_model($userinfo['modelid']);
  138. $this->db->insert($user_model_info);
  139. }
  140. if($userid > 0) {
  141. //执行登陆操作
  142. if(!$cookietime) $get_cookietime = param::get_cookie('cookietime');
  143. $_cookietime = $cookietime ? intval($cookietime) : ($get_cookietime ? $get_cookietime : 0);
  144. $cookietime = $_cookietime ? TIME + $_cookietime : 0;
  145. if($userinfo['groupid'] == 7) {
  146. param::set_cookie('_username', $userinfo['username'], $cookietime);
  147. param::set_cookie('email', $userinfo['email'], $cookietime);
  148. } else {
  149. $phpcms_auth = sys_auth($userid."\t".$userinfo['password'], 'ENCODE', get_auth_key('login'));
  150. param::set_cookie('auth', $phpcms_auth, $cookietime);
  151. param::set_cookie('_userid', $userid, $cookietime);
  152. param::set_cookie('_username', $userinfo['username'], $cookietime);
  153. param::set_cookie('_nickname', $userinfo['nickname'], $cookietime);
  154. param::set_cookie('_groupid', $userinfo['groupid'], $cookietime);
  155. param::set_cookie('cookietime', $_cookietime, $cookietime);
  156. }
  157. }
  158. //如果需要邮箱认证
  159. if($member_setting['enablemailcheck']) {
  160. pc_base::load_sys_func('mail');
  161. $code = sys_auth($userid.'|'.microtime(true), 'ENCODE', get_auth_key('email'));
  162. $url = APP_PATH."index.php?m=member&c=index&a=register&code=$code&verify=1";
  163. $message = $member_setting['registerverifymessage'];
  164. $message = str_replace(array('{click}','{url}','{username}','{email}','{password}'), array('<a href="'.$url.'">'.L('please_click').'</a>',$url,$userinfo['username'],$userinfo['email'],$password), $message);
  165. sendmail($userinfo['email'], L('reg_verify_email'), $message);
  166. //设置当前注册账号COOKIE,为第二步重发邮件所用
  167. param::set_cookie('_regusername', $userinfo['username'], $cookietime);
  168. param::set_cookie('_reguserid', $userid, $cookietime);
  169. param::set_cookie('_reguseruid', $userinfo['phpssouid'], $cookietime);
  170. showmessage(L('operation_success'), 'index.php?m=member&c=index&a=register&t=2');
  171. } else {
  172. //如果不需要邮箱认证、直接登录其他应用
  173. $synloginstr = $this->client->ps_member_synlogin($userinfo['phpssouid']);
  174. showmessage(L('operation_success').$synloginstr, 'index.php?m=member&c=index&a=init');
  175. }
  176. }
  177. } else {
  178. showmessage(L('enable_register').L('enable_phpsso'), 'index.php?m=member&c=index&a=login');
  179. }
  180. showmessage(L('operation_failure'), HTTP_REFERER);
  181. } else {
  182. if(!pc_base::load_config('system', 'phpsso')) {
  183. showmessage(L('enable_register').L('enable_phpsso'), 'index.php?m=member&c=index&a=login');
  184. }
  185. if(!empty($_GET['verify'])) {
  186. $code = isset($_GET['code']) ? trim($_GET['code']) : showmessage(L('operation_failure'), 'index.php?m=member&c=index');
  187. $code_res = sys_auth($code, 'DECODE', get_auth_key('email'));
  188. $code_arr = explode('|', $code_res);
  189. $userid = isset($code_arr[0]) ? $code_arr[0] : '';
  190. $userid = is_numeric($userid) ? $userid : showmessage(L('operation_failure'), 'index.php?m=member&c=index');
  191. $this->db->update(array('groupid'=>$this->_get_usergroup_bypoint()), array('userid'=>$userid));
  192. showmessage(L('operation_success'), 'index.php?m=member&c=index');
  193. } elseif(!empty($_GET['protocol'])) {
  194. include template('member', 'protocol');
  195. } else {
  196. //过滤非当前站点会员模型
  197. $modellist = getcache('member_model', 'commons');
  198. foreach($modellist as $k=>$v) {
  199. if($v['siteid']!=$siteid || $v['disabled']) {
  200. unset($modellist[$k]);
  201. }
  202. }
  203. if(empty($modellist)) {
  204. showmessage(L('site_have_no_model').L('deny_register'), HTTP_REFERER);
  205. }
  206. //是否开启选择会员模型选项
  207. if($member_setting['choosemodel']) {
  208. $first_model = array_pop(array_reverse($modellist));
  209. $modelid = isset($_GET['modelid']) && in_array($_GET['modelid'], array_keys($modellist)) ? intval($_GET['modelid']) : $first_model['modelid'];
  210. if(array_key_exists($modelid, $modellist)) {
  211. //获取会员模型表单
  212. require CACHE_MODEL_PATH.'member_form.class.php';
  213. $member_form = new member_form($modelid);
  214. $this->db->set_model($modelid);
  215. $forminfos = $forminfos_arr = $member_form->get();
  216. //万能字段过滤
  217. foreach($forminfos as $field=>$info) {
  218. if($info['isomnipotent']) {
  219. unset($forminfos[$field]);
  220. } else {
  221. if($info['formtype']=='omnipotent') {
  222. foreach($forminfos_arr as $_fm=>$_fm_value) {
  223. if($_fm_value['isomnipotent']) {
  224. $info['form'] = str_replace('{'.$_fm.'}',$_fm_value['form'], $info['form']);
  225. }
  226. }
  227. $forminfos[$field]['form'] = $info['form'];
  228. }
  229. }
  230. }
  231. $formValidator = $member_form->formValidator;
  232. }
  233. }
  234. $description = $modellist[$modelid]['description'];
  235. include template('member', 'register');
  236. }
  237. }
  238. }
  239. /*
  240. * 测试邮件配置
  241. */
  242. public function send_newmail() {
  243. $_username = param::get_cookie('_regusername');
  244. $_userid = param::get_cookie('_reguserid');
  245. $_ssouid = param::get_cookie('_reguseruid');
  246. $newemail = $_GET['newemail'];
  247. if($newemail=='' || !is_email($newemail)){//邮箱为空,直接返回错误
  248. return '2';
  249. }
  250. //验证userid和username是否匹配
  251. $r = $this->db->get_one(array('userid'=>intval($_userid)));
  252. if($r[username]!=$_username){
  253. return '2';
  254. }
  255. $this->_init_phpsso();
  256. $status = $this->client->ps_checkemail($newemail);
  257. if($status=='-5'){//邮箱被占用
  258. exit('-1');
  259. }
  260. if ($status==-1) {
  261. $status = $this->client->ps_get_member_info($newemail, 3);
  262. if($status) {
  263. $status = unserialize($status); //接口返回序列化,进行判断
  264. if (!isset($status['uid']) || $status['uid'] != intval($_ssouid)) {
  265. exit('-1');
  266. }
  267. } else {
  268. exit('-1');
  269. }
  270. }
  271. //验证邮箱格式
  272. pc_base::load_sys_func('mail');
  273. $code = sys_auth($_userid.'|'.microtime(true), 'ENCODE', get_auth_key('email'));
  274. $url = APP_PATH."index.php?m=member&c=index&a=register&code=$code&verify=1";
  275. //读取配置获取验证信息
  276. $member_setting = getcache('member_setting');
  277. $message = $member_setting['registerverifymessage'];
  278. $message = str_replace(array('{click}','{url}','{username}','{email}','{password}'), array('<a href="'.$url.'">'.L('please_click').'</a>',$url,$_username,$newemail,$password), $message);
  279. if(sendmail($newemail, L('reg_verify_email'), $message)){
  280. //更新新的邮箱,用来验证
  281. $this->db->update(array('email'=>$newemail), array('userid'=>$_userid));
  282. $this->client->ps_member_edit($_username, $newemail, '', '', $_ssouid);
  283. $return = '1';
  284. }else{
  285. $return = '2';
  286. }
  287. echo $return;
  288. }
  289. public function account_manage() {
  290. $memberinfo = $this->memberinfo;
  291. //初始化phpsso
  292. $phpsso_api_url = $this->_init_phpsso();
  293. //获取头像数组
  294. $avatar = $this->client->ps_getavatar($this->memberinfo['phpssouid']);
  295. $grouplist = getcache('grouplist');
  296. $member_model = getcache('member_model', 'commons');
  297. //获取用户模型数据
  298. $this->db->set_model($this->memberinfo['modelid']);
  299. $member_modelinfo_arr = $this->db->get_one(array('userid'=>$this->memberinfo['userid']));
  300. $model_info = getcache('model_field_'.$this->memberinfo['modelid'], 'model');
  301. foreach($model_info as $k=>$v) {
  302. if($v['formtype'] == 'omnipotent') continue;
  303. if($v['formtype'] == 'image') {
  304. $member_modelinfo[$v['name']] = "<a href='$member_modelinfo_arr[$k]' target='_blank'><img src='$member_modelinfo_arr[$k]' height='40' widht='40' onerror=\"this.src='$phpsso_api_url/statics/images/member/nophoto.gif'\"></a>";
  305. } elseif($v['formtype'] == 'datetime' && $v['fieldtype'] == 'int') { //如果为日期字段
  306. $member_modelinfo[$v['name']] = format::date($member_modelinfo_arr[$k], $v['format'] == 'Y-m-d H:i:s' ? 1 : 0);
  307. } elseif($v['formtype'] == 'images') {
  308. $tmp = string2array($member_modelinfo_arr[$k]);
  309. $member_modelinfo[$v['name']] = '';
  310. if(is_array($tmp)) {
  311. foreach ($tmp as $tv) {
  312. $member_modelinfo[$v['name']] .= " <a href='$tv[url]' target='_blank'><img src='$tv[url]' height='40' widht='40' onerror=\"this.src='$phpsso_api_url/statics/images/member/nophoto.gif'\"></a>";
  313. }
  314. unset($tmp);
  315. }
  316. } elseif($v['formtype'] == 'box') { //box字段,获取字段名称和值的数组
  317. $tmp = explode("\n",$v['options']);
  318. if(is_array($tmp)) {
  319. foreach($tmp as $boxv) {
  320. $box_tmp_arr = explode('|', trim($boxv));
  321. if(is_array($box_tmp_arr) && isset($box_tmp_arr[1]) && isset($box_tmp_arr[0])) {
  322. $box_tmp[$box_tmp_arr[1]] = $box_tmp_arr[0];
  323. $tmp_key = intval($member_modelinfo_arr[$k]);
  324. }
  325. }
  326. }
  327. if(isset($box_tmp[$tmp_key])) {
  328. $member_modelinfo[$v['name']] = $box_tmp[$tmp_key];
  329. } else {
  330. $member_modelinfo[$v['name']] = $member_modelinfo_arr[$k];
  331. }
  332. unset($tmp, $tmp_key, $box_tmp, $box_tmp_arr);
  333. } elseif($v['formtype'] == 'linkage') { //如果为联动菜单
  334. $tmp = string2array($v['setting']);
  335. $tmpid = $tmp['linkageid'];
  336. $linkagelist = getcache($tmpid, 'linkage');
  337. $fullname = $this->_get_linkage_fullname($member_modelinfo_arr[$k], $linkagelist);
  338. $member_modelinfo[$v['name']] = substr($fullname, 0, -1);
  339. unset($tmp, $tmpid, $linkagelist, $fullname);
  340. } else {
  341. $member_modelinfo[$v['name']] = $member_modelinfo_arr[$k];
  342. }
  343. }
  344. include template('member', 'account_manage');
  345. }
  346. public function account_manage_avatar() {
  347. $memberinfo = $this->memberinfo;
  348. //初始化phpsso
  349. $phpsso_api_url = $this->_init_phpsso();
  350. $ps_auth_key = pc_base::load_config('system', 'phpsso_auth_key');
  351. $auth_data = $this->client->auth_data(array('uid'=>$this->memberinfo['phpssouid'],'sys_auth_time'=>microtime(true)), '', $ps_auth_key);
  352. $upurl = base64_encode($phpsso_api_url.'/index.php?m=phpsso&c=index&a=uploadavatar&auth_data='.$auth_data);
  353. //获取头像数组
  354. $avatar = $this->client->ps_getavatar($this->memberinfo['phpssouid']);
  355. include template('member', 'account_manage_avatar');
  356. }
  357. public function account_manage_security() {
  358. $memberinfo = $this->memberinfo;
  359. include template('member', 'account_manage_security');
  360. }
  361. public function account_manage_info() {
  362. if(isset($_POST['dosubmit'])) {
  363. //更新用户昵称
  364. $nickname = isset($_POST['nickname']) && is_username(trim($_POST['nickname'])) ? trim($_POST['nickname']) : '';
  365. $nickname = safe_replace($nickname);
  366. if($nickname) {
  367. $this->db->update(array('nickname'=>$nickname), array('userid'=>$this->memberinfo['userid']));
  368. if(!isset($cookietime)) {
  369. $get_cookietime = param::get_cookie('cookietime');
  370. }
  371. $_cookietime = $cookietime ? intval($cookietime) : ($get_cookietime ? $get_cookietime : 0);
  372. $cookietime = $_cookietime ? TIME + $_cookietime : 0;
  373. param::set_cookie('_nickname', $nickname, $cookietime);
  374. }
  375. require_once CACHE_MODEL_PATH.'member_input.class.php';
  376. require_once CACHE_MODEL_PATH.'member_update.class.php';
  377. $member_input = new member_input($this->memberinfo['modelid']);
  378. $modelinfo = $member_input->get($_POST['info']);
  379. $this->db->set_model($this->memberinfo['modelid']);
  380. $membermodelinfo = $this->db->get_one(array('userid'=>$this->memberinfo['userid']));
  381. if(!empty($membermodelinfo)) {
  382. $this->db->update($modelinfo, array('userid'=>$this->memberinfo['userid']));
  383. } else {
  384. $modelinfo['userid'] = $this->memberinfo['userid'];
  385. $this->db->insert($modelinfo);
  386. }
  387. showmessage(L('operation_success'), HTTP_REFERER);
  388. } else {
  389. $memberinfo = $this->memberinfo;
  390. //获取会员模型表单
  391. require CACHE_MODEL_PATH.'member_form.class.php';
  392. $member_form = new member_form($this->memberinfo['modelid']);
  393. $this->db->set_model($this->memberinfo['modelid']);
  394. $membermodelinfo = $this->db->get_one(array('userid'=>$this->memberinfo['userid']));
  395. $forminfos = $forminfos_arr = $member_form->get($membermodelinfo);
  396. //万能字段过滤
  397. foreach($forminfos as $field=>$info) {
  398. if($info['isomnipotent']) {
  399. unset($forminfos[$field]);
  400. } else {
  401. if($info['formtype']=='omnipotent') {
  402. foreach($forminfos_arr as $_fm=>$_fm_value) {
  403. if($_fm_value['isomnipotent']) {
  404. $info['form'] = str_replace('{'.$_fm.'}',$_fm_value['form'], $info['form']);
  405. }
  406. }
  407. $forminfos[$field]['form'] = $info['form'];
  408. }
  409. }
  410. }
  411. $formValidator = $member_form->formValidator;
  412. include template('member', 'account_manage_info');
  413. }
  414. }
  415. public function account_manage_password() {
  416. if(isset($_POST['dosubmit'])) {
  417. $updateinfo = array();
  418. if(!is_password($_POST['info']['password'])) {
  419. showmessage(L('password_format_incorrect'), HTTP_REFERER);
  420. }
  421. if($this->memberinfo['password'] != password($_POST['info']['password'], $this->memberinfo['encrypt'])) {
  422. showmessage(L('old_password_incorrect'), HTTP_REFERER);
  423. }
  424. //修改会员邮箱
  425. if($this->memberinfo['email'] != $_POST['info']['email'] && is_email($_POST['info']['email'])) {
  426. $email = $_POST['info']['email'];
  427. $updateinfo['email'] = $_POST['info']['email'];
  428. } else {
  429. $email = '';
  430. }
  431. if(!is_password($_POST['info']['newpassword']) || is_badword($_POST['info']['newpassword'])) {
  432. showmessage(L('password_format_incorrect'), HTTP_REFERER);
  433. }
  434. $newpassword = password($_POST['info']['newpassword'], $this->memberinfo['encrypt']);
  435. $updateinfo['password'] = $newpassword;
  436. $this->db->update($updateinfo, array('userid'=>$this->memberinfo['userid']));
  437. if(pc_base::load_config('system', 'phpsso')) {
  438. //初始化phpsso
  439. $this->_init_phpsso();
  440. $res = $this->client->ps_member_edit('', $email, $_POST['info']['password'], $_POST['info']['newpassword'], $this->memberinfo['phpssouid'], $this->memberinfo['encrypt']);
  441. $message_error = array('-1'=>L('user_not_exist'), '-2'=>L('old_password_incorrect'), '-3'=>L('email_already_exist'), '-4'=>L('email_error'), '-5'=>L('param_error'));
  442. if ($res < 0) showmessage($message_error[$res]);
  443. }
  444. showmessage(L('operation_success'), HTTP_REFERER);
  445. } else {
  446. $show_validator = true;
  447. $memberinfo = $this->memberinfo;
  448. include template('member', 'account_manage_password');
  449. }
  450. }
  451. //更换手机号码
  452. public function account_change_mobile() {
  453. $memberinfo = $this->memberinfo;
  454. if(isset($_POST['dosubmit'])) {
  455. if(!is_password($_POST['password'])) {
  456. showmessage(L('password_format_incorrect'), HTTP_REFERER);
  457. }
  458. if($this->memberinfo['password'] != password($_POST['password'], $this->memberinfo['encrypt'])) {
  459. showmessage(L('old_password_incorrect'));
  460. }
  461. $sms_report_db = pc_base::load_model('sms_report_model');
  462. $mobile_verify = $_POST['mobile_verify'];
  463. $mobile = $_POST['mobile'];
  464. if($mobile){
  465. if(!preg_match('/^1([0-9]{10})$/',$mobile)) exit('check phone error');
  466. $posttime = SYS_TIME-600;
  467. $where = "`mobile`='$mobile' AND `send_userid`='".$memberinfo['userid']."' AND `posttime`>'$posttime'";
  468. $r = $sms_report_db->get_one($where,'id,id_code','id DESC');
  469. if($r && $r['id_code']==$mobile_verify) {
  470. $sms_report_db->update(array('id_code'=>''),$where);
  471. $this->db->update(array('mobile'=>$mobile),array('userid'=>$memberinfo['userid']));
  472. showmessage("手机号码更新成功!",'?m=member&c=index&a=account_change_mobile&t=1');
  473. } else {
  474. showmessage("短信验证码错误!请重新获取!");
  475. }
  476. }else{
  477. showmessage("短信验证码已过期!请重新获取!");
  478. }
  479. } else {
  480. include template('member', 'account_change_mobile');
  481. }
  482. }
  483. //选择密码找回方式
  484. public function public_get_password_type() {
  485. $siteid = intval($_GET['siteid']);
  486. include template('member', 'get_password_type');
  487. }
  488. public function account_manage_upgrade() {
  489. $memberinfo = $this->memberinfo;
  490. $grouplist = getcache('grouplist');
  491. if(empty($grouplist[$memberinfo['groupid']]['allowupgrade'])) {
  492. showmessage(L('deny_upgrade'), HTTP_REFERER);
  493. }
  494. if(isset($_POST['upgrade_type']) && intval($_POST['upgrade_type']) < 0) {
  495. showmessage(L('operation_failure'), HTTP_REFERER);
  496. }
  497. if(isset($_POST['upgrade_date']) && intval($_POST['upgrade_date']) < 0) {
  498. showmessage(L('operation_failure'), HTTP_REFERER);
  499. }
  500. if(isset($_POST['dosubmit'])) {
  501. $groupid = isset($_POST['groupid']) ? intval($_POST['groupid']) : showmessage(L('operation_failure'), HTTP_REFERER);
  502. $upgrade_type = isset($_POST['upgrade_type']) ? intval($_POST['upgrade_type']) : showmessage(L('operation_failure'), HTTP_REFERER);
  503. $upgrade_date = !empty($_POST['upgrade_date']) ? intval($_POST['upgrade_date']) : showmessage(L('operation_failure'), HTTP_REFERER);
  504. //消费类型,包年、包月、包日,价格
  505. $typearr = array($grouplist[$groupid]['price_y'], $grouplist[$groupid]['price_m'], $grouplist[$groupid]['price_d']);
  506. //消费类型,包年、包月、包日,时间
  507. $typedatearr = array('366', '31', '1');
  508. //消费的价格
  509. $cost = $typearr[$upgrade_type]*$upgrade_date;
  510. //购买时间
  511. $buydate = $typedatearr[$upgrade_type]*$upgrade_date*86400;
  512. $overduedate = $memberinfo['overduedate'] > SYS_TIME ? ($memberinfo['overduedate']+$buydate) : (SYS_TIME+$buydate);
  513. if($memberinfo['amount'] >= $cost) {
  514. $this->db->update(array('groupid'=>$groupid, 'overduedate'=>$overduedate, 'vip'=>1), array('userid'=>$memberinfo['userid']));
  515. //消费记录
  516. pc_base::load_app_class('spend','pay',0);
  517. spend::amount($cost, L('allowupgrade'), $memberinfo['userid'], $memberinfo['username']);
  518. showmessage(L('operation_success'), 'index.php?m=member&c=index&a=init');
  519. } else {
  520. showmessage(L('operation_failure'), HTTP_REFERER);
  521. }
  522. } else {
  523. $groupid = isset($_GET['groupid']) ? intval($_GET['groupid']) : '';
  524. //初始化phpsso
  525. $phpsso_api_url = $this->_init_phpsso();
  526. //获取头像数组
  527. $avatar = $this->client->ps_getavatar($this->memberinfo['phpssouid']);
  528. $memberinfo['groupname'] = $grouplist[$memberinfo[groupid]]['name'];
  529. $memberinfo['grouppoint'] = $grouplist[$memberinfo[groupid]]['point'];
  530. unset($grouplist[$memberinfo['groupid']]);
  531. include template('member', 'account_manage_upgrade');
  532. }
  533. }
  534. public function login() {
  535. $this->_session_start();
  536. //获取用户siteid
  537. $siteid = isset($_REQUEST['siteid']) && trim($_REQUEST['siteid']) ? intval($_REQUEST['siteid']) : 1;
  538. $SEO = seo($siteid);
  539. $CATEGORYS = getcache('category_content_'.$siteid,'commons');
  540. //定义站点id常量
  541. if (!defined('SITEID')) {
  542. define('SITEID', $siteid);
  543. }
  544. if(isset($_POST['dosubmit'])) {
  545. if(empty($_SESSION['connectid'])) {
  546. //判断验证码
  547. $code = isset($_POST['code']) && trim($_POST['code']) ? trim($_POST['code']) : showmessage(L('input_code'), HTTP_REFERER);
  548. if ($_SESSION['code'] != strtolower($code)) {
  549. $_SESSION['code'] = '';
  550. showmessage(L('code_error'), HTTP_REFERER);
  551. }
  552. $_SESSION['code'] = '';
  553. }
  554. $username = isset($_POST['username']) && is_username($_POST['username']) ? trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
  555. $password = isset($_POST['password']) && trim($_POST['password']) ? addslashes(urldecode(trim($_POST['password']
  556. ))) : showmessage(L('password_empty'), HTTP_REFERER);
  557. is_password($_POST['password']) && is_badword($_POST['password'])==false ? trim($_POST['password']) : showmessage(L('password_format_incorrect'), HTTP_REFERER);
  558. $cookietime = intval($_POST['cookietime']);
  559. $synloginstr = ''; //同步登陆js代码
  560. if(pc_base::load_config('system', 'phpsso')) {
  561. $this->_init_phpsso();
  562. $status = $this->client->ps_member_login($username, $password);
  563. $memberinfo = unserialize($status);
  564. if(isset($memberinfo['uid'])) {
  565. //查询帐号
  566. $r = $this->db->get_one(array('phpssouid'=>$memberinfo['uid']));
  567. if(!$r) {
  568. //插入会员详细信息,会员不存在 插入会员
  569. $info = array(
  570. 'phpssouid'=>$memberinfo['uid'],
  571. 'username'=>$memberinfo['username'],
  572. 'password'=>$memberinfo['password'],
  573. 'encrypt'=>$memberinfo['random'],
  574. 'email'=>$memberinfo['email'],
  575. 'regip'=>$memberinfo['regip'],
  576. 'regdate'=>$memberinfo['regdate'],
  577. 'lastip'=>$memberinfo['lastip'],
  578. 'lastdate'=>$memberinfo['lastdate'],
  579. 'groupid'=>$this->_get_usergroup_bypoint(), //会员默认组
  580. 'modelid'=>10, //普通会员
  581. );
  582. //如果是connect用户
  583. if(!empty($_SESSION['connectid'])) {
  584. $userinfo['connectid'] = $_SESSION['connectid'];
  585. }
  586. if(!empty($_SESSION['from'])) {
  587. $userinfo['from'] = $_SESSION['from'];
  588. }
  589. unset($_SESSION['connectid'], $_SESSION['from']);
  590. $this->db->insert($info);
  591. unset($info);
  592. $r = $this->db->get_one(array('phpssouid'=>$memberinfo['uid']));
  593. }
  594. $password = $r['password'];
  595. $synloginstr = $this->client->ps_member_synlogin($r['phpssouid']);
  596. } else {
  597. if($status == -1) { //用户不存在
  598. showmessage(L('user_not_exist'), 'index.php?m=member&c=index&a=login');
  599. } elseif($status == -2) { //密码错误
  600. showmessage(L('password_error'), 'index.php?m=member&c=index&a=login');
  601. } else {
  602. showmessage(L('login_failure'), 'index.php?m=member&c=index&a=login');
  603. }
  604. }
  605. } else {
  606. //密码错误剩余重试次数
  607. $this->times_db = pc_base::load_model('times_model');
  608. $rtime = $this->times_db->get_one(array('username'=>$username));
  609. if($rtime['times'] > 4) {
  610. $minute = 60 - floor((SYS_TIME - $rtime['logintime']) / 60);
  611. showmessage(L('wait_1_hour', array('minute'=>$minute)));
  612. }
  613. //查询帐号
  614. $r = $this->db->get_one(array('username'=>$username));
  615. if(!$r) showmessage(L('user_not_exist'),'index.php?m=member&c=index&a=login');
  616. //验证用户密码
  617. $password = md5(md5(trim($password)).$r['encrypt']);
  618. if($r['password'] != $password) {
  619. $ip = ip();
  620. if($rtime && $rtime['times'] < 5) {
  621. $times = 5 - intval($rtime['times']);
  622. $this->times_db->update(array('ip'=>$ip, 'times'=>'+=1'), array('username'=>$username));
  623. } else {
  624. $this->times_db->insert(array('username'=>$username, 'ip'=>$ip, 'logintime'=>SYS_TIME, 'times'=>1));
  625. $times = 5;
  626. }
  627. showmessage(L('password_error', array('times'=>$times)), 'index.php?m=member&c=index&a=login', 3000);
  628. }
  629. $this->times_db->delete(array('username'=>$username));
  630. }
  631. //如果用户被锁定
  632. if($r['islock']) {
  633. showmessage(L('user_is_lock'));
  634. }
  635. $userid = $r['userid'];
  636. $groupid = $r['groupid'];
  637. $username = $r['username'];
  638. $nickname = empty($r['nickname']) ? $username : $r['nickname'];
  639. $updatearr = array('lastip'=>ip(), 'lastdate'=>SYS_TIME);
  640. //vip过期,更新vip和会员组
  641. if($r['overduedate'] < SYS_TIME) {
  642. $updatearr['vip'] = 0;
  643. }
  644. //检查用户积分,更新新用户组,除去邮箱认证、禁止访问、游客组用户、vip用户,如果该用户组不允许自助升级则不进行该操作
  645. if($r['point'] >= 0 && !in_array($r['groupid'], array('1', '7', '8')) && empty($r[vip])) {
  646. $grouplist = getcache('grouplist');
  647. if(!empty($grouplist[$r['groupid']]['allowupgrade'])) {
  648. $check_groupid = $this->_get_usergroup_bypoint($r['point']);
  649. if($check_groupid != $r['groupid']) {
  650. $updatearr['groupid'] = $groupid = $check_groupid;
  651. }
  652. }
  653. }
  654. //如果是connect用户
  655. if(!empty($_SESSION['connectid'])) {
  656. $updatearr['connectid'] = $_SESSION['connectid'];
  657. }
  658. if(!empty($_SESSION['from'])) {
  659. $updatearr['from'] = $_SESSION['from'];
  660. }
  661. unset($_SESSION['connectid'], $_SESSION['from']);
  662. $this->db->update($updatearr, array('userid'=>$userid));
  663. if(!isset($cookietime)) {
  664. $get_cookietime = param::get_cookie('cookietime');
  665. }
  666. $_cookietime = $cookietime ? intval($cookietime) : ($get_cookietime ? $get_cookietime : 0);
  667. $cookietime = $_cookietime ? SYS_TIME + $_cookietime : 0;
  668. $phpcms_auth = sys_auth($userid."\t".$password, 'ENCODE', get_auth_key('login'));
  669. param::set_cookie('auth', $phpcms_auth, $cookietime);
  670. param::set_cookie('_userid', $userid, $cookietime);
  671. param::set_cookie('_username', $username, $cookietime);
  672. param::set_cookie('_groupid', $groupid, $cookietime);
  673. param::set_cookie('_nickname', $nickname, $cookietime);
  674. //param::set_cookie('cookietime', $_cookietime, $cookietime);
  675. $forward = isset($_POST['forward']) && !empty($_POST['forward']) ? urldecode($_POST['forward']) : 'index.php?m=member&c=index';
  676. showmessage(L('login_success').$synloginstr, $forward);
  677. } else {
  678. $setting = pc_base::load_config('system');
  679. $forward = isset($_GET['forward']) && trim($_GET['forward']) ? urlencode($_GET['forward']) : '';
  680. $siteid = isset($_REQUEST['siteid']) && trim($_REQUEST['siteid']) ? intval($_REQUEST['siteid']) : 1;
  681. $siteinfo = siteinfo($siteid);
  682. include template('member', 'login');
  683. }
  684. }
  685. public function logout() {
  686. $setting = pc_base::load_config('system');
  687. //snda退出
  688. if($setting['snda_enable'] && param::get_cookie('_from')=='snda') {
  689. param::set_cookie('_from', '');
  690. $forward = isset($_GET['forward']) && trim($_GET['forward']) ? urlencode($_GET['forward']) : '';
  691. $logouturl = 'https://cas.sdo.com/cas/logout?url='.urlencode(APP_PATH.'index.php?m=member&c=index&a=logout&forward='.$forward);
  692. header('Location: '.$logouturl);
  693. } else {
  694. $synlogoutstr = ''; //同步退出js代码
  695. if(pc_base::load_config('system', 'phpsso')) {
  696. $this->_init_phpsso();
  697. $synlogoutstr = $this->client->ps_member_synlogout();
  698. }
  699. param::set_cookie('auth', '');
  700. param::set_cookie('_userid', '');
  701. param::set_cookie('_username', '');
  702. param::set_cookie('_groupid', '');
  703. param::set_cookie('_nickname', '');
  704. param::set_cookie('cookietime', '');
  705. $forward = isset($_GET['forward']) && trim($_GET['forward']) ? $_GET['forward'] : 'index.php?m=member&c=index&a=login';
  706. showmessage(L('logout_success').$synlogoutstr, $forward);
  707. }
  708. }
  709. /**
  710. * 我的收藏
  711. *
  712. */
  713. public function favorite() {
  714. $this->favorite_db = pc_base::load_model('favorite_model');
  715. $memberinfo = $this->memberinfo;
  716. if(isset($_GET['id']) && trim($_GET['id'])) {
  717. $this->favorite_db->delete(array('userid'=>$memberinfo['userid'], 'id'=>intval($_GET['id'])));
  718. showmessage(L('operation_success'), HTTP_REFERER);
  719. } else {
  720. $page = isset($_GET['page']) && trim($_GET['page']) ? intval($_GET['page']) : 1;
  721. $favoritelist = $this->favorite_db->listinfo(array('userid'=>$memberinfo['userid']), 'id DESC', $page, 10);
  722. $pages = $this->favorite_db->pages;
  723. include template('member', 'favorite_list');
  724. }
  725. }
  726. /**
  727. * 我的好友
  728. */
  729. public function friend() {
  730. $memberinfo = $this->memberinfo;
  731. $this->friend_db = pc_base::load_model('friend_model');
  732. if(isset($_GET['friendid'])) {
  733. $this->friend_db->delete(array('userid'=>$memberinfo['userid'], 'friendid'=>intval($_GET['friendid'])));
  734. showmessage(L('operation_success'), HTTP_REFERER);
  735. } else {
  736. //初始化phpsso
  737. $phpsso_api_url = $this->_init_phpsso();
  738. //我的好友列表userid
  739. $page = isset($_GET['page']) ? intval($_GET['page']) : 1;
  740. $friendids = $this->friend_db->listinfo(array('userid'=>$memberinfo['userid']), '', $page, 10);
  741. $pages = $this->friend_db->pages;
  742. foreach($friendids as $k=>$v) {
  743. $friendlist[$k]['friendid'] = $v['friendid'];
  744. $friendlist[$k]['avatar'] = $this->client->ps_getavatar($v['phpssouid']);
  745. $friendlist[$k]['is'] = $v['is'];
  746. }
  747. include template('member', 'friend_list');
  748. }
  749. }
  750. /**
  751. * 积分兑换
  752. */
  753. public function change_credit() {
  754. $memberinfo = $this->memberinfo;
  755. //加载用户模块配置
  756. $member_setting = getcache('member_setting');
  757. $this->_init_phpsso();
  758. $setting = $this->client->ps_getcreditlist();
  759. $outcredit = unserialize($setting);
  760. $setting = $this->client->ps_getapplist();
  761. $applist = unserialize($setting);
  762. if(isset($_POST['dosubmit'])) {
  763. //本系统积分兑换数
  764. $fromvalue = intval($_POST['fromvalue']);
  765. //本系统积分类型
  766. $from = $_POST['from'];
  767. $toappid_to = explode('_', $_POST['to']);
  768. //目标系统appid
  769. $toappid = $toappid_to[0];
  770. //目标系统积分类型
  771. $to = $toappid_to[1];
  772. if($from == 1) {
  773. if($memberinfo['point'] < $fromvalue) {
  774. showmessage(L('need_more_point'), HTTP_REFERER);
  775. }
  776. } elseif($from == 2) {
  777. if($memberinfo['amount'] < $fromvalue) {
  778. showmessage(L('need_more_amount'), HTTP_REFERER);
  779. }
  780. } else {
  781. showmessage(L('credit_setting_error'), HTTP_REFERER);
  782. }
  783. $status = $this->client->ps_changecredit($memberinfo['phpssouid'], $from, $toappid, $to, $fromvalue);
  784. if($status == 1) {
  785. if($from == 1) {
  786. $this->db->update(array('point'=>"-=$fromvalue"), array('userid'=>$memberinfo['userid']));
  787. } elseif($from == 2) {
  788. $this->db->update(array('amount'=>"-=$fromvalue"), array('userid'=>$memberinfo['userid']));
  789. }
  790. showmessage(L('operation_success'), HTTP_REFERER);
  791. } else {
  792. showmessage(L('operation_failure'), HTTP_REFERER);
  793. }
  794. } elseif(isset($_POST['buy'])) {
  795. if(!is_numeric($_POST['money']) || $_POST['money'] < 0) {
  796. showmessage(L('money_error'), HTTP_REFERER);
  797. } else {
  798. $money = intval($_POST['money']);
  799. }
  800. if($memberinfo['amount'] < $money) {
  801. showmessage(L('short_of_money'), HTTP_REFERER);
  802. }
  803. //此处比率读取用户配置
  804. $point = $money*$member_setting['rmb_point_rate'];
  805. $this->db->update(array('point'=>"+=$point"), array('userid'=>$memberinfo['userid']));
  806. //加入消费记录,同时扣除金钱
  807. pc_base::load_app_class('spend','pay',0);
  808. spend::amount($money, L('buy_point'), $memberinfo['userid'], $memberinfo['username']);
  809. showmessage(L('operation_success'), HTTP_REFERER);
  810. } else {
  811. $credit_list = pc_base::load_config('credit');
  812. include template('member', 'change_credit');
  813. }
  814. }
  815. //mini登陆条
  816. public function mini() {
  817. $_username = param::get_cookie('_username');
  818. $_userid = param::get_cookie('_userid');
  819. $siteid = isset($_GET['siteid']) ? intval($_GET['siteid']) : '';
  820. //定义站点id常量
  821. if (!defined('SITEID')) {
  822. define('SITEID', $siteid);
  823. }
  824. $snda_enable = pc_base::load_config('system', 'snda_enable');
  825. include template('member', 'mini');
  826. }
  827. /**
  828. * 初始化phpsso
  829. * about phpsso, include client and client configure
  830. * @return string phpsso_api_url phpsso地址
  831. */
  832. private function _init_phpsso() {
  833. pc_base::load_app_class('client', '', 0);
  834. define('APPID', pc_base::load_config('system', 'phpsso_appid'));
  835. $phpsso_api_url = pc_base::load_config('system', 'phpsso_api_url');
  836. $phpsso_auth_key = pc_base::load_config('system', 'phpsso_auth_key');
  837. $this->client = new client($phpsso_api_url, $phpsso_auth_key);
  838. return $phpsso_api_url;
  839. }
  840. protected function _checkname($username) {
  841. $username = trim($username);
  842. if ($this->db->get_one(array('username'=>$username))){
  843. return false;
  844. }
  845. return true;
  846. }
  847. private function _session_start() {
  848. $session_storage = 'session_'.pc_base::load_config('system','session_storage');
  849. pc_base::load_sys_class($session_storage);
  850. }
  851. /*
  852. * 通过linkageid获取名字路径
  853. */
  854. protected function _get_linkage_fullname($linkageid, $linkagelist) {
  855. $fullname = '';
  856. if($linkagelist['data'][$linkageid]['parentid'] != 0) {
  857. $fullname = $this->_get_linkage_fullname($linkagelist['data'][$linkageid]['parentid'], $linkagelist);
  858. }
  859. //所在地区名称
  860. $return = $fullname.$linkagelist['data'][$linkageid]['name'].'>';
  861. return $return;
  862. }
  863. /**
  864. *根据积分算出用户组
  865. * @param $point int 积分数
  866. */
  867. protected function _get_usergroup_bypoint($point=0) {
  868. $groupid = 2;
  869. if(empty($point)) {
  870. $member_setting = getcache('member_setting');
  871. $point = $member_setting['defualtpoint'] ? $member_setting['defualtpoint'] : 0;
  872. }
  873. $grouplist = getcache('grouplist');
  874. foreach ($grouplist as $k=>$v) {
  875. $grouppointlist[$k] = $v['point'];
  876. }
  877. arsort($grouppointlist);
  878. //如果超出用户组积分设置则为积分最高的用户组
  879. if($point > max($grouppointlist)) {
  880. $groupid = key($grouppointlist);
  881. } else {
  882. foreach ($grouppointlist as $k=>$v) {
  883. if($point >= $v) {
  884. $groupid = $tmp_k;
  885. break;
  886. }
  887. $tmp_k = $k;
  888. }
  889. }
  890. return $groupid;
  891. }
  892. /**
  893. * 检查用户名
  894. * @param string $username 用户名
  895. * @return $status {-4:用户名禁止注册;-1:用户名已经存在 ;1:成功}
  896. */
  897. public function public_checkname_ajax() {
  898. $username = isset($_GET['username']) && trim($_GET['username']) && is_username(trim($_GET['username'])) ? trim($_GET['username']) : exit(0);
  899. if(CHARSET != 'utf-8') {
  900. $username = iconv('utf-8', CHARSET, $username);
  901. $username = addslashes($username);
  902. }
  903. $username = safe_replace($username);
  904. //首先判断会员审核表
  905. $this->verify_db = pc_base::load_model('member_verify_model');
  906. if($this->verify_db->get_one(array('username'=>$username))) {
  907. exit('0');
  908. }
  909. $this->_init_phpsso();
  910. $status = $this->client->ps_checkname($username);
  911. if($status == -4 || $status == -1) {
  912. exit('0');
  913. } else {
  914. exit('1');
  915. }
  916. }
  917. /**
  918. * 检查用户昵称
  919. * @param string $nickname 昵称
  920. * @return $status {0:已存在;1:成功}
  921. */
  922. public function public_checknickname_ajax() {
  923. $nickname = isset($_GET['nickname']) && trim($_GET['nickname']) && is_username(trim($_GET['nickname'])) ? trim($_GET['nickname']) : exit('0');
  924. if(CHARSET != 'utf-8') {
  925. $nickname = iconv('utf-8', CHARSET, $nickname);
  926. $nickname = addslashes($nickname);
  927. }
  928. //首先判断会员审核表
  929. $this->verify_db = pc_base::load_model('member_verify_model');
  930. if($this->verify_db->get_one(array('nickname'=>$nickname))) {
  931. exit('0');
  932. }
  933. if(isset($_GET['userid'])) {
  934. $userid = intval($_GET['userid']);
  935. //如果是会员修改,而且NICKNAME和原来优质一致返回1,否则返回0
  936. $info = get_memberinfo($userid);
  937. if($info['nickname'] == $nickname){//未改变
  938. exit('1');
  939. }else{//已改变,判断是否已有此名
  940. $where = array('nickname'=>$nickname);
  941. $res = $this->db->get_one($where);
  942. if($res) {
  943. exit('0');
  944. } else {
  945. exit('1');
  946. }
  947. }
  948. } else {
  949. $where = array('nickname'=>$nickname);
  950. $res = $this->db->get_one($where);
  951. if($res) {
  952. exit('0');
  953. } else {
  954. exit('1');
  955. }
  956. }
  957. }
  958. /**
  959. * 检查邮箱
  960. * @param string $email
  961. * @return $status {-1:email已经存在 ;-5:邮箱禁止注册;1:成功}
  962. */
  963. public function public_checkemail_ajax() {
  964. $this->_init_phpsso();
  965. $email = isset($_GET['email']) && trim($_GET['email']) && is_email(trim($_GET['email'])) ? trim($_GET['email']) : exit(0);
  966. $status = $this->client->ps_checkemail($email);
  967. if($status == -5) { //禁止注册
  968. exit('0');
  969. } elseif($status == -1) { //用户名已存在,但是修改用户的时候需要判断邮箱是否是当前用户的
  970. if(isset($_GET['phpssouid'])) { //修改用户传入phpssouid
  971. $status = $this->client->ps_get_member_info($email, 3);
  972. if($status) {
  973. $status = unserialize($status); //接口返回序列化,进行判断
  974. if (isset($status['uid']) && $status['uid'] == intval($_GET['phpssouid'])) {
  975. exit('1');
  976. } else {
  977. exit('0');
  978. }
  979. } else {
  980. exit('0');
  981. }
  982. } else {
  983. exit('0');
  984. }
  985. } else {
  986. exit('1');
  987. }
  988. }
  989. public function public_sina_login() {
  990. define('WB_AKEY', pc_base::load_config('system', 'sina_akey'));
  991. define('WB_SKEY', pc_base::load_config('system', 'sina_skey'));
  992. define('WEB_CALLBACK', APP_PATH.'index.php?m=member&c=index&a=public_sina_login&callback=1');
  993. pc_base::load_app_class('saetv2.ex', '' ,0);
  994. $this->_session_start();
  995. if(isset($_GET['callback']) && trim($_GET['callback'])) {
  996. $o = new SaeTOAuthV2(WB_AKEY, WB_SKEY);
  997. if (isset($_REQUEST['code'])) {
  998. $keys = array();
  999. $keys['code'] = $_REQUEST['code'];
  1000. $keys['redirect_uri'] = WEB_CALLBACK;
  1001. try {
  1002. $token = $o->getAccessToken('code', $keys);
  1003. } catch (OAuthException $e) {
  1004. }
  1005. }
  1006. if ($token) {
  1007. $_SESSION['token'] = $token;
  1008. }
  1009. $c = new SaeTClientV2(WB_AKEY, WB_SKEY, $_SESSION['token']['access_token'] );
  1010. $ms = $c->home_timeline(); // done
  1011. $uid_get = $c->get_uid();
  1012. $uid = $uid_get['uid'];
  1013. $me = $c->show_user_by_id( $uid);//根据ID获取用户等基本信息
  1014. if(CHARSET != 'utf-8') {
  1015. $me['name'] = iconv('utf-8', CHARSET, $me['name']);
  1016. $me['location'] = iconv('utf-8', CHARSET, $me['location']);
  1017. $me['description'] = iconv('utf-8', CHARSET, $me['description']);
  1018. $me['screen_name'] = iconv('utf-8', CHARSET, $me['screen_name']);
  1019. }
  1020. if(!empty($me['id'])) {
  1021. //检查connect会员是否绑定,已绑定直接登录,未绑定提示注册/绑定页面
  1022. $where = array('connectid'=>$me['id'], 'from'=>'sina');
  1023. $r = $this->db->get_one($where);
  1024. //connect用户已经绑定本站用户
  1025. if(!empty($r)) {
  1026. //读取本站用户信息,执行登录操作
  1027. $password = $r['password'];
  1028. $this->_init_phpsso();
  1029. $synloginstr = $this->client->ps_member_synlogin($r['phpssouid']);
  1030. $userid = $r['userid'];
  1031. $groupid = $r['groupid'];
  1032. $username = $r['username'];
  1033. $nickname = empty($r['nickname']) ? $username : $r['nickname'];
  1034. $this->db->update(array('lastip'=>ip(), 'lastdate'=>SYS_TIME, 'nickname'=>$me['name']), array('userid'=>$userid));
  1035. if(!$cookietime) $get_cookietime = param::get_cookie('cookietime');
  1036. $_cookietime = $cookietime ? intval($cookietime) : ($get_cookietime ? $get_cookietime : 0);
  1037. $cookietime = $_cookietime ? TIME + $_cookietime : 0;
  1038. $phpcms_auth = sys_auth($userid."\t".$password, 'ENCODE', get_auth_key('login'));
  1039. param::set_cookie('auth', $phpcms_auth, $cookietime);
  1040. param::set_cookie('_userid', $userid, $cookietime);
  1041. param::set_cookie('_username', $username, $cookietime);
  1042. param::set_cookie('_groupid', $groupid, $cookietime);
  1043. param::set_cookie('cookietime', $_cookietime, $cookietime);
  1044. param::set_cookie('_nickname', $nickname, $cookietime);
  1045. $forward = isset($_GET['forward']) && !empty($_GET['forward']) ? $_GET['forward'] : 'index.php?m=member&c=index';
  1046. showmessage(L('login_success').$synloginstr, $forward);
  1047. } else {
  1048. //弹出绑定注册页面
  1049. $_SESSION = array();
  1050. $_SESSION['connectid'] = $me['id'];
  1051. $_SESSION['from'] = 'sina';
  1052. $connect_username = $me['name'];
  1053. //加载用户模块配置
  1054. $member_setting = getcache('member_setting');
  1055. if(!$member_setting['allowregister']) {
  1056. showmessage(L('deny_register'), 'index.php?m=member&c=index&a=login');
  1057. }
  1058. //获取用户siteid
  1059. $siteid = isset($_REQUEST['siteid']) && trim($_REQUEST['siteid']) ? intval($_REQUEST['siteid']) : 1;
  1060. //过滤非当前站点会员模型
  1061. $modellist = getcache('member_model', 'commons');
  1062. foreach($modellist as $k=>$v) {
  1063. if($v['siteid']!=$siteid || $v['disabled']) {
  1064. unset($modellist[$k]);
  1065. }
  1066. }
  1067. if(empty($modellist)) {
  1068. showmessage(L('site_have_no_model').L('deny_register'), HTTP_REFERER);
  1069. }
  1070. $modelid = 10; //设定默认值
  1071. if(array_key_exists($modelid, $modellist)) {
  1072. //获取会员模型表单
  1073. require CACHE_MODEL_PATH.'member_form.class.php';
  1074. $member_form = new member_form($modelid);
  1075. $this->db->set_model($modelid);
  1076. $forminfos = $forminfos_arr = $member_form->get();
  1077. //万能字段过滤
  1078. foreach($forminfos as $field=>$info) {
  1079. if($info['isomnipotent']) {
  1080. unset($forminfos[$field]);
  1081. } else {
  1082. if($info['formtype']=='omnipotent') {
  1083. foreach($forminfos_arr as $_fm=>$_fm_value) {
  1084. if($_fm_value['isomnipotent']) {
  1085. $info['form'] = str_replace('{'.$_fm.'}',$_fm_value['form'], $info['form']);
  1086. }
  1087. }
  1088. $forminfos[$field]['form'] = $info['form'];
  1089. }
  1090. }
  1091. }
  1092. $formValidator = $member_form->formValidator;
  1093. }
  1094. include template('member', 'connect');
  1095. }
  1096. } else {
  1097. showmessage(L('login_failure'), 'index.php?m=member&c=index&a=login');
  1098. }
  1099. } else {
  1100. $o = new SaeTOAuthV2(WB_AKEY, WB_SKEY);
  1101. $aurl = $o->getAuthorizeURL(WEB_CALLBACK);
  1102. include template('member', 'connect_sina');
  1103. }
  1104. }
  1105. /**
  1106. * 盛大通行证登陆
  1107. */
  1108. public function public_snda_login() {
  1109. define('SNDA_AKEY', pc_base::load_config('system', 'snda_akey'));
  1110. define('SNDA_SKEY', pc_base::load_config('system', 'snda_skey'));
  1111. define('SNDA_CALLBACK', urlencode(APP_PATH.'index.php?m=member&c=index&a=public_snda_login&callback=1'));
  1112. pc_base::load_app_class('OauthSDK', '' ,0);
  1113. $this->_session_start();
  1114. if(isset($_GET['callback']) && trim($_GET['callback'])) {
  1115. $o = new OauthSDK(SNDA_AKEY, SNDA_SKEY, SNDA_CALLBACK);
  1116. $code = $_REQUEST['code'];
  1117. $accesstoken = $o->getAccessToken($code);
  1118. if(is_numeric($accesstoken['sdid'])) {
  1119. $userid = $accesstoken['sdid'];
  1120. } else {
  1121. showmessage(L('login_failure'), 'index.php?m=member&c=index&a=login');
  1122. }
  1123. if(!empty($userid)) {
  1124. //检查connect会员是否绑定,已绑定直接登录,未绑定提示注册/绑定页面
  1125. $where = array('connectid'=>$userid, 'from'=>'snda');
  1126. $r = $this->db->get_one($where);
  1127. //connect用户已经绑定本站用户
  1128. if(!empty($r)) {
  1129. //读取本站用户信息,执行登录操作
  1130. $password = $r['password'];
  1131. $this->_init_phpsso();
  1132. $synloginstr = $this->client->ps_member_synlogin($r['phpssouid']);
  1133. $userid = $r['userid'];
  1134. $groupid = $r['groupid'];
  1135. $username = $r['username'];
  1136. $nickname = empty($r['nickname']) ? $username : $r['nickname'];
  1137. $this->db->update(array('lastip'=>ip(), 'lastdate'=>SYS_TIME, 'nickname'=>$me['name']), array('userid'=>$userid));
  1138. if(!$cookietime) $get_cookietime = param::get_cookie('cookietime');
  1139. $_cookietime = $cookietime ? intval($cookietime) : ($get_cookietime ? $get_cookietime : 0);
  1140. $cookietime = $_cookietime ? TIME + $_cookietime : 0;
  1141. $phpcms_auth = sys_auth($userid."\t".$password, 'ENCODE', get_auth_key('login'));
  1142. param::set_cookie('auth', $phpcms_auth, $cookietime);
  1143. param::set_cookie('_userid', $userid, $cookietime);
  1144. param::set_cookie('_username', $username, $cookietime);
  1145. param::set_cookie('_groupid', $groupid, $cookietime);
  1146. param::set_cookie('cookietime', $_cookietime, $cookietime);
  1147. param::set_cookie('_nickname', $nickname, $cookietime);
  1148. param::set_cookie('_from', 'snda');
  1149. $forward = isset($_GET['forward']) && !empty($_GET['forward']) ? $_GET['forward'] : 'index.php?m=member&c=index';
  1150. showmessage(L('login_success').$synloginstr, $forward);
  1151. } else {
  1152. //弹出绑定注册页面
  1153. $_SESSION = array();
  1154. $_SESSION['connectid'] = $userid;
  1155. $_SESSION['from'] = 'snda';
  1156. $connect_username = $userid;
  1157. include template('member', 'connect');
  1158. }
  1159. }
  1160. } else {
  1161. $o = new OauthSDK(SNDA_AKEY, SNDA_SKEY, SNDA_CALLBACK);
  1162. $accesstoken = $o->getSystemToken();
  1163. $aurl = $o->getAuthorizeURL();
  1164. include template('member', 'connect_snda');
  1165. }
  1166. }
  1167. /**
  1168. * QQ号码登录
  1169. * 该函数为QQ登录回调地址
  1170. */
  1171. public function public_qq_loginnew(){
  1172. $appid = pc_base::load_config('system', 'qq_appid');
  1173. $appkey = pc_base::load_config('system', 'qq_appkey');
  1174. $callback = pc_base::load_config('system', 'qq_callback');
  1175. pc_base::load_app_class('qqapi','',0);
  1176. $info = new qqapi($appid,$appkey,$callback);
  1177. $this->_session_start();
  1178. if(!isset($_GET['code'])){
  1179. $info->redirect_to_login();
  1180. }else{
  1181. $code = $_GET['code'];
  1182. $openid = $_SESSION['openid'] = $info->get_openid($code);
  1183. if(!empty($openid)){
  1184. $r = $this->db->get_one(array('connectid'=>$openid,'from'=>'qq'));
  1185. if(!empty($r)){
  1186. //QQ已存在于数据库,则直接转向登陆操作
  1187. $password = $r['password'];
  1188. $this->_init_phpsso();
  1189. $synloginstr = $this->client->ps_member_synlogin($r['phpssouid']);
  1190. $userid = $r['userid'];
  1191. $groupid = $r['groupid'];
  1192. $username = $r['username'];
  1193. $nickname = empty($r['nickname']) ? $username : $r['nickname'];
  1194. $this->db->update(array('lastip'=>ip(), 'lastdate'=>SYS_TIME, 'nickname'=>$me['name']), array('userid'=>$userid));
  1195. if(!$cookietime) $get_cookietime = param::get_cookie('cookietime');
  1196. $_cookietime = $cookietime ? intval($cookietime) : ($get_cookietime ? $get_cookietime : 0);
  1197. $cookietime = $_cookietime ? TIME + $_cookietime : 0;
  1198. $phpcms_auth = sys_auth($userid."\t".$password, 'ENCODE', get_auth_key('login'));
  1199. param::set_cookie('auth', $phpcms_auth, $cookietime);
  1200. param::set_cookie('_userid', $userid, $cookietime);
  1201. param::set_cookie('_username', $username, $cookietime);
  1202. param::set_cookie('_groupid', $groupid, $cookietime);
  1203. param::set_cookie('cookietime', $_cookietime, $cookietime);
  1204. param::set_cookie('_nickname', $nickname, $cookietime);
  1205. $forward = isset($_GET['forward']) && !empty($_GET['forward']) ? $_GET['forward'] : 'index.php?m=member&c=index';
  1206. showmessage(L('login_success').$synloginstr, $forward);
  1207. }else{
  1208. //未存在于数据库中,跳去完善资料页面。页面预置用户名(QQ返回是UTF8编码,如有需要进行转码)
  1209. $user = $info->get_user_info();
  1210. $_SESSION['connectid'] = $openid;
  1211. $_SESSION['from'] = 'qq';
  1212. if(CHARSET != 'utf-8') {//转编码
  1213. $connect_username = iconv('utf-8', CHARSET, $user);
  1214. } else {
  1215. $connect_username = $user;
  1216. }
  1217. include template('member', 'connect');
  1218. }
  1219. }
  1220. }
  1221. }
  1222. /**
  1223. * QQ微博登录
  1224. */
  1225. public function public_qq_login() {
  1226. define('QQ_AKEY', pc_base::load_config('system', 'qq_akey'));
  1227. define('QQ_SKEY', pc_base::load_config('system', 'qq_skey'));
  1228. pc_base::load_app_class('qqoauth', '' ,0);
  1229. $this->_session_start();
  1230. if(isset($_GET['callback']) && trim($_GET['callback'])) {
  1231. $o = new WeiboOAuth(QQ_AKEY, QQ_SKEY, $_SESSION['keys']['oauth_token'], $_SESSION['keys']['oauth_token_secret']);
  1232. $_SESSION['last_key'] = $o->getAccessToken($_REQUEST['oauth_verifier']);
  1233. if(!empty($_SESSION['last_key']['name'])) {
  1234. //检查connect会员是否绑定,已绑定直接登录,未绑定提示注册/绑定页面
  1235. $where = array('connectid'=>$_REQUEST['openid'], 'from'=>'qq');
  1236. $r = $this->db->get_one($where);
  1237. //connect用户已经绑定本站用户
  1238. if(!empty($r)) {
  1239. //读取本站用户信息,执行登录操作
  1240. $password = $r['password'];
  1241. $this->_init_phpsso();
  1242. $synloginstr = $this->client->ps_member_synlogin($r['phpssouid']);
  1243. $userid = $r['userid'];
  1244. $groupid = $r['groupid'];
  1245. $username = $r['username'];
  1246. $nickname = empty($r['nickname']) ? $username : $r['nickname'];
  1247. $this->db->update(array('lastip'=>ip(), 'lastdate'=>SYS_TIME, 'nickname'=>$me['name']), array('userid'=>$userid));
  1248. if(!$cookietime) $get_cookietime = param::get_cookie('cookietime');
  1249. $_cookietime = $cookietime ? intval($cookietime) : ($get_cookietime ? $get_cookietime : 0);
  1250. $cookietime = $_cookietime ? TIME + $_cookietime : 0;
  1251. $phpcms_auth = sys_auth($userid."\t".$password, 'ENCODE', get_auth_key('login'));
  1252. param::set_cookie('auth', $phpcms_auth, $cookietime);
  1253. param::set_cookie('_userid', $userid, $cookietime);
  1254. param::set_cookie('_username', $username, $cookietime);
  1255. param::set_cookie('_groupid', $groupid, $cookietime);
  1256. param::set_cookie('cookietime', $_cookietime, $cookietime);
  1257. param::set_cookie('_nickname', $nickname, $cookietime);
  1258. param::set_cookie('_from', 'snda');
  1259. $forward = isset($_GET['forward']) && !empty($_GET['forward']) ? $_GET['forward'] : 'index.php?m=member&c=index';
  1260. showmessage(L('login_success').$synloginstr, $forward);
  1261. } else {
  1262. //弹出绑定注册页面
  1263. $_SESSION = array();
  1264. $_SESSION['connectid'] = $_REQUEST['openid'];
  1265. $_SESSION['from'] = 'qq';
  1266. $connect_username = $_SESSION['last_key']['name'];
  1267. //加载用户模块配置
  1268. $member_setting = getcache('member_setting');
  1269. if(!$member_setting['allowregister']) {
  1270. showmessage(L('deny_register'), 'index.php?m=member&c=index&a=login');
  1271. }
  1272. //获取用户siteid
  1273. $siteid = isset($_REQUEST['siteid']) && trim($_REQUEST['siteid']) ? intval($_REQUEST['siteid']) : 1;
  1274. //过滤非当前站点会员模型
  1275. $modellist = getcache('member_model', 'commons');
  1276. foreach($modellist as $k=>$v) {
  1277. if($v['siteid']!=$siteid || $v['disabled']) {
  1278. unset($modellist[$k]);
  1279. }
  1280. }
  1281. if(empty($modellist)) {
  1282. showmessage(L('site_have_no_model').L('deny_register'), HTTP_REFERER);
  1283. }
  1284. $modelid = 10; //设定默认值
  1285. if(array_key_exists($modelid, $modellist)) {
  1286. //获取会员模型表单
  1287. require CACHE_MODEL_PATH.'member_form.class.php';
  1288. $member_form = new member_form($modelid);
  1289. $this->db->set_model($modelid);
  1290. $forminfos = $forminfos_arr = $member_form->get();
  1291. //万能字段过滤
  1292. foreach($forminfos as $field=>$info) {
  1293. if($info['isomnipotent']) {
  1294. unset($forminfos[$field]);
  1295. } else {
  1296. if($info['formtype']=='omnipotent') {
  1297. foreach($forminfos_arr as $_fm=>$_fm_value) {
  1298. if($_fm_value['isomnipotent']) {
  1299. $info['form'] = str_replace('{'.$_fm.'}',$_fm_value['form'], $info['form']);
  1300. }
  1301. }
  1302. $forminfos[$field]['form'] = $info['form'];
  1303. }
  1304. }
  1305. }
  1306. $formValidator = $member_form->formValidator;
  1307. }
  1308. include template('member', 'connect');
  1309. }
  1310. } else {
  1311. showmessage(L('login_failure'), 'index.php?m=member&c=index&a=login');
  1312. }
  1313. } else {
  1314. $oauth_callback = APP_PATH.'index.php?m=member&c=index&a=public_qq_login&callback=1';
  1315. $oauth_nonce = md5(SYS_TIME);
  1316. $oauth_signature_method = 'HMAC-SHA1';
  1317. $oauth_timestamp = SYS_TIME;
  1318. $oauth_version = '1.0';
  1319. $url = "https://open.t.qq.com/cgi-bin/request_token?oauth_callback=$oauth_callback&oauth_consumer_key=".QQ_AKEY."&oauth_nonce=$oauth_nonce&oauth_signature=".QQ_SKEY."&oauth_signature_method=HMAC-SHA1&oauth_timestamp=$oauth_timestamp&oauth_version=$oauth_version";
  1320. $o = new WeiboOAuth(QQ_AKEY, QQ_SKEY);
  1321. $keys = $o->getRequestToken(array('callback'=>$oauth_callback));
  1322. $_SESSION['keys'] = $keys;
  1323. $aurl = $o->getAuthorizeURL($keys['oauth_token'] ,false , $oauth_callback);
  1324. include template('member', 'connect_qq');
  1325. }
  1326. }
  1327. /**
  1328. * 找回密码
  1329. * 新增加短信找回方式
  1330. */
  1331. public function public_forget_password () {
  1332. $email_config = getcache('common', 'commons');
  1333. //SMTP MAIL 二种发送模式
  1334. if($email_config['mail_type'] == '1'){
  1335. if(empty($email_config['mail_user']) || empty($email_config['mail_password'])) {
  1336. showmessage(L('email_config_empty'), HTTP_REFERER);
  1337. }
  1338. }
  1339. $this->_session_start();
  1340. $member_setting = getcache('member_setting');
  1341. if(isset($_POST['dosubmit'])) {
  1342. if ($_SESSION['code'] != strtolower($_POST['code'])) {
  1343. showmessage(L('code_error'), HTTP_REFERER);
  1344. }
  1345. //邮箱验证
  1346. if(!is_email($_POST['email'])){
  1347. showmessage(L('email_error'), HTTP_REFERER);
  1348. }
  1349. $memberinfo = $this->db->get_one(array('email'=>$_POST['email']));
  1350. if(!empty($memberinfo['email'])) {
  1351. $email = $memberinfo['email'];
  1352. } else {
  1353. showmessage(L('email_error'), HTTP_REFERER);
  1354. }
  1355. pc_base::load_sys_func('mail');
  1356. $code = sys_auth($memberinfo['userid']."\t".microtime(true), 'ENCODE', get_auth_key('email'));
  1357. $url = APP_PATH."index.php?m=member&c=index&a=public_forget_password&code=$code";
  1358. $message = $member_setting['forgetpassword'];
  1359. $message = str_replace(array('{click}','{url}'), array('<a href="'.$url.'">'.L('please_click').'</a>',$url), $message);
  1360. //获取站点名称
  1361. $sitelist = getcache('sitelist', 'commons');
  1362. if(isset($sitelist[$memberinfo['siteid']]['name'])) {
  1363. $sitename = $sitelist[$memberinfo['siteid']]['name'];
  1364. } else {
  1365. $sitename = 'PHPCMS_V9_MAIL';
  1366. }
  1367. sendmail($email, L('forgetpassword'), $message, '', '', $sitename);
  1368. showmessage(L('operation_success'), 'index.php?m=member&c=index&a=login');
  1369. } elseif($_GET['code']) {
  1370. $hour = date('y-m-d h', SYS_TIME);
  1371. $code = sys_auth($_GET['code'], 'DECODE', get_auth_key('email'));
  1372. $code = explode("\t", $code);
  1373. if(is_array($code) && is_numeric($code[0]) && date('y-m-d h', SYS_TIME) == date('y-m-d h', $code[1])) {
  1374. $memberinfo = $this->db->get_one(array('userid'=>$code[0]));
  1375. if(empty($memberinfo['phpssouid'])) {
  1376. showmessage(L('operation_failure'), 'index.php?m=member&c=index&a=login');
  1377. }
  1378. $updateinfo = array();
  1379. $password = random(8,"23456789abcdefghkmnrstwxy");
  1380. $updateinfo['password'] = password($password, $memberinfo['encrypt']);
  1381. $this->db->update($updateinfo, array('userid'=>$code[0]));
  1382. if(pc_base::load_config('system', 'phpsso')) {
  1383. //初始化phpsso
  1384. $this->_init_phpsso();
  1385. $this->client->ps_member_edit('', $email, '', $password, $memberinfo['phpssouid'], $memberinfo['encrypt']);
  1386. }
  1387. $email = $memberinfo['email'];
  1388. //获取站点名称
  1389. $sitelist = getcache('sitelist', 'commons');
  1390. if(isset($sitelist[$memberinfo['siteid']]['name'])) {
  1391. $sitename = $sitelist[$memberinfo['siteid']]['name'];
  1392. } else {
  1393. $sitename = 'PHPCMS_V9_MAIL';
  1394. }
  1395. pc_base::load_sys_func('mail');
  1396. sendmail($email, L('forgetpassword'), "New password:".$password, '', '', $sitename);
  1397. showmessage(L('operation_success').L('newpassword').':'.$password);
  1398. } else {
  1399. showmessage(L('operation_failure'), 'index.php?m=member&c=index&a=login');
  1400. }
  1401. } else {
  1402. $siteid = isset($_REQUEST['siteid']) && trim($_REQUEST['siteid']) ? intval($_REQUEST['siteid']) : 1;
  1403. $siteinfo = siteinfo($siteid);
  1404. include template('member', 'forget_password');
  1405. }
  1406. }
  1407. /**
  1408. *通过手机修改密码
  1409. *方式:用户发送HHPWD afei985#821008 至 1065788 ,PHPCMS进行转发到网站运营者指定的回调地址,在回调地址程序进行密码修改等操作,处理成功时给用户发条短信确认。
  1410. *phpcms 以POST方式传递相关数据到回调程序中
  1411. *要求:网站中会员系统,mobile做为主表字段,并且唯一(如已经有手机号码,把号码字段转为主表字段中)
  1412. */
  1413. public function public_changepwd_bymobile(){
  1414. $phone = $_REQUEST['phone'];
  1415. $msg = $_REQUEST['msg'];
  1416. $sms_key = $_REQUEST['sms_passwd'];
  1417. $sms_pid = $_REQUEST['sms_pid'];
  1418. if(empty($phone) || empty($msg) || empty($sms_key) || empty($sms_pid)){
  1419. return false;
  1420. }
  1421. if(!preg_match('/^1([0-9]{10})$/',$phone)) {
  1422. return false;
  1423. }
  1424. //判断是否PHPCMS请求的接口
  1425. pc_base::load_app_func('global','sms');
  1426. pc_base::load_app_class('smsapi', 'sms', 0);
  1427. $this->sms_setting_arr = getcache('sms');
  1428. $siteid = $_REQUEST['siteid'] ? $_REQUEST['siteid'] : 1;
  1429. if(!empty($this->sms_setting_arr[$siteid])) {
  1430. $this->sms_setting = $this->sms_setting_arr[$siteid];
  1431. } else {
  1432. $this->sms_setting = array('userid'=>'', 'productid'=>'', 'sms_key'=>'');
  1433. }
  1434. if($sms_key != $this->sms_setting['sms_key'] || $sms_pid != $this->sms_setting['productid']){
  1435. return false;
  1436. }
  1437. //取用户名
  1438. $msg_array = explode("@@",$str);
  1439. $newpwd = $msg_array[1];
  1440. $username = $msg_array[2];
  1441. $array = $this->db->get_one(array('mobile'=>$phone,'username'=>$username));
  1442. if(empty($array)){
  1443. echo 1;
  1444. }else{
  1445. $result = $this->db->update(array('password'=>$newpwd),array('mobile'=>$phone,'username'=>$username));
  1446. if($result){
  1447. //修改成功,发送短信给用户回执
  1448. //检查短信余额
  1449. if($this->sms_setting['sms_key']) {
  1450. $smsinfo = $this->smsapi->get_smsinfo();
  1451. }
  1452. if($smsinfo['surplus'] < 1) {
  1453. echo 1;
  1454. }else{
  1455. $this->smsapi = new smsapi($this->sms_setting['userid'], $this->sms_setting['productid'], $this->sms_setting['sms_key']);
  1456. $content = '你好,'.$username.',你的新密码已经修改成功:'.$newpwd.' ,请妥善保存!';
  1457. $return = $this->smsapi->send_sms($phone, $content, SYS_TIME, CHARSET);
  1458. echo 1;
  1459. }
  1460. }
  1461. }
  1462. }
  1463. /**
  1464. * 手机短信方式找回密码
  1465. */
  1466. public function public_forget_password_mobile () {
  1467. $step = intval($_POST['step']);
  1468. $step = max($step,1);
  1469. $this->_session_start();
  1470. if(isset($_POST['dosubmit']) && $step==2) {
  1471. //处理提交申请,以手机号为准
  1472. if ($_SESSION['code'] != strtolower($_POST['code'])) {
  1473. showmessage(L('code_error'), HTTP_REFERER);
  1474. }
  1475. //验证
  1476. if(!is_username($_POST['username'])){
  1477. showmessage(L('username_format_incorrect'), HTTP_REFERER);
  1478. }
  1479. $username = safe_replace($_POST['username']);
  1480. $r = $this->db->get_one(array('username'=>$username),'userid,mobile');
  1481. if($r['mobile']=='') {
  1482. $_SESSION['mobile'] = '';
  1483. $_SESSION['userid'] = '';
  1484. $_SESSION['code'] = '';
  1485. showmessage("该账号没有绑定手机号码,请选择其他方式找回!");
  1486. }
  1487. $_SESSION['mobile'] = $r['mobile'];
  1488. $_SESSION['userid'] = $r['userid'];
  1489. include template('member', 'forget_password_mobile');
  1490. } elseif(isset($_POST['dosubmit']) && $step==3) {
  1491. $sms_report_db = pc_base::load_model('sms_report_model');
  1492. $mobile_verify = $_POST['mobile_verify'];
  1493. $mobile = $_SESSION['mobile'];
  1494. if($mobile){
  1495. if(!preg_match('/^1([0-9]{10})$/',$mobile)) exit('check phone error');
  1496. pc_base::load_app_func('global','sms');
  1497. $posttime = SYS_TIME-600;
  1498. $where = "`mobile`='$mobile' AND `posttime`>'$posttime'";
  1499. $r = $sms_report_db->get_one($where,'id,id_code','id DESC');
  1500. if($r && $r['id_code']==$mobile_verify) {
  1501. $sms_report_db->update(array('id_code'=>''),$where);
  1502. $userid = $_SESSION['userid'];
  1503. $updateinfo = array();
  1504. $password = random(8,"23456789abcdefghkmnrstwxy");
  1505. $encrypt = random(6,"23456789abcdefghkmnrstwxyABCDEFGHKMNRSTWXY");
  1506. $updateinfo['encrypt'] = $encrypt;
  1507. $updateinfo['password'] = password($password, $encrypt);
  1508. $this->db->update($updateinfo, array('userid'=>$userid));
  1509. $rs = $this->db->get_one(array('userid'=>$userid),'phpssouid');
  1510. if(pc_base::load_config('system', 'phpsso')) {
  1511. //初始化phpsso
  1512. $this->_init_phpsso();
  1513. $this->client->ps_member_edit('', '', '', $password, $rs['phpssouid'], $encrypt);
  1514. }
  1515. $status = sendsms($mobile, $password, 5);
  1516. if($status!==0) showmessage($status);
  1517. $_SESSION['mobile'] = '';
  1518. $_SESSION['userid'] = '';
  1519. $_SESSION['code'] = '';
  1520. showmessage("密码已重置成功!请查收手机",'?m=member&c=index&a=login');
  1521. } else {
  1522. showmessage("短信验证码错误!请重新获取!");
  1523. }
  1524. }else{
  1525. showmessage("短信验证码已过期!请重新获取!");
  1526. }
  1527. } else {
  1528. $siteid = isset($_REQUEST['siteid']) && trim($_REQUEST['siteid']) ? intval($_REQUEST['siteid']) : 1;
  1529. $siteinfo = siteinfo($siteid);
  1530. include template('member', 'forget_password_mobile');
  1531. }
  1532. }
  1533. //通过用户名找回密码
  1534. public function public_forget_password_username() {
  1535. $step = intval($_POST['step']);
  1536. $step = max($step,1);
  1537. $this->_session_start();
  1538. if(isset($_POST['dosubmit']) && $step==2) {
  1539. //处理提交申请,以手机号为准
  1540. if ($_SESSION['code'] != strtolower($_POST['code'])) {
  1541. showmessage(L('code_error'), HTTP_REFERER);
  1542. }
  1543. //验证
  1544. if(!is_username($_POST['username'])){
  1545. showmessage(L('username_format_incorrect'), HTTP_REFERER);
  1546. }
  1547. $username = safe_replace($_POST['username']);
  1548. $r = $this->db->get_one(array('username'=>$username),'userid,email');
  1549. if($r['email']=='') {
  1550. $_SESSION['userid'] = '';
  1551. $_SESSION['code'] = '';
  1552. showmessage("该账号没有绑定邮箱,请选择其他方式找回!");
  1553. } else {
  1554. $_SESSION['userid'] = $r['userid'];
  1555. $_SESSION['email'] = $r['email'];
  1556. }
  1557. $_SESSION['emc'] = "";
  1558. $_SESSION['emc_times']=0;
  1559. $email_arr = explode('@',$r['email']);
  1560. include template('member', 'forget_password_username');
  1561. } elseif(isset($_POST['dosubmit']) && $step==3) {
  1562. $sms_report_db = pc_base::load_model('sms_report_model');
  1563. $mobile_verify = $_POST['mobile_verify'];
  1564. $email = $_SESSION['email'];
  1565. if($email){
  1566. if(!preg_match('/^([a-z0-9_]+)@([a-z0-9_]+).([a-z]{2,6})$/',$email)) exit('check email error');
  1567. if($_SESSION['emc_times']=='' || $_SESSION['emc_times']<=0){
  1568. showmessage("验证次数超过5次,验证码失效,请重新获取邮箱验证码!",HTTP_REFERER,3000);
  1569. }
  1570. $_SESSION['emc_times'] = $_SESSION['emc_times']-1;
  1571. if($_SESSION['emc']!='' && $_POST['email_verify']==$_SESSION['emc']) {
  1572. $userid = $_SESSION['userid'];
  1573. $updateinfo = array();
  1574. $password = random(8,"23456789abcdefghkmnrstwxy");
  1575. $encrypt = random(6,"23456789abcdefghkmnrstwxyABCDEFGHKMNRSTWXY");
  1576. $updateinfo['encrypt'] = $encrypt;
  1577. $updateinfo['password'] = password($password, $encrypt);
  1578. $this->db->update($updateinfo, array('userid'=>$userid));
  1579. $rs = $this->db->get_one(array('userid'=>$userid),'phpssouid');
  1580. if(pc_base::load_config('system', 'phpsso')) {
  1581. //初始化phpsso
  1582. $this->_init_phpsso();
  1583. $this->client->ps_member_edit('', '', '', $password, $rs['phpssouid'], $encrypt);
  1584. }
  1585. $_SESSION['email'] = '';
  1586. $_SESSION['userid'] = '';
  1587. $_SESSION['emc'] = '';
  1588. $_SESSION['code'] = '';
  1589. pc_base::load_sys_func('mail');
  1590. sendmail($email, '密码重置通知', "您在".date('Y-m-d H:i:s')."通过密码找回功能,重置了本站密码。");
  1591. include template('member', 'forget_password_username');
  1592. exit;
  1593. } else {
  1594. showmessage("验证码错误!请重新获取!",HTTP_REFERER,3000);
  1595. }
  1596. } else {
  1597. showmessage("非法请求!");
  1598. }
  1599. } else {
  1600. include template('member', 'forget_password_username');
  1601. }
  1602. }
  1603. //邮箱获取验证码
  1604. public function public_get_email_verify() {
  1605. pc_base::load_sys_func('mail');
  1606. $this->_session_start();
  1607. $code = $_SESSION['emc'] = random(8,"23456789abcdefghkmnrstwxy");
  1608. $_SESSION['emc_times']=5;
  1609. $message = '您的验证码为:'.$code;
  1610. sendmail($_SESSION['email'], '邮箱找回密码验证', $message);
  1611. echo '1';
  1612. }
  1613. }
  1614. ?>