在线购物网站模板企业做网站服务费
在线购物网站模板,企业做网站服务费,做個app网站价格,网站升级改版需要几天淘客系统的佣金资金流处理#xff1a;数据追溯与账户交易的安全机制
大家好#xff0c;我是 微赚淘客系统3.0 的研发者省赚客#xff01;
在淘客返利平台中#xff0c;佣金资金流的处理直接关系到平台的财务安全与用户信任。每一笔订单产生的佣金必须准确记录、可追溯importjuwatech.cn.finance.mapper.TransactionMapper;importjuwatech.cn.finance.mapper.UserAccountMapper;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importorg.springframework.transaction.annotation.Transactional;ServicepublicclassCommissionService{AutowiredprivateTransactionMappertransactionMapper;AutowiredprivateUserAccountMapperaccountMapper;Transactional(rollbackForException.class)publicvoidcreditCommission(StringorderId,LonguserId,BigDecimalamount){// 幂等检查同一订单是否已处理if(transactionMapper.existsByBizRefIdAndType(orderId,ORDER_COMMISSION)){return;// 已处理直接返回}// 获取当前余额加行锁varaccountaccountMapper.selectForUpdate(userId);BigDecimalnewBalanceaccount.getBalance().add(amount);// 插入资金流水状态为 COMMITTEDvartxnewAccountTransaction();tx.setTransactionId(generateTxId());tx.setUserId(userId);tx.setAmount(amount);tx.setBalanceAfter(newBalance);tx.setBizType(ORDER_COMMISSION);tx.setBizRefId(orderId);tx.setStatus(COMMITTED);tx.setCreatedAt(LocalDateTime.now());transactionMapper.insert(tx);accountMapper.updateBalance(userId,newBalance);}privateStringgenerateTxId(){returnTXSystem.currentTimeMillis()ThreadLocalRandom.current().nextInt(1000);}}其中selectForUpdate使用数据库行级锁防止并发修改!-- UserAccountMapper.xml --selectidselectForUpdateresultTypeUserAccountSELECT user_id, balance FROM user_account WHERE user_id #{userId} FOR UPDATE/select三、账户余额快照与对账机制为应对极端情况如程序异常导致余额不一致系统每日凌晨生成账户快照并与交易流水进行对账packagejuwatech.cn.finance.task;importjuwatech.cn.finance.mapper.AccountSnapshotMapper;importjuwatech.cn.finance.mapper.TransactionMapper;importorg.springframework.scheduling.annotation.Scheduled;importorg.springframework.stereotype.Component;importjava.math.BigDecimal;importjava.time.LocalDate;ComponentpublicclassDailyReconciliationTask{AutowiredprivateTransactionMappertransactionMapper;AutowiredprivateAccountSnapshotMappersnapshotMapper;Scheduled(cron0 0 2 * * ?)// 每天凌晨2点publicvoidreconcileAllAccounts(){LocalDateyesterdayLocalDate.now().minusDays(1);varuserstransactionMapper.listAllActiveUsers();for(LonguserId:users){// 从零开始重算昨日结束余额BigDecimalrecalculatedtransactionMapper.sumCommittedTransactionsBefore(userId,yesterday.atTime(23,59,59));// 获取昨日快照varsnapshotsnapshotMapper.findSnapshotByDate(userId,yesterday);if(snapshotnull||!snapshot.getBalance().equals(recalculated)){// 触发告警并记录差异alertService.notifyBalanceMismatch(userId,snapshot!null?snapshot.getBalance():null,recalculated);}}// 保存今日初始快照saveTodaySnapshots();}privatevoidsaveTodaySnapshots(){vartodayLocalDate.now();varaccountsaccountMapper.selectAll();for(varacc:accounts){snapshotMapper.insert(newAccountSnapshot(acc.getUserId(),acc.getBalance(),today));}}}四、提现风控与二次确认提现操作需经过风控校验与异步审核避免恶意套现packagejuwatech.cn.finance.controller;importjuwatech.cn.finance.service.WithdrawalService;importorg.springframework.web.bind.annotation.*;RestControllerRequestMapping(/api/finance)publicclassWithdrawalController{AutowiredprivateWithdrawalServicewithdrawalService;PostMapping(/withdraw)publicResponseEntity?requestWithdrawal(RequestBodyWithdrawRequestreq,RequestHeader(X-User-ID)LonguserId){// 校验金额、频率、实名认证状态withdrawalService.validateWithdrawalRequest(userId,req.getAmount());// 创建提现申请状态 PENDINGStringwithdrawIdwithdrawalService.createWithdrawal(userId,req.getAmount(),req.getAccountNo());// 异步通知风控系统审核riskAuditService.submitForReview(withdrawId);returnResponseEntity.ok(Map.of(withdrawId,withdrawId,status,PENDING));}}审核通过后由后台任务执行实际打款并更新资金流水TransactionalpublicvoidexecuteWithdrawal(StringwithdrawId){varwithdrawwithdrawalMapper.selectById(withdrawId);if(!APPROVED.equals(withdraw.getStatus())){thrownewIllegalStateException(未批准的提现请求);}// 扣减余额再次校验余额充足varaccountaccountMapper.selectForUpdate(withdraw.getUserId());if(account.getBalance().compareTo(withdraw.getAmount())0){thrownewRuntimeException(余额不足);}BigDecimalnewBalanceaccount.getBalance().subtract(withdraw.getAmount());accountMapper.updateBalance(withdraw.getUserId(),newBalance);// 记录出账流水vartxnewAccountTransaction();tx.setTransactionId(generateTxId());tx.setUserId(withdraw.getUserId());tx.setAmount(withdraw.getAmount().negate());tx.setBalanceAfter(newBalance);tx.setBizType(WITHDRAWAL);tx.setBizRefId(withdrawId);tx.setStatus(COMMITTED);transactionMapper.insert(tx);// 调用第三方支付接口此处省略paymentGateway.transfer(withdraw.getAccountNo(),withdraw.getAmount());withdrawalMapper.updateStatus(withdrawId,SUCCESS);}五、审计与追踪能力所有资金操作均记录操作日志并支持按biz_ref_id或transaction_id全链路追踪便于客服与财务核查。本文著作权归 微赚淘客系统3.0 研发团队转载请注明出处