【坑爹微信】微信开发基础 --- 微信快捷登陆问题解决

目录 List

  1. 那一抹淡淡的忧伤—–微信开发基础
  2. 用纯js是不可能用纯js了,这辈子都不用纯js了 —– 微信JSSDK开发以及问题解答
  3. 要你命3000 —— 微信支付开发系列问题解决

导语

微信快捷登陆是基于OAuth2.0 (如果想深入了解,点击查看博主的另一篇博文)和OPenid 等多种机制融合在一起的一种第三方授权协议接口的简称。
引用微信自己的话来讲快捷登陆的作用就是:如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑

简而言之就是拿着微信客户的资料入我们自己的系统完成我们自己的业务逻辑,这样做的好处是减少了用户注册登陆等环节的麻烦事,并且基于微信内置游览器能很好的延展我们要展现的业务功能,使操作流畅度增加。


微信开发前准备

这点准备其实你完全可以参考微信开发者文档

反正最后你得拥有以下这些:

  1. Appid
  2. Appsecret
  3. Mchid
  4. Key
  5. 证书并且上传至服务器
  6. JSSDK 安全授权目录配置好了
  7. 支付安全目录配置好了
  8. 支付回调目录配置好了

注意: 1和2是最基础的,你一定要有。后面的可以慢慢申办。


微信快捷登陆

终于说到正题了

首先我们要了解微信快捷登陆的步骤

1 第一步:用户同意授权,获取code
2 第二步:通过code换取网页授权access_token
3 第三步:拉取用户信息(需scope为 snsapi_userinfo)

其实你完全可以参考微信开发者文档

我现在直接将实施步骤,直接上代码

第一步:用户同意授权,获取code

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 若提示“该链接无法访问”,请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限。

warning “: 尤其注意:由于授权操作安全等级较高,所以在发起授权请求时,微信会对授权链接做正则强匹配校验,如果链接的参数顺序不对,授权页面将无法正常访问

//拼接跳转地址
$oauthUrl = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' . $this->config['wechat_appid'] . '&redirect_uri=' . urlencode($customeUrl) . '&response_type=code&scope=snsapi_userinfo&state=' . $_SESSION['weixin']['state'] . '#wechat_redirect';
//跳转换code
header('Location:'.$oauthUrl);

注意这里面的可选参数state,虽然微信官方标注这个state是可选参数,但是事实告诉我,这个参数是必须加的,因为苹果手机的防火墙会自动先进行一次请求,会让你的code被使用而过期,所以只有验证你给state是否是你当前给的再使用code才是正确的步骤,那么代码改成:

//真正意义上的超全局变量
            $GLOBALS['_SESSION']['weixin']['state'] = md5(uniqid());
            //先正则匹配掉以前客户端可能存下的code
            $customeUrl = preg_replace('#&code=(\\w+)#', '', $this->config['site_url'] . $_SERVER['REQUEST_URI']);
            //拼接出要跳转的URL来给微信(这里的state状态值必须还是填上,因为苹果手机的防火墙会自动先进行一次请求,会让你的code被使用而过期)
            $oauthUrl = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' . $this->config['wechat_appid'] . '&redirect_uri=' . urlencode($customeUrl) . '&response_type=code&scope=snsapi_userinfo&state=' . $_SESSION['weixin']['state'] . '#wechat_redirect';

            //进行下一步跳转

            header('Location:'.$oauthUrl);

第二步:通过code换取网页授权access_token

首先请注意,这里通过code换取的是一个特殊的网页授权access_token,与基础支持中的access_token(该access_token用于调用其他接口)不同。公众号可通过下述接口来获取网页授权access_token。如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止。

 //只有带state的请求才是正式请求所以要先判断
            if (isset($_GET['code']) && isset($_GET['state']) && ($_GET['state'] == $GLOBALS['_SESSION']['weixin']['state'])) {
                unset($_SESSION['weixin']);
                //根据拿的code来拿access_token
                $return = $this->https_request('https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $this->config['wechat_appid'] . '&secret=' . $this->config['wechat_appsecret'] . '&code=' . $_GET['code'] . '&grant_type=authorization_code');


                $jsonrt = $return;

第三步:拉取用户信息(需scope为 snsapi_userinfo)

如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。

$url='https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid='.$openid.'&lang=zh_CN';//通过access_token和openid调用此接口获得用户详细信息
                    $res=$this->https_request($url);
                    //下方写上你的业务逻辑

到这里整个流程走完。

获取整段代码可以加qq 1577452412


出现问题的解决

我们排查错误先从前端表现来说

如果你还没有出现微信授权页面,那就是第一步就错了

如果你出现了授权页面,但是点击后有错误那就是卡在第二步后面

第一步出错的:

请排查

1.APPID是否对应当前公众号
2.REDIRECT_URI 是否是正确的url 里面有没有乱码或者有没有屏蔽掉&code这样的参数
3.snsapi_userinfo 只有这种模式的登陆才能出现快捷登陆授权页面

上面所有方法的调试都很简单就是直接打印出当前的请求url 看看到底是啥

第二步出错的:

请排查

1.SECRET 是否是当前公众号的
2. CODE 是否过期(code只能使用一次,5分钟未被使用自动过期。 )
3. 必须保证跳转url完整 检查state=STATE 这个有没有漏掉

以上调试的方法直接打印请求结果就可以了

第三步出错的:

1.access_token是否有效

以上方法请参考 验证access_token

所有问题都可以加qq 1577452412来问我,共同进步

你可能感兴趣的:(代码收获)