بنقرة واحدة
payment-notify-idempotency
MallBase 支付回调(notify)验签、幂等、防重放与金额校验规则;处理任意支付渠道(微信 / 支付宝 / 银联)回调链路时使用。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
MallBase 支付回调(notify)验签、幂等、防重放与金额校验规则;处理任意支付渠道(微信 / 支付宝 / 银联)回调链路时使用。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
MallBase 扩展槽边界规范;涉及会员、积分、分销、余额、优惠等权益扩展接入订单、商品编辑或 UniApp 展示时使用。
MallBase schema 真相源与幂等升级 SQL 规则;升级 SQL 仅在用户明确要求已有库升级时使用。
MallBase ThinkPHP 后端规则索引;仅在需要浏览或选择后端规则、且无法确定具体 ThinkPHP skill 时使用。
MallBase 已有库升级 SQL 边界规则;只有用户明确要求考虑已有库升级、测试服/线上升级或 upgrade SQL 时使用。
MallBase ThinkPHP 模型字段访问器与素材回显规则;在 Model 字段读写、访问器、修改器、with 关联、素材 ID 回显或 Service 字段组装优化时使用。
MallBase preview 演示站分支边界规则;涉及 preview 分支、演示站专用功能、main 与 preview 合并、反向合并、演示站部署或公开演示能力修改时使用。
| name | payment-notify-idempotency |
| description | MallBase 支付回调(notify)验签、幂等、防重放与金额校验规则;处理任意支付渠道(微信 / 支付宝 / 银联)回调链路时使用。 |
backend/app/service/client/payment/NotifyService.phpbackend/app/controller/client/order/PayNotifyController.php跨渠道通用,新增支付宝 / 银联回调时同样适用。
backend/route/api/notify.php/api/notify/wechat/pay、/api/notify/wechat/refund),避免单点故障扩散Wechatpay-Signature / Wechatpay-Serial / Wechatpay-Timestamp / Wechatpay-Nonce 等签名相关头不能被滤掉处理顺序严格按下面来,不能调换:
ServerRequest::handlePaid()),禁止自己写签名验证resource.ciphertext 用 api_v3_key AES-GCM 解密setNX wxpay:nonce:{nonce} TTL=300,已存在即拒amount.total(分)逐分比对 mb_order.pay_amount * 100,不等即拒并 dispatch 告警事件mb_payment_log,唯一索引兜底OrderService::confirmPaid() 转 PAIDmb_payment_log 必须建唯一索引:uk_txn_event(transaction_id, event_type) WHERE transaction_id IS NOT NULLprepay 记录(场景切换 / 超时重发),但只能有一条 paid 终态amount.total(回调报文)vs mb_order.pay_amount(库内订单)Logger::critical 落地完整报文 → dispatch payment.amount_mismatch 事件 → 返回 FAIL 应答给微信触发重试 → 不转单| 场景 | HTTP | Body |
|---|---|---|
| 处理成功 | 200 | {"code":"SUCCESS","message":"成功"} |
| 验签失败 | 401 | {"code":"FAIL","message":"签名错误"} |
| 金额不一致 | 500 | {"code":"FAIL","message":"金额校验失败"} |
| 业务异常 | 500 | {"code":"FAIL","message":"..."} |
mb_payment_log + 转单状态可以同事务,但任何外部调用禁止入事务event() 派发,监听器入队列异步处理Logger::critical 可以同步(写文件不阻塞)两者都要有,不能只靠其一。
通过 event() 派发(在 backend/app/event.php 注册):
payment.verify_failed — 验签失败payment.amount_mismatch — 金额不一致payment.replay_attack — Redis nonce 命中PaymentAlertListener 入队,调 SmsProviderService 通知运维mb_order.pay_amountmb_payment_log 有 (transaction_id, event_type) 唯一索引在以下场景触发此模式:
.codex/skills/thinkPHP/wechat-pay-stateless/SKILL.md — 支付 SDK 无状态姊妹规则.codex/skills/thinkPHP/validate-then-transact/SKILL.md — 事务边界上位规则backend/app/service/order/OrderStatusMachine.php — confirmPaid 状态机入口backend/app/event.php — 告警事件注册点