@bloque/payments

中文文档
0.2.1发布于 2026/07/02MITTypeScriptESM + CJS零依赖近 30 天下载 6345

Official Bloque SDK for creating and managing payments and checkouts.

原始使用文档
文档目录12 节
  1. Installation
  2. Authentication
  3. Initialize (recommended)
  4. Initialize (legacy)
  5. Quick Start: Create Checkout
  6. API
  7. Bloque config
  8. Checkout
  9. Payments
  10. 3D Secure (direct API)
  11. Webhooks
  12. Example

Bloque Payments SDK

Official TypeScript/JavaScript SDK for integrating Bloque payments.

Installation

bun add @bloque/payments

Authentication

The SDK supports a three-credential model:

CredentialPrefixWherePurpose
Secret keysk_test_ / sk_live_Server onlyExchanged for a short-lived JWT via /origins/api-keys/exchange
Publishable keypk_test_ / pk_live_BrowserIdentifies the merchant; read-only (view cart)
Client secretJWTBrowserScoped JWT for a single checkout session (checkout.pay)
import { Bloque } from '@bloque/payments';

const bloque = new Bloque({
  mode: 'sandbox',
  secretKey: process.env.BLOQUE_SECRET_KEY!,
  webhookSecret: process.env.BLOQUE_WEBHOOK_SECRET, // optional
});

The SDK automatically exchanges the secret key for a JWT and caches it (with refresh 1 min before expiry).

Initialize (legacy)

const bloque = new Bloque({
  mode: 'sandbox',
  accessToken: process.env.BLOQUE_ACCESS_TOKEN!, // deprecated — use secretKey
});

Quick Start: Create Checkout

import { Bloque } from '@bloque/payments';

const bloque = new Bloque({
  mode: 'sandbox',
  secretKey: process.env.BLOQUE_SECRET_KEY!,
});

const checkout = await bloque.checkout.create({
  name: 'Pack Profesional de Productividad',
  description:
    'Periféricos premium para trabajo intensivo y alto rendimiento',
  asset: 'COPM/2',
  image_url: 'https://cdn.bloque.app/checkouts/productivity-pack.png',
  items: [
    {
      name: 'Teclado mecánico Keychron K2',
      description: 'Wireless, RGB, switches Blue',
      amount: 450_000_00,
      quantity: 2,
      image_url: 'https://cdn.bloque.app/items/keychron-k2.png',
    },
    {
      name: 'Mouse Logitech MX Master 3S',
      description: 'Inalámbrico, sensor 8K DPI',
      amount: 380_000_00,
      quantity: 1,
      image_url: 'https://cdn.bloque.app/items/mx-master-3s.png',
    },
  ],
  success_url: 'https://bloque.app/success',
  cancel_url: 'https://bloque.app/cancel',
  merchant: {
    name: 'Bloque',
    theme: {
      primary: '#10b981',
      primary_foreground: '#ffffff',
      background: '#f8fafc',
      surface: '#ffffff',
      border: '#d1d5db',
      input_border: '#10b98166',
    },
  },
  payment_methods: ['card', 'pse', 'cash'],
  payeer: {
    name: 'Nestor Cortina',
    email: '[email protected]',
  },
});

console.log('Checkout URL:', checkout.url);

API

Bloque config

type BloqueConfig = {
  mode: 'sandbox' | 'production';
  secretKey: string;        // sk_test_... or sk_live_...
  timeout?: number;         // request timeout in ms (default 10_000)
  maxRetries?: number;      // retry count (default 2)
  webhookSecret?: string;
};

/** @deprecated Use BloqueConfig with secretKey instead */
type BloqueConfigLegacy = {
  mode: 'sandbox' | 'production';
  accessToken: string;
  timeout?: number;
  maxRetries?: number;
  webhookSecret?: string;
};

Checkout

bloque.checkout.create(params)

type CheckoutParams = {
  name: string;
  description?: string;
  image_url?: string;
  asset?: 'COPM/2' | 'DUSD/6';
  items: {
    name: string;
    description?: string;
    amount: number;
    quantity: number;
    image_url?: string;
  }[];
  success_url: string;
  cancel_url: string;
  metadata?: Record<string, string | number | boolean>;
  merchant?: {
    name: string;
    theme: {
      primary: string;
      primary_foreground: string;
      background: string;
      surface: string;
      border: string;
      input_border: string;
    };
  };
  payment_methods?: ('card' | 'pse' | 'cash')[];
  expires_at?: string;
};

Notes:

  • asset defaults to DUSD/6 when omitted.
  • Creation request is sent using redirect_url derived from success_url.

Response shape:

type Checkout = {
  id: string;
  urn: string;
  object: 'checkout';
  url: string;
  client_secret: string;   // scoped JWT for browser-side checkout
  status: 'pending' | 'paid' | 'expired' | 'deposited' | 'cancelled';
  amount_total: number;
  amount_subtotal: number;
  asset: 'COPM/2' | 'DUSD/6';
  items: {
    name: string;
    description?: string;
    amount: number;
    quantity: number;
    image_url?: string;
  }[];
  metadata?: Record<string, string | number | boolean>;
  created_at: string;
  updated_at: string;
  expires_at: string | null;
};

Pass the client_secret to @bloque/payments-core or @bloque/payments-react on the browser to authorize payment execution.

bloque.checkout.retrieve(checkoutId)

const checkout = await bloque.checkout.retrieve('checkout_123');

bloque.checkout.cancel(checkoutId)

const checkout = await bloque.checkout.cancel('checkout_123');

Payments

bloque.payments.create(params)

Supported direct payment methods are card, pse, and cash (maps to POST /payments/:type on the server).

const payment = await bloque.payments.create({
  paymentUrn: 'did:bloque:payments:123e4567-e89b-12d3-a456-426614174000',
  payment: {
    type: 'card',
    data: {
      cardNumber: '4111111111111111',
      cardholderName: 'John Doe',
      expiryMonth: '12',
      expiryYear: '2028',
      cvv: '123',
      email: '[email protected]',
      installments: 1,
      currency: 'COP',
    },
  },
});

Payment response:

type PaymentResponse = {
  id: string;
  object: 'payment';
  status: 'approved' | 'rejected' | 'pending';
  amount: number;
  currency: string;
  created_at: string;
  three_ds?: { current_step: string; iframe: string };
};

bloque.payments.getStatus(paymentId)

Poll payment status by URN (e.g. did:bloque:payments:...) after a 3DS challenge.

const latest = await bloque.payments.getStatus(payment.id);

3D Secure (direct API)

When you process card payments server-side with 3DS, pass browser fingerprint fields and optional sandbox scenario:

import type { BrowserInfo } from '@bloque/payments';

function browserInfoFromRequest(req: {
  headers: Record<string, string | string[] | undefined>;
}): BrowserInfo {
  const ua = String(req.headers['user-agent'] ?? '');
  const accept = String(req.headers['accept'] ?? '*/*');
  const lang = String(req.headers['accept-language'] ?? 'en');
  return {
    browser_user_agent: ua,
    browser_language: lang,
    browser_color_depth: '24',
    browser_screen_height: '900',
    browser_screen_width: '1440',
    browser_tz: '0',
  };
}

const payment = await bloque.payments.create({
  checkoutId: 'checkout_123',
  payment: {
    type: 'card',
    data: {
      cardNumber: '4111111111111111',
      cardholderName: 'John Doe',
      expiryMonth: '12',
      expiryYear: '2028',
      cvv: '123',
      email: '[email protected]',
      is_three_ds: true,
      browser_info: browserInfoFromRequest(req),
      three_ds_auth_type: 'challenge_v2', // sandbox only; omit in production
    },
  },
});

if (payment.three_ds?.iframe) {
  // 1) Decode HTML entities if the gateway returns escaped HTML
  // 2) If iframe is a URL (https://...), use <iframe src="...">
  // 3) Otherwise use <iframe srcdoc={decodedHtml}> with sandbox allow-scripts allow-forms allow-popups
  // 4) Show Mastercard ID Check branding before/around the challenge where required
  // 5) Poll until terminal state:
  let status = payment.status;
  while (status === 'pending') {
    await new Promise((r) => setTimeout(r, 3000));
    const next = await bloque.payments.getStatus(payment.id);
    status = next.status;
  }
}

Field names for BrowserInfo match the Bloque Payments API (browser_user_agent, browser_language, etc.).

Webhooks

Verify webhook signature (HMAC-SHA256):

const isValid = bloque.webhooks.verify(
  rawBody,
  signature,
  { secret: process.env.BLOQUE_WEBHOOK_SECRET! },
);

You can also set webhookSecret during Bloque initialization and omit options in verify.

Example

Full example available at:

  • examples/basic-checkout.ts

版本与发布记录

@bloque/payments 共发布 22 个版本,首次发布于 2025/12/19;过去 12 个月发布了 22 个版本。

版本发布日期距今
0.2.1latest2026/07/024 个月前
0.1.82026/05/195 个月前
0.1.72026/05/195 个月前
0.1.62026/05/185 个月前
0.1.52026/05/115 个月前
0.1.42026/04/077 个月前

关于 @bloque/payments 的常见问题

@bloque/payments 是什么?

Official Bloque SDK for creating and managing payments and checkouts.

如何安装 @bloque/payments?

在项目目录运行 npm install @bloque/payments,或使用 pnpm add / yarn add / bun add。

@bloque/payments 支持 TypeScript 吗?

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

@bloque/payments 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@bloque/payments 需要什么版本的 Node.js?

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

@bloque/payments 可以商用吗?

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

@bloque/payments 的下载量有多少?

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

@bloque/payments 还在维护吗?

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