尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

yansongda/pay 支付宝 V3 交易关闭接口(alipay.trade.close)实战指南

yansongda/pay 支付宝 V3 交易关闭接口(alipay.trade.close)实战指南 金融科技后端【免费下载链接】pay可能是我用过的最优雅的 Alipay/WeChat/Douyin/Unipay/江苏银行 的支付 SDK 扩展包了项目地址https://gitcode.com/gh_mirrors/pa/pay点击查看免费下载本文是一份针对yansongda/pay支付宝OpenAPI V3交易关闭能力的实操指南围绕Pay::alipay()-close()讲解调用方式、订单参数直传规则、notify_url的两级配置回落逻辑以及底层插件管道签名、验签、响应处理的完整执行链路。读完本文你将能够独立完成支付宝 V3 交易关闭的接入、参数排查与响应校验。接口速览支付宝 V3 交易关闭对应官方 OpenAPI 的alipay.trade.closeRESTful 路径/v3/alipay/trade/close。在yansongda/pay中入口方法定义如下method说明参数返回值close交易关闭array $orderCollection该方法在 src/Provider/Alipay.php 中定义内部通过__call(close, [$order])分发到对应的 Shortcut 插件管道。快速上手关闭交易与发起支付一样简单直接调用close()并传入订单参数即可use Yansongda\Pay\Pay; Pay::config($this-config); $result Pay::alipay()-close([ out_trade_no 1514027114, // trade_no 2013112011001004330000121536, // 支付宝交易号与 out_trade_no 二选一 ]);调用后返回Collection对象可像数组一样读取字段例如$result-get(trade_no)、$result-get(out_trade_no)。提示与 V2 的__call默认分流不同V3 接口需要显式传入 V3 Shortcut 插件数组见 支付宝 V3 API 总览但close()的调用形态与其余 V3 接口保持一致。订单配置参数交易关闭接口的业务参数采用snake_case 直传模式所有参数与支付宝官方 V3 接口请求体无任何差别直接以订单数组的形式传入即可无需method、biz_content等外层包装。常用参数包括参数类型说明out_trade_nostring商户订单号与trade_no二选一两者都传时以trade_no为准trade_nostring支付宝交易号与out_trade_no二选一operator_idstring商户操作员编号用于风控与对账notify_urlstring该接口 Model 独有字段见下文两级配置说明完整的参数集合请对照官方 PHP SDK 的AlipayTradeCloseModel字段如out_trade_no、trade_no、operator_id等均可直传本仓库不做任何字段白名单过滤传入什么就原样放入请求体。notify_url 的两级配置规则notify_url是官方AlipayTradeCloseModel独有的字段在yansongda/pay中遵循两级配置回落订单参数优先调用时显式传入notify_url https://...则直接采用该值租户配置回落订单参数未提供时回落读取租户配置中的notify_url对应AlipayConfig::getNotifyUrl()见 src/Config/AlipayConfig.php两者均未提供不会向请求体注入该字段。该逻辑在 src/Plugin/Alipay/V3/Pay/ClosePlugin.php 中实现$rocket-mergePayload([ _method POST, _url /v3/alipay/trade/close, notify_url $payload?-get(notify_url, $config-getNotifyUrl()), ]);对应地测试用例 tests/Shortcut/Alipay/V3/CloseShortcutTest.php 中显式传入notify_url后断言其进入了最终请求 body验证了订单参数优先的行为。底层原理插件管道执行链路close()最终由 src/Shortcut/Alipay/V3/CloseShortcut.php 定义的插件管道完成整个请求生命周期return [ StartPlugin::class, // 管道启动初始化 Rocket ClosePlugin::class, // 装载业务字段、_method、_url、notify_url AddPayloadBodyPlugin::class, // 将 payload 序列化为请求 body AddPayloadSignaturePlugin::class, // 生成 Authorization 签名头 AddRadarPlugin::class, // 组装 PSR-7 RequestURL、Headers、Body // 管道 post 阶段逆序执行先验签后抛业务异常 ResponsePlugin::class, // 非 2xx 响应抛出业务异常 VerifySignaturePlugin::class,// 校验同步响应签名 ParserPlugin::class, // 解析响应为 Collection ];请求签名AddPayloadSignaturePluginAddPayloadSignaturePlugin 生成ALIPAY-SHA256withRSA格式的Authorization头待签名组串由 5 行构成authString、httpMethod、requestUri、requestBody、appAuthToken并携带毫秒级时间戳与 UUID v4 nonce。若配置或订单参数中存在_app_auth_token第三方应用授权会额外注入alipay-app-auth-token请求头。请求组装AddRadarPluginAddRadarPlugin 负责组装最终 PSR-7 请求固定携带alipay-request-idUUID v4用于网关侧定位请求、User-Agent: yansongda/pay-v3、JSON Content-Type以及签名头Authorization。请求 URL 由 AlipayTrait::getAlipayV3Url 决定沙箱模式走 V3 专用沙箱网关正式模式走生产网关均拼接业务路径/v3/alipay/trade/close。响应验签VerifySignaturePluginVerifySignaturePlugin 对齐官方 SDK 的验签策略HTTP 200 强制验签非 200 响应仅在存在alipay-signature时验签防篡改无签名直接放行进入错误处理证书模式按alipay-sn匹配本地支付宝公钥证书缺失或不匹配直接抛InvalidSignException校验alipay-timestamp13 位毫秒级允许 ±300 秒偏差与微信 V3 的秒级时间戳不同组串${timestamp}\n${nonce}\n${body}\n后验签验签实现见 src/Traits/AlipayTrait.php。业务异常处理ResponsePluginResponsePlugin 在 post 阶段逆序执行时先于验签插件运行当响应非 2xx 时将错误体中的code/message并入异常消息抛出InvalidResponseException便于快速定位参数问题。返回值说明close()返回Collection其中字段与支付宝官方 V3 接口响应体完全一致无包裹层。以交易关闭为例典型返回字段包括out_trade_no商户订单号trade_no支付宝交易号如需获取原始响应头如alipay-timestamp、alipay-nonce等可从 Rocket 的 destination origin 中读取普通业务场景直接使用Collection即可。测试验证仓库为交易关闭提供了完整的单元测试与 HTTP 集成测试tests/Shortcut/Alipay/V3/CloseShortcutTest.phptestNormal断言插件管道顺序并验证 post 阶段ResponsePlugin必须位于VerifySignaturePlugin之前保证有签才验、再抛异常的顺序testCloseHttp使用 Mockery 模拟 HTTP 客户端构造带alipay-timestamp/alipay-nonce/alipay-signature/alipay-sn头的签名响应验证notify_url进入请求 body、返回结果解析正确。运行该文件对应的测试套件即可复现上述行为。注意事项参数二选一out_trade_no与trade_no必须提供其一两者同时提供时支付宝以trade_no为准V3 仅证书模式交易关闭走 V3 管道租户必须配置app_id、app_secret_cert、app_public_cert_path、alipay_public_cert_path四项V2/V3 共用一套AlipayConfig详见 src/Config/AlipayConfig.php沙箱网关差异V3 沙箱使用独立网关域名与 V2 沙箱不同时间戳单位V3 签名体系使用 13 位毫秒时间戳若自行实现验签务必与微信 V3 的秒级时间戳区分交易状态约束交易关闭仅对未支付状态的订单有效已支付订单请使用退款refund或撤销cancel能力相关接口见 支付宝 V3 API 总览。以上就是支付宝 V3 交易关闭的全部接入要点。参照本文代码即可完成对接遇到返回状态码异常时优先核对out_trade_no/trade_no的订单状态与参数取值。赞分享金融科技后端【免费下载链接】pay可能是我用过的最优雅的 Alipay/WeChat/Douyin/Unipay/江苏银行 的支付 SDK 扩展包了项目地址https://gitcode.com/gh_mirrors/pa/pay点击查看免费下载相关推荐pay 支付宝交易关闭alipay.trade.close实战指南close 方法、参数与返回值全解析pay 支付宝交易关闭alipay.trade.close实战指南close 方法、参数与返回值全解析 本文以 pay 开源项目Yansongda\Pa金融科技后端支付宝 V3 交易退款yansongda/pay 中 Refund 接口的完整接入指南与源码原理支付宝 V3 交易退款yansongda/pay 中 Refund 接口的完整接入指南与源码原理 本篇技术指南以 yansongda/pay 的支付宝 Ope金融科技后端yansongda/pay 支付宝 V3 支付实战指南付款码支付与扫码支付yansongda/pay 支付宝 V3 支付实战指南付款码支付与扫码支付 本指南聚焦 yansongda/pay 中支付宝 V3 网关的两大当面付场景——付金融科技后端上一篇Webpack配置优化终极指南Bing Chat for All Browsers多环境构建的最佳实践下一篇告别文本搜索困境用pgvector实现语义化智能检索创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表