企业微信对接:回调地址带#时返回地址参数位置不对的问题

企业微信对接回调地址带#参数位置问题解决
// 需要企微回调的地址
http://localhost:1024/app/#/SsoLogin?loginMethod=qw

// 企微配置的地址
https://open.weixin.qq.com/connect/oauth2/authorize?appid=xxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A1024%2Fapp%2F%23%2FSsoLogin%3FloginMethod%3Dqw&response_type=code&scope=snsapi_base&state=STATE&agentid=AGENTID#wechat_redirect

// 企微返回的地址
http://localhost:1024/app/?code=xxxxxxxxxxxxxxxxxxstate=000000#/SsoLogin?loginMethod=qw

返回结果并没有在#/SsoLogin后拼接参数

方法一:

企微返回的地址虽然参数顺序不对,但还是访问到/SsoLogin这个地址
只需要在这个页面中处理一下字符串取出参数即可

const getUrlParamsRegex = url => {
  const params = {};
  // 处理 URL 中的参数
  const urlParts = url.split("?");
  if (urlParts[1]) {
    const searchParams = new URLSearchParams(urlParts[1].split("#")[0]);
    for (const [key, value] of searchParams.entries()) {
      params[key] = value;
    }
  }
  // 处理 hash 中的参数
  const hashParts = url.split("#");
  if (hashParts[1]) {
    const hashParams = new URLSearchParams(hashParts[1].split("?")[1] || "");
    for (const [key, value] of hashParams.entries()) {
      params[key] = value;
    }
  }
  return params;
};

// 返回结果取值  const urlParamsRegex = getUrlParamsRegex(window.location.href);
// urlParamsRegex.code

方法二

1、修改vue路由模式,去掉#

// createWebHashHistory改为createWebHistory,并可以在配置额文件指定路由后缀VITE_PUBLIC_PATH

// 原代码
const router = createRouter({
  history: createWebHashHistory(),
...
});

// 修改后
const router = createRouter({
  history: createWebHistory(import.meta.env.VITE_PATH),
...
});

2、修改nginx配置

// 原配置
        location /app {
            root  /usr/share/nginx;
            index index.html;
        }

// 修改后
        location /app {
            root  /usr/share/nginx;
            index index.html;
            try_files $uri $uri/ /cloud/index.html;
        }
### 企业微信 OpenAPI 回调地址请求失败解决方案 在处理企业微信 OpenAPI 的回调地址验证,如果遇到“openapi回调地址请求不通过”的错误提示,通常是因为返回值不符合预期或者配置存在问题。以下是可能的原因分析以及对应的解决方案: #### 原因一:返回值格式错误 根据描述,在 Spring MVC 中使用 `@RestController` 注解的方法会默认将字符串作为 JSON 返回[^2]。然而,企业微信回调地址验证需要服务器原样返回明文字符串(即 echostr 参数),而不能将其包裹成 JSON 格式的响应。 ##### 解决方案: 修改控制器方法以确保返回纯文本而非 JSON 数据结构。可以通过调整返回方式来实现这一点。例如: ```java import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class WeChatController { @GetMapping("/wechat/callback") public String validateCallback(@RequestParam(required = false) String signature, @RequestParam(required = false) String timestamp, @RequestParam(required = false) String nonce, @RequestParam(required = false) String echostr) { // 验证签名逻辑省略... // 如果是验证请求,则直接返回 echostr if (echostr != null && !echostr.isEmpty()) { return echostr; // 纯文本返回 } return "success"; // 正常业务逻辑返回 } } ``` 注意这里未使用任何额外封装,而是直接返回了原始字符串 `echostr` 或 `"success"`。 --- #### 原因二:网络连通性问题 即使代码层面实现了正确的回显机制,还需要确认企业微信能够访问到您的服务端 URL。防火墙、反向代理或其他安全策略可能会阻止外部对企业微信 API 进行正常通信。 ##### 解决方案: 1. **检查公网可达性** 使用工具测试目标主机是否可以从外网访问,比如通过 telnet 测试端口开放情况。 2. **DNS解析校验** 确认绑定域名已正确指向实际运行环境 IP 地址,并且无缓存影响导致延迟生效。 3. **SSL证书合规性核查** 若采用 HTTPS 协议部署应用,则需保证所使用的 SSL/TLS 证书由受信任 CA 签发并处于有效期内。 --- #### 原因三:间戳与随机数匹配异常 当接收到 GET 请求,除了简单反射 `echostr` 外部输入之外,还需完成一次基础的安全性校验——基于官方提供的算法计算得出当前消息合法性标识符(signature)。只有两者一致才允许继续操作流程。 ##### 计算公式如下所示: 设 token 是预先设定好的密钥串;timestamp 和 nonce 则分别代表间戳与随机码字段名。按照字典序拼接这三个变量后再取 SHA1 散列值得到最终结果用于对比。 ```java import java.security.MessageDigest; import java.util.Arrays; public static boolean checkSignature(String token, String timestamp, String nonce, String signature) throws Exception { String[] paramArr = new String[]{token, timestamp, nonce}; Arrays.sort(paramArr); // 字典顺序排列 StringBuilder sbuilder = new StringBuilder(); for (String item : paramArr){ sbuilder.append(item); } MessageDigest mdigest = MessageDigest.getInstance("SHA-1"); byte[] digestBytes = mdigest.digest(sbuilder.toString().getBytes()); StringBuilder hexStrBuilder = new StringBuilder(); for(byte b : digestBytes){ hexStrBuilder.append(Integer.toHexString((b & 0xFF) | 0x100).substring(1,3)); } return hexStrBuilder.toString().equalsIgnoreCase(signature); } ``` 上述函数可以嵌入至前述 Controller 方法内部以便于实评估传参可信度。 --- ### 总结 综上所述,针对企业微信 OpenAPI 回调地址请求失败的情况,应着重排查以下几个方面: - 是否严格按照规定格式回应数据; - 应用所在实例是否存在物理隔离屏障阻碍连接建立; - 数学运算环节是否有疏漏致使认证失败。 只要逐一排除以上隐患即可顺利解决问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值