Yenileme ve İptal
Dönem sonunu yürüten on uç: yenileme faturası, iptal talepleri, iade ve abonelik iptali.
Genel Bakış
Bir dönem bittiğinde iki yol vardır: yenilenir ya da biter. Bu on uç ikisini de yürütür — yenileme faturasını üretir, müşterinin iptal talebini karara bağlar, hizmeti iade ile birlikte kapatır ve ödeme aboneliğini durdurur.
Dört ayrı şey birbirine karışmaya çok müsait: yenileme faturası parayı ister, iptal talebi müşterinin isteğidir, iptal ve iade hizmeti kapatıp parayı geri verir, abonelik iptali yalnız otomatik tahsilatı durdurur. Hiçbiri diğerini kendiliğinden yapmaz.
Referans
Hizmet Yenileme Faturası
Hizmet için yenileme faturası üretir. Cron'un kullandığı yolun aynısını elle çalıştırır.
curl -X POST 'https://panel.ornek.com/api/v1/admin/services/529/renewal-invoice' \
-H "Authorization: Bearer $API_KEY"const res = await fetch('https://panel.ornek.com/api/v1/admin/services/529/renewal-invoice', {
method: 'POST',
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();$ch = curl_init('https://panel.ornek.com/api/v1/admin/services/529/renewal-invoice');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// Atlama bir HATA degil bir KARARDIR; sebebi mesajda yazar.
$response = Api::Services()->GenerateServiceRenewalInvoice(['id' => 529]);
if (($response['error']['code'] ?? '') === 'renewal_skipped') {
$why = $response['error']['message'];
}{
"data": {
"invoice_id": 1234,
"service_id": 529
}
}{
"error": {
"code": "renewal_skipped",
"message": "Renewal skipped: this period is already invoiced."
}
}Ek Hizmet Yenileme Faturası
Tek bir ek hizmet için yenileme faturası üretir.
curl -X POST 'https://panel.ornek.com/api/v1/admin/services/529/addons/44/renewal-invoice' \
-H "Authorization: Bearer $API_KEY"const res = await fetch('https://panel.ornek.com/api/v1/admin/services/529/addons/44/renewal-invoice', {
method: 'POST',
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();$ch = curl_init('https://panel.ornek.com/api/v1/admin/services/529/addons/44/renewal-invoice');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// Hizmet yenilemesi ek hizmetleri zaten toplar; bu uc yalniz TEK BASINA yenileme icindir.
$response = Api::Services()->GenerateAddonRenewalInvoice([
'id' => 529,
'addon_id' => 44,
]);İptal ve İade
Hizmeti iptal eder ve isterseniz kullanılmamış dönemi iade eder.
none iade yok, credit müşteri bakiyesine, cash gider kaydı olarak. Varsayılan none.curl -X POST 'https://panel.ornek.com/api/v1/admin/services/529/cancel-refund' \
-H "Authorization: Bearer $API_KEY" \
-H 'Content-Type: application/json' \
-d '{"refund":"credit","apply_on_module":true}'const res = await fetch('https://panel.ornek.com/api/v1/admin/services/529/cancel-refund', {
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ refund: 'credit', apply_on_module: true }),
});
const body = await res.json();$ch = curl_init('https://panel.ornek.com/api/v1/admin/services/529/cancel-refund');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'refund' => 'credit',
'apply_on_module' => true,
]),
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);$response = Api::Services()->CancelAndRefundService([
'id' => 529,
'refund' => 'credit',
]);
// Istedigi iade YAPILMAMIS olabilir: karari 'refunded' verir, 'refund' degil.
$paid = $response['data']['refunded'] ?? false;İptal Taleplerini Listeleme
Müşterilerin açtığı iptal taleplerini döndürür. Bekleyenler başta gelir.
pending ya da approved.pending bekliyor, approved onaylanmış.now hemen, period-ending dönem sonunda. Onayın ne yapacağını bu belirler.curl -G 'https://panel.ornek.com/api/v1/admin/services/cancellation-requests' \
-H "Authorization: Bearer $API_KEY" \
-d status=pendingconst url = new URL('https://panel.ornek.com/api/v1/admin/services/cancellation-requests');
url.searchParams.set('status', 'pending');
const res = await fetch(url, { headers: { Authorization: `Bearer ${apiKey}` } });
const body = await res.json();$url = 'https://panel.ornek.com/api/v1/admin/services/cancellation-requests?' . http_build_query(['status' => 'pending']);
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);$response = Api::Services()->GetCancellationRequests([], ['status' => 'pending']);İptal Talebi Detayı
Tek bir talebi, kullanılan ve kalan dönemin hesabıyla birlikte döndürür.
pending bekliyor, approved onaylanmış.now hemen, period-ending dönem sonunda. Onayın ne yapacağını bu belirler.not-needed, too-expensive, switching, missing-features ya da other. Gerekçe anahtarı kaydedilmeden önce açılmış taleplerde boştur.other gerekçesi için yazdığı serbest metin. Diğer gerekçelerde boştur.curl 'https://panel.ornek.com/api/v1/admin/services/cancellation-requests/91' \
-H "Authorization: Bearer $API_KEY"const res = await fetch('https://panel.ornek.com/api/v1/admin/services/cancellation-requests/91', {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();$ch = curl_init('https://panel.ornek.com/api/v1/admin/services/cancellation-requests/91');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// Iade karari icin kalan tutari BURADAN okuyun; iptal ucu bunu size sormaz.
$request = Api::Services()->GetCancellationRequest(['eid' => 91])['data'];
$owed = $request['remaining']['remaining_amount'];Talebi Onaylama
Talebi onaylar. Aciliyet hemen ise hizmeti o anda iptal eder.
gate:service.cancellation_accept kancası işlemi veto etti.curl -X POST 'https://panel.ornek.com/api/v1/admin/services/cancellation-requests/91/accept' \
-H "Authorization: Bearer $API_KEY"const res = await fetch('https://panel.ornek.com/api/v1/admin/services/cancellation-requests/91/accept', {
method: 'POST',
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();$ch = curl_init('https://panel.ornek.com/api/v1/admin/services/cancellation-requests/91/accept');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// Onay iade YAPMAZ. Para iadesi gerekiyorsa iptal-ve-iade ucunu ayrica cagirin.
$response = Api::Services()->AcceptCancellationRequest(['eid' => 91]);
$stoppedNow = $response['data']['cancelled_now'] ?? false;Talebi Silme
Talep kaydını siler. Hizmetin durumuna dokunmaz.
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/services/cancellation-requests/91' \
-H "Authorization: Bearer $API_KEY"const res = await fetch('https://panel.ornek.com/api/v1/admin/services/cancellation-requests/91', {
method: 'DELETE',
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();$ch = curl_init('https://panel.ornek.com/api/v1/admin/services/cancellation-requests/91');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// Talebi silmek 'reddetme' degildir: musteriye hicbir sey bildirilmez.
$response = Api::Services()->DeleteCancellationRequest(['eid' => 91]);Hizmet Aboneliğini İptal Etme
Hizmete bağlı yinelenen ödeme aboneliğini ödeme sağlayıcısında iptal eder.
curl -X POST 'https://panel.ornek.com/api/v1/admin/services/529/cancel-subscription' \
-H "Authorization: Bearer $API_KEY"const res = await fetch('https://panel.ornek.com/api/v1/admin/services/529/cancel-subscription', {
method: 'POST',
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();$ch = curl_init('https://panel.ornek.com/api/v1/admin/services/529/cancel-subscription');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// Abonelik iptali HIZMETI iptal etmez: tahsilat durur, hizmet calismaya devam eder.
Api::Services()->CancelServiceSubscription(['id' => 529]);
Api::Services()->CancelService(['id' => 529]);Ek Hizmet Aboneliğini İptal Etme
Ek hizmete bağlı yinelenen ödeme aboneliğini iptal eder.
curl -X POST 'https://panel.ornek.com/api/v1/admin/services/529/addons/44/cancel-subscription' \
-H "Authorization: Bearer $API_KEY"const res = await fetch('https://panel.ornek.com/api/v1/admin/services/529/addons/44/cancel-subscription', {
method: 'POST',
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();$ch = curl_init('https://panel.ornek.com/api/v1/admin/services/529/addons/44/cancel-subscription');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);$response = Api::Services()->CancelServiceAddonSubscription([
'id' => 529,
'addon_id' => 44,
]);Hizmeti Abonelikten Çıkarma
Tek bir hizmeti abonelikten çıkarır; aboneliğin diğer üyeleri kalır.
curl -X POST 'https://panel.ornek.com/api/v1/admin/services/482/remove-subscription' \
-H "Authorization: Bearer $ADMIN_KEY"const res = await fetch(`https://panel.ornek.com/api/v1/admin/services/${serviceId}/remove-subscription`, {
method: 'POST',
headers: { Authorization: `Bearer ${adminKey}` },
});
const { data } = await res.json();
if (data.subscription_status === 'cancelled') refreshAgreement();$ch = curl_init('https://panel.ornek.com/api/v1/admin/services/' . $serviceId . '/remove-subscription');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $adminKey],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// CIKARMA ile IPTAL farklidir: bu cagri yalniz bu hizmeti alir, abonelik digerleriyle surer.
// Odeme tarafi da yeniden fiyatlanir; tum anlasmayi bitirmek icin cancel-subscription kullanin.
$r = Api::Services()->RemoveServiceFromSubscription(['id' => $serviceId])['data'];Tuzaklar
Abonelik uçları yalnız ödeme sağlayıcısındaki yinelenen tahsilatı durdurur. Hizmet çalışmaya, dönemi dolunca yenileme faturası kesilmeye devam eder; müşteri artık otomatik ödemediği için fatura ödenmeden kalır. Hizmetin de bitmesi gerekiyorsa iptal ucunu ayrıca çağırın.
İptal talebini onaylamak hizmeti kapatır ama para iade etmez. Kullanılmamış dönemi geri vermek istiyorsanız iptal-ve-iade ucunu ayrıca çağırmanız gerekir; kalan tutarı talep detayındaki hesaptan okursunuz.
Gövdedeki refund alanı ne istediğinizi söyler; gerçekte ne olduğunu yanıttaki refunded söyler. Kalan bakiye yoksa iade yapılmaz ve istek yine de 200 döner. İki alanı karıştırmak müşteriye yapılmamış bir iadeyi bildirmeye yol açar.
renewal_skipped, isteğinizin bozuk olduğunu değil, o hizmet için şu an fatura kesilmemesi gerektiğini söyler: dönem zaten faturalanmış, hizmette yenileme faturası kapatılmış ya da veri eksik olabilir. Sebep mesajda yazar; yeniden denemek yardımcı olmaz.
İptal talebi uçlarındaki kimlik talebin kimliğidir, hizmetin değil. Listede id talebe, service_id hizmete aittir; hizmet kimliğini vermek 404 döndürür.
İlgili Makaleler
Geri bildiriminiz için teşekkürler!
Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.