sid = $sid; $this->scode = $scode; $this->app_id = $app_id; $this->dev_key = $dev_key; $this->market_key = $market_key; $this->return_url = $return_url; $this->return_parameter = $return_parameter; $this->fail_url = $fail_url; } public function to_array() { return (array)$this; } public function to_string() { return json_encode($this, JSON_UNESCAPED_UNICODE); } public function from_array($array) { foreach ($array as $key => $value) { if (property_exists($this, $key)) $this->$key = $value; } return true; } public function from_string($string) { return $this->from_array((array)json_decode($string)); } /** * @param $string * @return LoginCallbackInformation */ static public function CreateWithString($string) { $return = new LoginCallbackInformation(); $return->from_string($string); return $return; } /** * @param $array * @return LoginCallbackInformation */ static public function CreateWithArray($array) { $return = new LoginCallbackInformation(); $return->from_array($array); return $return; } } /** * * 登录管理 * @path("/login") */ class Login extends apiBase { /** * 获得登录方式 * @route({"GET","/"}) * @throws({"phprs\util\exceptions\Forbidden","res", "403 Forbidden",{"error":"Forbidden"}}) cookie不可用 * @return("body") */ public function getLoginType() { $result = array( //0 => array( // 'name' => '微信登录', // 'url' => $this->getFullUrl('/api/login/weixin'), // 'third' => 'weixin', //), //1 => array( // 'name' => 'QQ登录', // 'url' => $this->getFullUrl('/api/login/qq'), // 'third' => 'qq', //), 0 => array( 'name' => '聚开心登录', 'url' => $this->getFullUrl('/api/login/jkx'), 'third' => 'jkx', ), ); return $result; } /** * 获得登录方式 * @route({"GET","/querylist"}) * @route({"POST","/querylist"}) * @param({"market_key","$._POST.market_key"}) 门店key * @param({"logintype","$._POST.logintype"}) 登陆方式 * @param({"silence","$._POST.silence"}) 是否静默方式 * @throws({"phprs\util\exceptions\Forbidden","res", "403 Forbidden",{"error":"Forbidden"}}) cookie不可用 * @return("body") */ public function getLoginList($market_key = '', $logintype = 0, $silence = null) { // 尝试使用框架注入的数据库连接,如果失败则使用直接连接 $db = $this->db; if (!$db) { try { $db = new PDO( "mysql:host=" . env('API_DB_HOST', 'rm-bp1btyuwq77591x0jpo.mysql.rds.aliyuncs.com') . ":" . env('API_DB_PORT', '3306') . ";dbname=" . env('API_DB_NAME', 'youlehudong') . ";charset=utf8", env('API_DB_USER', 'games'), env('API_DB_PASSWORD', 'Games0791!!'), [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] ); } catch (Exception $e) { // 如果数据库连接失败,返回默认的微信登录配置 $default_data = [[ 'type_id' => 2, 'type_key' => '0002', 'type_name' => '微信登录', 'image' => 'img/wx.png', 'url' => $this->getFullUrl('api/login/weixin'), 'component' => null, 'is_third' => 1, 'third_flag' => 'weixin' ]]; return json_encode($default_data, JSON_UNESCAPED_UNICODE); } } if (empty($market_key)) { $condition = 'is_enabled = 1 and is_silence = ' . intval(empty($silence) ? 0 : $silence); if (!empty($logintype)) $condition .= sprintf(' and type_id = %d', intval($logintype)); $data = Sql::Select('type_id,type_key,type_name,image,url,component,is_third,third_flag') ->from('syweb_logintype_base') ->where($condition) ->get($db); } else { $condition = 'a.type_key = b.type_key and a.is_enabled = 1 and b.is_enabled = 1 and market_key = ? and a.is_silence = ' . intval(empty($silence) ? 0 : $silence); if (!empty($logintype)) $condition .= sprintf(' and a.type_id = %d', intval($logintype)); $data = Sql::Select('a.type_id,a.type_key,a.type_name,a.image,a.url,a.component,a.is_third,a.third_flag') ->from('syweb_logintype_base a, syweb_logintype_market b') ->where($condition, $market_key) ->get($db); } foreach ($data as $key=>&$value) { $value['url'] = $this->getFullUrl($value['url']); } return json_encode($data, JSON_UNESCAPED_UNICODE); } /** * 使用QQ授权登录 * @route({"GET","/qq"}) * @param({"appid","$._GET.appid"}) 应用appid * @param({"devkey","$._GET.devkey"}) 开发者key * @param({"market_key","$._GET.market_key"}) 门店key * @param({"scode","$._GET.scode"}) 客户端生成的Scode * @param({"target","$._GET.target"}) 客户端需要回调的地址 * @param({"state","$._POST.state"}) 随机参数 * @throws({"phprs\util\exceptions\Forbidden","res", "403 Forbidden",{"error":"Forbidden"}}) cookie不可用 */ public function qqLogin($appid = "", $devkey = "", $market_key = "", $scode, $target, $state = '') { require_once __DIR__ . '/../../loginLib/qq/API/qqConnectAPI.php'; if (empty($appid)) { $result["error"] = '1'; $result["error_code"] = 10001; // 未传入appid参数 return $result; } if (empty($devkey)) { $result["error"] = '1'; $result["error_code"] = 10002; // 未传入devkey参数 return $result; } $devList = Sql::select('syweb_admin.*') ->from('syweb_admin') ->where('syweb_admin.type=2 and syweb_admin.devkey=? and syweb_admin.status=1', $devkey) ->get($this->db, null); if (empty($devList) || count($devList) <= 0) { $result["error"] = '1'; $result["error_code"] = 10003; // devkey无效 return $result; } $devInfo = $devList[0]; $appList = Sql::select('syweb_app.*') ->from('syweb_app') ->where('syweb_app.appid=? and syweb_app.dev_id=? and status=1', $appid, $devInfo['id']) ->get($this->db, null); if (empty($appList) || count($appList) <= 0) { $result["error"] = '1'; $result["error_code"] = 10004; // 指定的应用不存在或未被审核 return $result; } $appInfo = $appList[0]; $marketList = Sql::select('syweb_market.*') ->from('syweb_market') ->where('syweb_market.marketid=?', $market_key) ->get($this->db, null); if (empty($marketList) || count($marketList) <= 0) { $result["error"] = '1'; $result["error_code"] = 10007; // 指定的商家不存在 return $result; } $marketInfo = $marketList[0]; //开启一个会话 session_start(); $_SESSION[LOGINPARAMETER_CALLBACK] = (new LoginCallbackInformation('', $scode, $appInfo['id'], $devkey, $marketInfo['id'], $target))->to_string(); $qc = new QC(); $qc->qq_login(); } /** * QQ授权登录回调 * @route({"GET","/qq/callback"}) * @throws({"phprs\util\exceptions\Forbidden","res", "403 Forbidden",{"error":"Forbidden"}}) cookie不可用 */ public function qqLoginCallback() { session_start(); $scode = ""; $target = ""; $app_id = ""; $devkey = ""; $market_id = ""; if (isset($_SESSION[LOGINPARAMETER_CALLBACK])) { $login = LoginCallbackInformation::CreateWithString($_SESSION[LOGINPARAMETER_CALLBACK]); $scode = $login->scode; $target = $login->return_url; $app_id = $login->app_id; $devkey = $login->dev_key; $market_id = $login->market_key; } if (!$scode || !$target || !$app_id || !$devkey || !$market_id) { return "登录失败!"; } require_once __DIR__ . '/../../loginLib/qq/API/qqConnectAPI.php'; $qc = new QC(); $access_token = $qc->qq_callback(); $openId = $qc->get_openid(); if (empty($openId)) { return "授权登录失败!"; } // 获得QQ授权获得的QQ信息 $qc = new QC($access_token, $openId); $userinfo = $qc->get_user_info(); /* foreach($userinfo as $k => $v){ echo $k.'=='.$v.'
'; } $ret = $qc->get_info(); if($ret['ret'] == 0){ foreach($ret['data'] as $k => $v){ echo $k.'=='.$v.'
'; } }else{ echo ""; echo "获取失败,请开启调试查看原因"; } exit;*/ // 根据QQ对应的openId查询数据库对应的全局用户信息 $fan = getUserByOpenId($market_id, $openId, AUTHTYPE_QQ, $this->db); $sid = ""; $pdo = $this->db; $pdo->beginTransaction(); if (!empty($fan)) { // 查询粉丝对应的会员详细信息 $members = getQqUserByUId($fan['id'], $this->db); if (empty($member)) { if ($userinfo['ret'] == 0) {// 假如授权返回错误消息,则重新登录 header('Location: ' . $target); } } $member['uid'] = $fan['id']; $member['openid'] = $fan['openid']; // 粉丝昵称 $member['nickname'] = stripcslashes($userinfo['nickname']); $member['province'] = $userinfo['province'];//所属省份 $member['city'] = $userinfo['city'];//所属省份 $member['year'] = $userinfo['year'];//所属城市 $member['gender'] = $userinfo['gender'];// 性别 $member['figureurl_qq_1'] = $userinfo['figureurl_qq_1'];// QQ小头像 $member['figureurl_qq_2'] = $userinfo['figureurl_qq_2'];// QQ大头像 $member['figureurl'] = $userinfo['figureurl'];// 大头像 $member['figureurl_1'] = $userinfo['figureurl_1'];// 中头像 $member['figureurl_2'] = $userinfo['figureurl_2'];// 小头像 $member['vip'] = $userinfo['vip']; $member['level'] = $userinfo['level']; $member['yellow_vip_level'] = $userinfo['yellow_vip_level']; $member['is_yellow_year_vip'] = $userinfo['is_yellow_year_vip']; // 根据当前openId创建一条全局用户记录或更新用户记录 $globalUserInfoId = updateUserInfo($scode, AUTHTYPE_QQ, $fan['openid'], '', $market_id, $this->db, $pdo); updateQqUserInfo($member, $this->db, $pdo); } else {// 假如数据库中还不存在对应的粉丝信息记录 if ($userinfo['ret'] == 0) {// 假如授权返回错误消息,则重新登录 header('Location: ' . $target); } // 根据当前openId创建一条全局用户记录或更新用户记录 $globalUserInfoId = updateUserInfo($scode, AUTHTYPE_QQ, $openId, '', $market_id, $this->db, $pdo); $userinfo['uid'] = $globalUserInfoId;// 全局用户ID $userinfo['openid'] = $openId; updateQqUserInfo($userinfo, $this->db, $pdo); } $pdo->commit(); // 新创建的全局用户信息,从中获取新创建的sid $globalUserInfo = getUserById($globalUserInfoId, $this->db); $sid = $globalUserInfo["sid"]; if (strstr($target, '?')) { if (strstr($target, '&')) { $target .= '&sid=' . $sid; } else { $target .= 'sid=' . $sid; } } else { $target .= '?sid=' . $sid; } // 登录成功后跳转到客户端传入的回调页面 header('Location: ' . $target); } /** * 使用微信授权登录 * @route({"GET","/weixin"}) * @param({"appid","$._GET.appid"}) 应用appid * @param({"devkey","$._GET.devkey"}) 开发者key * @param({"market_key","$._GET.market_key"}) 门店key * @param({"scode","$._GET.scode"}) 客户端生成的Scode * @param({"target","$._GET.target"}) 客户端需要回调的地址 * @param({"fail_target","$._GET.fail_target"}) 发生错误时,客户端回调的页面 * @throws({"phprs\util\exceptions\Forbidden","res", "403 Forbidden",{"error":"Forbidden"}}) cookie不可用 */ public function weixinLogin($appid = "", $devkey = "", $market_key = "", $scode = "", $target = "", $fail_target = "") { if (empty($appid)) $this->forwardUrl($fail_target, new returnObject(1, 10001, '未传入appid参数!')); if (empty($devkey)) $this->forwardUrl($fail_target, new returnObject(1, 10002, '未传入devkey参数!')); $devList = Sql::select('a.*') ->from('syweb_admin a') ->where('a.type=2 and a.admin_key=? and a.status=1', $devkey) ->get($this->db, null); if (empty($devList) || count($devList) <= 0) $this->forwardUrl($fail_target, new returnObject(1, 10003, 'devkey无效或未经过审核!')); $devInfo = $devList[0]; /* $appBaseList = Sql::select('a.*') ->from('syweb_app_base a') ->where('a.ref_key=? and a.dev_key=? and a.status=10', $appid, $devInfo['admin_key']) ->get($this->db, null); if (empty($appBaseList) || count($appBaseList) <= 0) { $this->forwardUrl($fail_target, new returnObject(1, 10004, '指定的应用不存在或未被审核!')); } $appBaseKey = $appBaseList[0]["app_key"]; $appList = Sql::select('a.*') ->from('syweb_app a') ->where('a.ref_key=? and a.dev_key=? and a.status=10', $appBaseKey, $devInfo['admin_key']) ->get($this->db, null); if (empty($appList) || count($appList) <= 0) { $this->forwardUrl($fail_target, new returnObject(1, 10005, '指定的应用不存在或未被审核!')); } $appInfo = $appList[0]; $marketList = Sql::select('a.*') ->from('syweb_market a') ->where('a.market_key=?', $market_key) ->get($this->db, null); if (empty($marketList) || count($marketList) <= 0) { $this->forwardUrl($fail_target, new returnObject(1, 10007, '指定的门店不存在或已经被删除!')); } $marketInfo = $marketList[0]; */ $appList = Sql::select('b.*') ->from('syweb_app_base a, syweb_app b') ->where('a.app_key = b.ref_key and a.status = b.status and a.dev_key = b.dev_key and a.ref_key = ? and a.dev_key = ? and a.status = 10', $appid, $devInfo['admin_key']) ->get($this->db, null); if (empty($appList) || count($appList) <= 0) $this->forwardUrl($fail_target, new returnObject(1, 10005, '指定的应用不存在或未被审核!')); $appInfo = $appList[0]; $marketList = Sql::select('a.*') ->from('syweb_market a, syweb_logintype_market b') ->where('a.market_key = b.market_key and b.type_key = \'0002\' and b.is_enabled != 0 and a.market_key = ?', $market_key) ->get($this->db, null); if (empty($marketList) || count($marketList) <= 0) $this->forwardUrl($fail_target, new returnObject(1, 10007, '指定的门店不存在或已经被删除, 或该门店不支持该登录方式!')); $marketInfo = $marketList[0]; $account = array(); $account["key"] = $marketInfo['weixin_appid']; $weixin = new WeiXinAccount($account); /* // 分析主域名中的参数 begin $referUrls = parse_url($_SERVER['HTTP_REFERER']); /// 请求方的参数 $callback_paramers = ""; if (!empty($referUrls['query'])) { // 假如传入了参数 $callback_paramers_list = explode("&", $referUrls['query']); if (!empty($callback_paramers_list) && count($callback_paramers_list) > 0) { foreach ($callback_paramers_list as $key => $value) { if (!strstr($value, 'appid=') && !strstr($value, 'devkey=') && !strstr($value, 'market_key=') && !strstr($value, 'scode=') && !strstr($value, 'target=') && !strstr($value, 'state=') ) { if (empty($callback_paramers)) { $callback_paramers = $value; } else { $callback_paramers .= '&' . $value; } } } } } $newTarget = ''; $targetUrls = parse_url($target); if (!empty($targetUrls)) { $newTarget = $targetUrls['scheme'] . '://' . $targetUrls['host'] . ((!empty($targetUrls['port']) && $targetUrls['port'] != '80') ? ':' . $targetUrls['port'] : '') . $targetUrls['path']; } if (!empty($callback_paramers)) { if (strstr($newTarget, '?')) { if (strstr($newTarget, '&')) { $newTarget .= '&' . $callback_paramers; } else { $newTarget .= $callback_paramers; } } else { $newTarget .= '?' . $callback_paramers; } } // 分析主域名中的参数 */ /// 剔除必须的参数. $needed = array('sid', 'scode', 'appid', 'devkey', 'market_key', 'target', 'fail_target'); /// 获取请求参数 $refer_paramers = GetAttachParameters($needed); $parameters = ''; foreach ($refer_paramers as $k => $v) { $parameters .= "&{$k}={$v}"; } // 开启一个会话 if (session_status() == PHP_SESSION_NONE) { session_start(); } $callbackInfo = new LoginCallbackInformation('', $scode, $appInfo['id'], $devkey, $marketInfo["market_key"], $target, $parameters, $fail_target); $_SESSION[LOGINPARAMETER_CALLBACK] = $callbackInfo->to_string(); // 记录session存储的调试信息 error_log("WeChat Login - Storing session parameters:"); error_log("Session ID: " . session_id()); error_log("Session callback info: " . $_SESSION[LOGINPARAMETER_CALLBACK]); error_log("Parameters stored - scode: $scode, app_id: " . $appInfo['id'] . ", devkey: $devkey, market_key: " . $marketInfo["market_key"]); ///$callback = "http://" . $this::$domain . "/api/login/weixin/callback"; $callback = $this->getFullUrl('/api/login/weixin/callback'); $state = 'ylsid-' . session_name(); $forward = $weixin->getOauthUserInfoUrl($callback, $state); //exit($forward); header('Location: ' . $forward); exit(); } /** * 微信授权登录回调(10010-10030) * @route({"GET","/weixin/callback"}) * @param({"code", "$._GET.code"}) * @param({"state", "$._GET.state"}) * @throws({"phprs\util\exceptions\Forbidden","res", "403 Forbidden",{"error":"Forbidden"}}) cookie不可用 */ public function weixinLoginCallback($code = '', $state = '') { // 在任何输出之前启动session if (session_status() == PHP_SESSION_NONE) { session_start(); } // 添加错误处理和调试 error_reporting(E_ALL); ini_set('display_errors', 1); try { // 记录调试信息 error_log("WeChat Login Callback - Code: $code, State: $state"); error_log("Session ID: " . session_id()); error_log("Session data: " . print_r($_SESSION, true)); // 检查数据库连接 if (!$this->db) { try { $this->db = new PDO( "mysql:host=" . env('API_DB_HOST', 'rm-bp1btyuwq77591x0jpo.mysql.rds.aliyuncs.com') . ":" . env('API_DB_PORT', '3306') . ";dbname=" . env('API_DB_NAME', 'youlehudong') . ";charset=utf8", env('API_DB_USER', 'games'), env('API_DB_PASSWORD', 'Games0791!!'), [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] ); } catch (Exception $e) { error_log("Database connection failed: " . $e->getMessage()); echo '登录失败'; echo '

数据库连接失败

请稍后重试

'; echo ''; return; } } $scode = ''; $app_id = ''; $devkey = ''; $market_key = ''; $return_url = ''; $return_parameter = ''; $fail_url = ''; if (isset($_SESSION[LOGINPARAMETER_CALLBACK])) { $login = LoginCallbackInformation::CreateWithString($_SESSION[LOGINPARAMETER_CALLBACK]); $scode = $login->scode; $app_id = $login->app_id; $devkey = $login->dev_key; $market_key = $login->market_key; $return_url = $login->return_url; $return_parameter = $login->return_parameter; $fail_url = $login->fail_url; } // 详细验证参数并记录调试信息 if (empty($scode) || empty($return_url) || empty($fail_url) || empty($app_id) || empty($devkey) || empty($market_key)) { $missing_params = []; if (empty($scode)) $missing_params[] = 'scode'; if (empty($return_url)) $missing_params[] = 'return_url'; if (empty($fail_url)) $missing_params[] = 'fail_url'; if (empty($app_id)) $missing_params[] = 'app_id'; if (empty($devkey)) $missing_params[] = 'devkey'; if (empty($market_key)) $missing_params[] = 'market_key'; $error_msg = '缺少必要参数: ' . implode(', ', $missing_params); error_log("WeChat Login Callback - Missing parameters: " . $error_msg); error_log("Session LOGINPARAMETER_CALLBACK exists: " . (isset($_SESSION[LOGINPARAMETER_CALLBACK]) ? 'Yes' : 'No')); if (isset($_SESSION[LOGINPARAMETER_CALLBACK])) { error_log("Session LOGINPARAMETER_CALLBACK content: " . $_SESSION[LOGINPARAMETER_CALLBACK]); } // 显示友好的错误页面,包含调试信息 echo '微信登录失败'; echo '

微信登录失败

'; echo '

错误详情

'; echo '

错误代码: 10010

'; echo '

错误信息: ' . htmlspecialchars($error_msg) . '

'; echo '

调试信息

'; echo '

Session ID: ' . session_id() . '

'; echo '

Session状态: ' . (isset($_SESSION[LOGINPARAMETER_CALLBACK]) ? '已存储参数' : '未找到登录参数') . '

'; echo '

Code参数: ' . htmlspecialchars($code) . '

'; echo '

State参数: ' . htmlspecialchars($state) . '

'; echo '

可能的解决方案

'; echo ''; echo '

查看详细调试信息

'; echo '

返回上一页

'; echo ''; return; } // 检查微信授权参数 if (!$state || !$code) { error_log("WeChat Login Callback - Missing auth parameters: code=$code, state=$state"); if (!empty($return_url)) { error_log("WeChat Login Callback - Redirecting to return_url: $return_url"); header('Location: ' . $return_url); exit(); } else { error_log("WeChat Login Callback - No return_url available, showing error page"); echo '微信授权失败'; echo '

微信授权失败

'; echo '

错误详情

'; echo '

错误代码: 10011

'; echo '

错误信息: 缺少微信授权参数(code或state)

'; echo '

调试信息

'; echo '

Code参数: ' . htmlspecialchars($code) . '

'; echo '

State参数: ' . htmlspecialchars($state) . '

'; echo '

可能的解决方案

'; echo ''; echo '

查看详细调试信息

'; echo '

返回上一页

'; echo ''; return; } } $marketList = Sql::select('a.*') ->from('syweb_market a') ->where('a.market_key=?', $market_key) ->get($this->db, null); if (empty($marketList) || count($marketList) <= 0) $this->forwardUrl($fail_url, (new returnObject(1, 10007, '指定的门店不存在或已经被删除'))->to_array()); $marketInfo = $marketList[0]; $account = array(); $account["key"] = $marketInfo["weixin_appid"]; $account["secret"] = $marketInfo["weixin_secret_appid"]; $weixin = new WeiXinAccount($account); /// 通过授权获得的code去换取网页授权的Access_token和openId $oauth = $weixin->getOauthInfo($code); /// 假如没有获得openId,则重新发起一次网页授权请求 if (is_error($oauth) || empty($oauth['openid'])) { //if ($market_key == 'yulejia') // file_put_contents('c:/2.txt', json_encode($oauth)); $state = 'ylsid-' . session_name(); // 设置授权的回调地址 ///$callback = rawurlencode("http://" . $this::$domain . "/api/login/weixin/callback"); $callback = $this->getFullUrl('/api/login/weixin/callback'); // 返回网页非静默授权的授权访问地址 // 参数1:回调页面地址 // 参数2:重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值, // 最多128字节 $forward = $weixin->getOauthUserInfoUrl($callback, $state); header('Location: ' . $forward); exit; } $sid = ""; $pdo = $this->db; /// 通过网页授权查询用户详细信息 $userinfo = $weixin->getOauthUserInfo($oauth['access_token'], $oauth['openid']); /// 通过openId拉取用户信息,判断用户是否关注了公众号 $baseUserInfo = $weixin->fansQueryInfo($oauth['openid'], $this->db, $pdo); /// 根据openId和门店Key从数据库中查询全局用户信息 $fan = get_wechat_by_user_id($market_key, $userinfo['openid'], isset($userinfo['unionid']) ? $userinfo['unionid'] : '', $this->db); $pdo->beginTransaction(); if (!empty($fan)) { /// 假如数据库中已经存在全局用户信息 /// 查询粉丝对应的会员详细信息 $member = getWeixinUserByUId($fan['id'], $this->db); if (!empty($userinfo['errcode'])) { // 假如授权返回错误消息,则重新登录 $this->forwardUrl($fail_url, (new returnObject(1, 10011, '缺少state或code参数,登录失败!'))->to_array()); } else { if (!empty($baseUserInfo["errcode"])) { // 假如授权返回错误消息,则重新登录 $this->forwardUrl($fail_url, (new returnObject(1, 10012, '缺少state或code参数,登录失败!'))->to_array()); } else { if ($baseUserInfo["subscribe"] == 1) { $userinfo["subscribe"] = 1; $userinfo["subscribe_time"] = $baseUserInfo["subscribe_time"]; } else { $userinfo["subscribe"] = 0; $userinfo["subscribe_time"] = 0; } } } $member['uid'] = $fan['id']; $member['openid'] = $fan['openid']; require_once __DIR__ . '/../../lib/emoji/emoji.php'; $member['nickname'] = emoji_docomo_to_unified($userinfo['nickname']); $member['nickname'] = emoji_kddi_to_unified($member['nickname']); $member['nickname'] = emoji_softbank_to_unified($member['nickname']); $member['nickname'] = emoji_google_to_unified($member['nickname']); /// 粉丝头像 if (!empty($userinfo['headimgurl'])) { $member['headimgurl'] = rtrim($userinfo['headimgurl'], '0') . 132; } $member['sex'] = $userinfo['sex'];// 性别 $member['province'] = $userinfo['province'];// 所属省份 $member['city'] = $userinfo['city'];// 所属城市 $member['country'] = $userinfo['country'];// 所属国家 $member['privilege'] = is_array($userinfo['privilege']) ? json_encode($userinfo['privilege'], JSON_UNESCAPED_UNICODE) : $userinfo['privilege']; $member['subscribe'] = $userinfo['subscribe'];// 粉丝是否关注 // 粉丝是否关注 $member['subscribe_time'] = $userinfo['subscribe_time']; $member['unionid'] = isset($userinfo['unionid']) ? $userinfo['unionid'] : ''; // unionid // 根据当前openId创建一条全局用户记录或更新用户记录 $globalUserInfoId = updateUserInfo($scode, AUTHTYPE_WECHAT, $fan['openid'], $fan['unionid'], $market_key, $this->db, $pdo); // 更新微信用户信息 updateWeixinUserInfo($member, $this->db, $pdo); } else { /// 假如数据库中还不存在对应的粉丝信息记录 /// 通过网页授权接口获得粉丝信息(无论关注或未关注) $userinfo = $weixin->getOauthUserInfo($oauth['access_token'], $oauth['openid']); if (!empty($userinfo['errcode'])) { // 假如授权返回错误消息,则重新登录 $this->forwardUrl($fail_url, (new returnObject(1, 10011, '缺少state或code参数,登录失败!'))->to_array()); } else { // 通过openId拉取用户信息,判断用户是否关注了公众号 $baseUserInfo = $weixin->fansQueryInfo($userinfo['openid'], $this->db, $pdo); if (!empty($baseUserInfo["errcode"])) { // 假如授权返回错误消息,则重新登录 $this->forwardUrl($fail_url, (new returnObject(1, 10012, '缺少state或code参数,登录失败!'))->to_array()); } else { if ($baseUserInfo["subscribe"] == 1) { $userinfo["subscribe"] = 1; $userinfo["subscribe_time"] = $baseUserInfo["subscribe_time"]; } else { $userinfo["subscribe"] = 0; $userinfo["subscribe_time"] = 0; } } } // 根据当前openId创建一条全局用户记录或更新用户记录 $globalUserInfoId = updateUserInfo($scode, AUTHTYPE_WECHAT, $userinfo['openid'], isset($userinfo['unionid']) ? $userinfo['unionid'] : '', $market_key, $this->db, $pdo); $userinfo['uid'] = $globalUserInfoId;// 全局用户ID require_once __DIR__ . '/../../lib/emoji/emoji.php'; $userinfo['nickname'] = emoji_softbank_to_unified($userinfo['nickname']); if (!empty($userinfo['headimgurl'])) { // 粉丝头像 $userinfo['headimgurl'] = rtrim($userinfo['headimgurl'], '0') . 132; } ///$userinfo['unionid'] = $userinfo['unionid']; // unionid updateWeixinUserInfo($userinfo, $this->db, $pdo); } $pdo->commit(); // 新创建的全局用户信息,从中获取新创建的sid $globalUserInfo = getUserById($globalUserInfoId, $this->db); $sid = $globalUserInfo["sid"]; $p = strstr($return_url, '?'); if (empty($p)) $return_url .= "?sid={$sid}&scode={$scode}{$return_parameter}"; elseif ('?' == $p) $return_url .= "sid={$sid}&scode={$scode}{$return_parameter}"; else $return_url .= "&sid={$sid}&scode={$scode}{$return_parameter}"; // 登录成功后跳转到客户端传入的回调页面 header('Location: ' . $return_url); } catch (Exception $e) { error_log("WeChat Login Callback Error: " . $e->getMessage() . "\n" . $e->getTraceAsString()); // 如果有失败回调URL,跳转到失败页面 if (!empty($fail_url)) { $this->forwardUrl($fail_url, (new returnObject(1, 10099, '微信登录处理失败: ' . $e->getMessage()))->to_array()); } else { // 否则显示错误信息 echo '登录失败'; echo '

微信登录失败

'; echo '

错误信息: ' . htmlspecialchars($e->getMessage()) . '

'; echo '

返回上一页

'; echo ''; } } } /** * 使用微信授权登录 * @route({"GET","/weixin/silence"}) * @param({"appid","$._GET.appid"}) 应用appid * @param({"devkey","$._GET.devkey"}) 开发者key * @param({"market_key","$._GET.market_key"}) 门店key * @param({"scode","$._GET.scode"}) 客户端生成的Scode * @param({"target","$._GET.target"}) 客户端需要回调的地址 * @param({"state","$._POST.state"}) 随机参数 * @throws({"phprs\util\exceptions\Forbidden","res", "403 Forbidden",{"error":"Forbidden"}}) cookie不可用 */ public function weixinUrlLogin($appid = "", $devkey = "", $market_key = "", $scode = "", $target = "", $state = '') { if (empty($appid)) return new returnObject(1, 10001, '未传入appid参数!'); if (empty($devkey)) return new returnObject(1, 10002, '未传入devkey参数!'); $devList = Sql::select('a.*') ->from('syweb_admin a') ->where('a.type=2 and a.admin_key=? and a.status=1', $devkey) ->get($this->db, null); if (empty($devList) || count($devList) <= 0) return new returnObject(1, 10003, 'devkey无效或未经过审核!'); $devInfo = $devList[0]; $appList = Sql::select('b.*') ->from('syweb_app_base a, syweb_app b') ->where('a.app_key = b.ref_key and a.status = b.status and a.dev_key = b.dev_key and a.ref_key = ? and a.dev_key = ? and a.status = 10', $appid, $devInfo['admin_key']) ->get($this->db, null); if (empty($appList) || count($appList) <= 0) return new returnObject(1, 10005, '指定的应用不存在或未被审核!'); $appInfo = $appList[0]; $marketList = Sql::select('a.*') ->from('syweb_market a, syweb_logintype_market b') ->where('a.market_key = b.market_key and b.type_key = \'0012\' and b.is_enabled != 0 and a.market_key = ?', $market_key) ->get($this->db, null); if (empty($marketList) || count($marketList) <= 0) return new returnObject(1, 10007, '指定的门店不存在或已经被删除, 或该门店不支持该登录方式!'); $marketInfo = $marketList[0]; /// 剔除必须的参数. $needed = array('sid', 'scode', 'appid', 'devkey', 'market_key', 'target', 'fail_target'); /// 获取请求参数 $refer_paramers = GetAttachParameters($needed); $parameters = ''; foreach ($refer_paramers as $k => $v) { $parameters .= "&{$k}={$v}"; } // 开启一个会话 session_start(); $_SESSION[LOGINPARAMETER_CALLBACK] = (new LoginCallbackInformation('', $scode, $appInfo['id'], $devkey, $marketInfo["market_key"], $target, $parameters, ''))->to_string(); ///$callback = "http://" . $this::$domain . "/api/login/weixin/callback"; $callback = $this->getFullUrl('/api/login/weixin/silence/callback'); $state = 'ylsid-' . session_name(); $forward = $weixin->getOauthCodeUrl($callback, $state); //exit($forward); header('Location: ' . $forward); exit(); /* // 开启一个会话 session_start(); $_SESSION['user_app_id'] = $appInfo["id"]; $_SESSION['user_devkey'] = $devkey; $_SESSION['user_market_id'] = $marketInfo["id"]; $_SESSION['user_target'] = $target; $_SESSION['state'] = $state; $callback = $this->getFullUrl('/api/login/weixin/callback_url'); $state = 'ylsid-' . session_name(); $forward = $weixin->getOauthCodeUrl($callback, $state); header('Location: ' . $forward); exit(); */ } /** * 微信授权登录回调 * @route({"GET","/weixin/silence/callback"}) * @param({"code", "$._GET.code"}) * @param({"state", "$._GET.state"}) * @throws({"phprs\util\exceptions\Forbidden","res", "403 Forbidden",{"error":"Forbidden"}}) cookie不可用 */ public function weixinLoginUrlCallback($code = '', $state = '') { session_start(); $scode = ''; $app_id = ''; $devkey = ''; $market_key = ''; $return_url = ''; $return_parameter = ''; $fail_url = ''; if (isset($_SESSION[LOGINPARAMETER_CALLBACK])) { $login = LoginCallbackInformation::CreateWithString($_SESSION[LOGINPARAMETER_CALLBACK]); $scode = $login->scode; $app_id = $login->app_id; $devkey = $login->dev_key; $market_key = $login->market_key; $return_url = $login->return_url; $return_parameter = $login->return_parameter; $fail_url = $login->fail_url; } if (!$scode || !$return_url || !$app_id || !$devkey || !$market_key) return new returnObject(1, 10006, '缺少必要参数,登录失败!'); if (!$state || !$code) header('Location: ' . $return_url); $marketList = Sql::select('a.*') ->from('syweb_market a') ->where('a.market_key=?', $market_key) ->get($this->db, null); if (empty($marketList) || count($marketList) <= 0) return new returnObject(1, 10007, '指定的门店不存在或已经被删除!'); $marketInfo = $marketList[0]; $account = array(); $account["key"] = $marketInfo["weixin_appid"]; $account["secret"] = $marketInfo["weixin_secret_appid"]; $weixin = new WeiXinAccount($account); /// 通过授权获得的code去换取网页授权的Access_token和openId $oauth = $weixin->getOauthInfo($code); // 假如没有获得openId,则重新发起一次网页授权请求 if (is_error($oauth) || empty($oauth['openid'])) { $state = 'ylsid-' . session_name(); // 设置授权的回调地址 $callback = $this->getFullUrl('/api/login/weixin/silence/callback'); // 返回网页非静默授权的授权访问地址 // 参数1:回调页面地址 // 参数2:重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值, // 最多128字节 $forward = $weixin->getOauthCodeUrl($callback, $state); header('Location: ' . $forward); exit; } /*// 根据openId和商家ID从数据库中查询全局用户信息 $fan = getUserByOpenId($market_id,$oauth['openid'],AUTHTYPE_WECHAT,$this->db); $sid = ""; $pdo = $this->db; $pdo->beginTransaction(); // 通过网页授权查询用户详细信息 $userinfo = $weixin->getOauthUserInfo($oauth['access_token'],$oauth['openid']); // 通过openId拉取用户信息,判断用户是否关注了公众号 $baseUserInfo = $weixin->fansQueryInfo($oauth['openid'],$this->db,$pdo); if (!empty($fan)) {// 假如数据库中已经存在全局用户信息 // 查询粉丝对应的会员详细信息 $members = getWeixinUserByUId($fan['id'],$this->db); if(!empty($userinfo["errcode"])){// 假如授权返回错误消息,则重新登录 header('Location: ' . $target); }else{ if(!empty($baseUserInfo["errcode"])){// 假如授权返回错误消息,则重新登录 header('Location: ' . $target); }else{ if( $baseUserInfo["subscribe"]==1 ){ $userinfo["subscribe"] = 1; $userinfo["subscribe_time"] = $baseUserInfo["subscribe_time"]; }else{ $userinfo["subscribe"] = 0; $userinfo["subscribe_time"] = 0; } } } $member["uid"] = $fan['id']; $member["openid"] = $fan['openid']; require_once __DIR__ . '/../../lib/emoji/emoji.php'; $member['nickname'] = emoji_docomo_to_unified($userinfo['nickname']); $member['nickname'] = emoji_kddi_to_unified($member['nickname']); $member['nickname'] = emoji_softbank_to_unified($member['nickname']); $member['nickname'] = emoji_google_to_unified($member['nickname']); // 粉丝昵称 //$member['nickname'] = stripslashes(stripcslashes($userinfo['nickname'])); if (!empty($userinfo['headimgurl'])) {// 粉丝头像 $member['headimgurl'] = rtrim($userinfo['headimgurl'], '0') . 132; } $member['sex'] = $userinfo['sex'];// 性别 $member['province'] = $userinfo['province'];// 所属省份 $member['city'] = $userinfo['city'];// 所属城市 $member['country'] = $userinfo['country'];// 所属国家 $member['privilege'] = is_array($userinfo['privilege']) ? json_encode($userinfo['privilege'], JSON_UNESCAPED_UNICODE) : $userinfo['privilege']; $member['subscribe'] = $userinfo['subscribe'];// 粉丝是否关注 // 粉丝是否关注 $member['subscribe_time'] = $userinfo['subscribe_time']; // 根据当前openId创建一条全局用户记录或更新用户记录 $globalUserInfoId = updateUserInfo($scode,AUTHTYPE_WECHAT,$fan['openid'],$fan['unionid'],$market_id,$this->db,$pdo); updateWeixinUserInfo($member, $this->db, $pdo); } else {// 假如数据库中还不存在对应的粉丝信息记录 // 通过网页授权接口获得粉丝信息(无论关注或未关注) $userinfo = $weixin->getOauthUserInfo($oauth['access_token'],$oauth['openid']); if(!empty($userinfo["errcode"])){// 假如授权返回错误消息,则重新登录 header('Location: ' . $target); }else{ // 通过openId拉取用户信息,判断用户是否关注了公众号 $baseUserInfo = $weixin->fansQueryInfo($userinfo['openid'],$this->db,$pdo); if(!empty($baseUserInfo["errcode"])){// 假如授权返回错误消息,则重新登录 header('Location: ' . $target); }else{ if( $baseUserInfo["subscribe"]==1 ){ $userinfo["subscribe"] = 1; $userinfo["subscribe_time"] = $baseUserInfo["subscribe_time"]; }else{ $userinfo["subscribe"] = 0; $userinfo["subscribe_time"] = 0; } } } // 根据当前openId创建一条全局用户记录或更新用户记录 $globalUserInfoId = updateUserInfo($scode,AUTHTYPE_WECHAT,$userinfo['openid'],isset($userinfo['unionid']) ? $userinfo['unionid'] : '',$market_id,$this->db,$pdo); $userinfo['uid'] = $globalUserInfoId;// 全局用户ID require_once __DIR__ . '/../../lib/emoji/emoji.php'; //$userinfo['nickname'] = emoji_docomo_to_unified($userinfo['nickname']); //$userinfo['nickname'] = emoji_kddi_to_unified($userinfo['nickname']); $userinfo['nickname'] = emoji_softbank_to_unified($userinfo['nickname']); //$userinfo['nickname'] = emoji_google_to_unified($userinfo['nickname']); //exit; //$userinfo['nickname'] = stripslashes(stripcslashes($userinfo['nickname'])); if (!empty($userinfo['headimgurl'])) {// 粉丝头像 $userinfo['headimgurl'] = rtrim($userinfo['headimgurl'], '0') . 132; } updateWeixinUserInfo($userinfo, $this->db, $pdo); } $pdo->commit(); // 新创建的全局用户信息,从中获取新创建的sid /*$globalUserInfo = getUserById($globalUserInfoId,$this->db); $sid = $globalUserInfo["sid"];*/ /// 根据当前openId创建一条全局用户记录或更新用户记录 $globalUserInfoId = updateUserInfo($scode, AUTHTYPE_WECHAT, $oauth['openid'], $oauth['unionid'], $market_key, $this->db, $this->db); // 更新微信用户信息 $member = [ 'uid' => $globalUserInfoId, 'subscribe' => @$oauth['subscribe'], 'subscribe_time' => @$oauth['subscribe_time'], 'openid' => @$oauth['openid'], 'unionid' => @$oauth['unionid'], ]; $id = Sql::select('a.id') ->from('syweb_users_weixin a') ->where('a.uid=? and a.openid=?', $member["uid"], $member["openid"]) ->get($this->db, null); if (empty($id)) { Sql::insertInto('syweb_users_weixin')->values($member)->exec($this->db); } else { Sql::update('syweb_users_weixin')->setArgs($member)->where('uid=? and openid=?', $member["uid"], $member["openid"])->exec($this->db); } /// 新创建的全局用户信息,从中获取新创建的sid $globalUserInfo = getUserById($globalUserInfoId, $this->db); $sid = $globalUserInfo["sid"]; $p = strstr($return_url, '?'); if (empty($p)) $return_url .= "?sid={$sid}&scode={$scode}{$return_parameter}"; elseif ('?' == $p) $return_url .= "sid={$sid}&scode={$scode}{$return_parameter}"; else $return_url .= "&sid={$sid}&scode={$scode}{$return_parameter}"; // 登录成功后跳转到客户端传入的回调页面 header('Location: ' . $return_url); exit; } /** * 使用聚开心授权登录 * @route({"GET","/jkx"}) * @param({"appid","$._GET.appid"}) 应用appid * @param({"devkey","$._GET.devkey"}) 开发者key * @param({"market_key","$._GET.market_key"}) 门店key * @param({"scode","$._GET.scode"}) 客户端生成的Scode * @param({"target","$._GET.target"}) 客户端需要回调的地址 * @param({"fail_target","$._GET.fail_target"}) 发生错误时,客户端回调的页面 * @throws({"phprs\util\exceptions\Forbidden","res", "403 Forbidden",{"error":"Forbidden"}}) cookie不可用 */ public function jkxLogin($appid = "", $devkey = "", $market_key = "", $scode = "", $target = "", $fail_target = "") { $result = array(); if (empty($appid)) { $result["error"] = '1'; $result["error_code"] = 10001; // 未传入appid参数 $result["msg"] = "未传入appid参数"; $this->forwardUrl($fail_target, $result); } if (empty($devkey)) { $result["error"] = '1'; $result["error_code"] = 10002; // 未传入devkey参数 $result["msg"] = "未传入devkey参数"; $this->forwardUrl($fail_target, $result); } $devList = Sql::select('a.*') ->from('syweb_admin a') ->where('a.type=2 and a.admin_key=? and a.status=1', $devkey) ->get($this->db, null); if (empty($devList) || count($devList) <= 0) { $result["error"] = '1'; $result["error_code"] = 10003; // devkey无效 $result["msg"] = "devkey无效或未经过审核"; $this->forwardUrl($fail_target, $result); } $devInfo = $devList[0]; $appBaseList = Sql::select('a.*') ->from('syweb_app_base a') ->where('a.ref_key=? and a.dev_key=? and a.status=10', $appid, $devInfo['admin_key']) ->get($this->db, null); if (empty($appBaseList) || count($appBaseList) <= 0) { $result["error"] = '1'; $result["error_code"] = 10004; // 指定的应用不存在或未被审核 $result["msg"] = "指定的应用不存在或未被审核"; $this->forwardUrl($fail_target, $result); } $appBaseKey = $appBaseList[0]["app_key"]; $appList = Sql::select('a.*') ->from('syweb_app a') ->where('a.ref_key=? and a.dev_key=? and a.status=10', $appBaseKey, $devInfo['admin_key']) ->get($this->db, null); if (empty($appList) || count($appList) <= 0) { $result["error"] = '1'; $result["error_code"] = 10005; // 指定的应用不存在或未被审核 $result["msg"] = "指定的应用不存在或未被审核"; $this->forwardUrl($fail_target, $result); } $appInfo = $appList[0]; $marketList = Sql::select('a.*') ->from('syweb_market a') ->where('a.market_key=?', $market_key) ->get($this->db, null); if (empty($marketList) || count($marketList) <= 0) { $result["error"] = '1'; $result["error_code"] = 10007; // 指定的门店不存在 $result["msg"] = "指定的门店不存在或已经被删除"; $this->forwardUrl($fail_target, $result); } $marketInfo = $marketList[0]; $account = array(); $account["key"] = $marketInfo['weixin_appid']; //$weixin = new WeiXinAccount($account); /* // 分析主域名中的参数 begin $referUrls = parse_url($_SERVER['HTTP_REFERER']); $callback_paramers = ""; if (!empty($referUrls['query'])) { // 假如传入了参数 $callback_paramers_list = explode("&", $referUrls['query']); if (!empty($callback_paramers_list) && count($callback_paramers_list) > 0) { foreach ($callback_paramers_list as $key => $value) { if (!strstr($value, 'appid=') && !strstr($value, 'devkey=') && !strstr($value, 'market_key=') && !strstr($value, 'scode=') && !strstr($value, 'target=') && !strstr($value, 'state=') ) { if (empty($callback_paramers)) { $callback_paramers = $value; } else { $callback_paramers .= '&' . $value; } } } } } $newTarget = ''; $targetUrls = parse_url($target); if (!empty($targetUrls)) { $newTarget = $targetUrls['scheme'] . '://' . $targetUrls['host'] . ((!empty($targetUrls['port']) && $targetUrls['port'] != '80') ? ':' . $targetUrls['port'] : '') . $targetUrls['path']; } if (!empty($callback_paramers)) { if (strstr($newTarget, '?')) { if (strstr($newTarget, '&')) { $newTarget .= '&' . $callback_paramers; } else { $newTarget .= $callback_paramers; } } else { $newTarget .= '?' . $callback_paramers; } } // 分析主域名中的参数 */ /// 剔除必须的参数. $needed = array('sid', 'scode', 'appid', 'devkey', 'market_key', 'target', 'fail_target'); /// 获取请求参数 $refer_paramers = GetAttachParameters($needed); $parameters = ''; foreach ($refer_paramers as $k => $v) { $parameters .= "&{$k}={$v}"; } // 开启一个会话 session_start(); $_SESSION[LOGINPARAMETER_CALLBACK] = (new LoginCallbackInformation('', $scode, $appInfo['id'], $devkey, $marketInfo["market_key"], $target, $parameters, $fail_target))->to_string(); ///$callback = "http://" . $this::$domain . "/api/login/jkx/callback"; $callback = $this->getFullUrl('/api/login/jkx/callback'); //$state = 'ylsid-' . session_name(); $jkxParamers = array(); $jkxParamers["appid"] = "G3CI8FQF"; $jkxParamers["Appkey"] = "28de5f4a54cbbb62b2264ab555ff7f62"; //$secret = "ecd10d48daf3138b88727bc65ca3e0bd"; $jkxParamers["returnUrl"] = $callback; $forward = "http://www.0792it.com/partnerApi/GetAccessToken.aspx"; $this->forwardUrl($forward, $jkxParamers); } /** * 聚开心授权登录回调(10010-10030) * @route({"GET","/jkx/callback"}) * @param({"spid", "$._GET.spid"}) * @param({"accessToken", "$._GET.accessToken"}) * @param({"uid", "$._GET.uid"}) uid * @throws({"phprs\util\exceptions\Forbidden","res", "403 Forbidden",{"error":"Forbidden"}}) cookie不可用 */ public function jkxLoginCallback($spid, $accessToken, $uid) { session_start(); $scode = ''; $app_id = ''; $devkey = ''; $market_key = ''; $return_url = ''; $return_parameter = ''; $fail_url = ''; if (isset($_SESSION[LOGINPARAMETER_CALLBACK])) { $login = LoginCallbackInformation::CreateWithString($_SESSION[LOGINPARAMETER_CALLBACK]); $scode = $login->scode; $app_id = $login->app_id; $devkey = $login->dev_key; $market_key = $login->market_key; $return_url = $login->return_url; $return_parameter = $login->return_parameter; $fail_url = $login->fail_url; } if (!$scode || !$return_url || !$fail_url || !$app_id || !$devkey || !$market_key) { if (empty($fail_url)) exit('缺少必要参数,登录失败!'); else $this->forwardUrl($fail_url, (new returnObject(1, 10010, '缺少必要参数,登录失败!'))->to_array()); } if (!$spid || !$accessToken || !$uid) { if (empty($fail_url)) exit('缺少spid或accessToken或uid参数,登录失败!'); else $this->forwardUrl($fail_url, (new returnObject(1, 10011, '缺少spid或accessToken或uid参数,登录失败!'))->to_array()); } $marketList = Sql::select('a.*') ->from('syweb_market a') ->where('a.market_key=?', $market_key) ->get($this->db, null); if (empty($marketList) || count($marketList) <= 0) { $this->forwardUrl($fail_url, (new returnObject(1, 10007, '指定的门店不存在或已经被删除'))->to_array()); } //$marketInfo = $marketList[0]; //$account = array(); //$account["key"] = $marketInfo["weixin_appid"]; //$account["secret"] = $marketInfo["weixin_secret_appid"]; //$weixin = new WeiXinAccount($account); $appid = "G3CI8FQF"; $appkey = "28de5f4a54cbbb62b2264ab555ff7f62"; $url = "http://www.0792it.com/partnerApi/GetSpidFromUid.ashx?appid={$appid}&appkey={$appkey}&uid={$uid}"; $response = ihttp_get($url); if (empty($response)) { $this->forwardUrl($fail_url, (new returnObject(1, 10012, '获取授权信息错误,登录失败!'))->to_array()); } $response = @json_decode($response['content'], true); $spid = $response["spid"]; $accessToken = $response["accessToken"]; // 开始获取用户信息 $url = "http://www.0792it.com/partnerApi/GetUserInfo.ashx?spid={$spid}&accessToken={$accessToken}"; $sign = "accessToken={$accessToken}&spid={$spid}&secret=ecd10d48daf3138b88727bc65ca3e0bd"; $sign = md5($sign); $url .= "&sign={$sign}"; $response = ihttp_get($url); if (empty($response)) { $this->forwardUrl($fail_url, (new returnObject(1, 10012, '获取授权信息错误,登录失败!'))->to_array()); } $response = @json_decode($response['content'], true); $retCode = $response["RetCode"]; if ($retCode == 1) { $this->forwardUrl($fail_url, (new returnObject(1, 10013, $response["RetMsg"]))->to_array()); } $level = $response["Level"]; $enum = $response["Enum"]; $realname = $response["Realname"]; $img = $response["Img"]; $tel = $response["Tel"]; $integral = $response["Integral"]; // 根据openId和门店Key从数据库中查询全局用户信息 $fan = getUserByOpenId($market_key, $uid, AUTHTYPE_JKX, $this->db); //$sid = ""; $pdo = $this->db; $pdo->beginTransaction(); if (!empty($fan)) { // 假如数据库中已经存在全局用户信息 // 查询粉丝对应的会员详细信息 $members = getJkxUserByUId($fan['id'], $this->db); $member["uid"] = $fan['id']; $member["username"] = $uid; $member['headimgurl'] = $img; $member['level'] = $level; $member['enum'] = $enum; $member['realname'] = $realname; $member['tel'] = $tel; $member['integral'] = $integral; // 根据当前openId创建一条全局用户记录或更新用户记录 $globalUserInfoId = updateUserInfo($scode, AUTHTYPE_JKX, $uid, '', $market_key, $this->db, $pdo); // 更新微信用户信息 updateJkxUserInfo($member, $this->db, $pdo); } else { // 假如数据库中还不存在对应的粉丝信息记录 // 根据当前openId创建一条全局用户记录或更新用户记录 $globalUserInfoId = updateUserInfo($scode, AUTHTYPE_JKX, $uid, '', $market_key, $this->db, $pdo); $userinfo['uid'] = $globalUserInfoId;// 全局用户ID $userinfo["username"] = $uid; $userinfo['level'] = $level; $userinfo['enum'] = $enum; $userinfo['realname'] = $realname; $userinfo['tel'] = $tel; $userinfo['headimgurl'] = $img; $userinfo['integral'] = $integral; updateJkxUserInfo($userinfo, $this->db, $pdo); } $pdo->commit(); // 新创建的全局用户信息,从中获取新创建的sid $globalUserInfo = getUserById($globalUserInfoId, $this->db); $sid = $globalUserInfo["sid"]; $p = strstr($return_url, '?'); if (empty($p)) $return_url .= "?sid={$sid}&scode={$scode}{$return_parameter}"; elseif ('?' == $p) $return_url .= "sid={$sid}&scode={$scode}{$return_parameter}"; else $return_url .= "&sid={$sid}&scode={$scode}{$return_parameter}"; // 登录成功后跳转到客户端传入的回调页面 header('Location: ' . $return_url); } /** * 使用APP登录 * @route({"POST","/ylnn"}) * @param({"appid","$._POST.appid"}) 应用appid * @param({"devkey","$._POST.devkey"}) 开发者key * @param({"market_key","$._POST.market_key"}) 门店key * @param({"scode","$._POST.scode"}) 客户端生成的Scode * @param({"agent_key","$._POST.agent_key"}) 代理商Key * @param({"game_key","$._POST.game_key"}) 游戏Key * @param({"user_key","$._POST.user_key"}) 用户Key * @param({"headImg","$._POST.headImg"}) 用户头像 * @param({"nickname","$._POST.nickname"}) 用户昵称 * @throws({"phprs\util\exceptions\Forbidden","res", "403 Forbidden",{"error":"Forbidden"}}) cookie不可用 */ public function ylnnLogin( $appid = "", $devkey = "", $market_key = "", $scode = "", $agent_key = "", $game_key = "", $user_key = '', $headImg = '', $nickname = '' ) { if (empty($appid)) return new returnObject(1, 10001, '未传入appid参数!'); if (empty($devkey)) return new returnObject(1, 10002, '未传入devkey参数!'); $devList = Sql::select('a.*') ->from('syweb_admin a') ->where('a.type=2 and a.admin_key=? and a.status=1', $devkey) ->get($this->db, null); if (empty($devList) || count($devList) <= 0) return new returnObject(1, 10002, 'devkey无效或未经过审核!'); $devInfo = $devList[0]; /* $appBaseList = Sql::select('a.*') ->from('syweb_app_base a') ->where('a.ref_key=? and a.dev_key=? and a.status=10', $appid, $devInfo['admin_key']) ->get($this->db, null); if (empty($appBaseList) || count($appBaseList) <= 0) return new returnObject(1, 10004, '指定的应用不存在或未被审核!'); $appBaseKey = $appBaseList[0]["app_key"]; $appList = Sql::select('a.*') ->from('syweb_app a') ->where('a.ref_key=? and a.dev_key=? and a.status=10', $appBaseKey, $devInfo['admin_key']) ->get($this->db, null); if (empty($appList) || count($appList) <= 0) return new returnObject(1, 10005, '指定的应用不存在或未被审核!'); */ $appList = Sql::select('b.*') ->from('syweb_app_base a, syweb_app b') ->where('a.app_key = b.ref_key and a.status = b.status and a.dev_key = b.dev_key and a.ref_key = ? and a.dev_key = ? and a.status = 10', $appid, $devInfo['admin_key']) ->get($this->db, null); if (empty($appList) || count($appList) <= 0) return new returnObject(1, 10004, '指定的应用不存在或未被审核!'); ///$appInfo = $appList[0]; $marketList = Sql::select('a.*') ->from('syweb_market a') ->where('a.market_key=?', $market_key) ->get($this->db, null); if (empty($marketList) || count($marketList) <= 0) return new returnObject(1, 10007, '指定的门店不存在或已经被删除!'); ///$marketInfo = $marketList[0]; $uid = md5($agent_key . $game_key . $user_key); // 根据openId和门店Key从数据库中查询全局用户信息 $fan = getUserByOpenId($market_key, $uid, AUTHTYPE_NIUNIUGAME, $this->db); $sid = ""; $pdo = $this->db; $pdo->beginTransaction(); if (!empty($fan)) { // 假如数据库中已经存在全局用户信息 // 查询粉丝对应的会员详细信息 $member = getYlnnUserByUId($fan['id'], $this->db); $member['uid'] = $fan['id']; $member['user_key'] = $uid; $member['agent_key'] = $agent_key; $member['game_key'] = $game_key; $member['player_key'] = $user_key; $member['headimgurl'] = $headImg; $member['nickname'] = $nickname; // 根据当前openId创建一条全局用户记录或更新用户记录 $globalUserInfoId = updateUserInfo($scode, AUTHTYPE_NIUNIUGAME, $uid, '', $market_key, $this->db, $pdo); // 更新微信用户信息 updateYlnnUserInfo($member, $this->db, $pdo); } else { // 假如数据库中还不存在对应的粉丝信息记录 // 根据当前openId创建一条全局用户记录或更新用户记录 $globalUserInfoId = updateUserInfo($scode, AUTHTYPE_NIUNIUGAME, $uid, '', $market_key, $this->db, $pdo); $userinfo['uid'] = $globalUserInfoId;// 全局用户ID $userinfo['user_key'] = $uid; $userinfo['agent_key'] = $agent_key; $userinfo['game_key'] = $game_key; $userinfo['player_key'] = $user_key; $userinfo['headimgurl'] = $headImg; $userinfo['nickname'] = $nickname; updateYlnnUserInfo($userinfo, $this->db, $pdo); } $pdo->commit(); // 新创建的全局用户信息,从中获取新创建的sid $globalUserInfo = getUserById($globalUserInfoId, $this->db); $sid = $globalUserInfo['sid']; if (empty($sid)) return new returnObject(1, 13000, '登录失败,无法获取SID!'); else return new returnObject(0, 0, '登录成功!', array('sid' => $sid, 'scode' => $scode,)); } /** * 移动登录(微信) * @route({"POST","/mobile/wechat"}) * @param({"appid","$._POST.appid"}) 应用appid * @param({"devkey","$._POST.devkey"}) 开发者key * @param({"market_key","$._POST.market_key"}) 门店key * @param({"scode","$._POST.scode"}) 客户端生成的Scode * @param({"open_id","$._POST.open_id"}) openid * @param({"head_img","$._POST.head_img"}) 头像 * @param({"nick_name","$._POST.nick_name"}) 昵称 * @param({"sex","$._POST.sex"}) 性别 * @param({"city","$._POST.city"}) 城市 * @param({"province","$._POST.province"}) 省 * @param({"union_id","$._POST.union_id"}) unionid * @throws({"phprs\util\exceptions\Forbidden","res", "403 Forbidden",{"error":"Forbidden"}}) cookie不可用 */ public function mobile_wechat($appid = '', $devkey = '', $market_key = '', $scode = '', $open_id = '', $head_img = '', $nick_name = '', $sex = '', $city = '', $province = '', $union_id = '') { if (empty($appid)) return new returnObject(1, 10001, '未传入appid参数!'); if (empty($devkey)) return new returnObject(1, 10002, '未传入devkey参数!'); $devList = Sql::select('a.*') ->from('syweb_admin a') ->where('a.type=2 and a.admin_key=? and a.status=1', $devkey) ->get($this->db, null); if (empty($devList) || count($devList) <= 0) return new returnObject(1, 10002, 'devkey无效或未经过审核!'); $devInfo = $devList[0]; $appList = Sql::select('b.*') ->from('syweb_app_base a, syweb_app b') ->where('a.app_key = b.ref_key and a.status = b.status and a.dev_key = b.dev_key and a.ref_key = ? and a.dev_key = ? and a.status = 10', $appid, $devInfo['admin_key']) ->get($this->db, null); if (empty($appList) || count($appList) <= 0) return new returnObject(1, 10004, '指定的应用不存在或未被审核!'); ///$appInfo = $appList[0]; $marketList = Sql::select('a.*') ->from('syweb_market a') ->where('a.market_key=?', $market_key) ->get($this->db, null); if (empty($marketList) || count($marketList) <= 0) return new returnObject(1, 10007, '指定的门店不存在或已经被删除!'); ///$marketInfo = $marketList[0]; if (empty($open_id)) return new returnObject(1, 500, '用户open_id不能为空!'); require_once __DIR__ . '/../../lib/emoji/emoji.php'; $nick_name = emoji_docomo_to_unified($nick_name); $nick_name = emoji_kddi_to_unified($nick_name); $nick_name = emoji_softbank_to_unified($nick_name); $nick_name = emoji_google_to_unified($nick_name); /// 根据openId和门店Key从数据库中查询全局用户信息 $fan = get_wechat_by_user_id($market_key, $open_id, $union_id, $this->db); $pdo = $this->db; $pdo->beginTransaction(); try { if (!empty($fan)) { /// 假如数据库中已经存在全局用户信息 /// 查询粉丝对应的会员详细信息 $member = getWeixinUserByUId($fan['id'], $this->db); $member['uid'] = $fan['id']; $member['openid'] = $fan['openid']; $member['nickname'] = $nick_name; /// 粉丝头像 if (!empty($head_img)) $member['headimgurl'] = rtrim($head_img, '0') . 132; $member['sex'] = $sex; /// 性别 $member['province'] = $province; /// 所属省份 $member['city'] = $city; /// 所属城市 $member['country'] = ''; /// 所属国家 $member['privilege'] = ''; $member['subscribe'] = 0; /// 粉丝是否关注 $member['subscribe_time'] = 0; /// 粉丝是否关注 $member['unionid'] = $union_id; // unionid /// 根据当前openId创建一条全局用户记录或更新用户记录 $globalUserInfoId = updateUserInfo($scode, AUTHTYPE_WECHAT, $fan['openid'], $fan['unionid'], $market_key, $this->db, $pdo); /// 更新微信用户信息 updateWeixinUserInfo($member, $this->db, $pdo); } else { // 根据当前openId创建一条全局用户记录或更新用户记录 $globalUserInfoId = updateUserInfo($scode, AUTHTYPE_WECHAT, $open_id, $union_id, $market_key, $this->db, $pdo); $member = array( 'uid' => $globalUserInfoId, /// 全局用户ID 'openid' => $open_id, /// openid 'nickname' => $nick_name, /// 昵称 'headimgurl' => !empty($head_img) ? rtrim($head_img, '0') . 132 : '', /// 头像 'sex' => $sex, /// 性别 'province' => $province, /// 所属省份 'city' => $city, /// 所属城市 'country' => '', /// 所属国家 'privilege' => '', 'subscribe' => 0, /// 粉丝是否关注 'subscribe_time' => 0, /// 关注时间 'unionid' => $union_id, // unionid ); updateWeixinUserInfo($member, $this->db, $pdo); } $pdo->commit(); } catch (Exception $Exception) { $pdo->rollBack(); return new returnObject($Exception->getCode(), $Exception->getCode(), $Exception->getMessage()); } // 新创建的全局用户信息,从中获取新创建的sid $globalUserInfo = getUserById($globalUserInfoId, $this->db); $sid = $globalUserInfo['sid']; if (empty($sid)) return new returnObject(1, 13000, 'login failed, cannot query sid code value!'); else return new returnObject(0, 0, 'success!', array('sid' => $sid, 'scode' => $scode,)); } /** @inject("ioc_factory") */ private $factory; /** * @property({"default":"@db"}) * @var PDO */ public $db; // 此处删除了代码 }