search

Home  >  Q&A  >  body text

php - 微信网页进入页面也可以获取有效的code,但是分享出去后,获取不到code,请问这个问题应该怎么解决呢?

微信网页进入页面也可以获取有效的code,但是分享出去后,获取不到code,请问这个问题应该怎么解决呢?

大家讲道理大家讲道理2902 days ago190

reply all(1)I'll reply

  • 阿神

    阿神2017-04-10 17:19:04

    最近刚接触微信开发。你的页面的url应该是你控制器中的一个方法,分享出去的url也应该是这个方法,在这个方法里面第一件事就是从微信获取code,然后再进行url跳转,跳转到你实际需要访问的页面。实现的方法可以是在url后面加上不同的参数以区别访问页面的不同。
    我用laravel写的代码,删除了我的一些业务逻辑,你看个大概:

    <?php
    class WeiXinController extends BaseController {
        /**
         * @name OAuth2.0获取openid和用户信息跳转(外部专用,网页授权地址必须写当前代码地址)
         * 该方法的作用是进行微信用户授权,获取微信code,假设此方法的url为:http://mysite.com/oauthtwo
         * 则所有的页面访问均通过该url跳转,可以通过在该url上添加参数的形式来实现
         * 比如:在此url后添加type参数,通过判断type参数值跳转到不同的页面
         * 举例:http://mysite.com/oauthtwo?type=login
         * http://mysite.com/oauthtwo?type=signup
         * http://mysite.com/oauthtwo?type=play
         * http://mysite.com/oauthtwo?type=func1
         * @param string $url
         */
        public function oauthtwo(Request $request) {
            $redirectUrl = 'http://mysite.com/start';
            $redirectUrl = $redirectUrl . '?' . $_SERVER['QUERY_STRING'];// 取出参数并添加到跳转链接
            $redirectUrl = urlencode($redirectUrl);
            // 第一步:用户授权-跳转链接-获取到code
            $url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' . $this->appid . '&redirect_uri=' . $redirectUrl . '&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect';// 微信授权url
            
            return redirect($url);// 跳转到start方法
        }
        
        /**
         * 获取微信用户的openid和access_token,并判断type值跳转页面
         */
        public function start(Request $request) {
            // 第二步:通过code获取到openid和access_token(有效期两小时)
            $code = Input::get('code');
            $type = Input::get('type');
            $openid = Input::get('openid');
            $redirectUrl = 'http://mysite.com';// 设置一个默认跳转链接,后面专门写一个方法判断type值,获取需要跳转的链接
            $result = $this->getAccessToken($code);
            if ($result) {
                // 第三步:获取用户信息
                $result = $this->getUserInfo($result['openid'], $result['access_token']);
                // 第四步:跳转到访问页面链接,将用户openid写到url参数中
                $redirectUrl = $this->getRedirectUrl($type, $openid);//根据type值获取需要跳转的页面
            }
            
            return redirect($redirectUrl);
        }
        
        /**
         * 获取微信access_token
         * @return 成功返回结果,失败返回false
         */
        public function getAccessToken($code) {
            $getAccessTokenUrl = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $this->appid . '&secret=' . $this->appsecret . '&code=' . $code . '&grant_type=authorization_code';
            $httpapi = new CommonHttpApi();
            $result = $httpapi->call($getAccessTokenUrl);
            
            return $result;
        }
    
        /**
         * 获取用户信息
         * @param unknown $openid
         * @param unknown $accessToken
         */
        public function getUserInfo($openid, $accessToken) {
            $getUserInfoUrl = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $accessToken . '&openid=' . $openid . '&lang=zh_CN';
            $httpapi = new CommonHttpApi();
            $result = $httpapi->call($getUserInfoUrl);
            
            return $result;
        }
    }

    reply
    0
  • Cancelreply