小程序接入微信支付集成指南
在 CloudBase 控制台「集成中心」创建微信支付集成后,平台会自动为你生成一个 HTTP 云函数,封装好下单、查单、退款 、回调等全部能力。本指南介绍如何在小程序端调用该云函数,完成从下单到回调的完整支付闭环。
关于函数名的约定:集成中心生成的云函数名形如
<集成名>-<随机串>(例如miniapp-wxpay-rwmx67sc)。为方便讲解,本文统一称其为pay-common——你在自己的代码中替换为实际函数名即可。
整体调用链路:
- 正向请求:小程序 →
wx.cloud.callHTTPFunction(平台自动鉴权 + 注入 openid)→pay-commonHTTP 云函数 → 微信支付 API - 异步回调:微信支付 → 集成中心(验签 + 解密)→
pay-common→ 业务侧
架构总览
┌──────────────────┐ ┌──────────────────┐
│ 微信小程序 │ wx.cloud.callHTTPFunction │ pay-common │
│ │ ──── POST /wx-pay/* ──────→ │ (HTTP 云函数) │
│ app.js │ ←─── { code, msg, data } ──│ SDK 自签 │
│ └ wx.cloud.init │ │ 直连微信支付 API │
│ │ 平台自动注入 header: └────────┬─────────┘
│ pay.js │ x-wx-openid │
│ └ callHTTPFunc │ x-wx-appid │ 统一下单
│ │ ▼
└──────────────────┘ ┌───────────────────────┐
▲ │ 微信支付 API │
│ │ api.mch.weixin.qq.com│
│ wx.requestPayment └───────────┬───────────┘
│ │ 异步支付回调
└────── 返回调起参数 ──────┐ ▼
│ ┌───────────────────────┐
│ │ 集成中心 │
│ │ (自动验签 + 解密) │
pay-common └───────────┬───────────┘
│ │ 明文转发
│ ▼
│ ┌───────────────────────┐
└──────── │ pay-common │
│ /wechatpay/order │
│ → orderService 处理 │
└ ───────────────────────┘
职责分工:
| 角色 | 职责 |
|---|---|
| 小程序 | 通过 wx.cloud.callHTTPFunction 调用 pay-common,平台自动注入 openid,无需登录、无需 Token |
| pay-common 云函数 | 从 x-wx-openid header 获取用户身份;处理下单、查单、退款等主动请求;接收并处理回调 |
| 微信支付 API | 支付业务实际执行方 |
| 集成中心 | 统一托管凭证;接收回调后完成验签与解密,并以明文转发至云函数 |
前置条件
| 项 | 要求 |
|---|---|
| 小程序 | 已通过微信认证,个人号小程序不支持开通支付 |
| 微信支付商户号 | 已申请并在商户平台完成与上述小程序的绑定 |
| 商户超管权限 | 用于下载 API 证书、设置 APIv3 密钥 |
| 小程序基础库版本 | ≥ 3.15.2(wx.cloud.callHTTPFunction API 的前提条件) |
| Node.js 18+ / CloudBase CLI | 本地开发与调试使用 |
| 微信开发者工具 | 最新稳定版 |
第一步 · 准备商户凭证
登录微信支付商户平台,以超级管理员身份按以下三节取值。获得的所有值将在第二步统一填入集成中心表单。
1.1 APIv3 密钥
路径:账户中心 → API 安全 → 设置 APIv3 密钥。
如首次使用,点击「设置」,自定义 32 位字母/数字组合。该密钥仅在设置时显示一次,需妥善保存。
APIv3 密钥用于回调的 AES-GCM 解密及部分 V3 API 响应的验签。如未设置,微信服务器将直接拒绝下发任何回调通知,商户平台「交易中心 → 通知查询」将显示"通知发送失败"。
1.2 商户 API 证书
路径:账户中心 → API 安全 → API 证书 → 申请/下载。
下载并解压后,需保留:
apiclient_key.pem:商户 API 私钥,用于下单请求签名- 40 位十六进制证书序列号(页面上展示),形如
36048761817F82958048330A6301E922AB28A04D
apiclient_cert.p12 与 apiclient_cert.pem 本指南不使用。
1.3 微信支付公钥
路径:账户中心 → API 安全 → 微信支付公钥管理 → 查看/下载公钥。
需保留:
wxp_pub.pem:微信支付公钥文件- 公 钥 ID(页面上展示),形如
PUB_KEY_ID_0114...
公钥与平台证书的区别:微信支付 V3 验签历史上存在两种方案——「微信支付公钥」(一次下载,长期有效,推荐)与「微信支付平台证书」(X.509 证书,会过期,需调接口轮换)。如在集成中心表单中填写了微信支付公钥,pay-common 则用公钥方案;否则将按平台证书方案处理。
与商户 API 证书的区别:微信支付公钥用于验证微信下发给商户的响应与回调(代表微信侧身份);商户 API 证书则用于对商户发起的请求进行签名(代表商户侧身份)。两者作用相反,请勿混淆。
1.4 凭证清单
完成上述三节后,应已获得以下 7 项值,均将在第二步填入集成中心表单(字段名以 pay-common 实际注入的环境变量为准):
| # | 集成中心字段 / 环境变量 | 形态 | 取值出处 |
|---|---|---|---|
| 1 | appId | 小程序 AppID,形如 wxc1546068399a59fc | 微信公众平台 |
| 2 | merchantId | 10 位数字商户号 | 商户平台首页 |
| 3 | apiV3Key | 32 字符 APIv3 密钥 | 见 1.1 |
| 4 | merchantSerialNumber | 40 位十六进制证书序列号 | 见 1.2 |
| 5 | privateKey | apiclient_key.pem 完整内容(PEM 文本) | 见 1.2 |
| 6 | wxPayPublicKey | 微信支付公钥 PEM 内容 | 见 1.3 |
| 7 | wxPayPublicKeyId | 公钥 ID(PUB_KEY_ID_...) | 见 1.3 |
第二步 · 在 CloudBase 创建集成
2.1 进入集成中心
路径:云开发平台 → 模板与集成 → 集成中心 → 小程序微信支付 → 创建集成。
2.2 填写集成信息
控制台向导需填写以下内容:
- 集成名称(自定义,例如
miniapp-wxpay) - 第一步获取的 7 项凭证:
appId/merchantId/apiV3Key/merchantSerialNumber/privateKey/wxPayPublicKey/wxPayPublicKeyId
集成中心将统一托管上述凭证,并用于代处理回调的验签与解密。
2.3 自动生成云函数资源
创建 成功后,系统自动完成两项操作:
- 按集成名称创建一个 HTTP 云函数(⚠️ 函数名形如
<集成名>-<随机串>,例如miniapp-wxpay-rwmx67sc,本文统称pay-common)。 - 生成回调域名与具体回调 URL,用于接收微信支付的异步通知:
| 资源 | 说明 |
|---|---|
| 回调基础域名 | 形如 https://<集成标识>.integration-callback.tcloudbase.com |
| 支付回调 | /wechatpay/order |
| 退款回调 | /wechatpay/refund |
| 转账回调 | /wechatpay/transfer(当前版本暂不支持,集成中心尚未代处理转账回调;如有商家转账需求需自行接管) |
支付回调 URL 需同步填入微信支付商户平台的「支付结果通知 URL」(商户平台 → 产品中心 → 开发配置)。退款回调由 V3 退款接口请求中携带的 notify_url 决定,pay-common 已自动使用集成中心生成的对应 URL,无需手动填写。集成中心会将上述 URL 作为环境变量自动注入云函数(详见第三步)。
第三步 · 了解 pay-common 云函数
第二步创建集成时,平台已经把表单中的全部参数(AppID、商户号、APIv3 密钥、证书、私钥、回调地址等)作为环境变量注入到云函数。运行时通过 process.env 读取,业务代码中不会出现明文凭证,集成中心用户亦无 需维护任何配置文件。
如需修改配置,进入「集成中心 → 对应集成 → 编辑」,保存后平台将自动重新部署云函数。
3.1 源码结构
如需查看或下载自动生成的云函数源码,可使用 tcb fn code <函数名> --download 或在控制台查看。目录结构如下:
pay-common/
├── index.js HTTP 云函数入口(CLI 部署入口)
├── app.js Express 应用入口,路由分发(_action)
├── scf_bootstrap HTTP 云函数启动脚本(监听 9000 端口)
├── bin/
│ └── www 本地/容器启动脚本(监听 3000 端口)
├── Dockerfile 云托管部署配置(集成中心模式下不使用)
├── cloudbaserc.json CloudBase CLI 部署配置(集成中心模式下无需修改)
├── package.json
├── config/
│ └── config.js 读取 process.env,处理 PEM 规范化与凭证校验
├── controllers/
│ └── payController.js 路由控制器(下单、查单、退款、转账、回调)
├── routes/
│ └── pay.js 对外路由定义
├── services/
│ ├── payService.js 统一入口,按 signMode 路由到策略
│ ├── orderService.js 回调处理(需对接业务系统)
│ └── strategies/
│ └── sdkStrategy.js SDK 自签名策略(下单、退款、转账的主动请求均走此策略)
├── utils/
│ ├── validator.js 参数校验
│ └── cloudbaseAuth.js 从请求 header 中提取 openid(x-wx-openid / JWT)
└── tests/ 单元/集成测试
3.2 支付相关路由
小程序通过 wx.cloud.callHTTPFunction 调用 pay-common,路由通过 path 参数走 Express 标准路由(如 /wx-pay/wxpay_order),平台自动注入 x-wx-openid header,无需登录、无需 Token。
💡 旧方案(
wx.request+ 云 API 网关 +body._action分发)仍可用但不推荐,callHTTPFunction更简洁。
路由路径 / _action | 类别 | 说明 |
|---|---|---|
wxpay_order | 下单 | JSAPI / 小程序下单(本指南主要使用) |
wxpay_query_order_by_out_trade_no | 查询 | 按商户订单号查单 |
wxpay_query_order_by_transaction_id | 查询 | 按微信订单号查单 |
wxpay_close_order | 关单 | 关闭订单(10 分钟未支付建议主动关闭) |
wxpay_refund | 退款 | 申请退款 |
wxpay_refund_query | 退款 | 查询退款 |
wxpay_transfer | 转账 | 商家转账。集成中心暂不支持转账回调 /wechatpay/transfer,发起接口可用,回调需自行接管 |
wxpay_transfer_bill_query | 转账 | 商户单号查转账单 |
wxpay_transfer_bill_query_by_no | 转账 | 微信单号查转账单 |
使用 callHTTPFunction 时,path 格式为 /wx-pay/<路由路径>,例如:path: '/wx-pay/wxpay_order'。
3.3 回调处理
services/orderService.js 是业务占位层,默认实现仅打印日志。上线前需结合业务数据库选型(MySQL、MongoDB、CloudBase 数据库等),在以下回调处理方法中补齐业务处理逻辑:
| 方法 | 触发时机 | 典型实现 |
|---|---|---|
handlerUnified(params) | 下单成功后 | 将订单以 PENDING 状态写入数据库,保留 out_trade_no、金额、用户标识等字段 |
handlerUnifiedTrigger(params) | 支付回调 | 幂等校验订单状态、核对金额、将状态原子更新为 PAID,并触发发货等业务副作用 |
handlerRefund(params) | 发起退款成功后 | 将订单或退款单状态更新为「退款中」,记录 out_refund_no |
handlerRefundTrigger(params) | 退款回调 | 根据 refund_status(SUCCESS / CHANGE / REFUNDCLOSE)更新退款结果,处理账款回退、权益回收等 |
handlerTransfer(params, result) | 转账受理成功后 | 记录商户转账单号、微信转账单号与金额 |
handlerTransferTrigger(params) | 转账回调 | 根据 state(SUCCESS / FAIL 等)更新转账单最终状态。当前集成中心尚不支持转账回调代转发,如启用需自行接管 |
实现时需遵循以下原则:
- 尽早返回:所有
*Trigger回调需在 5 秒内返回{"code":"SUCCESS"},否则将触发微信重试(最长 24 小时,约 15 次)。幂等校验尽量同步完成,耗时副作用(发货、推送、外部 API 调用)异步派发到消息队列或定时任务。
第四步 · 接入小程序前端
pay-common 部署完成后,小程序侧有三种接入方式,按团队技术栈选择即可:
- 方式一:小程序自定义接入——原生开发者最常见路径,使用
wx.cloud.callHTTPFunction调用后端,平台自动注入 openid,无需登录流程。 - 方式二:使用官方示例工程——直接复用仓库内置的
examples/miniprogram/,开箱即用,适合快速验证或在 Demo 基础上改造。 - 方式三:在微搭低码(WeDa)中接入——零开发,把页面方法粘贴到微搭即可。
无论选哪种方式,都要先完成 4.1 的前置准备;接口契约见 3.2 路由清单与 3.3 回调处理。
4.1 前置准备
确认基础库版本
在 project.config.json 中确认 libVersion ≥ 3.15.2(wx.cloud.callHTTPFunction 最低版本要求)。
初始化云开发
在 app.js 的 onLaunch 中调用 wx.cloud.init(),后续即可使用 wx.cloud.callHTTPFunction:
App({
onLaunch() {
wx.cloud.init({
env: 'your-env-id', // ⚠️ 替换为你的云开发环境 ID
traceUser: true,
})
},
})
💡
callHTTPFunction无需开启 CloudBase Auth 身份源、无需安装@cloudbase/js-sdk、无需构建 npm。
4.2 方式一:小程序自定义接入
适合原生小程序自研工程。通过 wx.cloud.callHTTPFunction 调用 pay-common,平台自动注入 openid,无需登录流程、无需 Token 管理。
关键约束:
ENV_ID:云开发环境 ID,在控制台 → 环境概览 → 环境 ID 中获取,形如test-wxpay-5gy4ugzreef15cfeFN_NAME:集成创建后自动生成的 HTTP 云函数名,在控制台 → 集成中心 → 对应集成的详情页或云函数列表中查看,形如miniapp-wxpay-rwmx67sc- 下单请求体最少包含 3 个字段:
description/out_trade_no/amount amount.total单位为分(1 分 = 0.01 元),out_trade_no必须全局唯一- 无需传
payer.openid,后端自动从平台注入的x-wx-openidheader 获取 - 调用返回结构:
callHTTPFunction的success回调收到res = { statusCode, data, header },其中res.data即云函数响应体{ code, msg, data },支付参数在res.data.data中
接入分三步:初始化 → 封装请求 → 发起支付。