微信扫码登录流程(业务流程向)
主流程
以某网站为例。
场景:用户电脑打开某网站,点击微信登陆,弹出微信二维码,用户用手机扫描这个二维码,在手机上选择同意登录,电脑上某网站得到同意登录的结果,完成登录。
电脑端:弹出微信二维码时,向wx报告将要登录(post),传参表单数据:
curl 'https://open.work.weixin.qq.com/wwopen/report' \
-H 'accept: */*' \
-H 'accept-language: zh-CN,zh;q=0.9' \
-H 'content-type: application/x-www-form-urlencoded; charset=UTF-8' \
-H 'origin: https://open.work.weixin.qq.com' \
-H 'priority: u=1, i' \
-H 'referer: https://open.work.weixin.qq.com/wwopen/sso/v1/qrConnect?appid=woshiappid&agentid=1000041&redirect_uri=https://hahahahah.com.cn&state=STATE&login_type=jssdk&href=https://hahaha.css' \
-H 'sec-ch-ua: "Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "Windows"' \
-H 'sec-fetch-dest: empty' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-site: same-origin' \
-H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36' \
-H 'x-requested-with: XMLHttpRequest' \
--data-raw 'q=st%3Asgkvuin_report%3D%7B%22id%22%3A1728895941078%2C%22key%22%3A%22sso%7Cqrcode%7Cview%7Cinner%22%2C%22value%22%3A1%2C%22kv%22%3A78502824%7D'接着,立刻请求微信服务端接口(get),这个接口标志二维码的若干状态,携带一些必要的信息。
curl 'https://open.work.weixin.qq.com/wwopen/sso/l/qrConnect?callback=jsonpCallback&key=e091e4043f85445e&redirect_uri=xxxhahahaha.com.cn&appid=woshiappid&_=1728895941077' \
-H 'accept: text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01' \
-H 'accept-language: zh-CN,zh;q=0.9' \
-H 'priority: u=1, i' \
-H 'referer: https://open.work.weixin.qq.com/wwopen/sso/v1/qrConnect?appid=woshiappid&agentid=1000041&redirect_uri=https://xxxxx.com.cn&state=STATE&login_type=jssdk&href=https://xxxxxxxx.css' \
-H 'sec-ch-ua: "Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "Windows"' \
-H 'sec-fetch-dest: empty' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-site: same-origin' \
-H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36' \
-H 'x-requested-with: XMLHttpRequest'
callback自定义回调,appid代表这个应用(通过微信授权可以使用微信登录的网站应用)的id,redirect_url重定向地址
其中key标志这个二维码的信息,也是地址,微信服务端会动态生成这个key所对应的二维码(两幅图非同一次,并非出错)。

自此,二维码出现了。
然后PC端对这个二维码的状态请求进行轮询,就是这个接口,轮询的方式是超时就轮询,超时时间在这里是20秒左右.

在超时时间内,这个请求没有得到回复,这个函数会返回结果。经过测试,未扫描的结果是
jsonpCallback({"status":"QRCODE_SCAN_NEVER","auth_code":""})扫描了的结果
jsonpCallback({"status":"QRCODE_SCAN_ING","auth_code":""})扫描后,手机取消登录的结果
jsonpCallback({"status":"QRCODE_SCAN_FAIL","auth_code":""})扫描后,手机同意登录的结果
jsonpCallback({
"status": "QRCODE_SCAN_SUCC",
"auth_code": "hahahahahahahahah"
})扫描二维码超时
jsonpCallback({"status":"QRCODE_SCAN_ERR","auth_code":""})状态转移:如果这个请求超时,那么延续上一个请求的状态;如果手机进行操作(登录或者取消),那么当前请求立即得到微信的响应结果,得到响应扫描了。
手机扫描这个二维码,会请求(get)微信接口,拿到一个内嵌网页,标有当前企业、应用是xxx,拥有同意登录或者取消登录的按钮

手机取消登录,向下图接口传一个post请求,携带空白数据,此时微信服务端立即处理,立即返回给PC当前的轮询的等待函数,得到空白数据

如果手机同意登录,手机同接口发送post请求,本地生成一个auth_code一起发送,微信服务端立即处理,那么PC会拿到唯一仅用一次的auth_code,然后去消费这个code,就登录成功了。然后根据重定向redirect_url跳转到应该去的地方。
自此,微信登录成功。
拓展资料
某跳动面试官:你再说说微信扫码登录背后的实现原理?(以某东为例)
乔戈里:阿里面试官:分别说说微信和淘宝扫码登录背后的实现原理?
微信开发文档:网站应用登录开发指南
The OAuth 2.0 Authorization Framework OAuth2.0的核心角色code 扫码登录
作者:一百个Chocolate 链接:https://juejin.cn/post/6924218259302694919 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
