当前位置: 首页 > news >正文

解决微信OAuth2.0网页授权回调域名只能设置一个的问题

解决微信OAuth2.0网页授权只能设置一个回调域名的问题

get-weixin-code.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>微信登录</title>
</head><body><script>var GWC = {version: '1.2.0',urlParams: {},appendParams: function (url, params) {if (params) {var baseWithSearch = url.split('#')[0];var hash = url.split('#')[1];for (var key in params) {var attrValue = params[key];if (attrValue !== undefined) {var newParam = key + "=" + attrValue;if (baseWithSearch.indexOf('?') > 0) {var oldParamReg = new RegExp('^' + key + '=[-%.!~*\'\(\)\\w]*', 'g');if (oldParamReg.test(baseWithSearch)) {baseWithSearch = baseWithSearch.replace(oldParamReg, newParam);} else {baseWithSearch += "&" + newParam;}} else {baseWithSearch += "?" + newParam;}}}if (hash) {url = baseWithSearch + '#' + hash;} else {url = baseWithSearch;}}return url;},getUrlParams: function () {var pairs = location.search.substring(1).split('&');for (var i = 0; i < pairs.length; i++) {var pos = pairs[i].indexOf('=');if (pos === -1) {continue;}GWC.urlParams[pairs[i].substring(0, pos)] = decodeURIComponent(pairs[i].substring(pos + 1));}},doRedirect: function () {var code = GWC.urlParams['code'];var appId = GWC.urlParams['appid'];var scope = GWC.urlParams['scope'] || 'snsapi_base';var state = GWC.urlParams['state'];var isMp = GWC.urlParams['isMp']; //isMp为true时使用开放平台作授权登录,false为网页扫码登录var baseUrl;var redirectUri;if (!code) {baseUrl = "https://open.weixin.qq.com/connect/oauth2/authorize#wechat_redirect";if (scope == 'snsapi_login' && !isMp) {baseUrl = "https://open.weixin.qq.com/connect/qrconnect";}//第一步,没有拿到code,跳转至微信授权页面获取coderedirectUri = GWC.appendParams(baseUrl, {'appid': appId,'redirect_uri': encodeURIComponent(location.href),'response_type': 'code','scope': scope,'state': encodeURIComponent(state),});} else {//第二步,从微信授权页面跳转回来,已经获取到了code,再次跳转到实际所需页面redirectUri = GWC.appendParams(GWC.urlParams['redirect_uri'], {'code': code,'state': encodeURIComponent(state)});}location.href = redirectUri;}};GWC.getUrlParams();GWC.doRedirect();</script>
</body></html>

 

使用方法

  1. 部署get-weixin-code.html至你的微信授权回调域名的目录下

  2. 使用方式类似于直接通过微信回调的方式,只是将回调地址改成了get-weixin-code.html所在的地址,另外省去了response_type参数(因为它只能为code)以及#wechat_redirect(它是固定的),它们会在get-weixin-code.html里面自己加上

  3. get-weixin-code.html页面从微信那里拿到code之后会重新跳转回redirect_uri里面填写的url,并且在url后面带上codestate

详细示例

  1. 前往微信公众平台->接口权限->网页授权获取用户基本信息->修改,填写授权回调页面域名,例如www.abc.com

  2. www.abc.com域名下部署get-weixin-code.html,不一定是根目录,例如:http://www.abc.com/xxx/get-weixin-code.html

  3. 假设你的http://www.xyz.com/hello-world.html这个页面需要获取微信授权,那么你应该使用以下地址来获取授权:http://www.abc.com/xxx/get-weixin-code.html?appid=XXXX&scope=snsapi_base&state=hello-world&redirect_uri=http%3A%2F%2Fwww.xyz.com%2Fhello-world.html

  4. 这样最终就会跳转到这样一个地址:http://www.xyz.com/hello-world.html?code=XXXXXXXXXXXXXXXXX&state=hello-world,从而你就拿到了授权code以及自定义的state参数了

其他说明

  • 通过多一次的跳转,解决了微信限制回调域名只能设置一个的问题

  • 牺牲了一点用户体验,换来了项目部署的美感,不需要将各种项目都部署到一个域名下

  • 如果你有这样的需求,可以使用本项目

  • 很多朋友问我怎么支持第三方微信平台,这个需要对不同的第三方平台的授权方式有所了解,熟悉他们的授权方式,请求参数等。如果他们是通过在网站入口处的URL上进行授权的,那么可以使用本项目,将入口的URL改成上述的方式,如果他们是在流程中的某些页面去获取授权,那么是没法改变他们的获取地址的,所以本项目就不适用了

 


http://www.mrgr.cn/news/58897.html

相关文章:

  • python的Django的render_to_string函数和render函数模板的使用
  • 从区别看本质:CRM和SCRM的全面对比
  • 分支限界法(Branch and Bound)详细解读
  • 【必收藏】史上最全AI工具大盘点!一篇搞定所有需求
  • 使用Prometheus对微服务性能自定义指标监控
  • iOS调试真机出现的 “__llvm_profile_initialize“ 错误
  • Docker部署项目
  • LeetCode 每日一题 2024/10/21-2024/10/27
  • day02|计算机网络重难点之HTTP请求报文和响应报文、HTTP的请求方式(方法字段)、GET请求和POST请求的区别
  • 统一异常处理和拦截器
  • 了解Oracle表结构查询:获取列信息与注释
  • Mac打开环境变量配置文件,source ~/.zshrc无法打开问题解决
  • 分享一款录屏、直播软件
  • 计算机组成原理之指令系统的基本概念、指令格式
  • 数学之三角函数
  • 太香了,用AI做育儿账号带货,卖出2.1万件赚佣金10W+
  • Spring Boot框架下的厨艺社交网络构建
  • IP协议详解:报头格式、主机定位、转发流程、网段划分与路由机制
  • 算法刷题-小猫爬山
  • 《打造 C++团队知识库:提升团队实力,开启高效编程之旅》
  • 函数递归
  • 嵌入式软开——八股文——学习引导和资料网址
  • 【微服务】Java 对接飞书多维表格使用详解
  • C++的IO流(文件部分在这里)
  • 软考高级架构-7.2-基于架构的软件开发方法-超详细讲解+精简总结
  • Redis混合持久化原理