Ga naar inhoud
Log in om dit te volgen  
kingunit

[TUT] PayPal IPN

Aanbevolen berichten

Hoi,

In deze tutorial geef ik meer uitleg over een PayPal IPN. Je kunt een PayPal IPN gebruiken als je bijvoorbeeld een eigen donatie systeem wilt maken, er zijn honderden dingen wat je kan doen als je een PayPal IPN gebruikt. Een PayPal IPN systeem werkt als volgt:

Je gaat naar PayPal -> Je betaald -> Je gaat naar betaald.php

Dat klinkt verder niet zo heel moeilijk. Maar je wilt natuurlijk niet hebben dat iedereen in zijn browser mijnwebsite.nl/betaald.php intoetst en dat de query de rest gaat doen. Hiervoor stuurt PayPal een IPN URL. Het is een van soort lange code waar verschillende dingen in staan; naam van de betaler, datum en natuurlijk ook of de betaling geldig was of mislukt. Genoeg gepraat, laten we maar eens beginnen met het scripten. Voordat ik begin met het scripten wil ik even duidelijk vermelden dat ik het basis script zelf niet gemaakt hebt. Ik geef jullie puur uitleg over PayPal IPN en hoe je het script kunt gebruiken. Alle rechten van het script gaat dus ook naar de originele eigenaar.

We gaan beginnen met een standaard HTML form.
Codeblok:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<body onload="document.paypal_form.submit();">
    <center><h2>Processing Transaction...</h2>
    <p>Please wait shortly. Do not close this window.</p></center>
    
    <form method="post" name="paypal_form" action="https://www.paypal.com/cgi-bin/webscr">    
        <input type="hidden" name="business" value="" />
        <input type="hidden" name="cmd" value="_xclick" />
        <!-- the next three need to be created -->
        <input type="hidden" name="image_url" width="263" height="76" value="" />
        <input type="hidden" name="return" value="" />
        <input type="hidden" name="cancel_return" value="" />
        <input type="hidden" name="notify_url" value="" />
        <input type="hidden" name="rm" value="2" />
        <input type="hidden" name="currency_code" value="EUR" />
        <input type="hidden" name="lc" value="US" />
        <input type="hidden" name="bn" value="toolkit-php" />
        <input type="hidden" name="cbt" value="Continue" />
        
        <!-- Payment Page Information -->
        <input type="hidden" name="no_shipping" value="" />
        <input type="hidden" name="no_note" value="1" />
        <input type="hidden" name="cn" value="Comments" />
        <input type="hidden" name="cs" value="" />
        
        <!-- Product Information -->
        <input type="hidden" name="item_name" value="Donatie - 1 EU" />
        <input type="hidden" name="amount" value="1" />
        <input type="hidden" name="quantity" value="1" />
        <input type="hidden" name="item_number" value="1" />
        <input type="hidden" name="undefined_quantity" value="" />
        <input type="hidden" name="on0" value="" />
        <input type="hidden" name="os0" value="" />
        <input type="hidden" name="on1" value="" />
        <input type="hidden" name="os1" value="" />
        
        <!-- Shipping and Misc Information -->
        <input type="hidden" name="shipping" value="" />
        <input type="hidden" name="shipping2" value="" />
        <input type="hidden" name="handling" value="" />
        <input type="hidden" name="tax" value="" />
        <input type="hidden" name="custom" value="" />
        <input type="hidden" name="invoice" value="" />
        
        <!-- Customer Information -->
        <input type="hidden" name="first_name" value="Kingunit" />
        <input type="hidden" name="last_name" value="" />
        <input type="hidden" name="address1" value="" />
        <input type="hidden" name="address2" value="" />
        <input type="hidden" name="city" value="" />
        <input type="hidden" name="state" value="" />
        <input type="hidden" name="zip" value="10004" />
        <input type="hidden" name="email" value="" />
        <input type="hidden" name="night_phone_a" value="" />
        <input type="hidden" name="night_phone_b" value="" />
        <input type="hidden" name="night_phone_c" value="" />
        
        <noscript>
            <p>Your browser doesnt support Javscript, click the button below to process the transaction.</p>
            <input type="submit" name="Submit" value="Process Payment" />
        </noscript>
    </form>
</body>


Zoals je ziet zijn er een hoop input velden. Als je een beetje engels kunt dan weet je wel wat ze inhouden. Ik gebruik ze zelf niet allemaal, de belangrijkste zijn; business(email), return(waar je naartoe gaat als de betaling correct is), cancel_return(als je de betaling stopt), notify_url(de pagina waar de IPN naar toe gaat). In het form moet je dus ook de prijs meegeven(amount, onder Product Information)

Omdat we onload gebruiken, lijkt me het wel een goed idee om een $_GET variable te gebruiken. Laten we $_GET[type] gaan gebruiken. Dit ook omdat je bijvoorbeeld later meerderen types wilt gaan maken. Je kunt het gewoon laten linken met: <a href="http://www.mijnsite.nl/pagina.php?type=1">Donate!</a> Hier een voorbeeldje hoe je dat moet doen:
Codeblok:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
if (isset($_GET[type])) {

    if ($_GET[type] == 1) {
    
        # Laat de form zien met onload.
    
    } else if ($GET[type] == 2) {
    
        # Laat een andere form zien met onload.

    }
    
    #etc.
}
?>


We gaan nu dus een nieuwe pagina aanmaken waar we naartoe gaan als de betaling klaar is. Jammer genoeg kan ik niet stap voor stap gaan uitleggen wat de code precies doet. Simpelweg omdat ik niet de eigenaar van het script ben maar puur uitleg geef over de IPN. Ik heb een kleine beschrijving erbij gegeven.
Codeblok:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
$url
      = https://www.paypal.com/cgi-bin/webscr;
$postdata = ;
foreach ($_POST as $i => $v) {
    $postdata .= $i . = . urlencode($v) . &;
}

$postdata .= cmd=_notify-validate;
$web = parse_url($url);
if ($web[scheme] == https) {
    $web[port] = 443;
    $ssl         = ssl://;
}
else {
    $web[port] = 80;
    $ssl         = ;
}

$fp = @fsockopen($ssl . $web[host], $web[port], $errnum, $errstr, 30);
if (!$fp) {
    echo $errnum . : . $errstr;
}
else {
    fputs($fp, "POST " . $web[path] . " HTTP/1.1 ");
    fputs($fp, "Host: " . $web[host] . " ");
    fputs($fp, "Content-type: application/x-www-form-urlencoded ");
    fputs($fp, "Content-length: " . strlen($postdata) . " ");
    fputs($fp, "Connection: close ");
    fputs($fp, $postdata . " ");
    while (!feof($fp)) {
        $info[] = @fgets($fp, 1024);
    }

    fclose($fp);
    $info = implode(,, $info);
    # If statement of de betaling verified is.
    if (eregi(VERIFIED, $info)) {
        # Betaling geldig -> Voorbeeld:
        #echo Betaling is gelukt!;

    } else {
        # Bezoeker komt op deze pagina en er is geen betaling gedaan. -> Toegang geweigerd, voorbeeld:
        # echo Je mag deze pagina niet bekijken!;

    }
}

?>


Wat het script eigenlijk doet is het volgende: PayPal stuurt een zogenaamde IPN-URL. Hierin staat dus allemaal informatie wat ik al eerder vertelde. Ook staat er o.a. notify-validate in, als deze op VERIFIED staat dan is de betaling gelukt. Als dat niet gebeurt dan is de betaling mislukt en word je dus naar de fout pagina gestuurd.


Hopelijk is na deze tutorial de bedoeling van de PayPal IPN duidelijker geworden. Ik weet niet zeker of je nog e.v.t. de IPN op je PayPal account aan moet zetten en de URL opgeven of dat het form het al doet. Hier kun je meer informatie vinden hoe dat moet. Als er nog vragen zijn hoor ik dat graag.

Groet,
Kingunit

Deel dit bericht


Link naar bericht
Delen op andere sites
Yorrick (link):
Iemand al ontdekt of je de IPN aan moet zetten en wat je daar moet invullen?


Jup bij IPN voer je website url in waar die PHP bestand staat smiley

Deel dit bericht


Link naar bericht
Delen op andere sites
Sorry voor deze enorm oude bump, maar ik wil toch even toelichten dat deze code ONVEILIG is.

Ik kwam hier door de link in Kingunit zijn onderschrift waardoor meerdere mensen alsnog hier zouden kunnen belanden.

In de officiele PayPal IPN documentatie staat vermeld dat er gecontroleerd moet worden op de volgende dingen:

Quote:
Check that the payment_status is Completed.
If the payment_status is Completed, check the txn_id against the previous PayPal transaction that you processed to ensure the IPN message is not a duplicate.
Check that the receiver_email is an email address registered in your PayPal account.
Check that the price (carried in mc_gross) and the currency (carried in mc_currency) are correct for the item (carried in item_name or item_number).


Zonder dit kan iedereen het bedrag, of de ontvanger van het geld aanpassen en alsnog het product krijgen.

Deel dit bericht


Link naar bericht
Delen op andere sites

Maak een account aan of log in om te reageren

Je moet lid zijn om een reactie te kunnen achterlaten

Account aanmaken

Maak een account aan in onze gemeenschap. Het is makkelijk!

Registreer een nieuw account

Aanmelden

Ben je al lid? Meld je hier aan.

Nu aanmelden
Log in om dit te volgen  

×