# 支付功能使用指南 ## 📋 概述 本项目已完整接入**微信支付**和**支付宝支付**,支持内容购买、账户充值等支付场景。 --- ## 一、配置信息 ### 1.1 微信支付配置 位置:`src/main/resources/application-dev.yml` 和 `src/main/resources/application-prod.yml` ```yaml payment: wechat: appId: wx7d13d99de5be3bfa # 微信应用 ID mchId: 1673321732 # 商户号 mchKey: UDuZXDcmy5Eb6o0nTNZhu6ek4DDh4K8B # 商户密钥 mchSerialNo: 5EFC47D3AA59BFD1AAE548F96B5E19E1C60F067D # 商户证书序列号 privateKeyPath: apiclient_key.pem # 商户私钥文件路径 domain: https://api.mch.weixin.qq.com # 微信服务器地址 notifyUrl: http://127.0.0.1:19001/api/pay/wx/notify # 支付回调地址 returnUrl: http://127.0.0.1:19001/api/pay/success # 支付成功跳转地址 ``` ### 1.2 支付宝支付配置 ```yaml payment: alipay: appId: 2021004138642603 # 支付宝应用 ID publicKey: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnakP04nUmsoFoveIvOhbLqkA1xQuYtvkrqq2AVvTsbtqpsEOTm9G095e2rBYLp89oDcf6L6BhtJPwdrhnA+qifUyVmACI9sprrsGeRYQgndK7y4c6spQcSnsnakSxlIp22j7pvBXNAZuqud2hQV+TOLKEUh1W3izTgMj/Ejoh3ZsCjgDRtTVgaytzSdHYrhNku+pIrl15/xVGJED99RYXkR8GHawxuK+vWVmxU0tiTCwTsqLz43v6TtCZ+/UfLL/luwp9B4ZvB+0qon82LILYr6oxs10kE2IAvryuDToAc1s/v/36jgt+7DXwqzfUDksHhVLHdJHChyc4ax5HmMsBwIDAQAB" # 支付宝公钥 privateKey: "" # 商户私钥(需配置) notifyUrl: http://127.0.0.1:19001/api/pay/alipay/trade/notify # 支付回调地址 returnUrl: https://shuziren.xueai.art/alipay-success # 支付成功跳转地址 signType: RSA2 # 签名类型 charset: UTF-8 # 字符编码 gatewayUrl: https://openapi.alipay.com/gateway.do # 支付宝网关 ``` --- ## 二、API 接口说明 ### 2.1 创建微信支付订单 **接口地址:** `POST /api/pay/wx/create` **请求参数:** | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | orderNo | String | 否 | 订单号(不传则自动生成) | | userId | Long | 是 | 用户 ID | | userName | String | 是 | 用户名 | | amount | BigDecimal | 是 | 支付金额(单位:元) | | productName | String | 是 | 商品名称 | | productDesc | String | 否 | 商品描述 | | businessId | Long | 是 | 关联业务 ID | | businessType | String | 是 | 业务类型:recharge(充值)/purchase_content(购买内容) | **请求示例:** ```bash curl -X POST http://localhost:19001/api/pay/wx/create \ -H "Content-Type: application/json" \ -d '{ "userId": 123, "userName": "张三", "amount": 0.01, "productName": "测试商品", "productDesc": "商品描述", "businessId": 456, "businessType": "purchase_content" }' ``` **响应示例:** ```json { "code": 200, "message": "success", "data": { "code_url": "weixin://wxpay/bizpayurl?pr=xxx", "order_no": "ORDER_20260331_001" } } ``` **字段说明:** - `code_url`: 微信支付二维码链接,前端可使用此链接生成二维码 - `order_no`: 支付订单号,用于后续查询订单状态 --- ### 2.2 创建支付宝支付订单 **接口地址:** `POST /api/pay/alipay/create` **请求参数:** 与微信支付相同 **请求示例:** ```bash curl -X POST http://localhost:19001/api/pay/alipay/create \ -H "Content-Type: application/json" \ -d '{ "userId": 123, "userName": "张三", "amount": 0.01, "productName": "测试商品", "businessId": 456, "businessType": "purchase_content" }' ``` **响应示例:** ```json { "code": 200, "message": "success", "data": "
" } ``` **使用说明:** - 返回的是 HTML 表单字符串 - 前端将此外壳写入页面后会自动提交跳转到支付宝支付页面 --- ### 2.3 支付回调接口(系统自动处理) #### 微信支付回调 **接口地址:** `POST /api/pay/wx/notify` **说明:** - 由微信支付服务器自动调用 - 处理支付结果并更新订单状态 - 返回 XML 格式响应给微信服务器 #### 支付宝支付回调 **异步回调:** `POST /api/pay/alipay/trade/notify` **同步回调:** `GET /api/pay/alipay/trade/return` **说明:** - 异步回调由支付宝服务器自动调用 - 同步回调用于用户支付完成后跳转回指定页面 --- ## 三、使用场景示例 ### 3.1 场景 1:购买付费内容 **业务流程:** 1. 用户点击购买按钮 2. 创建购买记录(待支付状态) 3. 创建支付订单 4. 用户扫码或跳转支付 5. 支付成功后更新订单和购买记录状态 **前端调用示例:** ```javascript // 步骤 1:创建购买记录 const purchaseResponse = await fetch('/api/content/purchase', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ userId: 123, contentId: 456, payType: 3 // 3=微信支付,4=支付宝支付 }) }); const purchaseResult = await purchaseResponse.json(); // 步骤 2:创建支付订单 const payResponse = await fetch('/api/pay/wx/create', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ userId: 123, amount: 9.99, productName: 'AI 技能教程', productDesc: '高级 AI 技能培训内容', businessId: 456, businessType: 'purchase_content' }) }); const payResult = await payResponse.json(); if (payResult.code === 200) { // 步骤 3:显示支付二维码 const codeUrl = payResult.data.code_url; // 使用 QRCode 库生成二维码 new QRCode(document.getElementById('qrcode'), { text: codeUrl, width: 200, height: 200 }); // 步骤 4:轮询查询订单状态 const checkOrderStatus = setInterval(async () => { const statusResponse = await fetch(`/api/pay/order/query?orderNo=${payResult.data.order_no}`); const statusResult = await statusResponse.json(); if (statusResult.data.status === 2) { // 2=已支付 clearInterval(checkOrderStatus); alert('支付成功!'); window.location.reload(); } }, 3000); // 每 3 秒查询一次 // 设置超时(15 分钟后停止查询) setTimeout(() => { clearInterval(checkOrderStatus); alert('支付超时,请重新下单'); }, 900000); } ``` --- ### 3.2 场景 2:账户充值 **业务流程:** ```javascript // 创建充值订单 const rechargeResponse = await fetch('/api/pay/wx/create', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ userId: 123, amount: 100.00, // 充值 100 元 productName: '账户充值', businessId: 123, businessType: 'recharge' // 充值业务类型 }) }); const result = await rechargeResponse.json(); if (result.code === 200) { // 显示支付二维码 showQRCode(result.data.code_url); } ``` **说明:** - 支付成功后,系统会自动通过回调将充值金额添加到用户账户余额 --- ### 3.3 场景 3:支付宝网页支付 ```javascript // 创建支付宝订单 const aliPayResponse = await fetch('/api/pay/alipay/create', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ userId: 123, amount: 0.01, productName: '测试商品', businessId: 456, businessType: 'purchase_content' }) }); const result = await aliPayResponse.json(); if (result.code === 200) { // 将返回的 HTML 表单写入页面 document.body.innerHTML = result.data; // 表单会自动提交,跳转到支付宝支付页面 } ``` --- ## 四、前端集成完整示例 ### 4.1 微信支付页面 ```html请使用微信扫码支付
等待支付...
请稍候