“URL未注册”是微信服务端校验失败,因发起支付页的完整域名(含协议、端口)与公众号后台“JS接口安全域名”及商户平台“支付授权目录”未完全匹配,常见于授权目录缺末尾斜杠、timeStamp类型错误或uni-app的router.base未同步配置。
微信
H5支付提示“URL未注册”是域名没配对
不是代码写错了,也不是
调用有问题,而是微信后台根本没认出你当前页面的域名。H5支付强制校验「发起支付页」的完整域名(含协议、端口),且必须和微信公众号后台配置的「JS接口安全域名」+「支付授权目录」完全匹配——少一个斜杠、多一个端口、协议不一致,全算不通过。
常见错误现象:
• 点击支付后弹出微信内置浏览器提示“该网页暂时无法访问”,或直接跳转到空白页
• 控制台看不到任何请求,连
的 success/fail 都不触发
• 微信开发者工具里能过,真机 H5 就失败
确认当前 H5 页面的完整 URL:打开页面 → 浏览器地址栏复制整条链接(比如
),取协议 + 域名 + 端口(如有)→ 即
登录微信公众号后台 → 「公众号设置」→ 「功能设置」→ 「JS接口安全域名」→ 添加该域名(注意:不带路径,不带端口,HTTP/HTTPS 必须严格一致)
同时进入「
微信支付
商户平台」→ 「产品中心」→ 「开发配置」→ 「H5 支付」→ 「支付授权目录」→ 填写带结尾斜杠的完整路径前缀,例如:
(注意末尾
不能少)
如果用了 Nginx 或 CDN,确保真实请求头中的
和你填的域名一致;
uni-app
H5 构建时若启用了
,也要体现在授权目录中
uni-app 的
在 H5 端实际走的是微信 JS-SDK
很多人以为调用
就能直接唤起微信支付,但在 H5 环境下,它底层依赖微信 JS-SDK 的
方法,而这个方法要求页面已执行
初始化,并且签名必须由后端生成(不能前端拼)、时间戳和 nonceStr 必须和后端签名时一致。
使用场景:只有用户在微信内置浏览器中打开你的 H5 页面,且域名已备案、已配置、已认证,才可能成功。
前端不能自己计算
,必须由后端返回完整参数对象(含
、
、
、
、
、
)
必须是字符串类型(不是数字),且与后端签名时用的时间戳完全一致(秒级,非毫秒)
字段值固定为
,不能带空格、换行,也不能漏掉
前缀
调用
前,务必确认
已加载,否则会静默失败
本地开发和测试环境无法触发微信 H5 支付
微信明确禁止 localhost、127.0.0.1、192.168.x.x、无备案域名、HTTP 协议(除 localhost 外)用于 H5 支付。uni-app 的
模式下,
启的服务默认是
,这个域名天然被微信拦截。
微信公众平台开发入门教程 中文WORD版
由于微信的大热,为了更好的方便使用微信的用户查询一些信息,这篇文章是入门级的微信公众平台开发教程,需要的朋友可以参考下 这篇入门教程将引导你完成如下任务: 创建百度云平台应用启用微信公众平台开发模式获取订阅、文字、图片、语音、视频消息回复文本、图文及音乐消息程序开发
下载
性能 / 兼容性影响:强行绕过(如用 ngrok 映射)会导致签名时间窗口错乱、回调地址不可达、用户授权异常等问题,不建议用于联调。
测试必须用真实 HTTPS 域名,且已完成微信公众号认证和微信支付开通
开发阶段可用条件编译模拟支付流程:
下才调用
,其他环境直接走 mock success
如果公司有测试子域名(如
),可申请加入公众号安全域名和支付授权目录,比正式域名更灵活
uni-app 编译 H5 后路由 base 影响支付授权目录匹配
当你在
或
中设置了
(比如设为
),那么所有页面路径都会带上这个前缀,包括支付跳转页。但微信支付授权目录只认你填进去的路径前缀,不会自动补上 router base。
例如:你配置了
,实际支付页 URL 是
,那你在微信后台就必须填写
,而不是
。
检查
项目根目录下
中的
值(或
的
字段)
把该值拼接到你的主域名后面,形成完整的授权目录前缀,再去微信商户平台更新
如果用了 history 模式且后端没配 fallback,404 页面也可能导致支付 JS 加载失败,间接引发 URL 未注册提示
微信 H5 支付的“URL未注册”本质是微信服务端校验失败,不是前端代码缺陷。最容易被忽略的是:授权目录末尾斜杠、
类型、以及 router base 对路径前缀的隐式影响。这三个点卡住,其他都白搭。
uni.requestPaymentrequestPaymenthttps://m.example.com/order/pay?id=123https://m.example.comhttps://m.example.com/order//Hostrouter.baseuni.requestPaymentuni.requestPaymentchooseWXPaywx.configpaySignappIdtimeStampnonceStrpackagesignTypepaySigntimeStamppackageprepay_id=xxxprepay_id=uni.requestPaymentdocument.querySelector('script[src*="jweixin"]')H5npm run dev:h5http://localhost:8080process.env.NODE_ENV === 'production'uni.requestPaymenttest.example.comvue.config.jsmanifest.jsonh5.router.base/shop/h5.router.base = '/shop/'https://m.example.com/shop/pay?id=123https://m.example.com/shop/https://m.example.com/uni-appvue.config.jsh5.router.basemanifest.jsonh5.router.basetimeStamp