用户咋微信中登录授权后,跳转到原来的地址,代码中获取原来地址写法如下:
if (!isset($_GET['code'])){
//触发微信返回code码
$baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING']);
$url = $this->__CreateOauthUrlForCode($baseUrl);
Header("Location: $url");
exit();
如果这种方式返回,URL不带任何参数是正确的,如果用户在朋友圈打开分享的链接,就会系统报错,例如:当前的URL为:http://www.baidu.com/goods/goodsid/2.html,分享在朋友圈的链接加上了微信来源。http://www.baidu.com/goods/goodsid/2.html?from=singlemessage&is....使用$baseurl后,获取到的链接会变成http://www.baidu.com/goods/goodsid/2.htmlfrom=singlemessage&is....
注意:授权回来后的URL变了,缺少了个问号,如果逻辑处理的话,获取goodsid就会变成2.htmlfrom=singlemessage&is...,导致数据库报错,解决办法:
private function get_url() {
$sys_protocal = isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://';
$php_self = $_SERVER['PHP_SELF'] ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
$path_info = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '';
$relate_url = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $php_self.(isset($_SERVER['QUERY_STRING']) ? '?'.$_SERVER['QUERY_STRING'] : $path_info);
return $sys_protocal.(isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '').$relate_url;
}
使用这个链接获取当前URL,就可以$this->get_url();
在mobilebase控制器中,获取头像的函数还没有写,只有获取用户的openid,还需要几个函数
if($wechat_config && !$_SESSION['openid']){
//去授权获取openid
$wxuser = $this->GetOpenid();
//获取用户昵称
//微信自动登录
$data = array(
'openid'=>$wxuser['openid'],//支付宝用户号
'oauth'=>'weixin',
'nickname'=>$wxuser['nickname'],
'head_pic'=>$wxuser['headimgurl']
);
$logic = new UsersLogic();
$data = $logic->thirdLogin($data);
if($data['status'] == 1){
session('user',$data['result']);
session('user_id',$data['result']['user_id']);
// 登录后将购物车的商品的 user_id 改为当前登录的id
M('cart')->where("session_id = '{$this->session_id}'")->save(array('user_id'=>$data['result']['user_id']));
}
}
Getopenid()这个函数只是获取到了openid,并没有昵称与头像,需要在函数调用另外一个获取用户信息的函数:
public function GetOpenid()
{
if($_SESSION['openid'])
return $_SESSION['openid'];
//通过code获得openid
if (!isset($_GET['code'])){
//触发微信返回code码
$baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING']);
$url = $this->__CreateOauthUrlForCode($baseUrl);
Header("Location: $url");
exit();
} else {
//获取code码,以获取openid
$code = $_GET['code'];
$data = $this->getOpenidFromMp($code);
$openid = $data['openid'];
$_SESSION['openid'] = $openid;
$userinfo=$this->GetUserInfo($data['access_token'],$openid);//获取用户头像等信息
return $userinfo;
}
}
public function GetUserInfo($access_token,$openid){
$params = array(
'access_token' => $access_token,
'openid' => $openid,
'lang' => 'zh_CN'
);
$jsonStr = $this->http('https://api.weixin.qq.com/sns/userinfo', $params);
$jsonArr = $this->parseJson($jsonStr);
if ($jsonArr) {
return $jsonArr;
}else {
return false;
}
}
private function parseJson($json) {
$jsonArr = json_decode($json, true);
if (isset($jsonArr['errcode'])) {
if ($jsonArr['errcode'] == 0) {
$this->result = $jsonArr;
return true;
} else {
//$this->error = $this->ErrorCode($jsonArr['errcode']);
return false;
}
}else {
return $jsonArr;
}
}
商品地方还有一些bug后面再一一添加。有开发的可以加我交流:li@cdhand.com