Modül Lisanslama
Modülünüzün lisanssız çalışmayı reddedip reddetmeyeceği sizin kararınız, kararı veren sunucu da öyle.
Genel Bakış
WISECP, sizin adınıza sattığı ürünler için bir lisans protokolü yayınlamaz. Adresi, soruyla giden alanları ve bir cevabın ne anlama geldiğini siz seçersiniz.
Bize ait iki şey var. Şifreleme: okunabilir gitmemesi gereken dosyaları işaretlersiniz, paketleyici onları şifreler. Taşıyıcı isteğe bağlıdır ve cevabı bir gün hatırlar.
$answer = \License::remote_check('https://siteniz.example/license/check', ['domain' => \Utility::getDomain()]);
if ($answer === null) return true; // sorulamadi
if (trim($answer['body']) !== 'OK') return false; // sunucunuz hayir dedi
return true;
Kendi curl'ünüz de aynı ölçüde makbul. Önemli olan kararın nerede durduğu: işaretlediğiniz bir dosyanın içinde, ki operatör onu silemesin.
Ön Koşullar
/license-verify/checking/{token}/{id} ucundan düz OK ya da ERROR kelimesiyle cevap verir.
null döner.
Yapı
Özelliği dört parça taşır ve ilk üçü sizindir.
| Parça | Nerede yaşar | Ne yapar |
|---|---|---|
| Sunucunuz | kontrol ettiğiniz bir adres | Soruyu seçtiğiniz şekilde yanıtlar. |
| Kontrolünüz | modül sınıfınızın private bir metodu | Sorar, cevabı okur ve ne anlama geldiğine karar verir. |
| Kapınız | ücretli davranışın başladığı yer | O metodu çağırır; reddeder, kısıtlar ya da açar. |
| Yanıt önbelleği | coremio/storage/licenses | Adres ve soru başına bir şifreli dosya, cache dizininin dışında. |
Önbellek kendi klasöründe kasıtlı olarak duruyor. Admin operation'ları parametresiz cache temizlemeyi günde birkaç kez çağırır. Oraya park edilmiş bir yanıt da diğerleriyle silinir.
Adım Adım
Kapıyı değerin olduğu yere koyun
Müşterinin parasını ödediği şeyi kapılayın, modülün varlığını değil. "Soramadım"ı kendi başına bir cevap sayın: curl'ü olmayan bir sistem size tam olarak onu getirir.
/* @wisecp-protected */
private function licensed(): bool
{
$answer = \License::remote_check('https://siteniz.example/license/check', [
'product' => 'aurora-backup',
'domain' => \Utility::getDomain(),
]);
// Sorulamadi. Sizin kesintiniz musterinin sucu degil, bu yuzden acik kaliyor.
if ($answer === null) return true;
return $answer['status'] === 200 && trim($answer['body']) === 'OK';
}
public function adminArea(): array
{
if (!$this->licensed())
return [
'page_title' => $this->lang['name'] ?? 'Aurora Backup',
'content' => $this->view('unlicensed.php'),
];
return [
'page_title' => $this->lang['name'] ?? 'Aurora Backup',
'content' => $this->view('index.php'),
];
}
Okunabilir gitmemesi gereken her dosyayı işaretleyin
Paketleyici kontrolünüzü hangi dosyanın taşıdığını çıkaramaz. Yardımcınızın adını siz koydunuz ve çağrı tek bir dosyada geçer. Bunu siz beyan edersiniz. İşareti, elden çıkarmak istemediğiniz her dosyanın başına kendi satırında koyun.
/* @wisecp-protected */ // modül sınıfı, hooks.php, bir yardımcı — herhangi bir PHP dosyası
Yalnız PHP. Şablonlar hangi motoru kullanırsa kullansın şifrelenmez. Motor onları gösterimden önce diske düz PHP olarak derler, yani şablona yazılan bir sır orada zaten okunabilir. Kararları PHP'de tutun.
İşaret bir taahhüttür: işaretli bir dosyayı koruyamayan yapı reddedilir.
En çok beş dosya
Bir gönderimde en çok beş dosya işaretlenebilir. Fazlası yayına alınmaz; yayınlamak ücretli bir ek olur. Karara dokunan her şeyi değil, kararı veren dosyayı işaretleyin: sınıf, yardımcısı ve view.
Referans
Taşıyıcı neyi hatırlar
| Pencere | Süre | Davranış |
|---|---|---|
| Disk önbelleği | 86400 saniye | Hiç ağ turu yok. Adres ve alan kümesi başına bir şifreli dosya, coremio/storage/licenses altında. |
| Her çağrı | yok | Bir soru dünkü cevapla yanıtlanmamalıysa üçüncü argümanı true geçin. |
| Ulaşılamadı | yok | null, ve hiçbir şey yazılmaz. Bir kesinti bir günlük sessizliği önbelleğe dondurmaz. |
Önbellek dosyası sistemin kendi sırrıyla şifrelenir ve imzalanır; zarf hangi sorunun cevabı olduğunu taşır. Başka bir sistemden alınıp adı değiştirilen dosya hiçbir şeye cevap vermez. Tolerans penceresi yoktur.
Kendi ucunuza sormak
Kontrolün nereye gideceği ve cevabın ne anlama geldiği sizin kararınız. Bu metot soruyu taşır ve trafiği günde bir çağrıda tutar.
public static function remote_check(string $url, array $fields = [], bool $always = false, array $options = []): ?array;
http ve https. Müşterinin kendi ağındaki adresler soket açılmadan reddedilir: loopback, özel aralıklar, bulut metadata.
true geçin.
headers istek başlıkları; 'Ad: değer' satırları ya da ad => değer haritası olarak verilir. method varsayılan POST. timeout saniye, 1 ile 60 arası, varsayılan 10.
['status' => int, 'headers' => array, 'body' => string]. Başlık adları küçük harfe çevrilir, gövde olduğu gibidir. null sunucuya ulaşılamadı demektir ve hiçbir şey saklanmaz.
Adres, alanlar, metot ve başlıklar birlikte cache kimliğidir. Kimlik doğrulamalı çağrı, anonim olandan ayrı hatırlanır.
$answer = \License::remote_check(
'https://siteniz.example/license/check',
['product' => 'aurora-backup', 'domain' => \Utility::getDomain()],
false,
['headers' => ['Authorization: Bearer ' . $this->vendor_key()]]
);
if ($answer === null) return true; // sorulamadi; sizin kesintiniz, musterinin sucu degil
if ($answer['status'] !== 200) return false; // 401, 403, 404 — sunucunuz baska bir sey soyledi
$data = \Utility::jdecode($answer['body'], true);
return (bool) ($data['valid'] ?? false);
Cevabı yorumlamaz, imza da doğrulamaz
Müşterinin sunucusu adresinizi neye çözerse o cevabı yazabilir, durum kodu dahil. Cevap parayı belirliyorsa sunucunuzda imzalayın ve okuyan kodda imzayı doğrulayın.
Örnek
Uçtan uca kapılanmış, eksiksiz bir ücretli modül. Admin ekranı da zamanlanmış görev de aynı soruyu sorar. Yalnız birine konan kapı, kapı değildir.
<?php
namespace WISECP\Modules\Addons;
use AddonModule;
use Filter;
/* @wisecp-protected */
class AuroraBackup extends AddonModule
{
public string $version = '1.2';
/** Sizin adresiniz, sizin alanlariniz, cevabi sizin okumaniz. */
private function licensed(): bool
{
$answer = \License::remote_check('https://vendor.example/license/check', [
'product' => 'aurora-backup',
'domain' => \Utility::getDomain(),
]);
// Sorulamadi. Sizin kesintiniz musterinin sucu degil.
if ($answer === null) return true;
return $answer['status'] === 200 && trim($answer['body']) === 'OK';
}
public function adminArea(): array
{
$action = Filter::init('REQUEST/action', 'route') ?: 'index';
if (!$this->licensed()) $action = 'unlicensed';
return [
'page_title' => $this->lang['name'] ?? 'Aurora Backup',
'content' => $this->view($action . '.php'),
];
}
/** Zamanlanmis yari. Bir cron kosusu da suresi dolmus lisansla is yapmamali. */
public function run_backup(): bool
{
if (!$this->licensed())
throw new \Exception($this->lang['error-not-licensed'] ?? 'Not licensed.');
// ...
return true;
}
}
Zamanlanmış yol da kapılanıyor. Yalnız admin ekranını koruyan bir kapı, aylar önce dolmuş bir lisansla ücretli işin çalışmasına izin verir.
Tuzaklar
Her olumsuz yanıtı hırsızlık saymak, ilk ağ tıkanmasında modülünüzü kapatır. Gerekçeye göre dallanın ve toleransın işini yapmasına izin verin.
Alan boşken yanıt yalnız nonce ve saat kontrolüyle kabul edilir. Host adınızı başka bir yere yönlendirebilen herkes her şeye "geçerli" diyebilir. Bunu ilk ücretli sürümden önce doldurun.
Domain seçeneği sorulan host'u ezer ve yalnız yerel çalışma içindir. Bir sürümde dolu bırakılırsa her kopya sizin makineniz hakkında sorar ve lisanslı çıkar.
Beş saniye, günde bir kez olan bir çağrı için zaten cömerttir. Yükseltirseniz sunucunuz düştüğü anda müşterinin panelindeki her sayfa sizi beklemeye başlar.
Adresi önce var olmayan bir host'a, sonra imzasız yanıt dönen bir host'a yönlendirin. Modülünüze iki durumda da bakın. Ret ekranını parasını ödemeyen her müşteri gö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.