İçeriğe geç

Rehberler

Kredi satışı

Bir API ya da AI hizmeti için ön ödemeli krediler: alıcılar kendileri yükler, sunucun her çağrıda harcar. Yüklemeden hiçbir şey kesilmez.

Markdown olarak aç

Krediler kullanıma göre satılan her şeye uyar: token'lar, görseller, dakikalar, aramalar. Alıcı bir paketi kriptoyla öder; sen her çağrıda ondan harcarsın; krediler bitince alıcı kendi sayfasından yükler. Hiçbir şey otomatik olarak tahsil edilmez — alıcı her zaman kendisi öder — ve Perly yüklemelerden hiçbir şey almaz.

Kurulum

  1. 1

    Bir ürün ve paketler oluştur

    Dashboard → Products → New, sonra New price → Credit pack: örneğin $10'a 1 000 kredi, $40'a 5 000. Ya da pay.prices.create({ product, model: "credit_pack", unit_amount: 1000, credits: 1000 }).

  2. 2

    Alıcının bakiyeyi ne zaman öğreneceğini seç

    Ürün sayfasında, Credits bölümünde: uyarı eşiği, alıcıya e-posta ve Any amount — tek bir paketin N katı; böylece alıcı yalnızca sabit bir paketle değil, $25 gibi bir tutarla da yükleyebilir.

  3. 3

    Her alıcıya bir müşteri ver

    Kullanıcı başına bir tane, kendi id'nle oluştur: pay.customers.create({ email, external_id: user.id }). Sonrasında SDK bu id'yi kabul eder.

Harca, kontrol et, yükle

import { PerlyPay, InvalidRequestError } from "perly-pay";
const pay = new PerlyPay(process.env.PERLY_PAY_SECRET_KEY);

// Before the work: enough left?
const { balance, top_up_url } = await pay.credits.balance(user.id);

// After it: spend. The same idempotencyKey never spends twice.
try {
  await pay.credits.consume(user.id, 3, { action: "chat", idempotencyKey: request.id });
} catch (e) {
  if (e instanceof InvalidRequestError && e.code === "insufficient_credits") {
    return { error: "Out of credits", topUp: await pay.credits.topUpUrl(user.id) };
  }
  throw e;
}
  • Müşteri; bir cus_… id'si, e-posta ya da onun için kendi id'ndir (external_id). Birden çok ürün için kredi satıyorsan product belirt.
  • Harcama atomiktir ve asla sıfırın altına inmez: aynı krediler üzerinde iki eşzamanlı harcama geçmez. Yetersizlik insufficient_credits (409) döner ve hiçbir şey harcanmaz.
  • İsteğinin id'sini idempotency anahtarı olarak gönder. Tekrar — zaman aşımından, hatadan, hatta ertesi günden sonra — ilk harcamayı döndürür, bir daha harcamaz.
  • action senin etiketindir (chat, image.hd, api/search). Ürün sayfası harcamaları eyleme ve müşteriye göre toplar.

Yükleme sayfası

top_up_url alıcının kendi sayfasıdır, her seferinde aynı: bakiyeyi ve paketlerini senin ödeme sayfanın görünümünde gösterir ve alıcı bir paket seçince normal bir fatura açar. Ödendiği anda krediler bakiyeye bir kez eklenir. Bağlantıyı uygulamada, "kredi bitti" hatasında göster ya da gönder — alıcı portalında da bir Yükle butonu var.

Krediler bitince

OlayNe zaman
credits.lowBakiye ürünün eşiğine indi. Geçiş başına bir kez: tekrar ancak bir yükleme onu eşiğin üstüne çıkardıktan sonra.
credits.depletedBakiye sıfıra ulaştı. Geçiş başına bir kez.

İkisi de müşteriyi data.object olarak, ayrıca data.product ve data.balance taşır. Eşik ayarlıysa ve e-posta açıksa alıcı ayrıca yükleme bağlantılı bir e-posta alır — günde en fazla bir kez. Test modunda e-postalar yalnızca ekibine gider.

Birden çok paketin kredileri toplanır; harcama önce en eski paketten yapılır.