假设你的场景是这样的:
- 用户在前端点击“微信登录”,用
window.open(url)弹出一个新的窗口去做扫码登录。 - 服务端的
重定向接口在登录成功后,向弹出页面返回特定的 HTML 页面代码。 - 这个 HTML 代码通过
window.opener.postMessage向主页面(父页面)发送消息(携带授权/用户信息等)。
下面是微信扫码授权成功后的 HTML 文件(示例代码):
<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>微信登录返回</title></head><body><script>// 这里假设你把后端通过重定向参数传给这个页面的数据放在URL上// 例如你的url是 /wx-redirect?code=xxx&state=xxxfunctiongetQueryParam(name){constre=newRegExp('[?&]'+name+'=([^&#]*)','i');constmatch=window.location.search.match(re);returnmatch?decodeURIComponent(match[1]):null;}// 获取你需要回传给父窗口的数据,比如微信的codevarcode=getQueryParam('code');varstate=getQueryParam('state');// 可选// 向父窗口发送消息if(window.opener){window.opener.postMessage({type:'wechat_login',code:code,state:state},'*');// 建议将 * 替换为你的父页面origin}// (可选)自动关闭弹窗window.close();</script><h2>登录成功, 正在跳转...</h2></body></html>前端主页面监听接收:
window.addEventListener('message',function(event){// 建议校验 event.originif(event.data&&event.data.type==='wechat_login'){// 这里可以拿到 event.data.code, event.data.state// 做后续登录处理console.log('收到微信登录结果:',event.data);}});说明
- 你可以根据自己的需求,在 HTML 中加入 loading 或美化提示。
- 强烈建议在实际环境将 postMessage 的目标 origin 用主页面真实的 origin 替代
*,增加安全性。 - 参数和业务可以自定义,比如是 code 还是 token、state、其他。
如果你还有后端部分的接口编写需求,可以继续追问。