URS提取功能实现
任务概述
实现URS系统的提取(withdraw)功能,允许URS用户从农场系统提取钻石到URS系统。
实现内容
1. 创建URS提取Webhook处理器
文件: ThirdParty/Urs/Webhook/UrsWithdrawWebhook.php
功能:
- 处理URS系统发送的提取通知
- 验证请求参数(user_id, amount, order_id)
- 查找URS用户对应的农场用户
- 调用Transfer模块完成资金转移
- 返回提取结果
关键方法:
handler(): 主处理方法,验证参数并调用核心逻辑
processWithdrawNotification(): 核心提取处理逻辑
validateWithdrawRequest(): 请求参数验证
2. 创建第三方应用专用验证类
文件: app/Module/Transfer/Validations/TransferOutThirdPartyValidation.php
功能:
- 专门为第三方应用转出请求设计
- 跳过密码验证(第三方应用不需要用户密码)
- 验证基础字段:transfer_app_id, user_id, amount等
3. 扩展Transfer模块支持第三方应用
文件: app/Module/Transfer/Logics/TransferLogic.php
新增方法:
createTransferOutForThirdParty(): 第三方应用转出接口
createTransferOutFromArrayForThirdParty(): 第三方应用转出内部实现
特点:
- 使用专用验证类跳过密码验证
- 保持与原有转出逻辑一致的业务流程
- 支持手续费计算和收取
4. 更新TransferThirdPartyService
文件: app/Module/Transfer/Services/TransferThirdPartyService.php
修改:
- 将
createTransferOut调用改为createTransferOutForThirdParty
- 移除不再需要的密码参数处理
测试验证
测试脚本
文件: test_urs_withdraw_webhook.php
功能:
- 模拟URS系统发送提取请求
- 正确生成签名验证
- 验证响应结果
测试结果
✅ 测试成功
- URS用户10003(对应农场用户39026)成功提取50钻石
- 签名验证通过
- 资金正确扣除
- Transfer订单正常创建
- 返回正确的订单ID和状态
测试数据:
用户ID: 10003 (URS) -> 39026 (农场)
提取金额: 50.0000 钻石
订单ID: URS_WITHDRAW_TEST_1750257155
返回订单ID: OUT20250618223235mQTN1p
Transfer订单ID: 11
技术要点
1. 签名验证
- 使用与WebhookDispatchService一致的签名算法
- 参数按字母顺序排序
- 使用HMAC-SHA256生成签名
2. 密码验证跳过
- 创建专用验证类
TransferOutThirdPartyValidation
- 移除password字段的必需验证
- 保持其他验证逻辑不变
3. 错误处理
- 完整的异常捕获和日志记录
- 详细的错误信息返回
- 支持调试和问题排查
4. 数据一致性
- 使用数据库事务确保操作原子性
- 正确的资金流转记录
- 完整的审计日志
配置要求
Transfer应用配置
- 应用ID: 2 (urs)
- 关联第三方应用ID: 11 (out_id3字段)
- 支持转出操作
- 手续费配置(可选)
URS用户映射
- 表:
kku_urs_promotion_user_mappings
- 字段:
urs_user_id -> farm_user_id
- 状态:
status = 1 (激活)
部署说明
- 代码部署: 确保所有新增文件和修改文件已部署
- 配置检查: 验证Transfer应用配置正确
- 权限验证: 确保Webhook路由可访问
- 测试验证: 运行测试脚本验证功能正常
后续优化
- 手续费配置: 根据业务需求调整手续费率
- 限额控制: 添加单次和日累计提取限额
- 风控机制: 添加异常检测和风险控制
- 监控告警: 添加关键指标监控和异常告警
相关文档
- Transfer模块文档
- URS推广系统文档
- Webhook处理机制文档
- 第三方服务集成规范