旅游软件的支付
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。
01
产品与价格
每个套餐只需在 Paddle 中创建一次,例如月付和年付两个价格,并把价格 ID 保存在您的系统中。
pri_…02
Paddle.js 结账
您的页面加载 Paddle.js,带上价格 ID 和您自己的客户标识,以浮层或内嵌框架的形式打开结账。
Paddle.Checkout.open()03
交易完成
买家付款后,Paddle 向银行卡或钱包扣款、计算税费并生成交易;如果该价格是周期性的,还会生成订阅。
txn_…04
带签名的 Webhook
Paddle 把 transaction.completed 之类的事件发送到您的端点,并用 Paddle-Signature 请求头签名。
transaction.completed05
您的系统执行操作
您的服务器先验证签名,再开通账户、续订套餐或记录这笔付款。
200 OK
API 密钥只能保存在您的服务器上。浏览器使用另一个客户端令牌,沙盒环境和正式环境各有自己的密钥、价格和 Webhook 密钥。
Webhook 安全
校验 Paddle-Signature 请求头
只要知道您的端点 URL,任何人都可以伪造 Webhook。对每个事件都验证签名,才能放心地依据 Webhook 来开通账户。
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 为准。
- 01
使用原始请求体
签名是对收到的原始请求体计算得出的,所以要在任何 JSON 解析改动内容之前就读取它。
- 02
时间戳加哈希
请求头里带有时间戳,以及用端点密钥生成的 HMAC-SHA256 哈希。请自行重新计算,并用恒定时间比较。
- 03
拒绝过期和重复的事件
拒绝时间戳过旧的事件,并保存每个事件 ID,避免重复投递的事件被处理两次。
- 04
先用沙盒
先在 Paddle 沙盒中用测试卡开发和测试,再把密钥、价格和 Webhook 密钥切换到正式环境。
PHPTRAVELS 与 Paddle
把 Paddle 接入 PHPTRAVELS
先说实话,再看有哪些选择。
Paddle 不是现成的连接器
Paddle 不在 PHPTRAVELS 的支付网关列表中,也没有公开的设置指南。下面展示的现成网关,才是专为收取预订款项而打造的。
可直接用于预订支付
已接入 PHPTRAVELS 的支付网关
对于旅客和代理的付款,这些网关都已就绪:在支付服务商处开户,在后台填入密钥,测试后即可上线。该列表来自我们集成目录的实时数据。
Stripe集成指南PayPal集成指南
xMoney
Fawaterk
Cashfree
Paystack
Flutterwave
Adyen
MyFatoorah
SSLcommerz
Razorpay- 全部集成
下级代理也可以通过 B2B 代理钱包 使用预付余额或信用额度付款,完全不需要网关。
不是以现成连接器的形式支持。Paddle 不在 PHPTRAVELS 支付网关列表中。如果您的用例符合 Paddle 的规则,例如销售自家软件订阅,可以作为定制集成添加,或由您的开发人员基于随附的源代码自行搭建。
Paddle 是面向软件、SaaS 和数字产品的商户记录方,因此通常不适合机票、酒店或旅游线路。在把它用于旅游预订之前,请先查看 Paddle 的可接受使用规则。大多数旅游企业通过支付网关收取预订款项,例如 Stripe、PayPal、Adyen 或本地网关。
在法律上向客户销售的公司。它负责代收并代缴销售税或增值税、开具发票、处理退款和拒付,并显示在客户的账单上。使用 Paddle 时,由 Paddle 承担这个角色,再向您付款。
网关只替您处理付款,您仍是卖家,税务和争议工作也仍由您承担。Paddle 则自己成为卖家,在软件销售中省去了这些工作,但也限制了可以通过它销售的内容。
当您销售的是自家软件而不是行程时:例如预订工具、API、插件或白标门户,由旅行社按订阅付费。这时 Paddle 可以向他们收费,并处理各国税务。
Paddle 会把交易完成、订阅续订等事件发送到您登记的 URL。每个请求都带有 Paddle-Signature 请求头,其中包含时间戳和哈希,您的服务器要先用端点密钥校验,才能执行后续操作。
可以。Paddle 有独立的沙盒环境,拥有自己的账户、API 密钥、价格和测试卡。请在其中开发和测试,然后再把配置迁移到正式环境。
可以,作为两条独立的流程:预订引擎通过现成网关收取旅客付款,Paddle 则为您的软件订阅计费。请把两边的记录分开保管,确保每笔销售适用正确的税务处理。
