@crvouga/ mockingbird-service-kill-bill 页面存档备份,存于互联网档案馆
本地模拟器。 真正的API合同. 部分 嘲笑鸟。 。 。 .
州立Kill Bill REST模拟器用于计费整合测试. 它模拟了租户范围账户、付款方法、订阅、捆绑、发票、付款、信贷、退款、退款、退款、退款、目录、审计元数据、一个测试钟、账户逾期状态以及秘密保护的生命周期网络呼号.
安装
npm install -D @crvouga/mockingbird-service-kill-bill
仅限无害环境管理。 节点22+或Bun 1.2+.
使用量
import { AccountApi, Configuration, apiKey } from "killbill"
import { createServer } from "@crvouga/mockingbird-service-kill-bill/server"
const emulator = await createServer()
// The Kill Bill client your application already uses. Only its basePath changes.
const config = new Configuration({
basePath: emulator.url,
username: "admin",
password: "password",
apiKey: apiKey("bob", "lazar"),
})
const accounts = new AccountApi(config)
await accounts.createAccount({ name: "Synthetic Customer", externalKey: "customer-1", currency: "USD" }, "example")
const { data: account } = await accounts.getAccountByKey("customer-1")
console.log(account.accountId, account.currency) // acc-… USD
await emulator.close()
默认证书为 Basic 认证 admin:password 加租户头 X-Killbill-ApiKey: bob 财务报告和审定财务报表 X-Killbill-ApiSecret: lazar变异也要求 X-Killbill-CreatedBy;可选的理由和评论头被记录在审计日记.
POST /1.0/kb/tenants 创造另一个拥有基本授权的房客 X-Killbill-CreatedBy 只有这个 用那个房客的阿皮钥匙创建的账户 藏在别处. POST /1.0/kb/tenants/registerNotificationCallback?cb= 将发票和付款活动作为Kill Bill通知JSON。 与Kill Bill 0.24.16(以对真实服务器的回调计量)一样,发送是在请求得到答复后进行,按每个账户的顺序排列:在巴士闲置时引发的事件等待 notificationDelayMs (2000年默认;Kill Bill的公交车取走2–3 s),在投递期间或投递后升起的公交车,如回电时的付款,立即出行(投递后Kill Bill的公交民意调查再次出行;测量到~70 ms). GET /1.0/kb/test/queues 等待待产。 在每次尝试失败后15分、30分、2小时、12小时和一天的时间内,当钟表到达时(一个钟表移动或下一个请求),回调(non-2xx或没有回答)被重审。 进程 onEvent 钩子在请求中仍然接收事件.
GET /1.0/kb/accounts/pagination 财务报告和审定财务报表 GET /1.0/kb/invoices/pagination 列出经认证的
租户现有的帐单记录是赤裸的阵列. offset 默认为 0并 limit 改为100;
正限使用创建顺序,而负限则倒置. 发票更新保留
原地处地. 答复正在进行 X-Killbill-Pagination-CurrentOffset, (中文(简体) ), TotalNbRecords 财务报告和审定财务报表
MaxNbRecords。 。 。 . NextOffset 财务报告和审定财务报表 NextPageUri 仅在另一页存在时才显示。 下一页
URL 保留选中的命名空间并配置了管理员前缀; 继续发送 Basic 认证和
租户头. 返回空/已耗尽的页面 []。零限制也返回 []作为真正的SQL
pagination确实如此;客户端应该停止在一空页面上. 账户余额默认为无效; 使用
accountWithBalance=true 或者说 accountWithBalanceAndCBA=true 实际发票余额/CBA.
这两本读作使用与发票的创建、支付和作废相同的收款,并参与
标准命名空间、时钟、重置、快照和故障控制.
先知是杀比尔的 账户资源, (中文(简体) ), 发票资源, (中文(简体) ), 贴花反应, (中文(简体) ), 财务报告和审定财务报表 命令执行。 。 。 . 模拟器的有限度的收集是精确的; 卖家的大数据集的计数热度, 审计预测和搜索终点没有建模。 无效的 pagination 使用模拟器已存在的 错误信封; 准确的活性错误文本仍未验证 。 发票 如Kill Bill 0.24.16所示.
现场平等
bun run parity -- [scenario…] [--out <dir>] [--allow-remote] 重放固定请求情景
(单位:千美元)scripts/scenarios.ts)针对你运行的"杀手"(Kill Bill)和"新模范",每个新房客都有
创建并传播规范的文字记录(标识成为占位符和即时) <ts>* 日期,
数额和状态. KILL_BILL_URL 杀死比尔的名字( 例如)
http://127.0.0.1:8080· ; KILL_BILL_USERNAME编号 :KILL_BILL_PASSWORD 默认为 admin编号 :password(三);
没有它,脚本出口2。 它会写,所以它拒绝一个非回放 URL 没有
--allow-remote。 。 。 .
假想包括未找到的答案、目录错误、续签发票
(单位:千美元)POST /1.0/kb/invoices及其目标日期、账户贷记(承诺和草案)及其
7个注销形状,项目调整后的外部退款
及其密钥检索和审计日志, 未来日期订阅在开始前取消, a
权利暂停并恢复,在两次续约中暂停计费,BCD在测试下更改
时钟(一 二叠加并按年度计划)
(即于所请之日,至期终同出一出,并取去
)和续展日(停收帐单、放行和BCD更改)。 改变计划
方案使用第二个目录,其规则在 END OF TERM 和
每一次Kill Bill的默认对齐 他们都符合Kill Bill 0.24.16(版本)
Geviti在生产中运行),于2026-11-06.
控件
POST /__admin/payments/decline-next财务报告和审定财务报表/pending-next选择下一个付款结果.POST /__admin/payments/:id/retry继承最近失败或待处理的交易.POST /__admin/catalog/plans种子一个计划.GET /__admin/billing检查账单状态和审计条目.GET /__admin/state是共享的收藏视图.GET /1.0/kb/test/clock返回 Kill Bill 的时钟 JSON (currentUtcTime, (中文(简体) ),localDate, (中文(简体) ),timeZone) (中文(简体) ).PUT /1.0/kb/test/clock?requestedDate=...预付经常性账单;POST /1.0/kb/test/clock没有requestedDate重新发送到系统时间 .PUT /1.0/kb/subscriptions/:id/undoChangePlan取消待定的计划更改。 没有待修改,它返回400 和杀死比尔错误代码1071.GET /1.0/kb/test/queues?timeoutSec=返回 200,当没有适当的通知或总线事件未完成时,返回 200,然后返回 412 秒。 默认超时为5秒. 通知只有在通知effectiveDate时间或时间之前;行入kb_bus_events总是数起。 两个收藏都通过GET /__admin/state。 。 。 .- 故障预设覆盖插件失败,速率限制,网络丢失,以及webhook重复/重排/投放交付.
API 密码
KillBillAPI, (中文(简体) ),KillBillAPIOptions, (中文(简体) ),KillBillEvent: REST处理器与事件合同.- 账户、订阅、捆绑、发票、付款、交易和目录状态类型.
createRuntime, (中文(简体) ),KillBillRuntime, (中文(简体) ),KillBillRuntimeOptions:全程运行和webhook中枢.KILL_BILL_NAMESPACE, (中文(简体) ),KILL_BILL_PRESETS: 命名空间和故障控制.document, (中文(简体) ),operationIds, (中文(简体) ),supportedOperationIds: 生成了 OpenAPI 元数据.createServer, (中文(简体) ),KillBillServerOptions, (中文(简体) ),DEFAULT_PORT, (中文(简体) ),serveTarget从./server。 。 。 .
菲德尔边界
模拟器的目标是确定适配器和生命周期测试。 它不运行 Kill Bill 插件, 税收引擎, 数据库, 通知工人, 或生产权利和调用算法 。 发票付款 externalPayment=true 例外: 它们存储在内置中 __EXTERNAL_PAYMENT__ 方法,而不发送到网关. GET /1.0/kb/invoices/{invoiceId}/payments 以 targetInvoiceId。 。 。 . POST /1.0/kb/invoices/{invoiceId}/payments如Kill Bill 0.24.10所述,外部或通过付款方法在发票余额上停留:没有欠款,它没有记录任何付款并回答204(重试使用同一方法) paymentExternalKey 超过余额的金额拒绝与 PaymentApiException 7199 (英语). 标签账户 AUTO_INVOICING_OFF (单位:千美元)00000000-0000-0000-0000-000000000002未开具发票:订阅从 chargedThroughDate 没有, POST /1.0/kb/invoices 回答201和发票 什么都没有,和 DELETE /1.0/kb/accounts/{id}/tags?tagDef= (204) 一次性持有的标签单(平等方案) auto-invoicing-off) (中文(简体) ). 自动支付新发票跳过标签账户 AUTO_PAY_OFF (附则定义) 00000000-0000-0000-0000-000000000001),否则只支付运行时尚欠的余额,因此自动支付运行前的通知消费者记录不再收取费用. 申请期间自动付费,所以消费者支付延迟付款 INVOICE_CREATION 没有发现任何欠款(204年),如"杀"法案0.24.16. GET /1.0/kb/invoicePayments/{paymentId} 返回该付款加 targetInvoiceId。 。 。 . POST /1.0/kb/invoicePayments/{paymentId}/refunds 添加a REFUND 同一笔付款(杀害法案0.24.10). externalPayment=true 在退款上记录了一笔单独的信用付款 并留下原件 refundedAmount 不变. GET /1.0/kb/test/queues 只有报告是否尚未提交到期通知和总线活动,包括推车通知。 未来日期的通知,包括生效日期仍然在时间之前的中期计划的修改,不算数. GET /1.0/kb/accounts/{accountId}/overdue 使用固定的 Kill Bill 0.24.10 配置: 合成清晰状态 __KILLBILL__CLEAR__OVERDUE_STATE__状态 OD1 如果最早的未付发票(正结余,不作废)至少已经过期一天(timeSinceEarliestUnpaidInvoiceEqualsOrExceeds) (中文(简体) ). 上传已过期的替换配置没有建模 。 订阅 priceOverrides 条目 phaseName 实值 {planName}-evergreen (或 phaseType 实值 EVERGREEN (b) 替换经常性发票项目上的目录金额 GET /1.0/kb/subscriptions/{id} 返回已发送的更改。 其他目录阶段没有建模. POST /1.0/kb/subscriptions 如 Kill Bill 0.24.10 在目录无法为计划服务时所做的: 没有上传目录( 启动模拟器 ) plans: []它返回500个 java.lang.IllegalStateException "版本Catalog目录中没有用于输入日期的现有版本...",因此上传其目录于该错误上的客户端可以恢复,一个上传目录中缺少的计划返回了400个 SubscriptionBaseApiException 代码2021"找不到任何名为"..."的计划".
账户、订阅和发票兼容性增加
以下合同为 最好猜,不是甲骨文验证他们跟随官员 账户 API, (中文(简体) ), 订阅资源, (中文(简体) ), 发票资源, (中文(简体) ), Shiro 管理员配置,以及 外部总线收听器。 。 。 . 现场对等跑者退出2号,因为它需要一个孤立的租户,没有启用; 确切的供应商错误、账户特定许可、按比例分配和账单过渡没有重现.
GET /1.0/kb/security/permissions只要求配置的基本证书和返回["*:*"],模拟默认管理员。 证书遗失或不正确UNAUTHORIZED自定义角色和用户特定许可清单没有建模.PUT /1.0/kb/accounts/{accountId}只更新已提供的内容name财务报告和审定财务报表email区域 返回 204 键。 除非treatNullAsReset=true。变化不可变 字段返回 400INVALID_ACCOUNT; 其他更新字段返回模拟器限制UNSUPPORTED_ACCOUNT_UPDATE。拒绝更新后,账户保持不变.POST /1.0/kb/subscriptions/{subscriptionId}/block记录屏蔽状态并返回 201 (《杀害法案》0.24.16,平等设想)block-entitlement) (中文(简体) ). 最新有效状态service应用; 任何屏蔽服务都会暂停计费,以及isBlockEntitlement制作 订阅数BLOCKED。每个州增加PAUSE_编号 :RESUME_ENTITLEMENT财务报告和审定财务报表_BILLING订阅事件及其捆绑timeline。 。 。 .requestedDate可选附表a 状态。 一旦暂停计费生效,将计入其余计费期(a)REPAIR_ADJ发票CBA_ADJ成为账户信用)和暂停续期账单 无;使用该信用额度,从自己的一天到下一个开出账单的一天,按比例结算的恢复账单 第一(《杀害法案》第0.24.16条,平等设想)billing-pause-resume) (中文(简体) ). 屏蔽状态变化 就像Kill Bill那样 立即重新开票.PUT /1.0/kb/subscriptions/{subscriptionId}/bcd接受billCycleDayLocal从1起至31起 和返回 204 (杀害法案 0.24.16, 均等假设)bcd-*) (中文(简体) ). 按日历延长的每月计划 在计费日数月, 夹到月底。 从effectiveFromDate(默认的今天) 首个休养期是新日的起养期,在生效日期后期开具账单 最后一个新帐单日或前日:在新帐单日开出帐单,按比例计算 新的时期(BCD 5,从01-01帐号02-01.02-05,01-05,4/31),否则为本月 从一开始(BCD 5,从02-01起,从02-01起,从4/28起)。 订阅报告新一天 从第一个新计费日开始 半年度和年度计划遵循同样的规则 更长时间。 更改堆栈,每个从自己的生效日期接管(稍后的更改为 相同日期取代;对等设想bcd-twice页:1billCycleDayLocal发送时间 订阅从一开始就是它的BCD. 从期末算起的帐单,已发行 后天,BCD搬到了那一天, 延长了整整一段时期(均等情景)move-renewal-day-annual) (中文(简体) ). 回溯变化返回UNSUPPORTED_BCD。 。 。 .PUT /1.0/kb/subscriptions/{subscriptionId}改变计划(《杀害法案》0.24.16,平等) 假设change-*) (中文(简体) ). 与billingPolicy=IMMEDIATE(默认)更改于今日生效; 只有一个requestedDate,该日期billingPolicy=END_OF_TERM时 续约日期, 重新提出计划。 生效后,它开出一张发票: 从那天到下一个计费日的新计划 也就是当月的时期 (根据04-11号法案04-11.next 04-01 at 355/365修改年度计划)REPAIR_ADJ联 合 国 旧计划账单期的未用份额,然后作为自动付款支付差额 会的.priceOverrides与更改一起发送,替换订阅的。 每个变化都是CHANGE(一) 请求时(当即请求时),prices列表 订阅的每个计划都已经或正在更改,事件报告生效的计划 当他们发生。 取消取消时或取消之后的更改;undoChangePlan财务报告和审定财务报表DELETE …/changePlan放弃任何尚未生效的更改。 目录是自己的 更改政策规则不读:没有政策和日期意味着IMMEDIATE。 。 。 .POST /1.0/kb/invoices/dryRun?accountId=...&targetDate=YYYY-MM-DD预览重现 至targetDate每一次未开具发票的主动、解锁订阅, 消费身份证、排放事件、收取费用或推进计费。 它支持TARGET_DATE只有;其他干运行类型/动作返回一个明显的错误。 退税 200 有发票items; 没有到期返回 204. 预览ID是合成的. 税收和 改变应享权利模拟不是模拟.POST /1.0/kb/invoices?accountId=...&targetDate=YYYY-MM-DD发票 账户的活跃订阅开始于或在此之前targetDate不动时钟, 按自动付款方式支付,并连同发票退回201Location. 待决 开始于或在此之前的订阅targetDate也是记帐的 没有发票 返回 Kill Bill 0.24.16的404,没有实体(Tomcat的HTML页面)。 37个月或以上的目标 今天之后是400个InvoiceApiException4005和15个以上项目,一个订阅a 日(包括审查)为400码4"SAFETY BOUND TRIGGERED"(均等方案)invoice-renewal, (中文(简体) ),invoice-target-dates) (中文(简体) ).GET /1.0/kb/paymentTransactions?transactionExternalKey=...返回所持有的付款 交易为PaymentJson,或 404 个PaymentApiException7020"付款... 不存在".- 退款会降低发票的金额
refundAdj通过退款,通过invoicePayments或者说payments与isAdjusted这个 添加ITEM_ADJ(“发票项目调整”)adjustments这 降低金额并留下余额;不这样做,退款将重新打开余额. 未按键 支付或交易按其本人的id键,但外部退款的信用支付除外, 获得生成的密钥(杀害法案0.24.16,均等方案)refund-adjusted) (中文(简体) ). POST /1.0/kb/credits每笔信贷增加aCREDIT_ADJ(-个,给定的描述)和aCBA_ADJ(+amont,"调整(账户信用)")在新发票上,COMMITTED与autoCommit=true财务报告和审定财务报表DRAFT否则,回答200与CREDIT_ADJ金额 (正数).PUT /1.0/kb/invoices/{invoiceId}/commitInvoice执行DRAFT返回 204 (均等情况)account-credit-draft) (中文(简体) ). 账户的accountCBA这是creditAdj联 合 国 已承付的发票及其accountBalance期初余额减去贷方 新的发票用途 (“调整(使用账户信贷)”),新的信贷支付账户的开户 发票一次,最古老的一次,只保留其余部分(均等情况)credit-pays-open-invoice) (中文(简体) ).DELETE /1.0/kb/subscriptions/{id}:权利在期末终止entitlementPolicy=END_OF_TERM现在IMMEDIATE,否则requestedDate(一天或一天) (即时)或现在;期末停止计费billingPolicy=END_OF_TERM和默认的, 现在用IMMEDIATE,或打开requestedDate与useRequestedDateForBilling=true编辑 订阅读取CANCELLED从权利站起,携带STOP_ENTITLEMENT财务报告和审定财务报表STOP_BILLING账单里没有账单 收账单,停止在一个 记账期后未使用的份额 调整("调整(订阅变更)";等价假想)cancel-after-item-adjust(单位:千美元)REPAIR_ADJ发票CBA_ADJ成为账户信用。 订阅开始前请求的瞬间是EntitlementApiException1001号.- 一个未知的账户,订阅或发票id是404
ObjectDoesNotExist("Object id=...) (中文(简体) ) 类型=ACCOUNT不存在!");未知账户外部密钥为404AccountApiException3003 (英语). Kill Bill 用Tomcat的404页回答一个错误的(非UUID)id; 模拟符ids不是 UUID , 所以模拟器用ObjectDoesNotExist。 。 。 . audit=FULL(或MINIMAL在读取时,增加每张发票、发票项目、付款和交易 审计行 :INSERT(和UPDATE(支付和交易)X-Killbill-CreatedBy, (中文(简体) ),-Comment, (中文(简体) ),-Reason,以及X-Request-Id作为userToken(产生) 案件发生时的种子身份证明 帐单记录为SubscriptionBaseTransition。 。 。 . 无audit每个物体携带auditLogs: []。 。 。 .- 带有目录的 XML 上传
effectiveDate已经上传的租户是400人CatalogApiException2080"租户无效目录:";更早和更晚的日期 装入. - 订阅、捆绑、发票、发票项目、付款和帐户的字段与
Kill Bill 0.24.16 制作回复:订阅后加
prices, (中文(简体) ),events, (中文(简体) ),billingPeriod, (中文(简体) ),productName以及其它问题SubscriptionJson字段,报告startDate即时创造, 键入未按键的账户,按其id订阅和捆绑,按 发票号码,报告chargedThroughDate无效, 直到 并读取PENDING直至以后开始(也在其之前取消)。 这个 账户发票清单只包含金额和项目includeInvoiceComponents=true。 。 。 . POST /1.0/kb/invoices/{invoiceId}调整指定的invoiceItemId以正数表示amount,或省去其剩余可调整金额。 它返回 201 并附加 a 负数ITEM_ADJ与原项目挂钩,减少发票金额。 随你便 期初余额以外的账户贷记:aCBA_ADJ("调整(账户信用)") 使余额保持在0并增加creditAdj(《杀害法案》0.24.16,平等设想)item-adjust-paid) (中文(简体) ). 无效的项目、金额、账户或货币在不更改的情况下发生故障 发票; 其准确的错误代码是模拟或近似.- 发票购买成功和失败
INVOICE_PAYMENT_SUCCESS财务报告和审定财务报表INVOICE_PAYMENT_FAILED并行PAYMENT_SUCCESS财务报告和审定财务报表PAYMENT_FAILED,与objectType: "INVOICE", (中文(简体) ),objectId等于发票身份证和账户身份证。 仅待付款PAYMENT_PENDING。事件既使用过程内钩又使用注册的租户召回.POST /1.0/kb/accounts/{accountId}/invoicePayments支付全额未付发票余额targetDate(今天默认),当没有到期时返回201,或返回204。 自定义paymentAmount财务报告和审定财务报表pluginProperty返回时UNSUPPORTED_INVOICE_PAYMENT。成功的管理程序也发出 发票成功事件.
未知账户、订阅和发票身份证保留现有的404个错误信封; 租户隔离适用于这些业务.