SHA1 / Checksum in de goede syntax te zetten?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Aristos Bouius

Aristos Bouius

15/07/2014 12:53:03
Quote Anchor link
Hallo slimmerikken,
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' + '
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $tempgrandtotX100 ?>
' + 'MIJN MERCHANT ID' + 'MIJN RETURNURL' + '
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $invoiceNo ?>
' + '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)
PHP script in nieuw venster Selecteer het PHP script
1
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>


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
 
PHP hulp

PHP hulp

20/04/2024 15:24:22
 
Erwin H

Erwin H

15/07/2014 13:07:07
Quote Anchor link
Dit soort dingen zijn over het algemeen niet zo 1-2-3 op te lossen, zonder precies te weten hoe die checksum bepaald moet worden.

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
 
Aristos Bouius

Aristos Bouius

15/07/2014 13:51:34
Quote Anchor link
Beste Erwin,
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
 
- SanThe -

- SanThe -

15/07/2014 14:16:07
Quote Anchor link
Dit gaat over PHP?
Dan zal je de plusjes door puntjes moeten vervangen.

SHA1('EUR'.'19.95'.'1'.'http://www.mijnwebsite.nl/betaalpagina.php'.'1000'.'12345')
 
Aristos Bouius

Aristos Bouius

15/07/2014 14:31:27
Quote Anchor link
Hi SanThe,
Dat helpt helaas niet (zie ook het voorbeelddocument van de PSP).
Krijg alleen maar PARSE ERRORS dan.

Bedankt voor de moeite natuurlijk,
Aristos
 
Frank Nietbelangrijk

Frank Nietbelangrijk

15/07/2014 14:33:27
Quote Anchor link
elk PHP statement dien je af te sluiten met een puntkomma ( ; ).

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $tempgrandtotX100 ?>


wordt dan

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $tempgrandtotX100; ?>
Gewijzigd op 15/07/2014 14:34:14 door Frank Nietbelangrijk
 
- SanThe -

- SanThe -

15/07/2014 14:34:05
Quote Anchor link
Aristos Bouius op 15/07/2014 14:31:27:
Krijg alleen maar PARSE ERRORS dan.


Welke?
 
Erwin H

Erwin H

15/07/2014 14:44:23
Quote Anchor link
@Frank
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?
 
Frank Nietbelangrijk

Frank Nietbelangrijk

15/07/2014 14:50:52
Quote Anchor link
Erwin,

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.
 
Erwin H

Erwin H

15/07/2014 15:01:55
Quote Anchor link
Consequent is aan het einde van een regel, maar in dit geval is het niet aan het einde van een regel:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<p>Mijn naam is <?php echo $username ?>!</p>

Ok, persoonlijk, maar bovenstaande vind ik toch echt logischer dan dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<p>Mijn naam is <?php echo $username; ?>!</p>

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.
 
Aristos Bouius

Aristos Bouius

15/07/2014 15:07:17
Quote Anchor link
@Frank:
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
 
- SanThe -

- SanThe -

15/07/2014 15:12:41
Quote Anchor link
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.
 
Erwin H

Erwin H

15/07/2014 15:40:43
Quote Anchor link
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 :-)
 
Aristos Bouius

Aristos Bouius

15/07/2014 17:45:16
Quote Anchor link
@SanThe:
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
 
Ward van der Put
Moderator

Ward van der Put

15/07/2014 17:53:14
Quote Anchor link
Haal die PHP-tags weg uit het gedeelte na $controle en maak er zoiets van, geheel in PHP:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$controle
= sha1(
   'EUR'
   . $tempgrandtotX100
   . '1713'
   . 'http://www.winkel.aristoscorpio.com'
   . $invoiceNo
   . 'lcdChp9EGNstdDOXGBYZOUoQ0'
);
?>
 
- SanThe -

- SanThe -

15/07/2014 18:20:39
Quote Anchor link
Nogmaals: geen plusjes maar puntjes.

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 -
 
Aristos Bouius

Aristos Bouius

15/07/2014 18:29:18
Quote Anchor link
Beste Ward,

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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.