在线演示

旅游软件的支付

Paddle API 集成:商户记录方何时适合旅游企业

Paddle 以商户记录方(Merchant of Record)的身份,代您销售软件、SaaS 和数字产品。因此它很适合为自家订阅收费的旅游科技公司,但通常不适合收取机票、酒店和旅游线路的款项。本页说明两者的区别、Paddle 集成的工作方式,以及在用例合适时如何把它接入 PHPTRAVELS。

  • 商户记录方,而非网关
  • 专为软件和订阅打造
  • 带签名的 Webhook
  • 作为定制集成接入

两种不同的模式

商户记录方与支付网关

支付网关替您转移资金:卖家仍是您,支付公司只负责处理银行卡,税费、发票、退款和争议仍由您承担。商户记录方则更进一步,在客户和税务机关眼中成为卖家。当有人通过 Paddle 购买时,是 Paddle 向对方销售,由它代收并代缴销售税或增值税、开具发票、处理拒付,最后再把您应得的部分支付给您。

这种模式能为软件公司省去大量税务与合规工作,但也意味着 Paddle 自己决定愿意转售什么。它的平台面向软件、SaaS 和数字产品,而不是由航空公司、酒店和旅行社提供的旅游服务。银行卡支付的通用机制请见 支付网关 API 页面。

支付流程图:客户在线付款,支付、税务和结算的责任在卖家与支付服务商之间传递
问题Paddle(商户记录方)支付网关
谁是卖家?Paddle 是登记在册的卖家。客户的收据和银行卡账单都来自 Paddle 一侧的这笔销售。卖家是您。网关只是通过您的商户账户处理这笔付款。
谁处理销售税和增值税?Paddle 在其销售所到的地区计算、代收并代缴销售税和增值税。由您自己负责,通过自己的税务登记、会计和开票来完成。
谁开具发票?由 Paddle 向买家开具发票或收据。由您自己的系统开具,例如后台里的预订发票。
谁处理拒付?Paddle 以卖家身份处理争议和拒付。由您通过网关的后台或 API 提交证据来应对争议。
可以销售什么?在 Paddle 可接受使用规则范围内的软件、SaaS、订阅和数字产品。网关批准的实物与服务销售,其中包括许多旅游商户的旅游预订。
如何收款?Paddle 扣除手续费后,按其结算周期向您支付收益。已扣款的款项扣除网关手续费后,结算到您的商户账户或银行账户。

费率、支持的国家以及允许销售的产品清单均由 Paddle 制定,并会随时间变化。在制定计划之前,请先查阅 Paddle 自己的条款。

决策助手

Paddle 适合您销售的产品吗?

先看客户到底为什么付款,再选择最接近您业务的场景。

01

旅客为机票、酒店和旅游线路付款

客户购买的是由航空公司、酒店或旅行社提供的行程。这类支付往往需要先预授权、之后再扣款,取消费用产生后要部分退款,还要支持多币种结账。

我们的看法

请使用支付网关

在把 Paddle 用于旅游预订之前,请先查看 Paddle 的可接受使用规则。大多数旅游企业通过支付网关收取预订款项,例如 Stripe、PayPal、Adyen 或本地网关。

02

您销售自己的旅游软件或 SaaS

您是旅游技术供应商,旅行社按月或按年向您支付订阅费,用于预订工具、API 访问、插件或白标门户。

我们的看法

Paddle 可能适合

这正是商户记录方所擅长的销售类型:Paddle 负责订阅计费,处理各国税务并向您付款,因此您无需在客户所在的每个国家注册增值税。

03

您既销售预订,也销售软件

您的旅行社既运营面向旅客的预订网站,也把平台或工具授权给其他旅行社使用。

我们的看法

两者并用,但相互分开

预订款项在预订流程中通过现成的网关收取,软件订阅则通过 Paddle 计费。两条流程、两套记录,各自适用正确的税务处理。

工作原理

Paddle 集成从头到尾如何运作

Paddle Billing 依靠三部分运转:您在 Paddle 中创建的产品和价格、由 Paddle.js 打开的结账页,以及把发生的事情通知您服务器的 Webhook。

  1. 01

    产品与价格

    每个套餐只需在 Paddle 中创建一次,例如月付和年付两个价格,并把价格 ID 保存在您的系统中。

    pri_…
  2. 02

    Paddle.js 结账

    您的页面加载 Paddle.js,带上价格 ID 和您自己的客户标识,以浮层或内嵌框架的形式打开结账。

    Paddle.Checkout.open()
  3. 03

    交易完成

    买家付款后,Paddle 向银行卡或钱包扣款、计算税费并生成交易;如果该价格是周期性的,还会生成订阅。

    txn_…
  4. 04

    带签名的 Webhook

    Paddle 把 transaction.completed 之类的事件发送到您的端点,并用 Paddle-Signature 请求头签名。

    transaction.completed
  5. 05

    您的系统执行操作

    您的服务器先验证签名,再开通账户、续订套餐或记录这笔付款。

    200 OK

API 密钥只能保存在您的服务器上。浏览器使用另一个客户端令牌,沙盒环境和正式环境各有自己的密钥、价格和 Webhook 密钥。

Webhook 安全

校验 Paddle-Signature 请求头

只要知道您的端点 URL,任何人都可以伪造 Webhook。对每个事件都验证签名,才能放心地依据 Webhook 来开通账户。

paddle-webhook.php
 1$raw    = file_get_contents("php://input"); 2$header = $_SERVER["HTTP_PADDLE_SIGNATURE"] ?? "";  // ts=…;h1=… 3parse_str(str_replace(";", "&", $header), $sig); 4 5$expected = hash_hmac("sha256", $sig["ts"] . ":" . $raw, $endpointSecret); 6if (!hash_equals($expected, $sig["h1"] ?? "")) { 7    http_response_code(400); exit;            // not from Paddle 8} 9if (time() - (int) $sig["ts"] > $tolerance) exit; // too old1011$event = json_decode($raw, true);12if (alreadyHandled($event["event_id"])) exit;      // repeat delivery13if ($event["event_type"] === "transaction.completed") {14    activatePlan($event["data"]["custom_data"]["account_id"]);15}16http_response_code(200);

这是用原生 PHP 写的示例,仅供说明。具体格式请以 Paddle 的最新文档或官方 SDK 为准。

  1. 01

    使用原始请求体

    签名是对收到的原始请求体计算得出的,所以要在任何 JSON 解析改动内容之前就读取它。

  2. 02

    时间戳加哈希

    请求头里带有时间戳,以及用端点密钥生成的 HMAC-SHA256 哈希。请自行重新计算,并用恒定时间比较。

  3. 03

    拒绝过期和重复的事件

    拒绝时间戳过旧的事件,并保存每个事件 ID,避免重复投递的事件被处理两次。

  4. 04

    先用沙盒

    先在 Paddle 沙盒中用测试卡开发和测试,再把密钥、价格和 Webhook 密钥切换到正式环境。

PHPTRAVELS 与 Paddle

把 Paddle 接入 PHPTRAVELS

先说实话,再看有哪些选择。

Paddle 不是现成的连接器

Paddle 不在 PHPTRAVELS 的支付网关列表中,也没有公开的设置指南。下面展示的现成网关,才是专为收取预订款项而打造的。

  • 收取预订款项:使用现成网关

    在后台用您自己的商户账户启用 Stripe付款 或 PayPal 支付 等现成网关。如 支付网关集成 页面所述,结账、退款和预订编号已经接入预订流程。

  • 销售软件:把 Paddle 作为定制集成

    当您的用例符合 Paddle 的规则时,我们的开发人员可以把它作为 定制API集成 接入:在您的页面上使用 Paddle.js 结账,配套经过验证的 Webhook 端点,并把付款记录到对应客户名下。工作开始前会先报价。

  • 或者基于源代码自行开发

    PHPTRAVELS 支持自托管,并附带完整源代码,您自己的开发人员可以在预订引擎旁边加入用于订阅的 Paddle。各版本授权包含的内容请见 价格 页面。

可直接用于预订支付

已接入 PHPTRAVELS 的支付网关

对于旅客和代理的付款,这些网关都已就绪:在支付服务商处开户,在后台填入密钥,测试后即可上线。该列表来自我们集成目录的实时数据。

下级代理也可以通过 B2B 代理钱包 使用预付余额或信用额度付款,完全不需要网关。

常见问题

Paddle API 集成:常见问题

联系销售

不是以现成连接器的形式支持。Paddle 不在 PHPTRAVELS 支付网关列表中。如果您的用例符合 Paddle 的规则,例如销售自家软件订阅,可以作为定制集成添加,或由您的开发人员基于随附的源代码自行搭建。

Paddle 是面向软件、SaaS 和数字产品的商户记录方,因此通常不适合机票、酒店或旅游线路。在把它用于旅游预订之前,请先查看 Paddle 的可接受使用规则。大多数旅游企业通过支付网关收取预订款项,例如 Stripe、PayPal、Adyen 或本地网关。

在法律上向客户销售的公司。它负责代收并代缴销售税或增值税、开具发票、处理退款和拒付,并显示在客户的账单上。使用 Paddle 时,由 Paddle 承担这个角色,再向您付款。

网关只替您处理付款,您仍是卖家,税务和争议工作也仍由您承担。Paddle 则自己成为卖家,在软件销售中省去了这些工作,但也限制了可以通过它销售的内容。

当您销售的是自家软件而不是行程时:例如预订工具、API、插件或白标门户,由旅行社按订阅付费。这时 Paddle 可以向他们收费,并处理各国税务。

Paddle 会把交易完成、订阅续订等事件发送到您登记的 URL。每个请求都带有 Paddle-Signature 请求头,其中包含时间戳和哈希,您的服务器要先用端点密钥校验,才能执行后续操作。

可以。Paddle 有独立的沙盒环境,拥有自己的账户、API 密钥、价格和测试卡。请在其中开发和测试,然后再把配置迁移到正式环境。

可以,作为两条独立的流程:预订引擎通过现成网关收取旅客付款,Paddle 则为您的软件订阅计费。请把两边的记录分开保管,确保每笔销售适用正确的税务处理。