微信登录API接口如何实现
待回答联系QQ: (紧急问题我们会及时联系您)
问题描述:
二次开发,增加了微信登录的API,本来是参照 官方 SyncLogin 插件来实现的。
但开发过程中发现问题,
SyncLogin 的处理逻辑是微信授权然后创建OS系统新账号(假如第一次微信登录),用新账号登录。
登录的调用方式是:
$rs = D('Member')->login($uid, $remember);
,因此我在API接口实现时也用了同样的处理逻辑,只不过在调用登录时报错,提示 参数错误。
于是我改用了这种方式调用:
$return = D('Api/Account')->login($uid, $pos);
登录确实是成功了,但不确定会不会有问题。
实现代码如下:
/**
* 第三方账号 同步登陆
* add by wzj
*/
public function SyncLogin()
{
$aType = $username = I_POST('type'); //登陆方式: WEIXIN facebook
if (empty($aType)) {
$this->apiError('类型参数不能为空');
}
$aOpenid = I_POST('openid');
if (empty($aOpenid)) {
$this->apiError('openid参数不能为空');
}
$aNickname = I_POST('nickname');
$aAvatar = I_POST('avatar');
$aSex = I_POST('sex');
$pos['token'] = I_POST('token');
//没有绑定,进行绑定
$userInfo['type'] = $aType;
$userInfo['name'] = $aNickname;
$userInfo['nick'] = $aNickname;
$userInfo['head'] = $aAvatar;
$userInfo['sex'] = $aSex == '1' ? 0 : 1;
$userInfo['openid'] = $aOpenid;
$loginInfo = D('SyncLogin')->where(array('type_uid' => $aOpenid, 'type' => $aType))->find();
if (empty($loginInfo)) {
//没有绑定,进行绑定
$uid = $this->addData($userInfo); //创建新用户
} else {
if (empty($loginInfo['uid'])) {//之前没有绑定成功
D('SyncLogin')->where(array('id' => $loginInfo['id']))->delete();
$uid = $this->addData($userInfo); //创建新用户
} else {
$uid = $loginInfo['uid'];
}
}
//理论上登录逻辑要先登录 uc 再登录上层应用。
//但是目前由于没有该用户的密码无法登录uc,所以目前只能直接登录上层应用,这样不知道有没有问题。
//目前暂时这么使用,等OS官方有微信登录后改为采用它的
$return = D('Api/Account')->login($uid, $pos);
//不用密码直接登陆;这是网页版微信登录方式
//如果接口采用这种方式会报错。
//$return = D('Member')->login($uid, false);
if(empty($return))
{
$this->apiError($uid . ',' . $this->showLoginError($uid));
}
$return['userinfo'] = D('Api/User')->getUserSimpleInfo_V1($uid);
$this->apiSuccess($return, '登录成功');
}
希望能跟OS官方咨询下。本人对系统内部创建账号和登录还不是特别了解,只是参照原有的代码来实现,但总是但是会有逻辑上的处理漏洞。
请登录后回答