ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Yansongda Pay 支付宝支付实战指南:web / h5 / app / pos / scan / transfer / mini 七种支付方式与返回值详解

Yansongda Pay 支付宝支付实战指南:web / h5 / app / pos / scan / transfer / mini 七种支付方式与返回值详解 金融科技后端【免费下载链接】pay可能是我用过的最优雅的 Alipay/WeChat/Douyin/Unipay/江苏银行 的支付 SDK 扩展包了项目地址https://gitcode.com/gh_mirrors/pa/pay点击查看免费下载本文以仓库文档 web/docs/v2/alipay/pay.md 为主体结合 src/Provider/Alipay.php、src/Traits/AlipayTrait.php、src/Config/AlipayConfig.php 及 src/Shortcut/Alipay 下的各 Shortcut 源码系统讲解 Yansongda Pay 中支付宝V2 网关全部 7 种支付方法的调用方式、订单参数、底层插件链路与返回值处理帮助开发者一次性掌握支付宝电脑站、手机站、APP、POS、扫码、转账与小程序支付的完整接入方案。一、支付宝支付方法总览Yansongda Pay 的支付宝模块V2 网关目前支持 7 种支付方法对应的支付method即通过$alipay实例调用的方法名如下表所示method说明参数返回值web电脑支付array $orderResponseh5旧文档写作wap手机网站支付array $orderResponseappAPP 支付array $orderResponsepos刷卡支付array $orderCollectionscan扫码支付array $orderCollectiontransfer账户转账array $orderCollectionmini小程序支付array $orderCollection说明本仓库 src/Provider/Alipay.php 的文档注释中将手机网站支付对应方法命名为h5__call魔术方法会把方法名映射为\Yansongda\Pay\Shortcut\Alipay\H5Shortcut见 src/Shortcut/Alipay/H5Shortcut.php。旧版 v2 文档中“wap”即手机网站支付的同义叫法接入时以当前仓库的h5方法为准。1.1 方法分发机制Shortcut 自动路由所有支付方法并非在 Provider 中逐个硬编码而是通过__call魔术方法自动分发// 摘自 src/Provider/Alipay.php public function __call(string $shortcut, array $params): Collection|MessageInterface|Rocket|null { $shortcut strtolower($shortcut); $plugin \Yansongda\Pay\Shortcut\Alipay\\.Str::studly($shortcut).Shortcut; return Artful::shortcut($plugin, ...$params); }也就是说$alipay-web($order)等价于触发WebShortcut、$alipay-pos($order)触发PosShortcut依此类推。每个 Shortcut 内部声明一条插件Plugin管道由 Artful 内核按序执行完成参数装载、签名、请求、验签与响应解析的全过程。1.2 统一调用入口与配置支付方法的前置条件是先构建$alipay实例。快速上手可参考 web/docs/v2/alipay/index.mduse Yansongda\Pay\Pay; $config [ app_id 2016082000295641, notify_url http://yansongda.cn/notify.php, return_url http://yansongda.cn/return.php, ali_public_key ...支付宝公钥..., private_key ...商户应用私钥..., log [ // optional file ./logs/alipay.log, level info, // 建议生产环境调整为 info开发环境为 debug type single, // optional可选 daily max_file 30, // optional当 type 为 daily 时有效默认 30 天 ], http [ // optional timeout 5.0, connect_timeout 5.0, ], // mode dev, // optional设置此参数进入沙箱模式 ]; $alipay Pay::alipay($config);从 src/Config/AlipayConfig.php 的validateRequired()可以看出V2/V3 管道强制校验appId、appSecretCert、appPublicCertPath、alipayPublicCertPath四项配置见 src/Config/AlipayConfig.php其余如notify_url、return_url、aes_key、service_provider_id、mode等按需配置。网关域名由 src/Provider/Alipay.php 中的URL常量统一管理沙箱模式下自动切换到https://openapi-sandbox.dl.alipaydev.com。1.3 关于“客观参数不用配置”文档反复强调所有订单配置中客观参数均不用配置扩展包已自动处理。这一点在插件源码中有直接体现。例如电脑支付的PayPlugin会自动注入product_code// 摘自 src/Plugin/Alipay/V2/Pay/Web/PayPlugin.php $rocket-setDirection(ResponseDirection::class) -mergePayload([ method alipay.trade.page.pay, biz_content array_merge( [ product_code FAST_INSTANT_TRADE_PAY, ], $rocket-getParams() ), ]);刷卡支付的Pos\PayPlugin则会自动注入scene bar_code见 src/Plugin/Alipay/V2/Pay/Pos/PayPlugin.php。你只需关注业务参数接口级常量由插件补齐。二、电脑支付web电脑支付对应支付宝alipay.trade.page.pay接口适合 PC 端网页收银台场景返回可自动提交的表单 HTML。2.1 调用示例$order [ out_trade_no time(), total_amount 0.01, subject test subject-测试订单, // http_method GET // 若需以 GET 方式提交表单请加上此参数默认使用 POST 方式提交 ]; return $alipay-web($order)-send(); // laravel 框架中请直接 return $alipay-web($order)要点out_trade_no为商户订单号示例用time()生成生产环境建议使用更严谨的唯一订单号total_amount为订单金额元支付宝接口要求字符串类型注意保持两位小数精度subject为订单标题将展示在支付宝收银台web返回的是Response对象非 Laravel 环境下需要-send()输出Laravel 中直接return即可框架会自动处理 Response。2.2 订单配置参数所有订单配置参数与支付宝官方接口完全一致兼容全部功能可参考支付宝开放平台alipay.trade.page.pay接口文档的「请求参数」一栏按需追加例如seller_id、body、time_expire、goods_detail等。扩展包不会对业务参数做任何裁剪。2.3 底层插件链路web方法对应的 WebShortcut 插件管道如下StartPlugin → Pay\Web\PayPlugin → FormatPayloadBizContentPlugin → AddPayloadSignaturePlugin → AddRadarPlugin → ResponseHtmlPlugin → ParserPlugin其中PayPlugin装载methodalipay.trade.page.pay与product_codeFAST_INSTANT_TRADE_PAY见 src/Plugin/Alipay/V2/Pay/Web/PayPlugin.phpAddPayloadSignaturePlugin完成 RSA2 签名ResponseHtmlPlugin将结果组装为自动提交表单的 HTML。相关插件实现可查阅 src/Plugin/Alipay/V2 目录测试用例位于 tests/Plugin/Alipay/V2/Pay。三、手机网站支付h5 / wap手机网站支付对应支付宝alipay.trade.wap.pay接口适用于手机浏览器内拉起支付宝收银台。3.1 调用示例$order [ out_trade_no time(), total_amount 0.01, subject test subject-测试订单, // http_method GET // 若想以 GET 方式提交请加上此参数默认使用 POST 方式提交 ]; return $alipay-h5($order)-send(); // laravel 框架中请直接 return $alipay-h5($order)与web的差异点http_method参数对 wap/h5 场景尤其常用——默认 POST 提交如需 GET 请显式指定其余订单参数同样与官方alipay.trade.wap.pay接口「请求参数」保持一致product_code等客观参数无需配置。3.2 底层插件链路H5Shortcut 与 Web 完全同构StartPlugin → Pay\H5\PayPlugin → FormatPayloadBizContentPlugin → AddPayloadSignaturePlugin → AddRadarPlugin → ResponseHtmlPlugin → ParserPlugin区别仅在业务插件 src/Plugin/Alipay/V2/Pay/H5/PayPlugin.php 中装载的method不同alipay.trade.wap.pay。四、APP 支付appAPP 支付对应支付宝alipay.trade.app.pay接口用于原生 APP 拉起支付宝客户端完成支付。4.1 调用示例$order [ out_trade_no time(), total_amount 0.01, subject test subject-测试订单, ]; // 将返回字符串供后续 APP 调用调用方式不在本文档讨论范围内请参考官方文档 return $alipay-app($order)-send(); // laravel 框架中请直接 return $alipay-app($order)注意app的返回体与web/h5不同它返回的不是整页 HTML而是一段可供 APP 端直接使用的订单参数字符串支付宝 SDK 调用PayResultActivity或AliPay客户端所需的 orderString。APP 端如何携带并拉起支付宝不在本文档范围内。4.2 订单配置参数所有订单配置参数与官方alipay.trade.app.pay接口无差别客观参数如product_code已由扩展包自动处理其余业务参数按官方文档「请求参数」一栏追加即可。4.3 底层插件链路AppShortcut 的管道与 web/h5 有一个显著差异StartPlugin → Pay\App\PayPlugin → FormatPayloadBizContentPlugin → AddPayloadSignaturePlugin → ResponseInvokeStringPlugin → ParserPlugin没有AddRadarPlugin因为 APP 支付不直接发起 HTTP 请求而是生成待签名字符串交给 APP 端末尾使用 ResponseInvokeStringPlugin 而非ResponseHtmlPlugin输出的是订单字符串而不是表单 HTML。五、刷卡支付pos刷卡支付付款码 / 被扫对应支付宝alipay.trade.pay接口适用于线下收银台扫码枪扫描用户付款码的场景同步返回支付结果。5.1 调用示例$order [ out_trade_no time(), total_amount 0.01, subject test subject-刷卡支付, auth_code 289756915257123456, // 用户付款码条码 ]; $result $alipay-pos($order);要点auth_code为扫码枪读取到的用户付款码必填pos返回Collection可直接读取支付宝同步返回的交易结果例如$result-trade_no支付宝交易号、$result-total_amount等底层 Pos\PayPlugin 会自动注入scene bar_code。5.2 订单配置参数所有订单配置参数与官方alipay.trade.pay接口完全一致客观参数scene等已自动处理其余参数参考官方「请求参数」一栏。5.3 底层插件链路PosShortcut 管道如下注意与 web/h5 相比多了验签环节StartPlugin → Pay\Pos\PayPlugin → FormatPayloadBizContentPlugin → AddPayloadSignaturePlugin → AddRadarPlugin → VerifySignaturePlugin → ResponsePlugin → ParserPlugin由于pos同步拿到服务器响应数据管道中通过VerifySignaturePlugin对响应做 RSA2 验签实现见 src/Traits/AlipayTrait.php 的verifyAlipaySign再用ResponsePlugin将Rocket转为Collection。六、扫码支付scan扫码支付正扫对应支付宝alipay.trade.precreate接口商户生成二维码、用户扫码付款属于异步支付——下单接口只返回二维码内容支付结果通过异步通知或主动查询获得。6.1 调用示例$order [ out_trade_no time(), total_amount 0.01, subject test subject-刷卡支付, ]; $result $alipay-scan($order); // 二维码内容 $qr $result-qr_code;要点返回Collection其中qr_code字段即为二维码内容可直接交给前端生成二维码图片下单成功后建议结合 web/docs/v2/alipay/find.md 中的查询方法轮询订单状态或依赖 web/docs/v2/alipay/callback.md 的异步通知确认支付结果。6.2 订单配置参数所有订单配置参数与官方alipay.trade.precreate接口一致客观参数已自动处理。业务参数如timeout_express扫码支付建议显式设置二维码超时时间、goods_detail等按官方「请求参数」一栏追加即可。底层 Scan\PayPlugin 负责装载methodalipay.trade.precreate。七、账户转账transfer账户转账对应支付宝alipay.fund.trans.uni.transfer接口用于单笔转账到支付宝账户。7.1 调用示例$order [ out_biz_no time(), trans_amount 0.01, product_code TRANS_ACCOUNT_NO_PWD, payee_info [ identity ghdhjw7124sandbox.com, identity_type ALIPAY_LOGON_ID, ], ]; $result $alipay-transfer($order);要点out_biz_no为商户转账订单号product_code转账场景建议显式指定TRANS_ACCOUNT_NO_PWDpayee_info.identity为收款方标识identity_type为标识类型如ALIPAY_LOGON_ID表示登录号/邮箱返回Collection可读取$result-order_id、$result-pay_fund_order_id等字段。7.2 查询转账订单转账属于资金类操作务必跟进结果。可通过find方法并传入第二个参数transfer指定查询转账订单$order [ out_trade_no 1514027114, ]; // $order 1514027114; // 也可以直接传字符串 $result $alipay-find($order, transfer);7.3 订单配置参数所有订单配置参数与官方alipay.fund.trans.uni.transfer接口完全一致客观参数无需配置其余按官方「请求参数」一栏使用。7.4 底层插件链路TransferShortcut 与 pos 同构业务插件为 src/Plugin/Alipay/V2/Fund/Transfer 下的TransferPluginStartPlugin → TransferPlugin → FormatPayloadBizContentPlugin → AddPayloadSignaturePlugin → AddRadarPlugin → VerifySignaturePlugin → ResponsePlugin → ParserPlugin八、小程序支付mini小程序支付对应支付宝alipay.trade.create接口用于支付宝小程序内拉起支付收银台。8.1 调用示例$order [ out_trade_no time(), subject test subject-小程序支付, total_amount 0.01, buyer_id 2088622190161234, // 用户支付宝 UID ]; $result $alipay-mini($order);要点buyer_id为小程序内获取到的用户支付宝 UID2088 开头的数字必填返回Collection可读取trade_no等字段后续由小程序端调用my.tradePay拉起收银台小程序支付的整体接入流程请参考支付宝小程序官方支付接入文档。8.2 订单配置参数所有订单配置参数与官方alipay.trade.create接口一致客观参数如product_code已自动处理其余业务参数按官方「请求参数」一栏追加。对应 Shortcut 与插件位于 src/Shortcut/Alipay/MiniShortcut.php 与 src/Plugin/Alipay/V2/Pay/Mini。九、返回值类型与处理方式各支付方法的返回值已在首节表格中标注返回值只会是两种类型之一Symfony\Component\HttpFoundation\Response—— 用于web、h5、app三个方法Yansongda\Supports\Collection—— 用于pos、scan、transfer、mini四个方法。9.1 Response 类型// 非框架环境 return $response-send(); // Laravel 等框架环境 return $response;Response承载的是需要输出给浏览器的表单 HTMLweb/h5或 APP 端订单字符串app直接send()输出即可框架中直接返回交给框架处理。9.2 Collection 类型// 通过属性方式访问服务器返回数据 $result-qr_code; // scan二维码内容 $result-trade_no; // pos/transfer/mini支付宝交易号 $result-order_id; // transfer转账单号Collection底层来自Yansongda\Supports组件支持-xxx属性访问与数组式访问数据即支付宝接口同步返回的原始字段。建议在业务代码中先判断$result-code10000表示成功再做后续流程。十、配套操作与注意事项支付之外同一套$alipay实例还提供完整的交易闭环能力可配合以下文档使用查询订单$alipay-find($order)并支持find($order, transfer)查询转账订单退款$alipay-refund($order)取消订单 与 关闭订单异步回调处理$alipay-verify()验签 $alipay-success()确认响应签名机制 与 下载账单。注意事项沙箱调试在 web/docs/v2/alipay/index.md 的配置基础上增加mode dev即可进入沙箱模式此时网关自动切换为沙箱地址服务商模式配置mode service并补充pid参数即可插件管道会自动注入sys_service_provider_id实现见 src/Traits/AlipayTrait.php 的loadAlipayServiceProvider加密方式当前仅支持支付宝官方推荐的RSA2SHA256withRSA相关验签逻辑见 src/Traits/AlipayTrait.php 的verifyAlipaySign响应签名校验失败会抛出InvalidSignException金额精度total_amount、trans_amount等金额字段请使用字符串类型避免浮点误差。通过以上 7 种支付方法及其插件管道开发者可以在 Yansongda Pay 中用一个统一的$alipay实例覆盖电脑、手机、APP、线下扫码与被扫、转账及小程序全场景的支付宝收款需求。赞分享金融科技后端【免费下载链接】pay可能是我用过的最优雅的 Alipay/WeChat/Douyin/Unipay/江苏银行 的支付 SDK 扩展包了项目地址https://gitcode.com/gh_mirrors/pa/pay点击查看免费下载相关推荐yansongda/pay 支付宝 V3 支付实战指南付款码支付与扫码支付yansongda/pay 支付宝 V3 支付实战指南付款码支付与扫码支付 本指南聚焦 yansongda/pay 中支付宝 V3 网关的两大当面付场景——付金融科技后端【限时免费】 yansongda/pay 支付宝H5支付实现解析yansongda/pay 支付宝H5支付实现解析 问题背景 在使用 yansongda/pay 3.7.4 版本进行支付宝H5支付开发时开发者遇到了一个常见后端金融科技yansongda/pay项目支付宝支付模式选择指南yansongda/pay项目支付宝支付模式选择指南 支付宝支付模式概述 在使用yansongda/pay这个PHP支付SDK对接支付宝支付时开发者需要了解支金融科技后端上一篇不换硬件不花钱老Mac免费升级最新macOSOpenCore Legacy Patcher完整上手指南下一篇WorkshopDL 零基础实战手册不装 Steam 客户端也能免费下载创意工坊模组创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表