Direkt Ödeme API Dokümantasyonu
3D Secure olmayan direkt ödeme işlemleri ve entegrasyon rehberi
Genel Bakış
OdemeNet Direkt Ödeme API, 3D Secure doğrulama gerektirmeyen hızlı ödeme işlemleri gerçekleştirmenizi sağlar. Bu API, POS entegrasyonu üzerinden direkt ödeme alma imkanı sunar.
Önemli Güvenlik Notu: Direkt ödeme işlemleri 3D Secure doğrulama gerektirmediği için daha yüksek risk taşır. Kart bilgileri şifrelenmiş olarak saklanır ve tüm API çağrıları JWT token ile yetkilendirilmelidir.
Yetkilendirme: Tüm API çağrıları için Authorization header'ında Bearer token kullanılmalıdır.
Özellikler:
- Hızlı İşlem: 3D Secure yönlendirmesi olmadan direkt ödeme
- Otomatik Banka Seçimi: BIN numarasına göre en uygun banka otomatik seçilir
- Kart Saklama: Kart bilgileri güvenli şekilde şifrelenmiş olarak saklanır
- Müşteri Yönetimi: Müşteri, fatura ve teslimat adresi bilgileri kaydedilir
- Ürün Takibi: Ödemeye ait ürün bilgileri detaylı olarak kaydedilir
Direkt Ödeme API
Endpoint Bilgileri
| Method | POST |
| URL | /api/Payment/pay |
| Authorization | Bearer {token} |
| Content-Type | application/json |
Zorunlu Request Parametreleri
| Parametre | Tip | Açıklama |
|---|---|---|
Amount |
decimal | Ödeme tutarı (0'dan büyük olmalı) |
CardNo |
string | Kart numarası (en az 6 haneli) |
CardHolderName |
string | Kart sahibinin adı soyadı |
ExpireMonth |
string | Son kullanma ayı (MM formatında) |
ExpireYear |
string | Son kullanma yılı (YY formatında) |
Cvv |
string | Kart güvenlik kodu (CVV/CVC) |
OrderNumber |
string | Sipariş numarası (benzersiz olmalı) |
Opsiyonel Request Parametreleri
| Parametre | Tip | Varsayılan | Açıklama |
|---|---|---|---|
Currency |
string | "TRY" | Para birimi kodu |
CurrencyId |
int? | 1 | Para birimi ID |
Installment |
int | 1 | Taksit sayısı |
ClientIp |
string | null | Müşteri IP adresi |
Phone |
string | null | Müşteri telefon numarası |
SuccessUrl |
string | null | Başarılı ödeme sonrası yönlendirilecek URL |
FailUrl |
string | null | Başarısız ödeme sonrası yönlendirilecek URL |
CardAlias |
string | auto | Kart için özel takma ad |
Customer |
object | null | Müşteri bilgileri objesi |
Customer Objesi Parametreleri (Opsiyonel)
| Parametre | Tip | Zorunlu | Açıklama |
|---|---|---|---|
FullName |
string | Hayır | Müşteri tam adı |
Email |
string | Hayır | Müşteri e-posta adresi |
Phone |
string | Hayır | Müşteri telefon numarası |
Country |
string | Hayır | Müşteri ülkesi |
City |
string | Hayır | Müşteri şehri |
Address |
string | Hayır | Müşteri adresi |
IdentityNumber |
string | Hayır | TC Kimlik Numarası |
TaxNumber |
string | Hayır | Vergi Numarası |
BillingAddress Objesi Parametreleri (Opsiyonel)
| Parametre | Tip | Zorunlu | Açıklama |
|---|---|---|---|
Name |
string | Hayır | Fatura adresi adı |
City |
string | Hayır | Fatura adresi şehir |
Country |
string | Hayır | Fatura adresi ülke |
Address |
string | Hayır | Fatura adresi detay |
ZipCode |
string | Hayır | Fatura adresi posta kodu |
ShippingAddress Objesi Parametreleri (Opsiyonel)
| Parametre | Tip | Zorunlu | Açıklama |
|---|---|---|---|
Name |
string | Hayır | Teslimat adresi adı |
City |
string | Hayır | Teslimat adresi şehir |
Country |
string | Hayır | Teslimat adresi ülke |
Address |
string | Hayır | Teslimat adresi detay |
ZipCode |
string | Hayır | Teslimat adresi posta kodu |
Products Array Parametreleri (Opsiyonel)
| Parametre | Tip | Zorunlu | Açıklama |
|---|---|---|---|
Id |
string | Hayır | Ürün ID |
Name |
string | Hayır | Ürün adı |
Category |
string | Hayır | Ürün kategorisi |
Description |
string | Hayır | Ürün açıklaması |
Amount |
decimal | Evet* | Ürün tutarı (*Products gönderiliyorsa zorunlu) |
Not: Products array gönderiliyorsa, tüm ürünlerin toplam tutarı (ProductAmount) ile request'teki Amount değeri eşleşmelidir. Aksi takdirde "AMOUNT_MISMATCH" hatası alınır.
Request Örneği (Tam)
JSON
{
"Amount": 100.50,
"Currency": "TRY",
"Installment": 1,
"CardNo": "4508034508034509",
"CardHolderName": "John Doe",
"ExpireMonth": "12",
"ExpireYear": "25",
"Cvv": "123",
"OrderNumber": "ORD-2024-001",
"ClientIp": "192.168.1.1",
"Phone": "+905551234567",
"Customer": {
"FullName": "John Doe",
"Email": "john@example.com",
"Phone": "+905551234567",
"Country": "Türkiye",
"City": "İstanbul",
"Address": "Test Adresi Sokak No: 123",
"IdentityNumber": "12345678901",
"TaxNumber": "1234567890"
},
"BillingAddress": {
"Name": "John Doe",
"City": "İstanbul",
"Country": "Türkiye",
"Address": "Fatura Adresi Sokak No: 123",
"ZipCode": "34000"
},
"ShippingAddress": {
"Name": "John Doe",
"City": "İstanbul",
"Country": "Türkiye",
"Address": "Teslimat Adresi Sokak No: 123",
"ZipCode": "34000"
},
"Products": [
{
"Id": "PROD-001",
"Name": "Test Ürün",
"Category": "Elektronik",
"Description": "Test ürün açıklaması",
"Amount": 100.50
}
]
}
Request Örneği (Minimum)
JSON
{
"Amount": 100.50,
"CardNo": "4508034508034509",
"CardHolderName": "John Doe",
"ExpireMonth": "12",
"ExpireYear": "25",
"Cvv": "123",
"OrderNumber": "ORD-2024-001"
}
Başarılı Response
JSON
{
"Success": true,
"Message": "Direkt ödeme işlemi başarılı",
"PaymentResult": "BANKA_RESPONSE_DATA",
"TransactionId": "123e4567-e89b-12d3-a456-426614174000",
"PaymentReferenceNumber": "ON-123456789",
"BankName": "Garanti BBVA",
"CardAlias": "****4509",
"Customer": {
"Id": "123e4567-e89b-12d3-a456-426614174001",
"FullName": "John Doe",
"Email": "john@example.com"
}
}
Hata Response
JSON
{
"Success": false,
"Message": "Direkt ödeme işlemi sırasında hata oluştu",
"Error": "Yetersiz bakiye"
}
Hata Kodları ve Mesajları
| HTTP Kodu | Mesaj | Açıklama |
|---|---|---|
400 |
Geçersiz ödeme verisi | Request parametreleri eksik veya hatalı |
400 |
Geçersiz kart numarası | Kart numarası 6 haneden kısa |
400 |
Company bulunamadı veya pasif durumda | Firma kaydı bulunamadı veya aktif değil |
400 |
Company için aktif banka bulunamadı | Firmaya ait aktif banka tanımı yok |
401 |
CompanyId claim bulunamadı | JWT token geçersiz veya eksik |
500 |
Direkt ödeme işlemi sırasında hata oluştu | Banka servisi çağrısında veya kayıt sırasında hata |
İşlem Akışı
- JWT Token Doğrulama: Authorization header'ındaki Bearer token doğrulanır
- Firma Kontrolü: Token'dan alınan CompanyId ile firma kaydı kontrol edilir
- BIN Kontrolü: Kart numarasının ilk 6 hanesi (BIN) ile banka belirlenir
- Banka Seçimi: BIN'e göre veya default olarak en uygun banka seçilir
- Müşteri Kaydı: Customer bilgileri varsa kaydedilir
- Kart Şifreleme: Kart bilgileri AES-256 ile şifrelenir ve saklanır
- Ödeme Kaydı: Payment kaydı oluşturulur (Durum: Beklemede)
- Banka Çağrısı: Seçilen bankaya uygun servis ile direkt ödeme talebi gönderilir
- Sonuç: Banka yanıtı ile birlikte ödeme sonucu döndürülür
Kod Örnekleri
C# HttpClient
var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", token);
var paymentData = new
{
Amount = 100.50m,
Currency = "TRY",
Installment = 1,
CardNo = "4508034508034509",
CardHolderName = "John Doe",
ExpireMonth = "12",
ExpireYear = "25",
Cvv = "123",
OrderNumber = "ORD-2024-001",
ClientIp = "192.168.1.1",
Phone = "+905551234567",
Customer = new
{
FullName = "John Doe",
Email = "john@example.com",
Phone = "+905551234567",
Country = "Türkiye",
City = "İstanbul",
Address = "Test Adresi Sokak No: 123",
IdentityNumber = "12345678901",
TaxNumber = "1234567890"
}
};
var json = JsonSerializer.Serialize(paymentData);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PostAsync(
"https://api.odemenet.com/api/Payment/pay", content);
var result = await response.Content.ReadAsStringAsync();
JavaScript Fetch
const paymentData = {
Amount: 100.50,
Currency: 'TRY',
Installment: 1,
CardNo: '4508034508034509',
CardHolderName: 'John Doe',
ExpireMonth: '12',
ExpireYear: '25',
Cvv: '123',
OrderNumber: 'ORD-2024-001',
ClientIp: '192.168.1.1',
Phone: '+905551234567',
Customer: {
FullName: 'John Doe',
Email: 'john@example.com',
Phone: '+905551234567',
Country: 'Türkiye',
City: 'İstanbul',
Address: 'Test Adresi Sokak No: 123',
IdentityNumber: '12345678901',
TaxNumber: '1234567890'
}
};
fetch('https://api.odemenet.com/api/Payment/pay', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify(paymentData)
})
.then(response => response.json())
.then(data => {
if (data.Success) {
console.log('Ödeme başarılı:', data);
} else {
console.error('Ödeme hatası:', data.Message);
}
})
.catch(error => console.error('Network hatası:', error));
Python Requests
import requests
import json
url = 'https://api.odemenet.com/api/Payment/pay'
headers = {
'Content-Type': 'application/json',
'Authorization': f'Bearer {token}'
}
payment_data = {
'Amount': 100.50,
'Currency': 'TRY',
'Installment': 1,
'CardNo': '4508034508034509',
'CardHolderName': 'John Doe',
'ExpireMonth': '12',
'ExpireYear': '25',
'Cvv': '123',
'OrderNumber': 'ORD-2024-001',
'ClientIp': '192.168.1.1',
'Phone': '+905551234567',
'Customer': {
'FullName': 'John Doe',
'Email': 'john@example.com',
'Phone': '+905551234567',
'Country': 'Türkiye',
'City': 'İstanbul',
'Address': 'Test Adresi Sokak No: 123',
'IdentityNumber': '12345678901',
'TaxNumber': '1234567890'
}
}
response = requests.post(url, headers=headers, json=payment_data)
result = response.json()
if result['Success']:
print('Ödeme başarılı:', result)
else:
print('Ödeme hatası:', result['Message'])
cURL
curl -X POST "https://api.odemenet.com/api/Payment/pay" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"Amount": 100.50,
"Currency": "TRY",
"Installment": 1,
"CardNo": "4508034508034509",
"CardHolderName": "John Doe",
"ExpireMonth": "12",
"ExpireYear": "25",
"Cvv": "123",
"OrderNumber": "ORD-2024-001",
"ClientIp": "192.168.1.1",
"Phone": "+905551234567",
"Customer": {
"FullName": "John Doe",
"Email": "john@example.com",
"Phone": "+905551234567",
"Country": "Türkiye",
"City": "İstanbul",
"Address": "Test Adresi Sokak No: 123",
"IdentityNumber": "12345678901",
"TaxNumber": "1234567890"
}
}'
Güvenlik Önlemleri
- Kart Bilgileri Şifreleme: Tüm kart bilgileri AES-256 algoritması ile şifrelenir
- JWT Token: Her API çağrısı için geçerli JWT token zorunludur
- HTTPS: Tüm API çağrıları HTTPS üzerinden yapılmalıdır
- IP Kısıtlaması: Firmanıza özel IP kısıtlamaları uygulanabilir
- Rate Limiting: API çağrıları için hız sınırlaması mevcuttur
Desteklenen Bankalar
| Banka Adı | Entegrasyon Tipi | Durum |
|---|---|---|
| Garanti BBVA | Garanti Sanal POS | Aktif |
| QNB Finansbank | QNB Sanal POS | Aktif |
| Yapı Kredi | Yapı Kredi POS | Aktif |
| İş Bankası | NestPay | Aktif |
| Akbank | NestPay | Aktif |
| Halkbank | NestPay | Aktif |
| Vakıfbank | Vakıf VPOS | Aktif |
| Kuveyt Türk | Kuveyt Türk POS | Aktif |
| Ziraat Bankası | NestPay | Aktif |