subscription-payment
POST /api/{team}/gateway/subscription-payment
recurring türündeki bir ya da birkaç ürün için abonelik açar. Bu istekte kart verisi gönderilmez ve çekim yapılmaz. Abonelik pending durumunda açılır ve yanıt, ilk dönemin ödeneceği gateway ödeme sayfasının adresini (subscription.checkout_url) döner. İlk ödemede kart saklanır; sonraki dönemler müşterinin varsayılan kayıtlı kartından çekilir. Akış: Abonelik rehberi.
Çalışma alanının planı abonelikleri kapsamıyorsa istek 403 ile reddedilir. Planın kayıtlı kartları da kapsaması gerekir.
Kimlik doğrulama
X-Api-Key, X-Signature, Content-Type: application/json. Ayrıntılar: Kimlik Doğrulama ve İmza.
İstek
{
"subscription": {
"channel_token": "6f1c2e7a-4b3d-4c8e-9a61-2f5d7b0c3e14",
"channel_reference": "UYELIK-4471",
"items": [
{ "channel_reference": "PREMIUM-AYLIK" },
{ "channel_reference": "EK-KULLANICI", "quantity": 3 }
],
"success_url": "https://magazam.com/tesekkurler",
"webhook_url": "https://magazam.com/odemehub/abonelik"
},
"customer": {
"channel_reference": "musteri-88",
"firstname": "Ahmet",
"lastname": "Yılmaz",
"phone": "05551112233",
"address": "Kızılırmak Mah. Dumlupınar Blv. No:3",
"district": "Çankaya",
"province": "Ankara",
"country": "Türkiye"
}
}
subscription
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
channel_token | string (UUID) | evet | Çalışma alanınıza ait kanalın token'ı. |
channel_reference | string | evet | Aboneliğin sizin sisteminizdeki kimliği. En çok 255 karakter, en az bir rakam. |
items | array | evet | En az bir kalem. |
success_url | string | evet | İlk dönem ödendikten sonra dönüş POST'unun gönderileceği adres. http/https, en çok 2048 karakter. |
cancel_url | string | hayır | Ödeme sayfasında vazgeçme bağlantısı olarak verilen adres. |
webhook_url | string | hayır | Abonelik durumu değiştiğinde webhook gönderilecek adres. Gönderilmezse webhook gönderilmez. |
payment_provider_token | string (UUID) | hayır | Aboneliğin ödeneceği hesap. Hesabın hem kart saklamayı hem 3D ödemeyi desteklemesi gerekir. Gönderilmezse bu koşullar varsayılan hesap için denetlenir; ilk ödemenin geçeceği hesap ödeme sırasında ödeme hesabı seçimi ile belirlenir. |
subscription.items[]
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
channel_reference | string | evet | Aynı kanalda save-product ile kaydedilmiş, type: recurring, is_active: true bir ürün. |
quantity | integer | hayır | En az 1. Gönderilmezse 1. |
unit_amount | string | hayır | Yalnızca ilk dönem için birim fiyat. Sonraki dönemler katalog fiyatıyla hesaplanır. |
- Kalemlerdeki ürünlerin
periodvecurrencydeğerleri aynı olmalıdır; aboneliğin dönemi ve para birimi bunlardan gelir. - Aynı ürün birden fazla kalemde gönderilemez.
customer
Zorunlu. Alanlar: customer nesnesi.
SDK örnekleri
- PHP
- Node.js
- Python
- Java
- cURL
use Gurmehub\Odemehub\Request\{SubscriptionItem, SubscriptionPayment};
$subscription = $client->subscriptionPayment(new SubscriptionPayment(
channelReference: 'UYELIK-4471',
items: [
new SubscriptionItem(channelReference: 'PREMIUM-AYLIK'),
new SubscriptionItem(channelReference: 'EK-KULLANICI', quantity: 3),
],
successUrl: 'https://magazam.com/tesekkurler',
customer: $customer,
webhookUrl: 'https://magazam.com/odemehub/abonelik',
));
// $subscription->token değerini saklayın
header('Location: '.$subscription->checkoutUrl);
const subscription = await client.subscriptionPayment({
channelReference: 'UYELIK-4471',
items: [
{ channelReference: 'PREMIUM-AYLIK' },
{ channelReference: 'EK-KULLANICI', quantity: 3 },
],
successUrl: 'https://magazam.com/tesekkurler',
customer,
webhookUrl: 'https://magazam.com/odemehub/abonelik',
});
// subscription.token değerini saklayın
res.redirect(subscription.checkoutUrl!);
from odemehub.request import SubscriptionItem, SubscriptionPayment
subscription = client.subscription_payment(SubscriptionPayment(
channel_reference="UYELIK-4471",
items=[
SubscriptionItem(channel_reference="PREMIUM-AYLIK"),
SubscriptionItem(channel_reference="EK-KULLANICI", quantity=3),
],
success_url="https://magazam.com/tesekkurler",
customer=customer,
webhook_url="https://magazam.com/odemehub/abonelik",
))
# subscription.token değerini saklayın
return redirect(subscription.checkout_url)
import com.odemehub.request.SubscriptionItem;
import com.odemehub.request.SubscriptionPayment;
import java.util.List;
var subscription = client.subscriptionPayment(SubscriptionPayment.builder()
.channelReference("UYELIK-4471")
.items(List.of(
SubscriptionItem.of("PREMIUM-AYLIK"),
SubscriptionItem.builder().channelReference("EK-KULLANICI").quantity(3).build()
))
.successUrl("https://magazam.com/tesekkurler")
.customer(customer)
.webhookUrl("https://magazam.com/odemehub/abonelik")
.build());
// subscription.getToken() değerini saklayın
return "redirect:" + subscription.getCheckoutUrl();
BODY='{"subscription":{"channel_token":"6f1c2e7a-4b3d-4c8e-9a61-2f5d7b0c3e14","channel_reference":"UYELIK-4471","items":[{"channel_reference":"PREMIUM-AYLIK"},{"channel_reference":"EK-KULLANICI","quantity":3}],"success_url":"https://magazam.com/tesekkurler","webhook_url":"https://magazam.com/odemehub/abonelik"},"customer":{"channel_reference":"musteri-88","firstname":"Ahmet","lastname":"Yılmaz","email":"[email protected]","phone":"05551112233","address":"Kızılırmak Mah. Dumlupınar Blv. No:3","district":"Çankaya","province":"Ankara","country":"Türkiye"}}'
SIGNATURE=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "$ODEMEHUB_API_SECRET" | sed 's/^.* //')
curl -X POST "https://odeme.gurmehub.com/api/$ODEMEHUB_TEAM/gateway/subscription-payment" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "X-Api-Key: $ODEMEHUB_API_KEY" \
-H "X-Signature: $SIGNATURE" \
--data-raw "$BODY"
Yanıt
PREMIUM-AYLIK 149.90, EK-KULLANICI 30.00 iken:
{
"result": {
"successful": true,
"message": null
},
"subscription": {
"token": "5a4b3c2d-1e0f-4a9b-8c7d-6e5f4a3b2c1d",
"channel_token": "6f1c2e7a-4b3d-4c8e-9a61-2f5d7b0c3e14",
"channel_reference": "UYELIK-4471",
"status": "pending",
"period": "monthly",
"items": [
{ "channel_reference": "PREMIUM-AYLIK", "name": "Premium üyelik", "quantity": 1, "unit_amount": "149.90", "tax_rate": "20.00" },
{ "channel_reference": "EK-KULLANICI", "name": "Ek kullanıcı", "quantity": 3, "unit_amount": "30.00", "tax_rate": "20.00" }
],
"amount": "239.90",
"currency": "TRY",
"is_test": null,
"starts_at": null,
"ends_at": null,
"paid_at": null,
"cancelled_at": null,
"checkout_url": "https://odeme.gurmehub.com/checkout/subscription/<dönem token'ı>"
},
"customer": {
"channel_reference": "musteri-88"
}
}
subscription nesnesinin alanları: retrieve-subscription. Bu yanıtta:
statusher zamanpending;starts_at,ends_at,paid_atveis_testnull.amountilk dönemin tutarıdır (unit_amountgönderilen kalemlerde gönderilen fiyatla hesaplanır).items[].unit_amountkatalogdaki fiyattır; ilk dönem için gönderilenunit_amountburada görünmez.
HTTP durum kodları
| Kod | Durum |
|---|---|
200 | Abonelik açıldı. |
401 | API anahtarı ya da imza geçersiz. |
403 | Çalışma alanı işlem yapamıyor ya da planı abonelikleri kapsamıyor. |
422 | Doğrulama hatası. |
Hatalar
| Alan | Mesaj |
|---|---|
subscription.items.{i}.channel_reference | Bu kanalda böyle bir ürün yok. / Bu ürün abonelik ürünü değil. / Bu ürün satışa kapalı. |
subscription.items | Aynı ürün birden fazla kez gönderilemez. / Aboneliğe konan ürünlerin dönemi aynı olmalı. / Aboneliğe konan ürünlerin para birimi aynı olmalı. |
subscription.success_url | Başarı adresi zorunludur; ödeme sonrası müşteri oraya yönlendirilir. |
subscription.channel_reference | Referans en az bir rakam içermelidir (ör. SIP1); bankaya giden sipariş numarası bu rakamlarla kurulur. |
subscription.payment_provider_token | Çalışma alanınızın planı kayıtlı kartları kapsamıyor; abonelik açılamaz. |
subscription.payment_provider_token | Bu ödeme hesabı kart saklamıyor; abonelik açılamaz. / Çalışma alanınızın varsayılan ödeme hesabı kart saklamıyor; abonelik açılamaz. |
subscription.payment_provider_token | Bu ödeme hesabı 3D ödeme almıyor; abonelik açılamaz. / Çalışma alanınızın varsayılan ödeme hesabı 3D ödeme almıyor; abonelik açılamaz. |
subscription.payment_provider_token | Ödeme hesabı belirtilmedi ve çalışma alanınızın varsayılan ödeme hesabı yok. |