在该页面内,有如下说明:
“方式二:点击移动端链接快速授权 第三方平台方可以生成授权链接,将链接通过移动端直接发给授权管理员,管理员确认后即授权成功。”
其中,参数“redirect_uri”在“步骤 4:授权后回调 URI,得到授权码(authorization_code)和过期时间”时,如果redirect_uri中存在自定义参数并按&拼接,则其&会被微信服务器变成&,导致回调失败。
例子:
假设用户的redirect_uri为:
http://127.0.0.1/test/?a=1&b=2&c=3
通过RFC 3986 URL编码后成为
http%3A%2F%2F127.0.0.1%2Ftest%2F%3Fa%3D1%26b%3D2%26c%3D3
拼接后得到移动授权链接:
https://mp.weixin.qq.com/safe/bindcomponent?action=bindcomponent&auth_type=3&no_scan=1&component_appid=xxxx&pre_auth_code=xxxxx&redirect_uri=http%3A%2F%2F127.0.0.1%2Ftest%2F%3Fa%3D1%26b%3D2%26c%3D3&auth_type=xxx&biz_appid=xxxx#wechat_redirect
最终回调时,微信服务器把redirect_uri中的&变成&,导致返回如下地址:
http://127.0.0.1/test/?a=1&b=2&c=3&auth_code=xxxxxxxxxxxxxxxxxx&expires_in=3600
结果第三方平台无法获取自定义参数b和c,导致回调业务失败。
===============
查了查,这个bug似乎很早有人提,但不知道为什么没人受理。
相关例子:https://developers.weixin.qq.com/community/develop/doc/0004a019c24f48fdfba74d84551000
我也遇到了这个问题,顶!
encode a=1&b=2&c=3 ==> a%3D1%26b%3D2%26c%3D3 state=a%3D1%26b%3D2%26c%3D3 redirect_uri=http%3A%2F%2F127.0.0.1%2Ftest%2F%3Fstate%3Da%253D1%2526b%253D2%2526c%253D3 回调后接收到的参数: state: a=1&b=2&c=3,自己再解析成所需参数