Invullen in PHP

Status
Niet open voor verdere reacties.

michael64142

Gebruiker
Lid geworden
12 okt 2012
Berichten
71
Hi,

Ik wil mijn programma gaan aanbieden op CodeCanyon (onderdeel van Envato waaronder ook marktplaatsen als Themeforest valt).

Ik wil mijn programma beveiligen met hun licentie code.
Iedere gebruiker krijgt daar een licentie code die gekoppelt is aan product en account.

Om te verbinden met hun API is dit script:
PHP:
<?php

//settings
$author_api_key = "Your-API-Key";
$author_username = "Your-Envato-Username";
$buyer_purchase_code = 'Your-Buyers-Purchase-Code';

//NOT required, but helpful!
$buyer_envato_name = 'Test';

//the api call
//create the url
$request_url = 'http://marketplace.envato.com/api/edge/'.$author_username.'/'.$author_api_key.'/verify-purchase:'.$buyer_purchase_code.'.json'; 

//make the call //could also use cURL - but for brevity:
$json_return = file_get_contents($request_url);  

//make sure return is not empty
if(empty($json_return)) die('Error connecting to the API system');

//decode json string into PHP Array
$json_data = json_decode($json_return, true);  

//if error isset - die showing error
if (isset($json_data['error'])) die($json_data['error']);

//still alive = no error
//if verify purchase is empty - die showing error
if (empty($json_data['verify-purchase'])) die('Invalid Purchase Code');

//verify buyers name - optional
//if you have your buyers Envato Username uncomment the next line
//if (strtolower($buyer_envato_name) !== strtolower($json_data['verify-purchase']['buyer'])) die('Envato Username Invalid');

//still alive = valid purchase

//do your custom stuff below -----------------------------------------

//show json decoded array - so you can see what is available to you.
print_r($json_data);

//available info:
//$json_data['verify-purchase']['item_name']
//$json_data['verify-purchase']['item_id']
//$json_data['verify-purchase']['created_at']
//$json_data['verify-purchase']['buyer']
//$json_data['verify-purchase']['licence']

//examples how to access specific info:
echo '<hr />';

//Show buyer name
echo 'Buyer: '.$json_data['verify-purchase']['buyer'].'<br />';

//Show license type
echo 'License Type: '.$json_data['verify-purchase']['licence'].'<br />';

//Show purchase date
echo 'Purchased: '.$json_data['verify-purchase']['created_at'].'<br />';

//other example:
echo '<hr />';
echo    'Hey '.$json_data['verify-purchase']['buyer'].', 
        I appreciate you buying a '.$json_data['verify-purchase']['licence'].' 
        to my '.$json_data['verify-purchase']['item_name'].' on 
        '.$json_data['verify-purchase']['created_at'];

Bovenaan staat: buyers purchase code. Deze moet vanuit mijn .NET programma ingevuld worden in een textbox.
Hoe laat ik een textbox dat stukje invullen van het PHP script?

Ook moet buyer envato name ingevuld worden met textbox 2. Hoe doe ik dit?

Alvast bedankt.
 
als ik dit hier goed versta moet je .NET invulbox geparsed worden naar je PHP script ?
 
als ik dit hier goed versta moet je .NET invulbox geparsed worden naar je PHP script ?

Bij regel 6: "Your-Buyers-Purchase-Code" en regel 9: waar "Test" staat.
Deze 2 moeten vanuit VB.NET textbox/invulbox ingevuld worden.
 
Hoi,

PHP kan vanuit de URL-balk gewoon input accepteren en gebruiken.

Kijk voor een voorbeeld even hiernaar:
http://www.helpmij.nl/forum/showthread.php/794579-Online-database-met-gegevens#post_5103801
Dat zou je al een stukje verder moeten kunnen helpen. Als het niet lukt dat goed te gebruiken kunnen wij je daar verder bij helpen.

MartinJM

Beste,

Ik heb het eens doorgekeken. Heel bekend ben ik niet met PHP (heb het script via het Envato forum gekregen), ik heb begrepen dat er iets met 'submit' moet worden gedaan zodat ik het kan aanroepen via VB.NET.

Zou jij met behulp van de PHP code (zie 1e post) het submit stuk kunnen maken?

Groet,
Michael
 
Hoi,

Dat wil ik best een keer voor je doen. Misschien kom ik er vandaag niet meer aan, maar dan zal ik het morgen proberen af te maken.

Is er ook nog een speciale output die je graag wil hebben?

MartinJM

PS: Nogmaals (ik heb het ook al in de post in het linkje gezegd) is het niet een echt hele veilige manier om gegevens over te zenden. Als je een duur programma wil maken zal het waarschijnlijk vrij snel al gekraakt zijn...

[edit]
Ik heb nog even goed naar de code gekeken en heb gezien dat je ook wat anders kan doen. Het PHP script roept namelijk een ander script aan en dat script geeft dan de response. Maar je kan natuurlijk ook direct vanuit het programma het tweede script aanroepen en dan de data die daaruit komt in het programma verwerken.
Dat zou trouwens ook best ingewikkeld kunnen zijn, maar je kan het proberen...
[/edit]
 
Laatst bewerkt:
Hoi,

Dat wil ik best een keer voor je doen. Misschien kom ik er vandaag niet meer aan, maar dan zal ik het morgen proberen af te maken.

Is er ook nog een speciale output die je graag wil hebben?

MartinJM

PS: Nogmaals (ik heb het ook al in de post in het linkje gezegd) is het niet een echt hele veilige manier om gegevens over te zenden. Als je een duur programma wil maken zal het waarschijnlijk vrij snel al gekraakt zijn...

[edit]
Ik heb nog even goed naar de code gekeken en heb gezien dat je ook wat anders kan doen. Het PHP script roept namelijk een ander script aan en dat script geeft dan de response. Maar je kan natuurlijk ook direct vanuit het programma het tweede script aanroepen en dan de data die daaruit komt in het programma verwerken.
Dat zou trouwens ook best ingewikkeld kunnen zijn, maar je kan het proberen...
[/edit]

Dag,

Geen probleem hoor. Wat bedoel je met speciale output?

Het idee van 2e link aanroepen lijkt mij geen goed idee, omdat daar mijn API en gebruikersnaam inzitten waarmee mee bijvoorbeeld ook mijn Envato account balans (geld) kan worden bekeken.
Op Envato Forum vertelden ze mij dat dat dus geen goed idee is (want daar vond ik zelf wel het script + oplossing voor in VB.net voor, maar dat was dus niet veilig).

Michael
 
Aha, ok.

Met speciale output bedoelde ik iets wat weergegeven wordt nadat het script is uitgevoerd. Als je bijvoorbeeld in het vb.net programma een antwoord van de server wil laten zien, kan ik er bijvoorbeeld voor zorgen dat het php script iets terugstuurt waardoor het programma daarna weet wat het moet laten zien als antwoord.

Ook moet het programma zelf toch op een manier weten dat het geactiveerd is? Dus dat moet dan toch ook meegestuurd worden vanuit de server (en dus het php script)?

MartinJM
 
Hoi,

Toch al vandaag geschreven:
PHP:
<?php
	if($_SERVER["REQUEST_METHOD"] == "GET"){	//Alleen als de request-method "get" is, het volgende stuk uitvoeren
		if(isset($_GET['BPCode']) && isset($_GET['BEName']))	//Kijken of de BPCode en BEName zijn ingevuld
		{
			$author_api_key = "Your-API-Key";
			$author_username = "Your-Envato-Username";
			
			$buyer_purchase_code = mysql_real_escape_string($_GET['BPCode']);	//Het mysql_real_escape_string gedeelte is tegen SQL injectie
			$buyer_envato_name = mysql_real_escape_string($_GET['BEName']);		//Verder zet je hier gewoon de variablen erin
			
			$request_url = 'http://marketplace.envato.com/api/edge/'.$author_username.'/'.$author_api_key.'/verify-purchase:'.$buyer_purchase_code.'.json';
			
			$json_return = file_get_contents($request_url);  
			if(empty($json_return)) die('Error connecting to the API system');
			$json_data = json_decode($json_return, true);
			if (isset($json_data['error'])) die($json_data['error']);
			if (empty($json_data['verify-purchase'])) die('Invalid Purchase Code');
			
			//if you have your buyers Envato Username uncomment the next line:
			if (strtolower($buyer_envato_name) !== strtolower($json_data['verify-purchase']['buyer'])) die('Envato Username Invalid');
			
			/*Hier echo ik alle gegevens die je mogelijk zou willen gebruiken in het vb.net programma. De chr(1)'s ertussen zijn om makkelijk te kunnen splitten.
			  De volgorde is:
				1.	Buyer
				2.	Licence
				3.	Item ID
				4.	Item Name
				5.	Created At
			*/
			echo($json_data['verify-purchase']['buyer'] & chr(1) & $json_data['verify-purchase']['licence'] & chr(1) & $json_data['verify-purchase']['item_id'] & chr(1) & $json_data['verify-purchase']['item_name'] & chr(1) & $json_data['verify-purchase']['created_at']);
			
		}else{
			die('');	//Als de BPCode of de BEName niet zijn ingevuld dan wordt er niet doorgegaan en wordt niks weergegeven
		}
	}
?>

Hoe je het moet gebruiken kan je vinden in de eerder gegeven link.

Dan heb ik ook nog wat opmerkingen:
  • De output van "$json_data['verify-purchase']['buyer'])" MOET al in mysql_real_escape_string staan, anders zou het verkeerd kunnen gaan (je kan de lijn ook overslaan). Ik neem aan dat die sowieso al uit een database gehaald wordt, waarin hij eigenlijk sowieso ook al als mysql_real_escape_string in gezet zou moeten worden (hangt ook af van de rest van het script btw).
  • Ik heb de code gewoon wat aangepast, maar heb er ook wat comments uit gehaald. Die kan je terugvinden in de oorspronkelijke code.
  • Ik heb de code niet getest. Er zou een foutje (of twee) in kunnen zitten.

Ik hoop dat het hiermee verder helemaal gaat lukken :thumb:

MartinJM


[edit]
Als het "mysql_real_escape_string" bij de purchase code problemen oplevert kan je het eruit halen, maar het zal wel een klein beetje veiligheid kosten.

Maar dan nogmaals: Het is sowieso al niet de veiligste manier om gewoon 'open' te communiceren. Je kan eigenlijk nog beter een encryptie toepassen.
[/edit]
 
Laatst bewerkt:
De speciale output moet zoals in 1e code zijn: item_name.
Dan kan ik dus checken of name gelijk is, want als de licentie niet van mijn klanten is dan krijg ik de naam niet te zien, wat dan dus betekend dat de code voor mij 'ongeldig' is.
 
Hoi,

Verander de volgende lijn in de code die ik je al gegeven heb:
PHP:
echo($json_data['verify-purchase']['buyer'] & chr(1) & $json_data['verify-purchase']['licence'] & chr(1) & $json_data['verify-purchase']['item_id'] & chr(1) & $json_data['verify-purchase']['item_name'] & chr(1) & $json_data['verify-purchase']['created_at']);
Naar:
PHP:
echo($json_data['verify-purchase']['item_name'] & chr(1));

Dan geeft hij de item_name en nog een chr(1) erachter, die is zodat je makkelijk kan splitten als er automatisch reclame aan je pagina wordt toegevoegd.

MartinJM
 
Bedankt!

Nog een vraagje: Hoe zou ik kunnen opslaan of het programma geactiveerd is met licentie code (en dat het programma nog niet geactiveerd is)?
Ik sla alle data dat een gebruik in kan stellen op in Registry, maar om daar een sleutel te maken dat het geactiveerd is lijkt me HEEL erg makkelijk om te 'kraken'
 
Hoi,

Dit is eigenlijk altijd een groot probleem... Wat ik zelf zou doen is minstens 5 manieren (of plekken) bedenken om het op te slaan, zodat het programma niet gelijk 'gekraakt' is zodra een manier ontdekt is. Ook kan je iemand dan makkelijk zijn licentie laten verliezen als diegene te vaak daarmee loopt te spelen (niet na 1 keer doen, bestanden kunnen corrupt raken). Moet je dan wel netjes in je voorwaarden zetten.

Ik zelf maak eigenlijk nooit programma's waar ik geld voor vraag, dus ik ken eigenlijk geen methodes hiervoor. Desondanks kan ik me voorstellen dat er veel mensen zijn die hetzelfde probleem hebben, dus er zal redelijk wat over te vinden zijn op internet.

MartinJM

[edit]
Ik wil niet vervelend zijn, maar als je bang bent dat mensen je programma 'kraken', dan kan ik je vertellen dat dat toch redelijk simpel blijft.
Er hoeft maar 1 keer iemand te kijken wat de server terug stuurt als het programma netjes gekocht is. Dan vervolgens kan diegene een server opzetten (of dat kunnen anderen doen) en kan iedere gebruiker een 'valide' kopie krijgen door hun computer te vertellen dat hij bij het adres "envato.com" naar een ander ip-adres moet, die dan natuurlijk het 'goede' antwoord terugstuurt.

Ik kan me voorstellen dat dit concept niet helemaal duidelijk is, dus als je er vragen over hebt kan je ze hier posten.
[/edit]
 
Laatst bewerkt:
Laatst bewerkt:
Ah, werkt nu wel. Had zoals in jouw eigen forum post (van link die je in de 2e post hier stuurde), en daar stond; 'submit' er in. En dat had ik hier dus ook.

Thanks!
 
Klopt, maar ik had de code hier iets anders gemaakt. Ik was het verschil alleen vergeten erbij te zetten...

Als het helemaal werkt, druk je dan op vraag opgelost? :thumb:

MartinJM
 
Trouwens nog een vraagje. In je post staat dat de VB.net code met daarin: Name = Name.Substring(0, Name.IndexOf(Chr(1)))
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan