公众号 JSAPI 网页支付集成指南
在 CloudBase 控制台创建「微信支付」集成后,系统会自动生成一个 HTTP 云函数(函数名形如 <集成名>-<随机串>,本文统称 pay-common)。本指南介绍如何基于该云函数在**微信公众号网页(H5 within WeChat)**端,使用 JSAPI 支付完成从下单到回调的完整支付闭环。
适用场景:用户在微信浏览器内打开的公众号 H5 页面发起支付(最常见的服务号支付)。 不适用:微信外浏览器(Chrome/Safari/系统浏览器)→ 应使用 H5 支付下单接口;PC 网页 → 应使用 Native(扫码)支付。
整体调用链路:
- 正向 请求:网页 → 业务后端获取微信网页授权 → CloudBase 云 API 网关(accessToken 鉴权)→
pay-commonHTTP 云函数 → 微信支付 API - 异步回调:微信支付 → 集成中心(验签 + 解密)→
pay-common→ 业务侧
架构总览
┌──────────────┐ ┌──────────────┐ ┌──────────────────┐
│ 公众号网页 │ │ 网页授权后端 │ │ CloudBase 云 API │
│ (微信浏览器)│───►│ code → openid│ │ 网关 │
│ │ └──────────────┘ │ accessToken 鉴权 │
│ fetch │ │ │ │
│ ──────────►│ Bearer │ │ HTTP invoke │
│ │ Token │ │ ────────────►│
│ │ ▼ │ │
│ │ ┌──────────────────────────────────────┴───┐
│ │ │ pay-common (HTTP 云函数) │
│ │ │ SDK 自签 → 调用 /v3/pay/transactions/jsapi
│ │ └────────────┬─────────────────────────────┘
│ │ │ 统一下单
│ │ ▼
│ │ ┌──────────────────┐
│ │ │ 微信支付 API │
│ │ │ (JSAPI/小程序) │
│ │ └────────┬─────────┘
│ WeixinJSBridge.invoke │ 异步支付回调
│ ('getBrandWCPayRequest') ▼
│ │ ┌──────────────────┐
│ │ │ 集成中心 │
└──────────────┘ │ (验签 + 解密) │
└────────┬─────────┘
│ 明文转发
▼
┌──────────────────┐
│ pay-common │
│ /wechatpay/order │
└──────────────────┘
JSAPI 与小程序支付的关键区别:
| 维度 | 小程序支付 | 公众号 JSAPI 网页支付 |
|---|---|---|
| 下单接口 | /v3/pay/transactions/jsapi | /v3/pay/transactions/jsapi(同一个) |
appid | 小程序 AppID | 公众号 AppID |
| openid 来源 | signInWithOpenId() 直接拿 | 微信网页授权(OAuth2.0)code → openid |
| 调起支付 API | wx.requestPayment | WeixinJSBridge.invoke('getBrandWCPayRequest', ...) |
| 运行环境 | 微信小程序容器 | 微信内置浏览器(必须) |
因此 pay-common 函数本身无差异,差异在「openid 获取」与「前端调起 API」两处。
职责分工:
| 角色 | 职责 |
|---|---|
| 公众号网页 | 通过微信网页授权拿 code → 业务后端换 openid;携带 Bearer Token 调用 pay-common;用 WeixinJSBridge.invoke 调起支付 |
| 业务后端(自备) | 持有公众号 AppSecret,调用 sns/oauth2/access_token 用 code 换 openid(不能让 AppSecret 出现在前端) |
| 云 API 网关 | 校验 Bearer {accessToken},将请求转发到 HTTP 云函数 |
| pay-common 云函数 | 处理下单、查单、退款;接收并处理回调 |
| 微信支付 API | 支付业务实际执行方 |
| 集成中心 | 统一托管凭证;接收回调后完成验签与解密,并以明文转发至云函数 |
前置条件
| 项 | 要求 |
|---|---|
| 公众号 | 服务号(订阅号不支持 JSAPI 支付)已通过微信认证 |
| 公众号 JSAPI 支付权限 | 在公众平台「微信支付」中开通并通过审核 |
| 微信支付商户号 | 已申请并在商户平台完成与上述公众号的绑定 |
| 公众号支付授权目录 | 商户平台 → 产品中心 → JSAPI 支付 → 添加授权目录(必须与下单页面 URL 前缀一致,含末尾 /) |
| 公众号网页授权域名 | 公众平台 → 设置与开发 → 公众号设置 → 功能设置 → 网页授权域名 |
| 商户超管权限 | 用于下载 API 证书、设置 APIv3 密钥 |
| 业务后端(任选) | 用于换 openid 的轻量服务(自有 Node/Java/Go 服务,或一个独立的云函数) |
第一步 · 准备商户凭证
需要获得 7 项凭证:
| # | 字段 | 说明 |
|---|---|---|
| 1 | appId | 公众号 AppID(不是小程序 AppID) |
| 2 | merchantId | 10 位数字商户号 |
| 3 | apiV3Key | 32 字符 APIv3 密钥 |
| 4 | merchantSerialNumber | 40 位十六进制证书序列号 |
| 5 | privateKey | apiclient_key.pem 完整内容 |
| 6 | wxPayPublicKey | 微信支付公钥 PEM |
| 7 | wxPayPublicKeyId | 公钥 ID(PUB_KEY_ID_...) |
⚠️
appId必须是公众号 AppID,且该 AppID 已在商户平台「JSAPI 支付」产品下与商户号关联。详见小程序指南附录的 AppID 区别说明。
第二步 · 在 CloudBase 创建集成
与小程序支付指南完全相同。集成创建后,系统自动生成:
- HTTP 云函数
pay-common - 回调基础域名
https://<集成标识>.integration-callback.tcloudbase.com - 支付回调路径
/wechatpay/order - 退款回调路径
/wechatpay/refund
完整支付回调 URL 需填入商户平台「产品中心 → 开发配置 → 支付通知 URL」。
第三步 · 了解云函数和环境变量
完全复用小程序指南所述源码结构与环境变量注入逻辑。pay-common 中/v3/pay/transactions/jsapi 下单的实现对小程序与公众号网页是同一份代码(路由 _action: wxpay_order)。
唯一区别:调用方传入的 payer.openid 必须是该公众号 AppID 下用户的 openid。