@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");
},
});
核心选项
| 选项 | 类型 | 需求 | 说明 |
|---|---|---|---|
key | string | ✅ | 你的佩斯达克 公开 键pk_...(中文(简体) ) |
email | string | ✅ | 客户的电子邮件地址 |
amount | number | ✅ | 以最低货币单位计算的数额(例如Kobo) |
currency | string | —— 说 | 货币代码 : NGN, (中文(简体) ), GHS, (中文(简体) ), ZAR, (中文(简体) ), KES, (中文(简体) ), USD |
reference | string | —— 说 | 独特的交易参考。 未设置时自动生成 |
label | string | —— 说 | 退出时显示的客户名 |
channels | string[] | —— 说 | 限制频道 : ["card", "bank", "ussd", "mobile_money", "bank_transfer", "qr", "eft"] |
metadata | object | —— 说 | 交易所附任意密钥值数据 |
language | string | —— 说 | 强制退出语言( E)en, (中文(简体) ), fr, (中文(简体) ), pt页:1 |
客户选项
| 选项 | 类型 | 说明 |
|---|---|---|
firstName | string | 预填客户名 |
lastName | string | 预填客户名 |
phone | string | 客户电话号码 |
customerCode | string | 现有的 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 选项
| 选项 | 类型 | 说明 |
|---|---|---|
container | string | QQ CSS 选择器或挂载目标的元素ID |
loadPaystackCheckoutButton | string | 打开完整弹出点的自定义按钮的选择器 |
styles.theme | "dark" | "light" | 苹果支付按钮主题 |
styles.applePay.type | string | 苹果支付按钮标签 : "plain", (中文(简体) ), "buy", (中文(简体) ), "donate" |
styles.applePay.locale | string | 苹果支付按钮区域 |
onElementsMount | function | 当嵌入元素出现在 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),
});
订阅选项
| 选项 | 类型 | 别名 | 说明 |
|---|---|---|---|
planCode | string | plan | Paystack 计划代码 (PLN_...(中文(简体) ) |
subscriptionCount | number | quantity | 订阅次数/席位 |
planInterval | string | interval | hourly, (中文(简体) ), daily, (中文(简体) ), weekly, (中文(简体) ), monthly, (中文(简体) ), annually |
subscriptionLimit | number | invoice_limit | 停止前的最大计费周期 |
subscriptionStartDate | string | start_date | ISO 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),
});
拆分选项
| 选项 | 类型 | 别名 | 说明 |
|---|---|---|---|
subaccountCode | string | subaccount | 要拆分的子账户代码 |
split_code | string | 引用一个预配置的拆分组 | |
split | object | 内置分割配置对象 | |
connect_split | string[] | 多分解连接账户代码阵列 | |
bearer | "account" | "subaccount" | 交易费由谁承担 | |
transactionCharge | string | number | transaction_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 并装有安全性头条.
相关资源
来源
- Monorepo 来源 : 阿列克萨松巴/帕斯塔克-波拿皮
- 独立的 SDK repo : https://github.com/alexasomba/paystack-inline 互联网档案馆的存檔,存档日期2013-12-02
许可证
麻省理工学院 亚历山大