SHA1 / Checksum in de goede syntax te zetten?
Jullie hebben vast meer verstand van PHP-programmeren dan ik. Mijn kennis dáárvan is namelijk zeer beperkt.
Nu wil ik graag mijn ooit functioneren iDeal-betalingsmogelijkheid nieuw leven inblazen.
De PSP (Payment Service Provider) wil echter in de FORM een checksum, die ik ook na lang proberen niet goed krijg. Hij blijft 'checksum error' retourneren.
Wat ik heb gedaan in mijn cgi-bestanden en daarvan dus de ideal.php is het volgende.
Kan iemand dit corrigeren als ik stom bezig ben geweest? Alsjeblieft....
Aan het einde van de php (dus net voor ?> ) heb ik, de SHA1 zo gedeclareerd:
$controle = SHA1('EUR' + '' + 'MIJN MERCHANT ID' + 'MIJN RETURNURL' + '' + 'MIJN MERCHANT SECRET');
(Met hoofdletters geschreven zijn de dingen die ik heb ingevuld natuurlijk.)
Vervolgens roep ik CONTROLE aan in de FORM voor de betaling:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<form action="https://www.qantanipayments.com/frontend/" method=post>
<INPUT type="hidden" NAME="merchantid" value="MIJN MERCHANT ID " />
<INPUT type="hidden" NAME="key" value="MIJN MERCHANT KEY" />
<INPUT type="hidden" NAME="checksum" value='<?php echo $controle ?>' />
<input type='hidden' name="amount" value='<?php echo $tempgrandtotX100 ?>' />
<INPUT type="hidden" NAME="ordernumber" value='<?php echo $invoiceNo ?>' />
<INPUT type="hidden" NAME="language" VALUE="NL" />
<INPUT type="hidden" NAME="return" VALUE="MIJN RETURNURL" />
<INPUT type="hidden" NAME="currency" VALUE="EUR" />
<INPUT type="hidden" NAME="description" VALUE="Boeken" />
<INPUT type="hidden" NAME="itemNumber1" VALUE="9089730000" />
<INPUT type="hidden" NAME="itemDescription1" VALUE="Boeken" />
<INPUT type="hidden" NAME="itemQuantity1" VALUE="1" />
<INPUT type="hidden" NAME="itemPrice1" value='<?php echo $tempgrandtotX100 ?>' />
<INPUT type="hidden" NAME="validUntil" VALUE="2020-12-31T12:00:00:0000Z" />
<font size="5">
<INPUT type="submit" NAME="submit" VALUE="Verstuur" id="submit" />
</font>
</form>
<INPUT type="hidden" NAME="merchantid" value="MIJN MERCHANT ID " />
<INPUT type="hidden" NAME="key" value="MIJN MERCHANT KEY" />
<INPUT type="hidden" NAME="checksum" value='<?php echo $controle ?>' />
<input type='hidden' name="amount" value='<?php echo $tempgrandtotX100 ?>' />
<INPUT type="hidden" NAME="ordernumber" value='<?php echo $invoiceNo ?>' />
<INPUT type="hidden" NAME="language" VALUE="NL" />
<INPUT type="hidden" NAME="return" VALUE="MIJN RETURNURL" />
<INPUT type="hidden" NAME="currency" VALUE="EUR" />
<INPUT type="hidden" NAME="description" VALUE="Boeken" />
<INPUT type="hidden" NAME="itemNumber1" VALUE="9089730000" />
<INPUT type="hidden" NAME="itemDescription1" VALUE="Boeken" />
<INPUT type="hidden" NAME="itemQuantity1" VALUE="1" />
<INPUT type="hidden" NAME="itemPrice1" value='<?php echo $tempgrandtotX100 ?>' />
<INPUT type="hidden" NAME="validUntil" VALUE="2020-12-31T12:00:00:0000Z" />
<font size="5">
<INPUT type="submit" NAME="submit" VALUE="Verstuur" id="submit" />
</font>
</form>
Ik krijg steeds 'checksum error' als antwoord.
De $tempgrandtotX100 en $invoiceNo komen uit eerdere onderdelen (basket.php) van de bestelprocedure en dat heeft altijd gewerkt, toen ik nog een direct basix iDeal-abonnement had.
Graag in het vervolg bij code, [code] [/code] tags gebruiken. Tevens titel gewijzigd.[/modedit]
Gewijzigd op 15/07/2014 14:59:21 door Bas IJzelendoorn
Ik zie bijvoorbeeld dat er een return url meegegeven moet worden, dan is direct de vraag: moet die worden gecodeerd? En zo ja, hoe? Vaak zal je er bijvoorbeeld een encodeurl overheen moeten halen, soms alleen niet helemaal via de php methode, maar via een RFC standaard. Zonder daarvan de details te kennen is het onbegonnen werk om te proberen het aan de praat te krijgen.
Gewijzigd op 15/07/2014 13:07:29 door Erwin H
In de eerste plaats mijn dank voor je snelle reactie.
Ik snap het probleem van de returnurl. Naar mijn mening hoeft die niet te worden gecodeerd.
In de documentatie van de PSP staat bijvoorbeeld dit bij wijze van voorbeeld:
SHA1('[currency]' + '[amount]' + '[merchantid]' + '[returnurl]' + '[ordernumber]' + '[merchantsecret]')
We nemen de volgende parameters:
currency = EUR
amount = 19.95
merchantid = 1
returnurl = http://www.mijnwebsite.nl/betaalpagina.php
odernumber = 1000
merchantsecret = 12345
SHA1( 'EUR' + '19.95' + '1' + 'http://www.mijnwebsite.nl/betaalpagina.php' + '1000' + '12345' )
=
SHA1( 'EUR19.951http://www.mijnwebsite.nl/betaalpagina.php100012345' )
=
989ab3fefd30104b4002fd53bf5950dfcd69744c
Waarbij de laatste regel natuurlijk de checksum is.
Voor ik uiteindelijk jullie hulp inriep, dacht dat het alleen maar een kwestie van de juiste syntax was.
Sorry als ik je teveel aan het werk zet.
Aristos
Dan zal je de plusjes door puntjes moeten vervangen.
SHA1('EUR'.'19.95'.'1'.'http://www.mijnwebsite.nl/betaalpagina.php'.'1000'.'12345')
Dat helpt helaas niet (zie ook het voorbeelddocument van de PSP).
Krijg alleen maar PARSE ERRORS dan.
Bedankt voor de moeite natuurlijk,
Aristos
Aristos Bouius op 15/07/2014 14:31:27:
Krijg alleen maar PARSE ERRORS dan.
Welke?
Een opmerking die ik hier wel vaker langs zie komen, maar dat maakt het nog geen waarheid.
@Aristos
In het voorbeeld staat "amount = 19.95", jouw variabele heet $tempgrandtotX100, doe je het keer 100? Klopt dat dan nog wel?
En verder, heeft de provider wellicht een test omgeving, om te controleren wat de checksum zou moeten zijn?
Misschien heb je gelijk dat in DEZE situatie de ; niet perse noodzakelijk is (ik zou het niet eens weten) maar vermeld er dan ook bij dat als er meer dan één statement tussen de php tags staat dat het dan voor alle regels (behalve de laatste misschien?) wel degelijk noodzakelijk is. En dan denk ik vervolgens: leer en doe het dan gewoon goed en wees consequent.
Ok, persoonlijk, maar bovenstaande vind ik toch echt logischer dan dit:
je sluit hier de regel namelijk nog niet, dat komt pas na de laatste html tag.
Anyway, je opmerking klopt gewoon niet. Ik kan met je mee gaan dat het voor een specifieke situatie is, maar dan wel dat het voor elke laatste regel voor het sluiten van de php tags is.
Die puntkomma was niet noodzakelijk toen ik hetzelfde script heb gebruikt voor mijn iDealabonnement bij de Postbank. Het heeft altijd perfect gewerkt zo.
Nu lijkt het alleen die checksum die niet werkt (... hopenlijk is het niet meer...)
@Erwin:
Ja, van dat totaalbedrag dat klopt. In het voorafgaande script wordt steeds met $tempgrandtot gewerkt (centen dus), maar om het goede totaalbedrag te krijgen is deze variable $tempgrandtotX100 in het leven geroepen. Heeft altijd perfect gewerkt.
- van een testomgeving voor de checksum weet is niks. Die gegenereerde checksum wordt vergeleken met de checksum die aan de serverkant wordt gemaakt en vergeleken, waarna een TRUE of FALSE wordt gegeven.
@SanThe:
Die PARSE ERROR staat niet gespecificeerd. Alleen maar 'parse error in line 205'
Ik test overigens door een betaling naar de PSP te sturen in de TESTomgeving. Zodra het werkt, kan ik het op LIVE zetten.
Vreselijk bedankt tot nu toe allemaal, hoewel de oplossing er nog niet is.
Aristos
Aristos Bouius op 15/07/2014 15:07:17:
Die PARSE ERROR staat niet gespecificeerd. Alleen maar 'parse error in line 205'
Dan post je de omliggende regels even.
Dus regel 203 t/m 207.
Aristos Bouius op 15/07/2014 15:07:17:
- van een testomgeving voor de checksum weet is niks. Die gegenereerde checksum wordt vergeleken met de checksum die aan de serverkant wordt gemaakt en vergeleken, waarna een TRUE of FALSE wordt gegeven.
Ik weet niet welke provider je hebt, dus daar kan ik ook niet meer over zeggen. Sommige hebben een test functie in hun api ingebouwd die de checksum teruggeeft voor de waardes die je zelf naar die api call stuurt. Zo kan je controleren wat de checksum zou moeten zijn en kan je dus makkelijker testen.
Maar als die van jou dat niet biedt dan heb je verder weinig aan die kennis natuurlijk :-)
Wil ik best doen, maar volgens mij, heb je daar niks aan??
$protocol = ($_SERVER['HTTPS'] == "") ? "http://" : "https://";
$theLoc = $protocol . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
$thePos = strpos($theLoc, "cgi/ideal.php");
$theLoc = substr($theLoc, 0, $thePos);
$return_url = $theLoc . "transaction_success.html";
$failure_url = $theLoc . "transaction_failure.html";
$maybe_url = $theLoc . "transaction_maybe.html";
$invoice_url = $theLoc . "cgi/invoice.php";
$controle = SHA1('EUR' ................................
?>
Daarna begint het HTML deel dus.
Gewijzigd op 15/07/2014 18:03:30 door Aristos Bouius
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
$controle = sha1(
'EUR'
. $tempgrandtotX100
. '1713'
. 'http://www.winkel.aristoscorpio.com'
. $invoiceNo
. 'lcdChp9EGNstdDOXGBYZOUoQ0'
);
?>
$controle = sha1(
'EUR'
. $tempgrandtotX100
. '1713'
. 'http://www.winkel.aristoscorpio.com'
. $invoiceNo
. 'lcdChp9EGNstdDOXGBYZOUoQ0'
);
?>
Dit 'EUR' + '19.95' + '1' + 'http://www.mijnwebsite.nl/betaalpagina.php' + '1000' + '12345'
geeft als resultaat 13365.95
En dit 'EUR' . '19.95' . '1' . 'http://www.mijnwebsite.nl/betaalpagina.php' . '1000' . '12345'
geeft EUR19.951http://www.mijnwebsite.nl/betaalpagina.php100012345
Gewijzigd op 15/07/2014 18:25:08 door - SanThe -
Mijn dank. Dit was de oplossing.
Ik begrijp hem eerlijk gezegd nog niet zo goed, aangezien het enige verschil is dat er returns in de declaratie (&controle) staan. Verder is er niets veranderd.
Maar goed, dat maakt niks uit. Het werkt nu, daar gaat het om.
Ik kan nu verder met het werk waar ik wèl goed in ben, zal ik maar zeggen.
Vele dank, ook aan de anderen die de moeite hebben genomen zich in mijn probleem te verdiepen (@Erwin H, @ShanThe, @Frank Nietbelangrijk).
Een prettige avond,
Aristos