游客
游客
阅读:1502 回复:1

微信网页授权后调整参数错误

楼主#
更多 发布于:2016-06-27 11:33

用户咋微信中登录授权后,跳转到原来的地址,代码中获取原来地址写法如下:

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

MRDZ工作室
贫民
贫民
  • UID12033
  • 粉丝0
  • 关注0
  • 发帖数0
沙发#
发布于:2016-07-23 03:26
我也建议官方统一使用 wechat sdk
本人已经全部改造成https://github.com/dodgepudding/wechat-php-sdk
游客

返回顶部