所有文章
一系列模拟的计费生命周期事件通过安全隧道传送到本地 Paddle Webhook 处理程序。
Paddlewebhook simulatorbillinglocal testing

在 localhost 使用 Paddle Webhook 模拟器

P (中文(简体) ). 要使用 PPXTERM000XPP 与本地主机的网络模拟器,通过 PPXTERM0001XPPP 隧道曝光您的本地处理器,创建指向公共URL的沙盒通知目的地,然后对该目的地进行单一事件或生命周期模拟. 页面存档备份,存于互联网档案馆 PPXTERM0002XPP 发送一个现实的要求,其中 Paddle-Signature P 双相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相 头,所以同样的生体验证路径可以在当地和生产中运行.

P 高压电源 为什么PPXTERM0003XPP的模拟器 不只是一个样本有效载荷

P 高压电源 复制的 PPXTERM0005XPP 固定测试您的开关语句 。 PPXTERM0004XPP的模拟器测试网络目的地,提供者头,签名秘密,响应状态,以及事件计划一起进行. 官员 存档副本 Webhook 模拟器概览 P (英语). 支持可重复使用的单个事件和情景。 单项事件针对一种事件类型,在跑出后可以定制. 情景发送一个生命周期的预定义序列,例如订阅创建或更新.

P (英语). 情景配置可以将有效载荷与现有的PPXTERM0006XPP实体相混合并改变流量. 每次运行都会产生模拟运行事件记录,在那里可以检查有效载荷,出站请求,以及端点响应. 这使得模拟器对调试状态过渡有用,而不仅仅是证明一个路由是在线的.

P 页面存档备份,存于互联网档案馆. 连接本地端点到 PPXTERM0007XPPP 沙盒

  1. 启动您的应用程序, 例如在 http://localhost:3000互联网档案馆的存檔,存档日期2013-10-02. 。 。 。 。
  2. 互联网档案馆的存檔,存档日期2013-12-02. 添加 POSTP 路由等 /api/webhooks/paddle。 。 。 。
  3. 互联网档案馆的存檔,存档日期2013-12-02. 运行 npx portpreview 3000 并复制PPXTERM0009XPP地址.
  4. 在 Paddle 沙盒中,使用 https://your-subdomain.portpreview.dev/api/webhooks/paddle互联网档案馆的存檔,存档日期2013-12-02. 。 。 。 。
  5. 将目的地的秘密复制到 PADDLE_WEBHOOK_SECRET这不是您的 API 键。
  6. 互联网档案馆的存檔,存档日期2013-12-02. 开放开发者工具 – 模拟,选择单个事件或情景,选择目的地,配置,运行.
  7. 互联网档案馆的存檔,存档日期2013-12-02. 比较 PaddleP 模拟运行的响应与您的本地日志, 并坚持 webhook 接收. (

) (英语). 在整个过程中使用沙盒资源和证书. 用一个沙盒模拟器请求来混合一个活的目的地秘密可以保证签名失败,尽管这两个字符串看起来都是合理的.

PP 校验 Paddle-Signature 标题

互联网档案馆的存檔,存档日期2013-12-02. Paddle在每个webhook上标出属于通知目的地的秘密. 信头包含组件,包括一个Unix时间戳 ts 和由 h1页面存档备份,存于互联网档案馆 PPXSEG0026XP . Paddle 可能添加签名版本,因此解析标题而不是假设它包含一个赤散列.

所签名的有效载荷是时间戳,一个结肠,以及未被移动的请求机体. Paddle应用PPXTERM000015XPP 并带有端点秘密. 内容 签名核查文件 互联网档案馆的存檔,存档日期2013-12-02. 如果有,建议使用官方的SDK,并记录手动算法。 总是执行 SDKP 的时标可容忍性,或者在您的验证器中明确允许以限制回放攻击.

存档副本 首选节点中的 SDKP

import express from 'express';
import { Environment, Paddle } from '@paddle/paddle-node-sdk';

const app = express();
const paddle = new Paddle(process.env.PADDLE_API_KEY, {
  environment: Environment.sandbox,
});

app.post(
  '/api/webhooks/paddle',
  express.raw({ type: 'application/json' }),
  async (req, res) => {
    const signature = req.header('paddle-signature') ?? '';
    const rawBody = req.body.toString('utf8');

    try {
      const event = await paddle.webhooks.unmarshal(
        rawBody,
        process.env.PADDLE_WEBHOOK_SECRET,
        signature,
      );

      await acceptOnce(event.eventId, event);
      return res.status(200).send('accepted');
    } catch (error) {
      return res.status(400).send('invalid webhook');
    }
  },
);

app.listen(3000);

挂载 express.raw() 在任何全球范围内 express.json() 页面存档备份,存于互联网档案馆 此路径的中间软件 。 在Next.js App Router等获取样式框架中,使用 await request.text() 存档副本 一次,把确切的字符串传递给SDK. 官员 网络快速启动 化学反应 证明这个原始的身体要求。

手工核查必须做什么

  1. 存档副本. 读取未实现JSON正常化的生体.
  2. 解析每个分号分隔页眉组件并收集支持 h1 互联网档案馆的存檔,存档日期2013-12-02. 数值。
  3. 页面存档备份,存于互联网档案馆 PPXSEG0041XP 拒绝失踪、畸形或不合理老化 ts。 。 。 。
  4. 计算 HMAC_SHA256(secret, ts + ':' + rawBody)互联网档案馆的存檔,存档日期2013-12-04. 。 。 。 。
  5. 互联网档案馆的存檔,存档日期2013-12-02. 通过时间安全比较,将预期摘要与候选人签名进行比较。 (
  6. ) (英语). 仅在匹配后, 才能解析 JSONP 并按 event_type存档副本. 。 。 。 。

在秘密旋转期间接受任何有效的支持签名事项,届时可以出现一个以上的签名. 不要分割标题,盲目取下第二个项目。 在诊断不匹配时不要登录端点秘密或完整的客户有效载荷.

页面存档备份,存于互联网档案馆 围绕计费变量的设计模拟

互联网档案馆的存檔,存档日期2013-12-02. 订阅创建

运行一个订阅创建假想, 并验证您的数据库可以接收相关的交易和订阅事件, 而无需假设一个网络到达命令 。 存储 Paddle 实体标识并一并更新记录. 申请应只给予一项权利,即使请求遭到不满。

页面存档备份,存于互联网档案馆 PPXSEG0052XP 延期和付款失败

存档副本 运行您的假想配置中可用的成功更新、过期和恢复路径 。 与产品访问政策分开计费状态:您的宽限期可能有意保持访问活动,而Paddle则报告收集问题.

页面存档备份,存于互联网档案馆 PPXSEG0054XP 取消和计划更改

互联网档案馆的存檔,存档日期2013-12-02. 将预定取消的订阅与已经达到有效取消的订阅区分开来. 保护 next_billed_at互联网档案馆的存檔,存档日期2013-12-02. ,计划更改数据和提供者地位,而不是将生命周期崩溃为 is_active。 。 。 。

常规弹药 实体最新情况

互联网档案馆的存檔,存档日期2013-12-02. 模拟您缓存所消耗的产品、价格、客户和订阅更新。 处理器应当安全地忽略未知事件类型,如果签名有效则予以确认;未来的Paddle添加不应变成无尽的故障回路.

互联网档案馆的存檔,存档日期2013-12-02. 每跑一次都出现偏颇和命令

使用webhook事件的稳定ID作为收件表中的独有密钥. 在一个交易中,插入收件,应用状态变化,并排出副作用. 如果插入冲突, 返回成功而不重复工作 。 不只通过实体ID来复制,因为许多合法更新可以针对一个订阅.

事情可能会出乎意料 比较事件发生时间或在应用破坏性过渡前取回最新的Paddle实体. 存储提供者的状态和时间戳,并拒绝较旧的更新,以覆盖较新的更新. 模拟假想是测试这些假设的理想方案,因为它们产生相连的序列而不是孤立的固定装置.

互联网档案馆的存檔,存档日期2013-12-02. 故障模拟器到本地主机失败

目标返回 404 或 405

请检查access-date=中的日期值 (帮助) POST公共URL包含全路由,且该路由会导出 POST. 一个浏览器GET并不是一个只使用POST的网页hook的有效测试. 使用 curl -X POST 相对于公共URL,以区分隧道的路径与Paddle配置.

目标返回 400

互联网档案馆的存檔,存档日期2013-12-02. 检查是否 Paddle-Signature 到达并确认端点机密属于选定的通知目的地。 确保不进行身体剖析、要求记录器或中间软件的消耗或重排。 模拟器发送可核查的签名,记录如下: Paddle的模拟跑导。 。 。 。

目标返回500次或多次

互联网档案馆的存檔,存档日期2013-12-02. 坚持快速移动电子邮件,提供,和出行的API呼叫到队列. 持久接受后返回2xx. 抛出一个不熟悉的事件类型是造成不必要的失败的常见原因;使用一个默认分支来记录和承认它.

设想方案使用出乎意料的数据

审查模拟是否使用自动生成的值,或包含真实的沙盒实体。 检查已配置的情景选项和运行事件有效载荷,而不是假设它与先前运行的类似.

生产前的安全核对表

  • 页面存档备份,存于互联网档案馆 保留API密钥并通知目的地机密,只保留服务器.
  • 在处理前核查生体、头部签名和时间戳。
  • 使用时间安全比较或官方SDK核查器.
  • 复制事件ID并处理出令更新.
  • 互联网档案馆的存檔,存档日期2013-12-02. 应用车身限制,POST只使用路由,重排记录,以及速率控制.
  • 页面存档备份,存于互联网档案馆 PPXSEG0082XP 使用有特色的沙盒和活目的地,再重复模拟和真实的沙盒流后再切换出出产地URL.

模拟器证明了您在受控生命周期序列下的整合; 一个真正的沙盒取出额外证明了 取出与实体的关系. 两者兼用,然后审查一般 互联网档案馆的存檔,存档日期2013-12-02. Webhook 签名指南一能指南 发射前

常见问题

P (中文(简体) ). PPXTERM000XPP的网页模拟器能将事件发送到本地主机吗?.
页面存档备份,存于互联网档案馆 是的,通过一个公共PPXTERM0001XPP隧道. 配置带有地道URL和路线的沙盒通知目的地,然后在运行模拟时选择该目的地.
P 双相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相 PPXTERM0002XPP模拟器网络hook签名真实吗?
P 高压电源 对 PPXTERM0004XPP说模拟器发送了包括PPXTERM0003XPP在内的可复制的webhook请求. 与普通的网游一样, 使用特定通知目的地的秘密验证它 。
P 高压电源 PPXTERM0005XPP单项事件模拟与情景有什么区别?
存档副本 单一事件模拟会发出一个自定义的事件. 一个情景发送一个预定义的序列,代表一个生命周期,如订阅创建或更新,并可以使用已存在的沙盒实体.
P (英语). PPXTERM0006XPP签名验证为何局部失败?.
P (英语). 通常的原因有:使用错误的目的地秘密,在验证前剖析出身体,省略PPXTERM0007XPP,将沙盒和活生生的配置相混合,或者向核查者传递一个有回放容性的时间戳.