index_old.php 68 KB

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