后端金融科技【免费下载链接】pay可能是我用过的最优雅的 Alipay/WeChat/Unipay/江苏银行 的支付 SDK 扩展包了项目地址https://gitcode.com/yansongda/pay点击查看免费下载微信支付官方规定订单生成后未支付超过 7 天将自动关闭而通过关闭订单接口商户可以在超时前主动对处于「未支付」状态的订单执行关单。本文以 Pay 开源支付 SDKyansongda/payv2 文档中 web/docs/v2/wechat/close.md 为骨架结合仓库源码Provider、Shortcut、Plugin 三层实现与测试用例完整讲解close关闭订单的调用方式、场景参数、返回值处理与底层插件执行链帮你快速掌握并排查线上关单问题。方法签名与返回值微信关闭订单在 Pay 中对应close方法其签名与返回值如下方法名参数返回值closestring/array$orderCollection参数既可以直接传入商户订单号字符串也可以传入包含out_trade_no等订单配置的数组返回值Yansongda\Supports\Collection实例可通过$collection-xxx访问服务器返回的数据。最小调用示例在 Pay 中先完成微信支付配置完整配置可参考 微信概述与快速上手需包含app_id/appid/miniapp_id、mch_id、key等基础信息随后即可关闭订单$order [ out_trade_no 1514027114, ]; // 也可以直接传入订单号字符串 // $order 1514027114; $result $wechat-close($order);其中$wechat为Pay::wechat($config)返回的实例。两种传参方式等价当传入字符串时SDK 内部会将其作为out_trade_no处理简化只关单个订单的场景。订单配置参数close的订单配置参数与微信支付官方接口无任何差别兼容所有官方功能。所有可用参数请以官方《JSAPI 支付-关闭订单》文档原 v2 文档中指向官方 wiki 的「请求参数」一栏为准。其中最关键、也是唯一必填的参数是参数类型必填说明out_trade_nostring✅商户系统内部订单号必须是 32 个字符内、且与下单时一致的订单号这一约束在源码中有明确校验以 JSAPI 场景的 Jsapi 关闭订单插件 为例插件从请求载荷中读取out_trade_no若为空则直接抛出InvalidParamsException错误码PARAMS_NECESSARY_PARAMS_MISSING提示“Jsapi 关闭订单参数缺少out_trade_no”。因此调用前务必确认订单号不为空且与支付下单时保持一致。APP / 小程序订单关闭默认情况下close关闭的是JSAPI公众号订单如果你需要关闭APP或小程序场景的订单请传入场景标识参数// 关闭 APP 支付订单 $result $wechat-close([ out_trade_no 1514027114, type app, ]); // 关闭小程序支付订单 $result $wechat-close([ out_trade_no 1514027114, type miniapp, ]);即通过[type app]与[type miniapp]分别指定 APP 与小程序关单场景。从当前仓库源码结构看v3 版本已将场景分发机制统一收敛为_action参数jsapi/app/mini/h5/native/combine详见下文「场景分发」小节与 微信关闭订单 v3 文档v2 文档中的type写法保留了旧版本的调用习惯两者表达的是同一组场景语义。返回值与异常处理close返回Yansongda\Supports\Collection类型的实例你可以通过属性方式访问服务器返回的数据$result $wechat-close([out_trade_no 1514027114]); // 例如判断关单是否成功、读取微信返回的相关字段 // $result-xxx需要特别留意的是关闭订单接口的返回语义微信关单接口在成功时返回 HTTP 204 状态码、响应体为空。从 微信 Provider 的 close 实现 可以看出close在内部派发MethodCalled事件并执行关单链路后返回的是new Collection()空集合而不是携带业务字段的完整响应。因此实践中判断关单是否成功应依赖是否抛出异常而非响应内容若请求链路无异常说明关单请求已被微信受理HTTP 2xx若参数缺失如无out_trade_no会抛出InvalidParamsException若微信返回状态码异常则由 微信响应插件 统一拦截抛出InvalidResponseException错误码RESPONSE_CODE_WRONG提示“微信返回状态码异常请检查参数是否错误”。调用时建议用 try/catch 包裹并记录异常避免关单失败被静默吞掉。源码级原理close 的插件执行链在 Pay v3 架构中close最终由Yansongda\Pay\Shortcut\Wechat\CloseShortcut编排一组插件完成。以默认JSAPI场景为例CloseShortcut 的 jsapiPlugins() 返回的插件链依次为StartPlugin → JsapiClosePlugin组装请求URL、方法、mchid → AddPayloadBodyPlugin组装请求体 → AddPayloadSignaturePlugin对载荷签名 → AddRadarPlugin生成 Guzzle 请求 → VerifySignaturePlugin校验微信响应签名 → ResponsePlugin校验 HTTP 状态码 → ParserPlugin解析响应为 Collection这一插件链在 CloseShortcut 测试用例 中有完整断言可作为理解请求链路的直接证据。场景分发CloseShortcut::getPlugins() 是整个关单逻辑的分发中枢它支持两类触发方式自动识别合单只要参数中包含combine_out_trade_no或sub_orders就自动走合单关单插件链对应测试 testCombineParams_action显式指定场景取值与 WechatAction 中 CLOSE_ 系列常量 一一对应包括default默认等价于 jsapi、app、h5、jsapi、mini、native、combine传入未知场景如virtual、foo则抛出InvalidParamsException错误码PARAMS_SHORTCUT_ACTION_INVALID测试见 testVirtual 与 testFoo。各场景请求地址来自源码场景插件类请求接口普通商户/服务商JSAPI默认Jsapi/ClosePluginPOST /v3/pay/transactions/out-trade-no/{out_trade_no}/close服务商为partner路径APPApp/ClosePlugin同上H5H5/ClosePlugin同上小程序Mini/ClosePlugin同上NativeNative/ClosePlugin同上合单Combine/ClosePluginPOST /v3/combine-transactions/out-trade-no/{combine_out_trade_no}/close普通商户模式下请求体仅包含mchid而合单关单插件还会自动补上combine_appid优先取参数中的值否则回退到配置的公众号appid并剔除combine_out_trade_no避免污染请求体详见 合单关闭插件。服务商模式说明若你处于服务商mode service模式下各关单插件会在装配请求时自动切换到_service_url/v3/pay/partner/transactions/...且请求体由normal()变为service()组装以 Jsapi 关闭插件的 service() 为例会携带sp_mchid服务商商户号与sub_mchid子商户商户号优先取参数中的sub_mchid否则回退到配置项开发者无需手写两套请求逻辑。相关阅读微信概述与快速上手配置、服务商模式微信支付下单 pay微信订单查询 find微信退款 refund微信回调 callbackv3 版本关闭订单_action场景分发与合单关单赞分享后端金融科技【免费下载链接】pay可能是我用过的最优雅的 Alipay/WeChat/Unipay/江苏银行 的支付 SDK 扩展包了项目地址https://gitcode.com/yansongda/pay点击查看免费下载相关推荐微信支付订单关闭接口实战Yansongda Pay SDK 的 close 方法详解与插件链源码解析微信支付订单关闭接口实战Yansongda Pay SDK 的 close 方法详解与插件链源码解析 本指南以仓库文档 web/docs/v2/wechat/金融科技后端支付宝关闭订单实战指南Yansongda Pay close 方法全场景解析支付宝关闭订单实战指南Yansongda Pay close 方法全场景解析 本文基于 Yansongda Pay本仓库讲解支付宝「关闭订单」能力如何通金融科技后端yansongda/pay 微信关闭订单close实战指南普通订单、合单关闭与源码路由解析yansongda/pay 微信关闭订单close实战指南普通订单、合单关闭与源码路由解析 导读 本文聚焦 yansongda/pay本仓库即该项目源码金融科技后端上一篇GitHub中文界面终极指南5分钟告别英文困扰专注代码开发下一篇GitHub中文界面终极指南告别英文障碍的完整解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考