Witam, na podstawie wielu poradników w internecie próbowałem napisać własny skrypt sprawdzający licencję, na początek podam kod który tworzy mi licencję w formacie XXXXX-XXXXX-XXXXX-XXXXX i wysyła do bazy danych:
<?php
if (!defined("LICENSE_KEY_INC") ) {
class license_key{
var $keylen= 20;
var $basechar='23456789ABCDEFGHJKLMNPQRSTUVWXYZ';
var $formatstr= '55555';
var $isvalid="YES";
var $invalid="NO";
var $software="";
function codeGenerate($name=""){
$keylen= $this->keylen;
$initlen=$this->initLen();
$initcode=$this->initCode($initlen);
$fullcode=$this->extendCode($initcode,$name);
return $this->formatLicense($fullcode);
}
function codeValidate($serial,$name=""){
if(empty($serial)|| $serial=="")return $this->invalid; $serial);
$keylen= $this->keylen;
if($keylen<>$thislen)return $this->invalid;
$initlen=$this->initLen();
$initcode=substr($serial,0
,$initlen); $extendedcode=$this->extendCode($initcode,$name);
$fullcode=substr($extendedcode,0
,$keylen); if($fullcode==$serial) return $this->isvalid;
else return $this->invalid;
}
function initCode($length=14){
$list=$this->basechar;
$codestring="";
if($length>0){
while(strlen($codestring)<$length){ $codestring.=$list[mt_rand(0
,$lenlist)]; }
}
return $codestring;
}
function extendCode($initcode,$name) {
$software=$this->software;
$p1str=$this->sumDigit($initcode);
$p1str.=$this->add32($initcode,$name."abhishek".$software);
$p1str);
$extrabit="";$i=0;
while(strlen($extrabit)<$this->keylen-2
) { $extrabit.=substr($p1str,$i,1
); $extrabit.=substr($p1str,$p1len-$i-1
,1
); $i++;
}
return $initcode.$extrabit."6F75";
}
function formatLicense($serial){
$farray=str_split($this->formatstr);
$sarray=str_split($serial);
$s0=$farray[0];
$s1=$farray[1]+$s0;
$s2=$farray[2]+$s1;
$s3=$farray[3]+$s2;
$s4=$farray[3]+$s3;
$scount=$this->keylen;$sformated="";
for ($i=0;$i<$scount;$i++){
if($i==$s0||$i==$s1||$i==$s2||$i==$s3||$i==$s4)
$sformated.="-";
$sformated.=$sarray[$i];
}
if (defined('LKM_DEBUG')) echo " $serial FORMATED AS $sformated<br/>";
return $sformated;
}
function initLen(){
$keylen=$this->keylen;
$initlen=max($initlen,1
); return $initlen;
}
function add32($a,$b){
array("","","","","","",), $sum32);
if (defined('LKM_DEBUG'))echo " ADD32 $a + $b = $sum32<br/>"; return $sum32;
}
function sumDigit($str){
$a=str_split($str);$sum=0;
for($i=0;$i<count
($a);$i++)$sum=$sum+base_convert($a[$i],36
,10
); array("AZ","BY","29","38","29","38",), $sum);
if (defined('LKM_DEBUG'))echo " sumDigit $str = $sum<br/>"; return $sum;
}
}
}
?>
Poniżej moje API:
<?php
'host' => 'localhost',
'user' => 'xxxxxxxx',
'pass' => 'xxxxxxxx',
'base' => 'xxxxxxxx'
);
$db = new mysqli($config['host'], $config['user'], $config['pass'], $config['base']);
if($db->connect_errno) {
exit('Błąd: nie udało się połączyć z bazą danych!'); }
$db->set_charset("utf8");
class Main {
public function keygen($domain){
$key[1
] = substr($key[0
], 0
, 5
); $key[2
] = substr($key[0
], 5
, 5
); $key[3
] = substr($key[0
], 10
, 5
); $key[4
] = substr($key[0
], 15
, 5
); $key[5
] = substr($key[0
], 20
, 5
);
return $key[1].'-'.$key[2].'-'.$key[3].'-'.$key[4].'-'.$key[5];
}
public function getLicInfo($domain){
$sql = "SELECT * FROM `lic` WHERE `domain` = '{$domain}' LIMIT 1";
$result = $db->query($sql);
if($result->num_rows == 1){
return $result->fetch_assoc();
}
return false;
}
}
$main = new Main;
$domain = "".$_GET['domain']."";
if($lic = $main->getLicInfo($domain)){
if($lic['license_status']){
$twokey = $main->keygen($lic['license_domain']);
if($twokey == $key){
$a = 'OK_'.$lic['license_domain'];
} else {
$a = 'ERROR_wrongkey';
}
} else {
$a = 'ERROR_nolicense';
}
} else {
$a = 'ERROR_nolicense';
}
?>
Struktura bazy wygląda tak:
ID | client | email | software | domain | key | amount
Przykład:
1 | test | test@test.pl | moduł | strona.pl | EYRA2-8965Z-3TSPN-RUAAU | 200
nie wiem co dokładnie mam źle w API ale wchodząc w link:
domena.pl/api.php?domain=strona.pl&key=EYRA2-8965Z-3TSPN-RUAAUzwraca mi wynik
ERROR_nolicense Chcę aby Klient kupując u mnie licencję na dany produkt i wpisując ja na swojej stronie skrypt łączył się z moim API które łączy się z bazą danych i sprawdza czy domena strony jak i podany klucz są zapisane w mojej jak i klucz jest przypisany do tej domeny. Walczę z tym już długi czas i nie wiem co mam źle...
PS. nie wiem czy to ważne ale kod do łączenia się z moim api w skrypcie mam taki:
public function __destruct() {
$request = file_get_contents("http://domain.com/api.php?domain=". $_SERVER['HTTP_HOST'] ."&key=".$this->config->lic_key."); $status = explode("_", $request);
if($status[0] != "OK" && "".$_SERVER['HTTP_HOST']."" != $status[1]){
header("Location: <a href="http://domain.com/"%3b%29;" target="_blank">http://domain.com/");</a>
}
}