8.4 KiB
8.4 KiB
钱包支付功能实施方案
📋 功能清单
1. 支付渠道集成
1.1 创建支付服务
// PaymentService.java
- createWechatPayOrder() // 创建微信支付订单
- createAlipayOrder() // 创建支付宝支付订单
- handlePaymentCallback() // 处理支付回调
- verifyPaymentSign() // 验证支付签名
1.2 支付回调处理
流程:
1. 接收支付平台回调
2. 验证签名
3. 校验订单金额
4. 更新订单状态
5. 钱包充值
6. 发送通知
7. 返回成功响应
2. 提现审核流程
2.1 数据库表设计
-- 提现申请表
CREATE TABLE withdraw_application (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL COMMENT '用户ID',
amount DECIMAL(10,2) NOT NULL COMMENT '提现金额',
fee DECIMAL(10,2) DEFAULT 0 COMMENT '手续费',
actual_amount DECIMAL(10,2) NOT NULL COMMENT '实际到账金额',
account_type VARCHAR(20) NOT NULL COMMENT '账户类型:wechat/alipay/bank_card',
account_no VARCHAR(100) NOT NULL COMMENT '账号',
account_name VARCHAR(100) NOT NULL COMMENT '账户名',
cardholder_name VARCHAR(50) COMMENT '持卡人姓名',
status INT DEFAULT 0 COMMENT '状态:0待审核 1已通过 2已拒绝 3已完成',
audit_user_id BIGINT COMMENT '审核人ID',
audit_time DATETIME COMMENT '审核时间',
audit_remark VARCHAR(500) COMMENT '审核备注',
transaction_id BIGINT COMMENT '交易记录ID',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_user_id (user_id),
INDEX idx_status (status)
) COMMENT='提现申请表';
2.2 提现申请流程
1. 用户提交提现申请
- 输入提现金额
- 选择提现方式
- 填写账户信息
2. 系统处理
- 校验余额
- 计算手续费
- 冻结金额
- 创建申请记录
3. 管理师审核
- 查看申请列表
- 审核申请详情
- 通过/拒绝
- 填写审核备注
4. 审核结果处理
- 通过:扣除余额,发起转账
- 拒绝:解冻金额,退回余额
- 发送通知
3. 订单支付集成
3.1 支付页面改造
<!-- payment/index.vue -->
<template>
<view class="payment-page">
<!-- 订单信息 -->
<view class="order-info">...</view>
<!-- 支付方式选择 -->
<view class="payment-methods">
<!-- 微信支付 -->
<view class="payment-item" @click="selectPayment('wechat')">
<image src="/static/icons/wechat-pay.png" />
<text>微信支付</text>
</view>
<!-- 支付宝支付 -->
<view class="payment-item" @click="selectPayment('alipay')">
<image src="/static/icons/alipay.png" />
<text>支付宝</text>
</view>
<!-- 钱包支付 -->
<view class="payment-item" @click="selectPayment('wallet')">
<image src="/static/icons/wallet.png" />
<text>钱包支付</text>
<text class="balance">余额: ¥{{ walletBalance }}</text>
</view>
<!-- 优惠券 -->
<view class="coupon-selector" @click="selectCoupon">
<text>优惠券</text>
<text class="selected">{{ selectedCoupon ? selectedCoupon.name : '请选择' }}</text>
</view>
</view>
<!-- 支付金额 -->
<view class="payment-amount">
<text>实付金额</text>
<text class="amount">¥{{ finalAmount }}</text>
</view>
<!-- 支付按钮 -->
<button class="pay-btn" @click="handlePay">立即支付</button>
</view>
</template>
3.2 支付处理逻辑
async handlePay() {
// 1. 校验
if (!this.selectedPayment) {
uni.showToast({ title: '请选择支付方式', icon: 'none' })
return
}
// 2. 钱包支付
if (this.selectedPayment === 'wallet') {
// 检查余额
if (this.walletBalance < this.finalAmount) {
uni.showToast({ title: '钱包余额不足', icon: 'none' })
return
}
// 调用钱包支付接口
const res = await orderApi.payByWallet({
orderId: this.orderId,
amount: this.finalAmount,
couponId: this.selectedCoupon?.id
})
if (res.code === 200) {
uni.showToast({ title: '支付成功', icon: 'success' })
// 跳转到订单详情
setTimeout(() => {
uni.redirectTo({ url: `/order-package/pages/order/detail?id=${this.orderId}` })
}, 1500)
}
}
// 3. 微信支付
else if (this.selectedPayment === 'wechat') {
// 创建微信支付订单
const res = await paymentApi.createWechatPay({
orderId: this.orderId,
amount: this.finalAmount,
couponId: this.selectedCoupon?.id
})
if (res.code === 200) {
// 调起微信支付
uni.requestPayment({
provider: 'wxpay',
...res.data,
success: () => {
uni.showToast({ title: '支付成功', icon: 'success' })
setTimeout(() => {
uni.redirectTo({ url: `/order-package/pages/order/detail?id=${this.orderId}` })
}, 1500)
},
fail: (err) => {
uni.showToast({ title: '支付失败', icon: 'none' })
}
})
}
}
// 4. 支付宝支付
else if (this.selectedPayment === 'alipay') {
// 类似微信支付处理
}
}
🔧 后端接口设计
1. 支付相关接口
/**
* 创建微信支付订单
* POST /api/payment/wechat/create
*/
@PostMapping("/wechat/create")
public Result<Map<String, Object>> createWechatPay(@RequestBody PaymentRequest request) {
// 1. 校验订单
// 2. 创建支付订单
// 3. 调用微信支付API
// 4. 返回支付参数
}
/**
* 微信支付回调
* POST /api/payment/wechat/callback
*/
@PostMapping("/wechat/callback")
public String wechatPayCallback(@RequestBody String xmlData) {
// 1. 解析XML
// 2. 验证签名
// 3. 校验订单
// 4. 更新订单状态
// 5. 钱包充值
// 6. 发送通知
// 7. 返回成功响应
}
/**
* 钱包支付
* POST /api/payment/wallet/pay
*/
@PostMapping("/wallet/pay")
public Result<Boolean> payByWallet(@RequestBody WalletPayRequest request) {
// 1. 校验订单
// 2. 检查余额
// 3. 扣除余额
// 4. 更新订单状态
// 5. 发送通知
}
2. 提现相关接口
/**
* 提交提现申请
* POST /api/wallet/withdraw/apply
*/
@PostMapping("/withdraw/apply")
public Result<WithdrawApplication> applyWithdraw(@RequestBody WithdrawRequest request) {
// 1. 校验余额
// 2. 计算手续费
// 3. 冻结金额
// 4. 创建申请记录
// 5. 发送通知
}
/**
* 提现申请列表(管理师端)
* GET /api/wallet/withdraw/list
*/
@GetMapping("/withdraw/list")
public Result<Page<WithdrawApplication>> getWithdrawList(
@RequestParam(required = false) Integer status,
@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10") Integer size
) {
// 查询提现申请列表
}
/**
* 审核提现申请
* POST /api/wallet/withdraw/audit
*/
@PostMapping("/withdraw/audit")
public Result<Boolean> auditWithdraw(@RequestBody AuditRequest request) {
// 1. 校验申请
// 2. 更新状态
// 3. 通过:扣除余额,发起转账
// 4. 拒绝:解冻金额
// 5. 发送通知
}
📊 数据流转图
充值流程
用户 -> 选择充值金额 -> 选择支付方式 -> 调起支付
-> 支付成功 -> 支付平台回调 -> 验证签名 -> 钱包充值
-> 发送通知 -> 完成
提现流程
用户 -> 提交提现申请 -> 冻结金额 -> 创建申请记录
-> 管理师审核 -> 通过/拒绝
-> 通过:扣除余额 + 发起转账
-> 拒绝:解冻金额
-> 发送通知 -> 完成
钱包支付流程
用户 -> 选择钱包支付 -> 检查余额 -> 扣除余额
-> 更新订单状态 -> 发送通知 -> 完成
⚠️ 注意事项
-
支付安全
- 所有支付回调必须验证签名
- 订单金额必须与支付金额一致
- 防止重复支付(订单状态校验)
- 敏感信息加密传输
-
并发控制
- 钱包操作使用乐观锁
- 订单状态更新使用事务
- 防止超卖和余额不足
-
异常处理
- 支付失败自动回滚
- 提现失败解冻金额
- 记录详细日志
-
用户体验
- 支付结果及时反馈
- 余额变动实时更新
- 提现进度可查询