peixue-dev/peidu/docs/fixes/2026-01-24-P0功能完善/📋钱包支付功能实施方案.md

8.4 KiB
Raw Blame History

钱包支付功能实施方案

📋 功能清单

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. 发送通知
}

📊 数据流转图

充值流程

用户 -> 选择充值金额 -> 选择支付方式 -> 调起支付
  -> 支付成功 -> 支付平台回调 -> 验证签名 -> 钱包充值
  -> 发送通知 -> 完成

提现流程

用户 -> 提交提现申请 -> 冻结金额 -> 创建申请记录
  -> 管理师审核 -> 通过/拒绝
  -> 通过:扣除余额 + 发起转账
  -> 拒绝:解冻金额
  -> 发送通知 -> 完成

钱包支付流程

用户 -> 选择钱包支付 -> 检查余额 -> 扣除余额
  -> 更新订单状态 -> 发送通知 -> 完成

⚠️ 注意事项

  1. 支付安全

    • 所有支付回调必须验证签名
    • 订单金额必须与支付金额一致
    • 防止重复支付(订单状态校验)
    • 敏感信息加密传输
  2. 并发控制

    • 钱包操作使用乐观锁
    • 订单状态更新使用事务
    • 防止超卖和余额不足
  3. 异常处理

    • 支付失败自动回滚
    • 提现失败解冻金额
    • 记录详细日志
  4. 用户体验

    • 支付结果及时反馈
    • 余额变动实时更新
    • 提现进度可查询