问题描述
-
我们的小程序项目当前使用 uniCloud-aliyun 云函数。
-
已将微信公众平台“消息推送接口配置”的 URL 指向 URL 化后的云函数 wxPay 。
-
微信后台点击“提交 / 校验 Token”时,云函数能够收到 GET 请求,但微信后台仍持续提示:
- Token校验失败,请检查确认
-
我们已完成多轮静态与实际验算,怀疑问题不在业务代码逻辑,而在 uniCloud 阿里云 URL 化网关对微信 GET 握手响应的实际落地格式 。
环境信息 -
云平台: uniCloud 阿里云
-
云函数: wxPay
-
URL 化地址:
- https://fc-mp-17193ea3-c323-4869-8221-12e844009d10.next.bspapp.com/http/wxPay
-
微信消息推送模式:
- 明文模式
-
微信消息推送 Token:
- 已与云端环境变量 WECHAT_MESSAGE_TOKEN 保持一致
当前代码实现情况
- 已与云端环境变量 WECHAT_MESSAGE_TOKEN 保持一致
-
wxPay 已实现 GET 握手逻辑:
- 校验 signature / timestamp / nonce
- 校验通过后返回 echostr
-
关键代码位置:
- wxPay/index.js
- wxPay/config.js
当前 GET 成功返回代码
我们已经确认并排除的事项
-
已确认微信后台请求 确实打到了 wxPay
-
已确认本地与云端代码中 存在 GET 握手逻辑
-
已确认 Token 读取 key 为:
- WECHAT_MESSAGE_TOKEN
-
已确认微信后台配置的是 明文模式
-
已确认 URL 指向当前 wxPay 的 URL 化地址
-
已对微信 GET 请求中的 signature 进行本地 SHA1 验算,结果与当前 Token 完全匹配
-
因此已基本排除:
- Token 填错
- 签名算法错误
- URL 没打到函数
- 代码缺少握手逻辑
验算证据
-
Token:
- qazwsx123456
-
微信请求参数:
- timestamp = 1781903348
- nonce = 1539998404
- signature = 4c400f8cebfceb1863b717ec90060a09bcd5e226
-
本地按当前代码算法计算得到:
- sha1( sort([token, timestamp, nonce]).join('') )
- 结果同样为:
- 4c400f8cebfceb1863b717ec90060a09bcd5e226
对应日志样例
当前怀疑点
-
从业务代码角度,当前握手逻辑应当通过。
-
因微信后台仍提示 Token校验失败 ,我们怀疑:
- uniCloud 阿里云 URL 化网关最终返回给微信的响应内容/格式,不是微信期望的“原样纯文本 echostr ”
- 即使云函数代码返回了 statusCode + headers + body ,最终 HTTP 响应可能仍被平台包装或改写
想请技术支持确认的问题
-
uniCloud 阿里云 URL 化云函数 是否支持微信消息推送 GET 握手这种“必须返回原始纯文本 echostr ”的场景?
-
当云函数返回如下对象时:
平台是否会将其 原样透传 给微信? -
是否存在已知兼容问题,导致微信后台拿到的并不是纯文本 echostr ?
-
如果该场景下 URL 化云函数无法满足微信接口要求,官方推荐的替代方案是什么?
我们希望得到的答复 -
是否确认当前平台支持该握手方式
-
如果支持,正确的返回格式应是什么
-
如果不支持,官方推荐的接入方式是什么
-
是否需要改用其他类型的 HTTP 服务入口,而不是当前 URL 化云函数
一句话总结 -
我们已经验证: Token 正确、签名正确、请求已打到函数、代码也实现了握手逻辑 。
-
现在唯一高概率剩余问题是: uniCloud 阿里云 URL 化网关对微信 GET Token 校验响应的实际落地格式不符合微信预期 。
3 个回复
Ask小助手
关于你遇到的 uniCloud 阿里云 URL 化云函数在微信消息推送 Token 校验时失败的问题,你的怀疑方向是对的,这通常不是业务代码逻辑错误,而是云函数 URL 化的响应格式与微信服务器期望的格式不兼容。
问题原因
微信服务器在进行 Token 校验时,发送 GET 请求到你的云函数 URL,并期望收到一个纯净的、不带任何额外格式的文本字符串
echostr作为响应。然而,uniCloud 阿里云的 URL 化云函数在将云函数的返回值转化为 HTTP 响应时,会将其包装成一个标准的 JSON 结构。例如,你的云函数代码可能返回了
echostr字符串,但微信服务器最终收到的响应体可能是这样的:微信服务器无法解析这种 JSON 格式的响应,因此会持续提示 “Token校验失败”。
解决方案
你需要修改云函数代码,使其直接构造并返回一个符合微信要求的原始 HTTP 响应,而不是仅仅返回一个字符串。
根据 uniCloud 官方文档,URL 化云函数可以通过返回一个特定格式的 JSON 对象来集成自己的 HTTP 响应,包括状态码、响应头和响应体。
在你的
wxPay/index.js中,对 GET 请求的握手逻辑进行如下修改:核心解释
statusCode、headers和body的对象时,uniCloud 平台会将其视为一个集成响应,并按照你设置的状态码、响应头和响应体原样返回给客户端。这正是解决此问题的关键。body直接返回echostr:将body字段的值设置为校验后获得的echostr原始字符串,确保微信服务器能收到纯净的文本。Content-Type头:设置Content-Type为text/plain是一个好的实践,能明确告知客户端返回的是纯文本格式。按照这种方式修改后,你的云函数就能正确处理微信的 Token 校验握手了。
3***@qq.com (作者)
uniCloud 阿里云 URL 化云函数是否支持通过 context.response/res.end 直接输出原始 text/plain 响应给微信消息推送握手?
3***@qq.com (作者)
要回复问题请先登录或注册
公告
更多>相关问题