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"}) 登陆方式
* @throws({"phprs\util\exceptions\Forbidden","res", "403 Forbidden",{"error":"Forbidden"}}) cookie不可用
* @return("body")
*/
public function getLoginList($market_key = '', $logintype = 0)
{
if (empty($market_key))
{
$condition = 'is_enabled = 1';
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($this->db);
}
else
{
$condition = 'a.type_key = b.type_key and a.is_enabled = 1 and b.is_enabled = 1 and market_key = ?';
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($this->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, $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}";
}
// 开启一个会话
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/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_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)
{
$this->forwardUrl($fail_url, (new returnObject(1, 10010, '缺少必要参数,登录失败!'))->to_array());
}
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)
{
$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']))
{
$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;
}
// 根据openId和门店Key从数据库中查询全局用户信息
$fan = getUserByOpenId($market_key, $oauth['openid'], 0, $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"]))
{
// 假如授权返回错误消息,则重新登录
$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'] = $userinfo['privilege'];
$member['subscribe'] = $userinfo['subscribe'];// 粉丝是否关注
// 粉丝是否关注
$member['subscribe_time'] = $userinfo['subscribe_time'];
$member['unionid'] = $userinfo['unionid']; // unionid
// 根据当前openId创建一条全局用户记录或更新用户记录
$globalUserInfoId = updateUserInfo($scode, AUTHTYPE_WECHAT, $fan['openid'], $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'], $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"];
/*
$newTarget = '';
$targetUrls = parse_url($target);
if (!empty($targetUrls))
{
$newTarget = $targetUrls['scheme'] . '://' . $targetUrls['host'] . ((!empty($targetUrls['port']) && $targetUrls['port'] != '80') ? ':' . $targetUrls['port'] : '') . $targetUrls['path'];
}
$paramers = "";
if (!empty($targetUrls['query']))
{
// 假如传入了参数
$paramerList = explode("&", $targetUrls['query']);
if (!empty($paramerList) && count($paramerList) > 0)
{
foreach ($paramerList as $key => $value)
{
if (!strstr($value, 'sid='))
{
if (empty($paramers))
{
$paramers = $value;
}
else
{
$paramers .= '&' . $value;
}
}
}
}
}
$stateParamers = "";
if (!empty($state))
{
$stateParamers = "&state=" . $state;
}
if (empty($paramers))
{
$newTarget .= '?sid=' . $sid . $stateParamers;
}
else
{
$newTarget .= '?' . $paramers . '&sid=' . $sid . $stateParamers;
}
*/
$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);
}
/**
* 使用微信授权登录
* @route({"GET","/weixin_url"})
* @param({"appid","$._GET.appid"}) 应用appid
* @param({"devkey","$._GET.devkey"}) 开发者key
* @param({"market_key","$._GET.market_key"}) 商家key
* @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 = "", $target = "", $state = '')
{
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];
$account = array();
$account["key"] = $marketInfo['weixin_appid'];
$weixin = new WeiXinAccount($account);
// 开启一个会话
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/callback_url"})
* @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();
$target = "";
$app_id = "";
$devkey = "";
$market_id = "";
$state = "";
if (isset($_SESSION['user_target']))
{
$target = $_SESSION['user_target'];
$app_id = $_SESSION['user_app_id'];
$devkey = $_SESSION['user_devkey'];
$market_id = $_SESSION['user_market_id'];
$state = $_SESSION['state'];
}
if (!$target || !$app_id || !$devkey || !$market_id)
{
return "登录失败!";
}
if (!$state || !$code)
{
header('Location: ' . $target);
}
$marketList = Sql::select('syweb_market.*')
->from('syweb_market')
->where('syweb_market.id=?', $market_id)
->get($this->db, null);
if (empty($marketList) || count($marketList) <= 0)
{
return "登录失败,未找到对应门店。";
}
$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/callback_url');
// 返回网页非静默授权的授权访问地址
// 参数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'],$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'] = $userinfo['privilege'];
$member['subscribe'] = $userinfo['subscribe'];// 粉丝是否关注
// 粉丝是否关注
$member['subscribe_time'] = $userinfo['subscribe_time'];
// 根据当前openId创建一条全局用户记录或更新用户记录
$globalUserInfoId = updateUserInfo($scode,AUTHTYPE_WECHAT,$fan['openid'],$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'],$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"];*/
if (strstr($target, '?'))
{
if (strstr($target, '&'))
{
$target .= '&openid=' . $oauth['openid'];
}
else
{
if (strstr($target, '='))
{
$target .= '&openid=' . $oauth['openid'];
}
else
{
$target .= 'openid=' . $oauth['openid'];
}
}
}
else
{
$target .= '?openid=' . $oauth['openid'];
}
// 登录成功后跳转到客户端传入的回调页面
header('Location: ' . $target);
}
/**
* 使用微信授权登录(直接跳转方式),获取用户信息
* @route({"GET","/weixin_user_url"})
* @param({"appid","$._GET.appid"}) 应用appid
* @param({"devkey","$._GET.devkey"}) 开发者key
* @param({"market_key","$._GET.market_key"}) 门店key
* @param({"target","$._GET.target"}) 客户端需要回调的地址
* @param({"fail_target","$._GET.fail_target"}) 发生错误时,客户端回调的页面
* @throws({"phprs\util\exceptions\Forbidden","res", "403 Forbidden",{"error":"Forbidden"}}) cookie不可用
*/
public function weixinUserUrlLogin($appid = "", $devkey = "", $market_key = "", $target = "", $fail_target = '')
{
if (empty($appid))
{
return "未传入appid参数。";
}
if (empty($devkey))
{
return "未传入devkey参数。";
}
$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)
{
return "指定的devkey不存在或未被审核。";
}
$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)
{
return "指定的应用不存在或未被审核。";
}
$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)
{
return "指定的商户不存在或未被审核。";
}
$marketInfo = $marketList[0];
$account = array();
$account["key"] = $marketInfo['weixin_appid'];
$weixin = new WeiXinAccount($account);
/// 剔除必须的参数.
$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('', '', $appInfo['id'], $devkey, $marketInfo["market_key"], $target, $parameters, $fail_target))->to_string();
$callback = $this->getFullUrl('/api/login/weixin/callback_user_url');
$state = 'ylsid-' . session_name();
$forward = $weixin->getOauthUserInfoUrl($callback, $state);
header('Location: ' . $forward);
exit();
}
/**
* 微信授权登录回调
* @route({"GET","/weixin/callback_user_url"})
* @param({"code", "$._GET.code"})
* @param({"state", "$._GET.state"})
* @throws({"phprs\util\exceptions\Forbidden","res", "403 Forbidden",{"error":"Forbidden"}}) cookie不可用
*/
public function weixinUserUrlLoginCallback($code, $state)
{
session_start();
$app_id = '';
$devkey = '';
$market_key = '';
$return_url = '';
$return_parameter = '';
$fail_url = '';
if (isset($_SESSION[LOGINPARAMETER_CALLBACK]))
{
$login = LoginCallbackInformation::CreateWithString($_SESSION[LOGINPARAMETER_CALLBACK]);
$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 (!$app_id || !$devkey || !$market_key || !$return_url || !$fail_url)
{
return "登录失败!";
}
if (!$state || !$code)
{
header('Location: ' . $return_url);
}
$marketList = Sql::select('syweb_market.*')
->from('syweb_market')
->where('syweb_market.market_key = ?', $market_key)
->get($this->db, null);
if (empty($marketList) || count($marketList) <= 0)
{
return "指定的商户ID不存在!";
}
$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/callback_user_url');
// 返回网页非静默授权的授权访问地址
// 参数1:回调页面地址
// 参数2:重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,
// 最多128字节
$forward = $weixin->getOauthUserInfoUrl($callback, $state);
header('Location: ' . $forward);
exit;
}
$pdo = $this->db;
// 通过网页授权查询用户详细信息
$userinfo = $weixin->getOauthUserInfo($oauth['access_token'], $oauth['openid']);
// 通过openId拉取用户信息,判断用户是否关注了公众号
$baseUserInfo = $weixin->fansQueryInfo($oauth['openid'], $this->db, $pdo);
if (!empty($userinfo["errcode"]))
{
// 假如授权返回错误消息,则重新登录
header('Location: ' . $return_url);
}
else
{
if (!empty($baseUserInfo["errcode"]))
{
// 假如授权返回错误消息,则重新登录
header('Location: ' . $return_url);
}
else
{
if ($baseUserInfo["subscribe"] == 1)
{
$userinfo["subscribe"] = 1;
$userinfo["subscribe_time"] = $baseUserInfo["subscribe_time"];
}
else
{
$userinfo["subscribe"] = 0;
$userinfo["subscribe_time"] = 0;
}
}
}
// 根据当前openId创建一条全局用户记录或更新用户记录
//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;
}
$extend_paramers = "nickname=" . $userinfo["nickname"];
$extend_paramers .= "&sex=" . $userinfo["sex"];
$extend_paramers .= "&province=" . $userinfo["province"];
$extend_paramers .= "&city=" . $userinfo["city"];
$extend_paramers .= "&country=" . $userinfo["country"];
$extend_paramers .= "&headimgurl=" . $userinfo["headimgurl"];
$extend_paramers .= "&privilege=" . $userinfo["privilege"];
$extend_paramers .= "&subscribe=" . $userinfo["subscribe"];
$extend_paramers .= "&subscribe_time=" . $userinfo["subscribe_time"];
$extend_paramers .= "&openid=" . $userinfo["openid"];
$extend_paramers .= "&state=" . $state;
$p = strstr($return_url, '?');
if (empty($p))
$return_url .= "?{$extend_paramers}{$return_parameter}";
elseif ('?' == $p)
$return_url .= "{$extend_paramers}{$return_parameter}";
else
$return_url .= "&{$extend_paramers}{$return_parameter}";
// 登录成功后跳转到客户端传入的回调页面
header('Location: ' . $return_url);
}
/**
* 使用聚开心授权登录
* @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)
{
$this->forwardUrl($fail_url, (new returnObject(1, 10010, '缺少必要参数,登录失败!'))->to_array());
}
if (!$spid || !$accessToken || !$uid)
{
$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, 2, $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"];
/*
$newTarget = '';
$targetUrls = parse_url($target);
if (!empty($targetUrls))
{
$newTarget = $targetUrls['scheme'] . '://' . $targetUrls['host'] . ((!empty($targetUrls['port']) && $targetUrls['port'] != '80') ? ':' . $targetUrls['port'] : '') . $targetUrls['path'];
}
$paramers = "";
if (!empty($targetUrls['query']))
{
// 假如传入了参数
$paramerList = explode("&", $targetUrls['query']);
if (!empty($paramerList) && count($paramerList) > 0)
{
foreach ($paramerList as $key => $value)
{
if (!strstr($value, 'sid='))
{
if (empty($paramers))
{
$paramers = $value;
}
else
{
$paramers .= '&' . $value;
}
}
}
}
}
$stateParamers = "";
if (!empty($state))
{
$stateParamers = "&state=" . $state;
}
if (empty($paramers))
{
$newTarget .= '?sid=' . $sid . $stateParamers;
}
else
{
$newTarget .= '?' . $paramers . '&sid=' . $sid . $stateParamers;
}
*/
$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));
}
/** @inject("ioc_factory") */
private $factory;
/**
* @property({"default":"@db"})
* @var PDO
*/
public $db;
// 此处删除了代码
}