

统一声明:
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走通授权流程:每一步都标好了“重点”
避开坑之后,接下来的流程其实很清晰——我把每一步的“重点”都标出来,你跟着做,绝对不会错。
首先登录公众号后台(注意是“服务号”或“订阅号(已认证)”,个人订阅号没有网页授权权限),找到“开发→接口权限→网页授权获取用户基本信息”,点击“修改”:
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
——这是微信的“锚点”,不加的话,页面会跳转到微信的错误页。当用户点击授权链接,同意授权后,微信会跳转到你填的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用户的信息); 附:常见问题对照表(直接查,不用翻文档)
为了省你查文档的时间,我把常见问题和解决方法做成了表格,直接看:
问题现象 | 可能原因 | 解决方法 |
---|---|---|
域名验证失败 | 文件没放对根目录/端口没开 | 把文件移到根目录,检查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续期后就好了,不用让用户重新授权。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!
站长QQ:709466365 站长邮箱:709466365@qq.com