# 微信支付配置说明 ## 环境变量配置 在 `apps/server/.env.local` 文件中添加以下配置: ```env # 微信小程序配置 WECHAT_APPID=你的小程序AppID WECHAT_SECRET=你的小程序AppSecret # 微信支付配置 WECHAT_MCHID=你的商户号 WECHAT_SERIAL_NO=你的API证书序列号 WECHAT_APIV3_KEY=你的APIv3密钥 # 微信支付私钥(需要转义换行符) WECHAT_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n你的私钥内容\n-----END PRIVATE KEY-----" # 支付回调地址(需要配置为外网可访问的地址) WECHAT_PAY_NOTIFY_URL=https://你的域名/api/app/payment/wechat/notify # API基础地址 API_BASE_URL=https://你的域名 ``` ## 获取微信支付配置参数 ### 1. 获取商户号 (WECHAT_MCHID) - 登录微信支付商户平台:https://pay.weixin.qq.com - 在"账户中心" -> "商户信息"中查看商户号 ### 2. 获取API证书序列号 (WECHAT_SERIAL_NO) - 在微信支付商户平台,进入"账户中心" -> "API安全" - 下载API证书(apiclient_cert.pem) - 使用以下命令查看证书序列号: ```bash openssl x509 -in apiclient_cert.pem -noout -serial ``` ### 3. 获取APIv3密钥 (WECHAT_APIV3_KEY) - 在微信支付商户平台,进入"账户中心" -> "API安全" - 设置APIv3密钥(32位字符串) ### 4. 获取API私钥 (WECHAT_PRIVATE_KEY) - 下载API证书后,会得到 `apiclient_key.pem` 文件 - 将文件内容复制到环境变量中,注意: - 需要将换行符替换为 `\n` - 整个内容用双引号包裹 - 示例:`"-----BEGIN PRIVATE KEY-----\nMIIEvQI...\n-----END PRIVATE KEY-----"` ## 配置支付回调地址 ### 1. 在微信支付商户平台配置 - 登录微信支付商户平台 - 进入"产品中心" -> "开发配置" - 配置"JSAPI支付"回调地址:`https://你的域名/api/app/payment/wechat/notify` ### 2. 确保回调地址可访问 - 回调地址必须是外网可访问的HTTPS地址 - 本地开发可以使用内网穿透工具(如ngrok、frp) ## 小程序端使用 在小程序页面中调用支付: ```typescript import { wxPay } from '@/api/user/order'; // 创建订单后调用支付 async function handlePay(orderNo: string) { try { uni.showLoading({ title: '正在支付...' }); await wxPay(orderNo); uni.hideLoading(); uni.showToast({ title: '支付成功', icon: 'success' }); // 跳转到订单详情或订单列表 uni.navigateTo({ url: `/pages/order/detail?orderNo=${orderNo}` }); } catch (error) { uni.hideLoading(); uni.showToast({ title: error.message || '支付失败', icon: 'none' }); } } ``` ## 支付流程 1. **用户创建订单**:调用 `POST /api/app/orders` 创建订单,订单状态为 `pending_pay` 2. **发起支付**:调用 `POST /api/app/orders/pay`,后端调用微信支付统一下单接口 3. **小程序调起支付**:使用返回的支付参数调用 `uni.requestPayment` 4. **支付回调**:微信支付成功后回调 `POST /api/app/payment/wechat/notify` 5. **更新订单状态**:后端验证签名后更新订单状态为 `pending_confirm` ## 注意事项 1. **证书安全**: - 不要将私钥提交到代码仓库 - 使用 `.env.local` 文件存储敏感信息 - `.env.local` 应该在 `.gitignore` 中 2. **回调验证**: - 后端会自动验证微信支付回调的签名 - 确保回调地址配置正确且可访问 3. **订单幂等性**: - 支付回调可能会重复通知 - 代码已处理订单状态判断,避免重复处理 4. **测试环境**: - 微信支付需要使用真实的商户号和证书 - 可以使用微信支付的沙箱环境进行测试 ## 退款功能 退款功能已集成在 `WechatPayService` 中,可以通过以下方式调用: ```typescript await this.wechatPayService.refund({ orderNo: '订单号', refundNo: '退款单号', totalAmount: 100, // 订单总金额(元) refundAmount: 100, // 退款金额(元) reason: '退款原因', notifyUrl: '退款回调地址(可选)', }); ``` 退款回调地址:`POST /api/app/payment/wechat/refund-notify`