create-payment-link
POST /api/{team}/gateway/create-payment-link
Bir ödeme linki açar. Link, kapatılana ya da son geçerlilik gününe kadar checkout_url adresindeki ödeme sayfasında tekrar tekrar ödenebilir; her ödeme 3D Secure ile alınır. Linkte customer gönderilmez; ödeyenin bilgileri ödeme sayfasında alınır ve işlemin customer alanında döner. Tutar gönderilmez: amount_type fixed (varsayılan) ise kalemlerden hesaplanır, öteki tiplerde ödeme sayfasında ödeyen tarafından belirlenir (Tutar tipleri). Akış: Ödeme Linki rehberi.
reference tekil değildir. Her create-payment-link çağrısı yeni bir link açar ve yeni bir token döndürür; aynı reference daha önce gönderilmiş olsa da. Aynı referanslı önceki linkler olduğu gibi kalır, hiçbiri değiştirilmez ve tekrarlanan referans 422 döndürmez. Var olan bir linki değiştirmek için update-payment-link/{token} kullanın; yanıttaki token'ı saklayın ve linkleri token'la eşleştirin. Ayrıntılar: Aynı referansla tekrarlanan create-* istekleri.
Ön koşullar
- Çalışma alanının planı ödeme linklerini kapsamalı ve Link ile Ödeme modülü açık olmalıdır; değilse
403. - Linkin ödeneceği hesap 3D ödeme almalıdır.
Kimlik doğrulama
X-Api-Key, X-Timestamp, X-Signature, Content-Type: application/json. Ayrıntılar: Kimlik Doğrulama ve İmza.
İstek
{
"payment_link": {
"reference": "LNK-1",
"description": "Atölye kaydı",
"currency": "TRY",
"expires_at": "2026-12-31",
"items": [
{ "name": "Atölye kaydı", "quantity": 1, "unit_amount": "750.00", "tax_rate": "20" }
]
}
}
Tutarı ödeyenin belirlediği, para birimini ödeyenin seçtiği bir link:
{
"payment_link": {
"description": "Bağış",
"currency": "TRY",
"amount_type": "predefined_and_custom",
"item_name": "Bağış",
"predefined_amounts": ["100.00", "250.00", "500.00"],
"tax_rate": "0",
"currency_type": "selectable",
"currencies": ["USD", "EUR"],
"emails_customer": true
}
}
payment_link
payment_link nesnesinde yalnızca aşağıdaki anahtarlar gönderilebilir; başka bir anahtar 422 döner.
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
currency | string | evet | TRY, USD, EUR, GBP. currency_type selectable ise currencies listesine her zaman eklenir. |
amount_type | string | hayır | Linkin tutarının nasıl belirlendiği: fixed, custom, predefined, predefined_and_custom. Gönderilmezse fixed. Bkz. Tutar tipleri. |
items | array | fixed tipte evet | 1–100 kalem. Alanlar: Kalemler. Kalemlerin toplamı en fazla 10000000.00. amount_type custom, predefined ya da predefined_and_custom ise gönderilse de yok sayılır ve linke kalem yazılmaz. |
item_name | string | seçimli tiplerde evet | amount_type custom, predefined ya da predefined_and_custom ise zorunlu: ödemenin tek kaleminin adı. En çok 255 karakter. fixed tipte yok sayılır. |
predefined_amounts | array | predefined ve predefined_and_custom tipte evet | Ödeyenin seçebileceği tutarlar: 1–10 tutar; her biri en az 0.01, en fazla 10000000.00, en çok iki ondalık, tekrarsız. Öteki tiplerde yok sayılır. |
tax_rate | string | number | hayır | Seçimli tiplerde ödenen tutarın KDV oranı, 0–100, en çok iki ondalık. Gönderilmezse KDV yok. fixed tipte yok sayılır; KDV kalemlerin kendi tax_rate alanından gelir. |
tax_mode | string | hayır | Seçimli tiplerde tax_rate'in tutara nasıl uygulandığı: inclusive ya da exclusive. Gönderilmezse inclusive. Bkz. Tutar tipleri. |
currency_type | string | hayır | fixed: ödeme currency ile alınır. selectable: ödeyen currencies listesinden birini seçer. Gönderilmezse fixed. Bkz. Para birimi seçimi. |
currencies | array | selectable ise evet | Ödeyenin currency dışında seçebileceği para birimleri: en az bir; TRY, USD, EUR, GBP, tekrarsız. currency_type fixed ise yok sayılır. |
reference | string | hayır | Linkin sizin sisteminizdeki referansı. En çok 255 karakter, en az bir rakam. Gönderilmezse LINK1, LINK2 … biçiminde üretilir. Tekil değildir: aynı referansla her çağrı yeni bir link ve yeni bir token açar, önceki linkler değişmez. Linki token'la izleyin. |
description | string | hayır | Açıklama. En çok 255 karakter. |
payment_provider_token | string (UUID) | hayır | Linkin ödeneceği hesap. Gönderilmezse ödeme anında ödeme hesabı seçimi uygulanır. |
emails_customer | boolean | hayır | true ise linkten yapılan her başarılı ödemeden sonra ödeyene, ödeme sayfasında verdiği e-posta adresine e-posta gönderilir. Gönderilmezse false. |
expires_at | string | hayır | Linkin ödenebileceği son gün, YYYY-MM-DD, çalışma alanının saat diliminde; bugün ya da sonrası. Gönderilmezse süresizdir. |
is_active | boolean | hayır | Linkin ödeme alıp almadığı. Gönderilmezse true. |
Tutar tipleri
amount_type | Ödenen tutar |
|---|---|
fixed | Kalemlerin toplamı. Her ödemede linkin o anki kalemleri alınır. |
custom | Ödeyenin ödeme sayfasında yazdığı tutar: en az 0.01, en fazla 10000000.00. |
predefined | predefined_amounts listesinden ödeyenin seçtiği tutar. |
predefined_and_custom | predefined_amounts listesinden seçilen ya da ödeyenin yazdığı tutar. |
Seçimli tiplerde (custom, predefined, predefined_and_custom) ödeme, adı item_name olan tek bir kalemden oluşur ve KDV tax_rate ile tax_mode'a göre hesaplanır:
inclusive: KDV ödenen tutarın içinden ayrılır.%20ile100.00→83.33ara toplam +16.67KDV; çekilen tutar100.00.exclusive: KDV tutarın üstüne eklenir.%20ile100.00→ çekilen tutar120.00, bunun20.00'si KDV.
Seçimli tipteki linkin yanıtında subtotal, tax_amount ve amount null'dır; her ödemenin tutarı retrieve-link-payments ile okunur.
Para birimi seçimi
currency_type: selectable ile ödeyen, currency ve currencies listesindeki para birimlerinden birini seçer. Yanıttaki currencies alanı currency dahil bütün listeyi döndürür. Tutarlar çevrilmez: kalem tutarları ya da ödeyenin belirlediği tutar, seçilen para biriminde aynı rakamla alınır.
SDK örnekleri
Örneklerdeki $client / client nesnesinin kurulumu: İstemciyi Kurmak.
- PHP
- Node.js
- Python
- Java
- cURL
use Gurmehub\Odemehub\Enum\Currency;
use Gurmehub\Odemehub\Request\{CreatePaymentLink, Item};
$created = $client->createPaymentLink(new CreatePaymentLink(
currency: Currency::TRY,
items: [new Item(name: 'Atölye kaydı', unitAmount: '750.00', quantity: 1, taxRate: '20')],
reference: 'LNK-1',
description: 'Atölye kaydı',
expiresAt: '2026-12-31',
));
$created->paymentLink->checkoutUrl; // paylaşılacak adres
const created = await client.createPaymentLink({
items: [{ name: 'Atölye kaydı', unitAmount: '750.00', quantity: 1, taxRate: '20' }],
currency: 'TRY',
reference: 'LNK-1',
description: 'Atölye kaydı',
expiresAt: '2026-12-31',
});
created.paymentLink.checkoutUrl; // paylaşılacak adres
from odemehub.enums import Currency
from odemehub.request import CreatePaymentLink, Item
created = client.create_payment_link(CreatePaymentLink(
items=[Item(name="Atölye kaydı", unit_amount="750.00", quantity=1, tax_rate="20")],
currency=Currency.TRY,
reference="LNK-1",
description="Atölye kaydı",
expires_at="2026-12-31",
))
created.payment_link.checkout_url # paylaşılacak adres
import com.odemehub.enums.Currency;
import com.odemehub.request.CreatePaymentLink;
import com.odemehub.request.Item;
import java.util.List;
var created = client.createPaymentLink(CreatePaymentLink.builder()
.items(List.of(Item.builder().name("Atölye kaydı").unitAmount("750.00").quantity(1).taxRate("20").build()))
.currency(Currency.TRY)
.reference("LNK-1")
.description("Atölye kaydı")
.expiresAt("2026-12-31")
.build());
created.getPaymentLink().getCheckoutUrl(); // paylaşılacak adres
URI_PATH="/api/$ODEMEHUB_TEAM/gateway/create-payment-link"
BODY='{"payment_link":{"reference":"LNK-1","description":"Atölye kaydı","currency":"TRY","expires_at":"2026-12-31","items":[{"name":"Atölye kaydı","quantity":1,"unit_amount":"750.00","tax_rate":"20"}]}}'
TIMESTAMP=$(date +%s)
SIGNATURE=$(printf '%s\n%s\n%s\n%s' "$TIMESTAMP" "POST" "$URI_PATH" "$BODY" | openssl dgst -sha256 -hmac "$ODEMEHUB_API_SECRET" | sed 's/^.* //')
curl -X POST "https://sandbox.odemehub.com$URI_PATH" \
-H "Content-Type: application/json" \
-H "X-Api-Key: $ODEMEHUB_API_KEY" \
-H "X-Timestamp: $TIMESTAMP" \
-H "X-Signature: $SIGNATURE" \
--data-raw "$BODY"
Tutarı ödeyenin belirlediği, para birimini ödeyenin seçtiği link (ikinci istek örneği):
- PHP
- Node.js
- Python
- Java
- cURL
use Gurmehub\Odemehub\Enum\{AmountType, Currency, CurrencyType};
use Gurmehub\Odemehub\Request\CreatePaymentLink;
$created = $client->createPaymentLink(new CreatePaymentLink(
currency: Currency::TRY,
description: 'Bağış',
amountType: AmountType::PredefinedAndCustom,
itemName: 'Bağış',
predefinedAmounts: ['100.00', '250.00', '500.00'],
taxRate: '0',
currencyType: CurrencyType::Selectable,
currencies: [Currency::USD, Currency::EUR],
emailsCustomer: true,
));
$created->paymentLink->amount; // null: tutarı ödeyen belirler
$created->paymentLink->currencies; // [Currency::TRY, Currency::USD, Currency::EUR]
const created = await client.createPaymentLink({
currency: 'TRY',
description: 'Bağış',
amountType: 'predefined_and_custom',
itemName: 'Bağış',
predefinedAmounts: ['100.00', '250.00', '500.00'],
taxRate: '0',
currencyType: 'selectable',
currencies: ['USD', 'EUR'],
emailsCustomer: true,
});
created.paymentLink.amount; // null: tutarı ödeyen belirler
created.paymentLink.currencies; // ['TRY', 'USD', 'EUR']
from odemehub.enums import AmountType, Currency, CurrencyType
from odemehub.request import CreatePaymentLink
created = client.create_payment_link(CreatePaymentLink(
currency=Currency.TRY,
description="Bağış",
amount_type=AmountType.PREDEFINED_AND_CUSTOM,
item_name="Bağış",
predefined_amounts=["100.00", "250.00", "500.00"],
tax_rate="0",
currency_type=CurrencyType.SELECTABLE,
currencies=[Currency.USD, Currency.EUR],
emails_customer=True,
))
created.payment_link.amount # None: tutarı ödeyen belirler
created.payment_link.currencies # [Currency.TRY, Currency.USD, Currency.EUR]
import com.odemehub.enums.AmountType;
import com.odemehub.enums.Currency;
import com.odemehub.enums.CurrencyType;
import com.odemehub.request.CreatePaymentLink;
import java.util.List;
var created = client.createPaymentLink(CreatePaymentLink.builder()
.currency(Currency.TRY)
.description("Bağış")
.amountType(AmountType.PREDEFINED_AND_CUSTOM)
.itemName("Bağış")
.predefinedAmounts(List.of("100.00", "250.00", "500.00"))
.taxRate("0")
.currencyType(CurrencyType.SELECTABLE)
.currencies(List.of(Currency.USD, Currency.EUR))
.emailsCustomer(true)
.build());
created.getPaymentLink().getAmount(); // null: tutarı ödeyen belirler
created.getPaymentLink().getCurrencies(); // [TRY, USD, EUR]
URI_PATH="/api/$ODEMEHUB_TEAM/gateway/create-payment-link"
BODY='{"payment_link":{"description":"Bağış","currency":"TRY","amount_type":"predefined_and_custom","item_name":"Bağış","predefined_amounts":["100.00","250.00","500.00"],"tax_rate":"0","currency_type":"selectable","currencies":["USD","EUR"],"emails_customer":true}}'
TIMESTAMP=$(date +%s)
SIGNATURE=$(printf '%s\n%s\n%s\n%s' "$TIMESTAMP" "POST" "$URI_PATH" "$BODY" | openssl dgst -sha256 -hmac "$ODEMEHUB_API_SECRET" | sed 's/^.* //')
curl -X POST "https://sandbox.odemehub.com$URI_PATH" \
-H "Content-Type: application/json" \
-H "X-Api-Key: $ODEMEHUB_API_KEY" \
-H "X-Timestamp: $TIMESTAMP" \
-H "X-Signature: $SIGNATURE" \
--data-raw "$BODY"
Yanıt
{
"result": { "successful": true, "message": null },
"payment_link": {
"token": "7c1e3a5b-9d2f-4b6e-8a1c-3e5f7b9d1a2c",
"reference": "LNK-1",
"description": "Atölye kaydı",
"payment_provider_token": null,
"amount_type": "fixed",
"item_name": null,
"predefined_amounts": null,
"tax_rate": null,
"tax_mode": "inclusive",
"items": [
{ "reference": null, "name": "Atölye kaydı", "image": null, "quantity": 1, "unit_amount": "750.00", "tax_rate": "20.00" }
],
"subtotal": "625.00",
"tax_amount": "125.00",
"amount": "750.00",
"currency": "TRY",
"currency_type": "fixed",
"currencies": null,
"emails_customer": false,
"is_active": true,
"is_test": false,
"expires_at": "2026-12-31T20:59:59.999999Z",
"checkout_url": "https://sandbox.odemehub.com/checkout/link/7c1e3a5b-9d2f-4b6e-8a1c-3e5f7b9d1a2c",
"created_at": "2026-10-02T09:20:00.000000Z"
}
}
Seçimli tipteki link (ikinci istek örneği) için payment_link:
{
"token": "9a4d2c6e-1b3f-4e5a-8c7d-2f4b6d8e0a1c",
"reference": "LINK7",
"description": "Bağış",
"payment_provider_token": null,
"amount_type": "predefined_and_custom",
"item_name": "Bağış",
"predefined_amounts": ["100.00", "250.00", "500.00"],
"tax_rate": "0.00",
"tax_mode": "inclusive",
"items": [],
"subtotal": null,
"tax_amount": null,
"amount": null,
"currency": "TRY",
"currency_type": "selectable",
"currencies": ["TRY", "USD", "EUR"],
"emails_customer": true,
"is_active": true,
"is_test": false,
"expires_at": null,
"checkout_url": "https://sandbox.odemehub.com/checkout/link/9a4d2c6e-1b3f-4e5a-8c7d-2f4b6d8e0a1c",
"created_at": "2026-10-02T09:25:00.000000Z"
}
Alanlar: Ödeme linki nesnesi.
HTTP durum kodları
| Kod | Durum |
|---|---|
200 | Yeni link açıldı. |
401 | API anahtarı ya da imza geçersiz. |
403 | Çalışma alanı işlem yapamıyor, planı ödeme linklerini kapsamıyor ya da Link ile Ödeme modülü kapalı. |
422 | Doğrulama hatası. |
429 | İstek sınırı aşıldı. |
Hatalar
| Alan | Mesaj |
|---|---|
payment_link.reference | Referans en az bir rakam içermeli (örneğin LNK1). |
payment_link.expires_at | Son geçerlilik tarihi geçmiş bir gün olamaz. |
payment_link.payment_provider_token | Bu ödeme hesabı ödeme sayfasından ödeme alamıyor. / Ödeme hesabı belirtilmedi ve çalışma alanınızın varsayılan ödeme hesabı yok. |
payment_link.items | En az bir kalem gönderilmeli. / Kalemlerin toplamı en fazla 10.000.000,00 olabilir. |
payment_link.items.*.unit_amount | … en fazla 10.000.000,00 olabilir. |
payment_link.item_name | Ödeyen tutarı seçtiğinde ödemenin kalem adı gönderilmeli. |
payment_link.predefined_amounts | Seçilebilecek en az bir tutar gönderilmeli. |
payment_link.predefined_amounts.* | … en fazla 10.000.000,00 olabilir. |
payment_link.currencies | Ödeyenin seçebileceği en az bir para birimi daha gönderilmeli. |