游侠网云服务,免实名免备案服务器 游侠云域名,免实名免备案域名

统一声明:

1.本站联系方式
QQ:709466365
TG:@UXWNET
官方TG频道:@UXW_NET
如果有其他人通过本站链接联系您导致被骗,本站一律不负责!

2.需要付费搭建请联系站长QQ:709466365 TG:@UXWNET
3.免实名域名注册购买- 游侠云域名
4.免实名国外服务器购买- 游侠网云服务
微信开发网页授权获取用户基本信息总失败?这篇详细教程帮你一次搞定

先把这3个坑避开,比看10遍文档有用

我踩过的坑里,这3个是“重灾区”——80%的开发者第一次做授权都会栽进去,先记下来,比急着写代码管用。

坑1:授权域名没做“文件验证”,白配置了

我帮朋友配置时,一开始直接在公众号后台填了域名https://www.xxx.com就提交,结果提示“验证失败”。后来翻了3遍微信的帮助中心才明白:微信要确认这个域名是你自己的,所以会给你一个叫MP_verify_xxxxxx.txt的文件(xxxxxx是随机字符串),你得把这个文件放到服务器的根目录(比如/public或者/wwwroot),还要能通过https://www.xxx.com/MP_verify_xxxxxx.txt访问到——如果访问时提示“404”,说明文件没放对。

我当时犯的傻是:把文件放到了/static目录下,结果微信验证时找不到,后来移到根目录,刷新一下就通过了。记住:文件必须能直接通过域名访问,不能加任何路径

坑2:scope参数选成“snsapi_base”,拿不到用户信息

我之前以为“snsapi_base”听起来更“基础”,肯定能拿到所有信息,结果调接口时返回“需要用户同意授权”——原来这两个scope的区别大了:

  • snsapi_base:只能拿用户的openid(用户在这个公众号下的唯一标识),不需要用户点“同意”,直接静默授权;
  • snsapi_userinfo:能拿用户的昵称、头像、性别、地区,但需要用户点击“同意授权”按钮。
  • 要是你想拿用户的头像或昵称,必须选snsapi_userinfo——我朋友的小程序一开始选了base,结果用户登录后头像显示“默认灰色”,查了3小时才发现是这个参数错了。

    坑3:回调URL填了“http”,直接被微信拦截

    现在微信要求所有授权回调必须用https,我朋友的服务器之前是http,我没注意,直接填了http://www.xxx.com/callback,结果回调时跳转到“参数错误”页面。后来改成https,再试就正常了。

    要是你的服务器还没配置https,可以用Let’s Encrypt免费申请SSL证书——我帮朋友弄的时候,10分钟就搞定了,比想象中简单。

    从0到1走通授权流程:每一步都标好了“重点”

    避开坑之后,接下来的流程其实很清晰——我把每一步的“重点”都标出来,你跟着做,绝对不会错。

  • 公众号后台配置:就3步,别漏了“文件验证”
  • 首先登录公众号后台(注意是“服务号”或“订阅号(已认证)”,个人订阅号没有网页授权权限),找到“开发→接口权限→网页授权获取用户基本信息”,点击“修改”:

  • 第一步:填“授权回调页面域名”(比如www.xxx.com,不用加http/https);
  • 第二步:下载微信给的MP_verify_xxxxxx.txt文件,放到服务器根目录;
  • 第三步:点击“检测”,确认文件能访问到,再提交。
  • 重点:要是你用的是云服务器(比如阿里云、腾讯云),记得要在“安全组”里打开80/443端口——我之前帮朋友配置时,忘了开443端口,结果文件能在服务器本地访问,但通过域名访问不了,白等了1小时。

  • 生成授权链接:参数填对,直接复制用
  • 授权链接的格式是微信规定的,你只要把appid(公众号的AppID)、redirect_uri(授权后跳转的URL)、scope填对就行,其他参数照抄:

    https://open.weixin.qq.com/connect/oauth2/authorize?appid=你的AppID&redirect_uri=URLEncode后的回调URL&response_type=code&scope=snsapi_userinfo&state=随机字符串#wechat_redirect

    重点说明

  • redirect_uri必须用URL编码(比如https://www.xxx.com/callback要编码成https%3A%2F%2Fwww.xxx.com%2Fcallback)——我之前没编码,结果回调时redirect_uri变成了乱码,code拿不到;
  • state是防CSRF攻击的随机字符串(比如abc123),可以随便填,但最好加一下,更安全;
  • 最后一定要加#wechat_redirect——这是微信的“锚点”,不加的话,页面会跳转到微信的错误页。
  • 处理回调:用code换access_token和用户信息
  • 当用户点击授权链接,同意授权后,微信会跳转到你填的redirect_uri,并在URL后面加一个code参数(比如https://www.xxx.com/callback?code=xxxxxx&state=abc123)。接下来你要做的是:

    步骤1:获取URL里的code

    用你熟悉的语言(比如PHP、Node.js)获取code——以Node.js为例:

    // 假设你用的是Express框架
    

    app.get('/callback', (req, res) => {

    const code = req.query.code; // 拿到code

    const state = req.query.state; // 拿到之前填的state

    // 接下来用code换access_token

    });

    重点code只能用一次,过期时间是5分钟——要是你调试时刷新页面,code会失效,得重新走授权流程。

    步骤2:用code换access_token和openid

    接下来调用微信的“通过code换取网页授权access_token”接口,地址是:

    https://api.weixin.qq.com/sns/oauth2/access_token?appid=你的AppID&secret=你的AppSecret&code=刚才拿到的code&grant_type=authorization_code

    参数说明

  • appSecret:在公众号后台“开发→基本配置”里找,别泄露给别人;
  • grant_type:固定填authorization_code
  • 调用后,微信会返回一个JSON:

    {
    

    "access_token": "xxxxxx", // 网页授权access_token

    "expires_in": 7200, // 有效期2小时

    "refresh_token": "xxxxxx", // 刷新token(可以用它续期)

    "openid": "xxxxxx", // 用户的openid

    "scope": "snsapi_userinfo" // 授权作用域

    }

    重点access_token过期后,不用让用户重新授权——可以用refresh_token换一个新的access_token,这样用户体验更好。我朋友的小程序一开始没做刷新,结果用户每隔2小时就要重新登录,被骂了好几天。

    步骤3:用access_token拿用户信息

    最后一步,调用“获取用户信息”接口,地址是:

    https://api.weixin.qq.com/sns/userinfo?access_token=刚才拿到的access_token&openid=刚才拿到的openid&lang=zh_CN

    调用后,微信会返回用户的基本信息:

    {
    

    "openid": "xxxxxx",

    "nickname": "小甜", // 用户昵称

    "sex": 1, // 1男,2女,0未知

    "province": "北京",

    "city": "朝阳区",

    "country": "中国",

    "headimgurl": "https://thirdwx.qlogo.cn/xxxxxx", // 用户头像URL

    "privilege": []

    }

    重点:要是返回“access_token无效”,先检查这3点:

  • access_token是不是过期了?(有效期2小时);
  • openid是不是和access_token对应的?(比如你用A用户的code换的access_token,不能用来查B用户的信息);
  • 是不是调用了“基础支持的access_token”接口?(网页授权的access_token和基础支持的access_token不一样,别搞混了)。
  • 附:常见问题对照表(直接查,不用翻文档)

    为了省你查文档的时间,我把常见问题和解决方法做成了表格,直接看:

    问题现象 可能原因 解决方法
    域名验证失败 文件没放对根目录/端口没开 把文件移到根目录,检查80/443端口
    拿不到用户昵称 scope选了snsapi_base 改成snsapi_userinfo
    回调URL参数错误 用了http/没urlencode 改成https,对redirect_uri编码
    access_token无效 过期/和openid不匹配 用refresh_token续期/检查openid

    我帮朋友做授权功能时,按照这个流程走,只用了2小时就调试成功——你要是遇到问题,别慌,先查上面的表格,90%的问题都能解决。要是还解决不了,把报错信息贴到评论区,我帮你看看~

    对了,要是你试成功了,记得回来告诉我——看到自己的方法帮到别人,比我自己做成功还开心!


    公众号后台填了授权域名,为啥提示验证失败啊?

    这大概率是没做“文件验证”——微信会给你一个叫MP_verify_xxxxxx.txt的文件(xxxxxx是随机字符串),得把它放到服务器的根目录(比如/public或者/wwwroot),而且要能通过“域名+文件名”直接访问到,比如https://www.xxx.com/MP_verify_xxxxxx.txt,要是访问提示404,说明文件放错位置了。我之前帮朋友配置时,把文件放到了/static目录下,结果验证失败,移到根目录就好了。

    另外要注意,文件必须能直接通过域名访问,不能加任何路径,不然微信找不到。

    想拿用户头像和昵称,scope参数该选snsapi_base还是snsapi_userinfo?

    肯定选snsapi_userinfo!这俩参数区别很大:snsapi_base只能拿用户的openid(公众号下的唯一标识),不用用户点“同意”;但snsapi_userinfo能拿昵称、头像、性别这些信息,不过需要用户点击“同意授权”按钮。我之前以为snsapi_base更“基础”,结果选了之后用户头像显示默认灰色,查了3小时才改对。

    要是你要用户的头像、昵称这些信息,必须选snsapi_userinfo,别搞错了。

    回调URL填了http,为啥跳转时提示参数错误?

    微信现在要求所有授权回调必须用https,填http的话会直接被拦截。我朋友之前的服务器是http,填了之后回调就报错,改成https就好了。

    回调URL还要做URL编码,比如https://www.xxx.com/callback要写成https%3A%2F%2Fwww.xxx.com%2Fcallback,不然参数会乱码,拿不到code。

    拿到的code用不了,提示“已过期”是怎么回事?

    code的有效期只有5分钟,而且只能用一次——要是你调试时刷新页面,之前的code就失效了,得重新走一遍授权流程。我调试时经常犯这错,刷新后还在用旧code,结果一直报错,后来记住每次调试都重新点授权链接就好了。

    调用用户信息接口时,提示“access_token无效”咋解决?

    先检查这几个点: access_token的有效期是2小时,是不是过期了?要是过期了,可以用之前拿到的refresh_token换一个新的; 是不是access_token和openid不匹配?比如你用A用户的code换的access_token,却用来查B用户的信息,肯定无效; 是不是把“网页授权access_token”和“基础支持access_token”搞混了?网页授权的access_token只能用来拿用户信息,别用错了。

    我之前帮朋友调试时,就是access_token过期了,用refresh_token续期后就好了,不用让用户重新授权。