@alexasomba/paystack-inline

中文文档
1.12.0发布于 2026/10/10MITTypeScriptES Module零依赖构建来源已验证近 30 天下载 2822

Paystack Popup (inline.js) 的强型,基于承诺的TypeScript包装器.

中文使用文档
文档目录29 节
  1. 特征
  2. 安装
  3. 代理技能
  4. 快速启动
  5. 1. 从您的服务器初始化( 需要)
  6. 2. 在浏览器中恢复交易
  7. API 参考
  8. loadPaystack()
  9. popup.resumeTransaction(accessCode, callbacks?)
  10. popup.newTransaction(options)
  11. popup.preloadTransaction(options) → () => void
  12. popup.checkout(options) → Promise<PopupTransaction>
  13. popup.cancelTransaction(idOrTransaction)
  14. popup.paymentRequest(options) → Promise<PopupTransaction>
  15. 回电
  16. 订阅
  17. 分期付款
  18. 框架实例
  19. 反应
  20. Next.js (App路由器) (英语)
  21. 第3组
  22. 斯维尔特/斯维尔特基特
  23. 类型脚本引用
  24. PopupTransactionStatus
  25. 完整支付流程
  26. 安全说明
  27. 相关资源
  28. 来源
  29. 许可证

@alexasomba/paystack-inline (英语)

A 类 强烈类型, 以承诺为基础的类型Script 包装器 用于 Paystack 弹出(inline.js) (中文(简体) ). 给予你完全的IDE自动完整和打出安全性,同时安全地将所有举重——iframe渲染,WebSockets,Apple Pay会话,PCI遵守——推迟到Paystack的官方CDN.

为什么不直接绑入内线?
Paystack 船舶安全 和欺诈- 检测补丁 沉默通过其CDN。 通过在运行时动态地加载脚本,你的用户总是得到最新的,最安全的版本——而无需剪去新的发布.


特征

  • ✅ 零依赖关系 没有npm bloat,0.91 kB gziped
  • ✅ 完整的脚本类型 对每个选项、召回和回复
  • * 所有记录 财务报告和审定财务报表 无证别名来自 inline.js 包含
  • ✅ loadPaystack() 承诺防止比赛条件和双装
  • 支持 : 卡片、银行、USSD、移动货币、银行转账、QR、苹果支付、订阅、分版
  • 与 反应, Vue, Svelte, Next.js, SvelteKit, 平面 HTML - 任何前端

安装

npm install @alexasomba/paystack-inline
# or
pnpm add @alexasomba/paystack-inline
# or
yarn add @alexasomba/paystack-inline

代理技能

这个包装船 TanStack 意向技能 代理辅助 Paystack Inline 集成:

npx @tanstack/intent@latest list
npx @tanstack/intent@latest install --map
npx @tanstack/intent@latest load @alexasomba/paystack-inline#paystack-inline-checkout

实用技能包括: paystack-inline-checkout, (中文(简体) ), paystack-inline-server-verify, (中文(简体) ), paystack-inline-popup-options,以及 paystack-inline-popup-lifecycle。 。 。 .


快速启动

1. 从您的服务器初始化( 需要)

永远不要从浏览器中调用Paystack的API——你的秘密密钥将会被曝光. 在后端初始化并传递 access_code 到前端:

curl https://api.paystack.co/transaction/initialize \
  -H "Authorization: Bearer YOUR_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "email": "[email protected]", "amount": "500000" }' \
  -X POST

答复包括: data.access_code把这个送到前端.

2. 在浏览器中恢复交易

import { loadPaystack } from "@alexasomba/paystack-inline";

const PaystackPop = await loadPaystack();
const popup = new PaystackPop();

popup.resumeTransaction(accessCode, {
  onSuccess: (response) => {
    console.log("Payment successful!", response.reference);
    // Verify on your server before delivering value
  },
  onCancel: () => {
    console.log("User cancelled payment");
  },
});

总是验证服务器侧 之后 onSuccess从不提供完全基于客户调回的值——与 验证交易 终点.


API 参考

loadPaystack()

动态注入 https://js.paystack.co/v2/inline.js 输入页面,并用 PaystackPop 建筑师。 安全可以多次调用——只创建了一个脚本标记.

import { loadPaystack } from "@alexasomba/paystack-inline";

const PaystackPop = await loadPaystack();
const popup = new PaystackPop();

掷出 如果在浏览器外调用(例如服务器侧渲染)。 需要时在浏览器检查中环绕 :

if (typeof window !== "undefined") {
  const PaystackPop = await loadPaystack();
}

popup.resumeTransaction(accessCode, callbacks?)

这个 建议 检查流量 。 在您的服务器上初始化, 然后恢复客户端 .

popup.resumeTransaction("br6cgmvflhn3qtd", {
  onSuccess: (res) => console.log(res.reference),
  onCancel: () => console.log("cancelled"),
  onError: (err) => console.error(err.message),
});

popup.newTransaction(options)

使用您的公钥直接从前端启动交易 .

[尖叫声] 这个 amount 必须是在 最低货币面额 (例如NGN的kobo,GHS的pesewas). 500000 = 5 000个.

const transaction = popup.newTransaction({
  key: "pk_test_xxxxxxxxx",
  email: "[email protected]",
  amount: 500000,
  currency: "NGN",
  reference: "unique-ref-" + Date.now(),
  onSuccess: (response) => {
    console.log("Transaction ref:", response.reference);
  },
  onCancel: () => {
    console.log("Checkout closed");
  },
});

核心选项

选项类型需求说明
keystring✅你的佩斯达克 公开 键pk_...(中文(简体) )
emailstring✅客户的电子邮件地址
amountnumber✅以最低货币单位计算的数额(例如Kobo)
currencystring—— 说货币代码 : NGN, (中文(简体) ), GHS, (中文(简体) ), ZAR, (中文(简体) ), KES, (中文(简体) ), USD
referencestring—— 说独特的交易参考。 未设置时自动生成
labelstring—— 说退出时显示的客户名
channelsstring[]—— 说限制频道 : ["card", "bank", "ussd", "mobile_money", "bank_transfer", "qr", "eft"]
metadataobject—— 说交易所附任意密钥值数据
languagestring—— 说强制退出语言( E)en, (中文(简体) ), fr, (中文(简体) ), pt页:1

客户选项

选项类型说明
firstNamestring预填客户名
lastNamestring预填客户名
phonestring客户电话号码
customerCodestring现有的 Paystack 客户代码

popup.preloadTransaction(options) → () => void

预feet 检查出 iframe 在背景中为快取 UX 。 返回打开预装弹出功能 .

const open = popup.preloadTransaction({
  key: "pk_test_xxxxxxx",
  email: "[email protected]",
  amount: 100000,
  onSuccess: (res) => verifyOnServer(res.reference),
});

// Later, when user clicks "Pay":
document.getElementById("pay-btn").addEventListener("click", open);

popup.checkout(options) → Promise<PopupTransaction>

约取出. 决定: PopupTransaction 弹出时的对象.

const transaction = await popup.checkout({
  key: "pk_test_xxxxxxx",
  email: "[email protected]",
  amount: 200000,
  onSuccess: (res) => console.log(res),
});

// Check status at any time:
console.log(transaction.getStatus());

popup.cancelTransaction(idOrTransaction)

程序上关闭一个公开交易.

const tx = popup.newTransaction({ ... });
// ... later
popup.cancelTransaction(tx); // or popup.cancelTransaction(tx.id)

popup.paymentRequest(options) → Promise<PopupTransaction>

显示一个 嵌入式支付元素 (Apple Pay按钮,钱包按钮)入到DOM容器. 适合自定义的检查.

const payment = await popup.paymentRequest({
  key: "pk_test_xxxxxxx",
  email: "[email protected]",
  amount: 500000,
  container: "#payment-request-container", // CSS selector or element ID
  onSuccess: (res) => console.log(res),
  onElementsMount: (elements) => {
    console.log("Payment elements mounted:", elements);
  },
  styles: {
    theme: "dark",
    applePay: {
      width: "100%",
      height: "48px",
      borderRadius: "8px",
      type: "buy", // "plain" | "buy" | "donate"
      locale: "en-US",
    },
  },
});

paymentRequest 选项

选项类型说明
containerstringQQ CSS 选择器或挂载目标的元素ID
loadPaystackCheckoutButtonstring打开完整弹出点的自定义按钮的选择器
styles.theme"dark" | "light"苹果支付按钮主题
styles.applePay.typestring苹果支付按钮标签 : "plain", (中文(简体) ), "buy", (中文(简体) ), "donate"
styles.applePay.localestring苹果支付按钮区域
onElementsMountfunction当嵌入元素出现在 DOM 中时起火

回电

所有交易方法都接受相同的回调接口 :

回电签署说明
onSuccess(res: { id, reference, message }) => void成功完成付款
onError(err: { message: string }) => void付款失败, 出错
onCancel() => void用户在完成前关闭弹出
onClose() => void弹出已关闭( 包括取消和成功)
onLoad(res: { id, customer, accessCode }) => void弹出已装满并准备好
onBankTransferConfirmationPending() => void启动银行转账,等待确认
callback(res: any) => void遗产 v1 回调( 使用) onSuccess 改为)

订阅

向客户收取经常性计划费用:

popup.newTransaction({
  key: "pk_test_xxxxxxx",
  email: "[email protected]",
  amount: 500000,
  plan: "PLN_xxxxxxxxx", // or planCode
  quantity: 1, // number of seats/plan units
  interval: "monthly", // or planInterval
  invoice_limit: 12, // stop after N billing cycles
  start_date: "2025-01-01T00:00:00Z",
  onSuccess: (res) => console.log(res),
});

订阅选项

选项类型别名说明
planCodestringplanPaystack 计划代码 (PLN_...(中文(简体) )
subscriptionCountnumberquantity订阅次数/席位
planIntervalstringintervalhourly, (中文(简体) ), daily, (中文(简体) ), weekly, (中文(简体) ), monthly, (中文(简体) ), annually
subscriptionLimitnumberinvoice_limit停止前的最大计费周期
subscriptionStartDatestringstart_dateISO 8601 第一次充电的日期

分期付款

分账户付款的路由:

popup.newTransaction({
  key: "pk_test_xxxxxxx",
  email: "[email protected]",
  amount: 500000,
  subaccount: "ACCT_xxxxxxxxx", // or subaccountCode
  bearer: "account", // who bears transaction charges
  transaction_charge: 2000, // flat charge for the main account (kobo)
  onSuccess: (res) => console.log(res),
});

拆分选项

选项类型别名说明
subaccountCodestringsubaccount要拆分的子账户代码
split_codestring引用一个预配置的拆分组
splitobject内置分割配置对象
connect_splitstring[]多分解连接账户代码阵列
bearer"account" | "subaccount"交易费由谁承担
transactionChargestring | numbertransaction_charge主账户留存的平价费用(以可博计)

框架实例

反应

import { loadPaystack } from "@alexasomba/paystack-inline";

function CheckoutButton({ accessCode }: { accessCode: string }) {
  const handlePay = async () => {
    const PaystackPop = await loadPaystack();
    const popup = new PaystackPop();

    popup.resumeTransaction(accessCode, {
      onSuccess: (response) => {
        // Call your API to verify + fulfill the order
        fetch("/api/verify", {
          method: "POST",
          body: JSON.stringify({ reference: response.reference }),
        });
      },
      onCancel: () => console.log("Payment cancelled"),
    });
  };

  return <button onClick={handlePay}>Pay Now</button>;
}

Next.js (App路由器) (英语)

"use client"; // Required — loadPaystack() is browser-only

import { loadPaystack } from "@alexasomba/paystack-inline";

export default function PayButton({ accessCode }: { accessCode: string }) {
  const handlePay = async () => {
    const PaystackPop = await loadPaystack();
    const popup = new PaystackPop();
    popup.resumeTransaction(accessCode, {
      onSuccess: (res) => console.log(res.reference),
    });
  };

  return <button onClick={handlePay}>Complete Payment</button>;
}

第3组

<script setup lang="ts">
import { loadPaystack } from "@alexasomba/paystack-inline";

const props = defineProps<{ accessCode: string }>();

const handlePay = async () => {
  const PaystackPop = await loadPaystack();
  const popup = new PaystackPop();
  popup.resumeTransaction(props.accessCode, {
    onSuccess: (res) => console.log(res.reference),
  });
};
</script>

<template>
  <button @click="handlePay">Pay Now</button>
</template>

斯维尔特/斯维尔特基特

<script lang="ts">
  import { loadPaystack } from "@alexasomba/paystack-inline";

  export let accessCode: string;

  async function handlePay() {
    const PaystackPop = await loadPaystack();
    const popup = new PaystackPop();
    popup.resumeTransaction(accessCode, {
      onSuccess: (res) => console.log(res.reference),
    });
  }
</script>

<button on:click={handlePay}>Pay Now</button>

类型脚本引用

所有出口类型均可直接进口:

import type {
  PaystackPopGeneralOptions,
  PaystackPopCallbacks,
  PaystackPopNewTransactionOptions,
  PaystackPopCheckoutOptions,
  PaystackPopPaymentRequestOptions,
  PaystackPopSplitOptions,
  PaystackPopSubscriptionOptions,
  PaystackPopInstance,
  PopupTransaction,
  PopupTransactionStatus,
} from "@alexasomba/paystack-inline";

PopupTransactionStatus

interface PopupTransactionStatus {
  status: "null" | "error" | "abandoned" | "auth" | "failed" | "success" | "pending";
  id?: string;
  errors?: any[];
  response?: any;
  checkoutUrl?: string;
}

完整支付流程

┌─────────────────┐      POST /transaction/initialize      ┌─────────────────┐
│   Your Backend  │ ─────────────────────────────────────► │  Paystack API   │
│  (Secret Key)   │ ◄───────────────────────────────────── │                 │
└────────┬────────┘            { access_code }             └─────────────────┘
         │
         │  access_code
         ▼
┌─────────────────┐       loadPaystack() + resumeTransaction()
│   Your Frontend │ ─────────────────────────────────────► Paystack Popup UI
│  (Public Key)   │ ◄─────────────── onSuccess({ reference }) ──────────────
└────────┬────────┘
         │
         │  Verify reference on YOUR server (never trust client callbacks alone)
         ▼
┌─────────────────┐      GET /transaction/verify/:reference
│   Your Backend  │ ─────────────────────────────────────► Paystack API
│                 │ ◄─────────────── { status: "success" } ─────────────────
└─────────────────┘
         │
         │  Deliver value to customer ✅

安全说明

  • 不要在前端用你的密钥. 只使用您的公钥( O)pk_...) (中文(简体) ).
  • 总是验证交易服务器侧 在提供价值之前—— onSuccess 召回可以被欺骗.
  • 脚本在 https://js.paystack.co/v2/inline.js 由Paystack的CDN装入HTTPS 并装有安全性头条.


来源


许可证

麻省理工学院 亚历山大

版本与发布记录

@alexasomba/paystack-inline 共发布 15 个版本,首次发布于 2026/04/16;过去 12 个月发布了 15 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
1.12.0latest2026/10/1028 天前
1.11.12026/10/1028 天前
1.11.02026/10/1029 天前
1.10.92026/10/0929 天前
1.10.82026/06/234 个月前
1.10.72026/06/015 个月前

关于 @alexasomba/paystack-inline 的常见问题

@alexasomba/paystack-inline 是什么?

Paystack Popup (inline.js) 的强型,基于承诺的TypeScript包装器.

如何安装 @alexasomba/paystack-inline?

在项目目录运行 npm install @alexasomba/paystack-inline,或使用 pnpm add / yarn add / bun add。

@alexasomba/paystack-inline 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@alexasomba/paystack-inline 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@alexasomba/paystack-inline 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=22.0.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@alexasomba/paystack-inline 可以商用吗?

@alexasomba/paystack-inline 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@alexasomba/paystack-inline 的下载量有多少?

根据 npm 官方下载统计,@alexasomba/paystack-inline 在 2026/10/06 – 2026/11/04 这 30 天内被下载 2,822 次,日均约 94 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@alexasomba/paystack-inline 还在维护吗?

最新版本 1.12.0 发布于 2026/10/10(28 天前);至今共发布 15 个版本,其中过去 12 个月发布了 15 个;首次发布于 2026/04/16。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。