商城外卖家政模板源码支付与退款:从流水看支付和退款

简介: DSMall Pro 是面向多业态(商城/外卖/家政)的高可靠支付清结算系统。严格分离支付流水(待付/成功/关闭)与退款流水(待退/成功/失败),每笔资金操作留痕可溯;通过参数级分布式锁防并发,订单金额变更实时校验,确保账务精准。

商城、外卖、上门家政的订单先支付再履约,退款留下可追溯的流水。对账时不能只看订单上的一个「已支付」。用户每一次发起支付都会记支付流水,每一次向渠道退钱都会记退款流水,订单退款单则记店铺同意、拒绝和退货这些业务步骤。

支付流水记一次申请

POST trade/pay 在扣款前就生成新的商户单号。注释写明:未支付的订单理论上可以复用单号,但参数一旦变化,复用是无效的,所以每次申请都新开一号,把提交参数和渠道返回记下来。流水来源是充值、单店订单或合并订单。状态是待支付、成功、关闭。

单店订单要同时满足:订单存在且属于该用户、收款商户一致、仍待付款、金额一致。合并支付中的某一单被单独支付时,合并单改为关闭,流水落在这一张订单上。充值流水的收款商户固定为 0,渠道不能是余额。余额支付会先看用户余额够不够,不够则整次失败,不写一条成功流水。

并发靠锁。键里有用户编号和这次参数的摘要,持有 30 秒。第二下相同请求直接提示正在处理,避免两次余额扣减或两次微信下单。

// app/api/service/trade/TradePayService.php
$lockKey = sprintf(LockKeyManager::LOCK_API_TRADE_PAY_KEY, '_' . $this->user_id . '_' . md5(serialize($data)));
$lockValue = KvManager::lock()->acquire($lockKey, 30);
if (!$lockValue) {
   
    throw new SystemException('支付正在处理中,请稍后再试');
}
$out_trade_no = generateOutTradeNo($data['pay_channel'], $data['user_id']);

支付流水状态只有三档:

// app/common/enum/trade/TradePayEnum.php
const PAY_STATUS_PENDING = 0; // 待支付
const PAY_STATUS_SUCCESS = 1; // 成功
const PAY_STATUS_CLOSED = 2;  // 关闭

回调地址带商户、渠道、场景和类型,不要求用户 token。用户自己查结果用 pay/status。平台后台查的是支付流水列表和支付配置;配置决定这个商户在某个场景下启用了哪些渠道。店铺后台看的是某一张订单的支付记录,用来和已经发货、配送或上门的订单对照。

支付成功之后的积分、成长值、商户通知和小票,由监听器处理,不写进支付流水的状态机。通知模板用订单号和支付金额。小票失败不应把已经成功的支付流水改回待支付。

退款流水只表示渠道结果

订单退款单的状态更长。用户申请是 10,店铺同意 20,拒绝 30。退货还有用户已退货 40、店铺已收货 50。处理中 60,成功 70,失败 80,关闭 90,取消 100。店铺主动退是 0。

这些数字描述的是人和货。渠道退款流水只有待退款、成功、失败。

// app/common/enum/trade/TradeRefundEnum.php
const REFUND_STATUS_PENDING = 0; // 待退款
const REFUND_STATUS_SUCCESS = 1; // 退款成功
const REFUND_STATUS_FAILED = 2;  // 退款失败

退款方式决定流水怎么产生:原路退回调用当时的微信或支付宝,退回余额改用户余额,人工处理记在退款单上。线下确认收款的订单,退款按余额退。

店铺点重试,是在业务状态已经是处理中或失败、渠道那次没退成的时候再试一次,例如店铺待结算余额不足、原路退回失败。平台也能对退款单发起重试,并查看退款日志。同意、拒绝、确认收到退货、代客创建退款在店铺路由上。用户端是申请、修改、取消、登记退货和查看。

退款成功的监听只在退货退款时恢复库存、减少销量。整单退货时订单商品编号为 0,按整单处理;指定了订单商品则只动那一行。仅退款和系统退款不走这段库存。

// app/listener/order/OrderRefundSuccessListener.php
if ($refund_info['refund_type'] == TblOrderRefundEnum::TYPE_REFUND_GOODS) {
   
    switch ($refund_info['order_goods_id']) {
   
        case 0:
            // 0 全部退货
            $condition[] = ['order_id', '=', $refund_info['order_id']];
            break;
        default:
            $condition[] = ['id', '=', $refund_info['order_goods_id']];
            break;
    }
}

仅退款不走这段库存。

和订单金额的关系

店铺可以在订单上改价,改的是待付款或业务允许改价时的应付金额。用户再发起 trade/pay 时,申请金额必须等于当时的应付金额,否则支付直接失败,不会用旧流水的金额去付新价格。退款金额记在退款单上,不能用支付流水的成功金额代替退款流水。一单可以有多次支付申请(多次未支付的单号),成功的应是其中一条;退款可以重试,成功的退款流水应和退款单的成功状态对在一起。

商城、外卖、上门家政共用这套流水。付完之后是发货、配送还是上门,由订单履约处理。钱的申请、回调、同意和重试都留在流水和退款单上。

相关文章
|
3月前
|
小程序 Java PHP
2026 开源商城排行榜!Java/PHP8 大项目对比,选错系统二开到崩溃
2026年开源商城系统实战选型指南:避坑关键在系统而非业务。本文按技术栈新旧、开源完整性、架构适配性及二开友好度,精选8大主流系统——VortMall(微服务首选)、Tigshop(功能全覆盖)、CRMEB(微信生态强)等,并附协议风险、流程闭环、部署成本等落地 checklist,助团队高效抄作业。
|
17天前
|
移动开发 JavaScript Java
常见商城源码的技术栈和特点:前后端分离、营销玩法与本地生活端口
本文对比7款主流商城源码:DSShop(单店+外卖/家政)、ECShop(传统模板型)、CRMEB(强营销多端)、RuoYi-Mall(若依权限底座)、DSMall Pro(多商户+多端服务)、Mall4j(标准Java多端,AGPL协议)、VortMall(微服务架构)。涵盖技术栈分层、核心交易与活动能力、差异化定位,助选型决策。
163 0
|
2月前
|
缓存 NoSQL 测试技术
商城外卖家政商品列表为什么能抗住反复刷:查缓存查库回写一次拆解
本文详解DSMall商品列表缓存优化实践:通过「条件序列化生成唯一Key」避免漏参、收紧数据库查询条件保障数据安全、TTL+业务Tag实现精准失效。一整套方案将高频读请求从DB卸载至KV,显著降低数据库压力,适用于商城、外卖、家政等多场景列表缓存。(239字)
112 0
|
3月前
|
前端开发 关系型数据库 MySQL
DSMall 字段和索引怎么起名:比表前缀更影响日常开发
DSMall数据库字段与索引命名规范:全库snake_case;统一语义(如`is_deleted`);主键用`id`、外键用`xxx_id`;状态分维度命名(`order_status`/`refund_status`);金额用`decimal`、积分用`int`;时间按场景选`*_at`或`*_time`;索引前缀`idx_`/`udx_`,名含字段;COMMENT须明确枚举值。
198 0
|
移动开发 监控 小程序
java家政平台源码,家政上门清洁系统源码,数据多端互通,可直接搭建使用
一款基于Java+SpringBoot+Vue+UniApp开发的家政上门系统,支持小程序、APP、H5、公众号多端互通。涵盖用户端、技工端与管理后台,支持多城市、服务分类、在线预约、微信支付、抢单派单、技能认证、钱包提现等功能,源码开源,可直接部署使用。
941 24
|
6天前
|
JavaScript API iOS开发
DeepSeek Harness下载、安装、配置一篇搞定(2026整理,送常用插件)
DeepSeek Harness(DSH)是DeepSeek于2026年开源的MIT协议AI Agent框架,支持插件化组装模型、工具、沙箱与UI,兼容主流大模型。本文提供免Node.js的桌面端安装包(Win/macOS),含详细图文教程及热门插件推荐。
2659 22
|
23小时前
|
云安全 人工智能 安全
|
5天前
|
Linux 开发工具 iOS开发
Codex保姆级教程(下载+安装+登录+使用,含所有版本,2026最新)
Codex是OpenAI推出的开源AI编程智能体,本地运行,可理解整个代码库,支持自然语言指令改代码、执行命令、跑测试、修Bug,兼容Win/macOS/Linux。(239字)
|
6天前
|
iOS开发 Docker MacOS
【2026实测】Docker Desktop下载、安装、汉化、配置教程(附官网安装包)
Docker Desktop 是 Docker 官方推出的桌面容器管理工具,集成引擎、CLI、图形界面与 Kubernetes,支持 Win/macOS/Linux。2026 最新版 4.88.1 强化 ARM 原生运行、镜像加速及资源可视化,附中文汉化与国内镜像配置指南。
1163 4