www.martdirks.nl

  • Decrease font size
  • Default font size
  • Increase font size
Home arrow iDEAL arrow Rabo iDEAL Lite (versie 1.x) arrow Integratie stap 5 - Virtuemart 3
Integratie stap 5 - Virtuemart 3 PDF Afdrukken E-mail
zaterdag 27 oktober 2007
Na het eerste tabblad en het bovenste deel van het tweede tabblad te hebben ingevuld, dient nog code toegevoegd te worden in het onderste veld.

Deze code zorgt voor het samenstellen van de data inclusief de benodigde hash, welke gepost wordt in de iDEAL omgeving van de Rabobank.
In de data die naar de bank gestuurd wordt staan eveneens drie return-url's omgenomen, die afhankelijk van de status van de betaling, vanuit iDEAL worden gebruikt om de koper weer terug naar je site te brengen.
In de code die hier door mij gebruikt is, wordt tevens op basis van deze status in de bestelling van de betalings bijgewerkt. LET OP: dit is echter GEEN GARANTIE dat de betaling ook daadwerkelijk uitgevoerd is. Controleer dan ook altijd binnen het dashboard naar de daadwerkelijke status, en controleer eventueel ook de je bankrekening of het bedrag bijgeboekt is. Voor een zakelijke rekening bij de Rabobank betekend dit als je klant de overboeking ook vanuit de Rabo gedaan heeft dat dit bedrag meteen is bijgeschreven. Voor de overige banken geldt de normale interbancaire overboekingstijd.

De onderstaande code is hier te downloaden.

### Mart Dirks © 25 oktober 2007
$versie = "Versie 1.31 voor Rabobank iDEAL Lite";
$partOfSha = "";
echo "<b>" . $versie . "</b> <br />";
### bedrag moet geconverteerd worden naar eurocenten ###
$amount = $db->f("order_total")*100;

### transportkosten en korting berekenen! nodig ivm met gekozen methode van hash-code-benadering
$shipping = 0;
$shipping = $db->f("order_shipping")*100 + $db->f("order_shipping_tax")*100;
$discount = 0;
$discount = $db->f("order_discount")*119*-1;

$amount bevat het totale orderbedrag in hele centen.
$shipping bevat de transportkosten, eveneens weer in hele centen.

### Lees ordernummer (is het veld order_id en niet order_number!)
$orderNumber = $db->f("order_id");
$paymentType = "ideal";

### De geldigheid van de aanbieding zetten we op een week ###
$validUntil = date("Y-m-d\TG:i:s\Z",strtotime ("+1 week"));

### Query order items ###

        $dboi = new ps_DB;
        $q_oi = "SELECT * FROM #__vm_product, #__vm_order_item, #__vm_orders ";
        $q_oi .= "WHERE #__vm_product.product_id=#__vm_order_item.product_id ";
        $q_oi .= "AND #__vm_order_item.order_id='$orderNumber' ";
        $q_oi .= "AND #__vm_orders.order_id=#__vm_order_item.order_id";
        $dboi->query($q_oi);


$orderNumber bevat het ordernummer, en is ook terug te vinden op het bankafschrift.
$paymentType dient 'ideal' in kleine letters te bevatten.
$dboi en $q_oi is de benodigde query om de bestelde artikkelen, aantallen en prijs op te vragen.

### Maak de bestellijst ###
$i = 0;
$t = 0;

while($dboi->next_record()) {
    $i++;
    ${'itemNumber'.$i} = $dboi->f("product_sku");
    ${'itemDescription'.$i} = $dboi->f("product_name");
    ${'productq'.$i} = $dboi->f("product_quantity");
    ${'productp'.$i} = $dboi->f("product_final_price")*100;
### bereken alvast een deel van de SHA string ###
    $partOfSha = $partOfSha . ${'itemNumber'.$i} . ${'itemDescription'.$i} . ${'productq'.$i} . ${'productp'.$i};
    $t = $t +(${'productq'.$i}*${'productp'.$i});
}

$i wordt  gebruikt als teller in de loop.
$t is een tijdelijke variabele, die binnen de code gebruikt wordt om  een afrondingsprobleem  te traceren en  binnen de transactie  te corrigeren.  iDEAL  Lite heeft als controle op de juistheid van het bedrag. Deze wordt door iDEAL nagerekend, dus het aantal*prijs van alle artikelen dient ALTIJD gelijk te zijn aan het totale orderbedrag! Doordat per artikel de prijs incl BTW berekend is, komt het door afrondingen voor dat deze controle een verschil oplevert. Verderop in de code wordt er dan een dump regel toegevoegd, die deze optelfout corrigeert. iDEAL gebruikt altijd het eindtotaal van de order voor de overboeking.
$partOfSha bevat de berekening van de hashcode, welke later opgeschoond gebruikt wordt door iDEAL om de gehele transactie te controleren.

if ($shipping > 0) {
   $i++;
   ${'itemNumber'.$i} = "000-order";
   ${'itemDescription'.$i} = "Order- en verzendkosten";
   ${'productq'.$i} = 1;
   ${'productp'.$i} = $shipping;
### bereken alvast een deel van de SHA string ###
    $partOfSha = $partOfSha . ${'itemNumber'.$i} . ${'itemDescription'.$i} . ${'productq'.$i} . ${'productp'.$i};
    $t = $t +(${'productq'.$i}*${'productp'.$i});
}

if ($discount <0) {
   $i++;
   ${'itemNumber'.$i} = "000-korting";
   ${'itemDescription'.$i} = "Korting";
   ${'productq'.$i} = 1;
   ${'productp'.$i} = $discount;
### bereken alvast een deel van de SHA string ###
    $partOfSha = $partOfSha . ${'itemNumber'.$i} . ${'itemDescription'.$i} . ${'productq'.$i} . ${'productp'.$i};
    $t = $t +(${'productq'.$i}*${'productp'.$i});

}

Bovenstaande spreekt, denk ik voor zich. Dit is het doorberekenen van de transportkosten en de eventuele korting.

######### correctie ivm arondeingsfouten binnen Virtuemart
if ($amount >$t) {
   $i++;
   ${'itemNumber'.$i} = "000-correctie";
   ${'itemDescription'.$i} = "Correctie";
   ${'productq'.$i} = 1;
   ${'productp'.$i} = round($amount - $t);
   ### bereken alvast een deel van de SHA string ###
   $partOfSha = $partOfSha . ${'itemNumber'.$i} . ${'itemDescription'.$i} . ${'productq'.$i} . ${'productp'.$i};
}
elseif ($amount < $t) {
   $i++;
   ${'itemNumber'.$i} = "000-correctie";
   ${'itemDescription'.$i} = "Correctie";
   ${'productq'.$i} = 1;
   ${'productp'.$i} = round($t-$amount);
   ### bereken alvast een deel van de SHA string ###
   $partOfSha = $partOfSha . ${'itemNumber'.$i} . ${'itemDescription'.$i} . ${'productq'.$i} . ${'productp'.$i};  
}

Zoals  de opmerking hierboven in de code al aangeeft  is dit deel sinds deze versie opgenomen. Eerder is al aangegeven dat er afrondingsfouten in de controleberekening gemaakt worden. Indien $t ongelijk is aan #amount wordt het verschil als een artikel toegevoegd aan de totale transactie.

$tt = $i;
### bouw de String op waarover een SHA1 moet worden berekend ###
$shastring = ILR_SLEUTEL . ILR_ACCEPTANT_ID . ILR_SUB  . "$amount" . "$orderNumber" . "$paymentType" . "$validUntil" . $partOfSha ;

###speciale HTML entiteiten verwijderen:
$clean_shaString = HTML_entity_decode($shastring);
### De tekens "\t", "\n", "\r", " " (spaties) mogen niet voorkomen in de string

$not_allowed = array("\t", "\n", "\r", " ");
$clean_shaString = str_replace($not_allowed, "",$clean_shaString);

$shasign = sha1($clean_shaString);

$tt wordt gebruikt om later in de code hetzelfde aantal artikelen door te sturen naar iDEAL, Zoals hierboven doorlopen zijn.
De rest van de code is de berekening van de HASH.

if (defined('GATEWAY_URL')) {
       ##### Overzicht van diverse gegevens voor samenvatting van de transatie (en debuging)!
       print '<br /> Overzicht van de bestelling:<br /><br />';
       #print 'Sleutel: ' . ILR_SLEUTEL . '<br />';
       #print 'Accepant ID: ' . ILR_ACCEPTANT_ID . '<br />';
       #print 'SubID: ' . ILR_SUB . '<br />';
       #print 'Test: ' . ILR_TEST_REQUEST . '<br />';
       #print 'URL: '. GATEWAY_URL . '<br />';
       print 'Betaalmethode: ' . $paymentType . '<br />';
       print 'Ordernummer: ' . $orderNumber . '<br />';
       #print 'Geldig tot: ' . $validUntil . '<br />';
       print 'Totaal orderbedrag in centen incl BTW: ' . $amount . '<br />';

      for($i=1;$i<=$tt ;$i++)
      {
       #print 'Artikelnummer:'.${'itemNumber'.$i}.'<br />';
       #print 'Omschrijving: '.${'itemDescription'.$i}.'<br />';
       #print 'Aantal: '.${'productq'.$i} . '   Prijs per stk: '.${'productp'.$i}.'<br /><br />';
      }
     }
else {   
   ## In account overzicht wordt, afhankelijk van de status, onderstaande boodschap boven orderdetail geprint!
   echo '<img hspace="10"  alt="iDeal logo" src="/components/com_virtuemart/shop_image/iDeal.jpg" />' ;
   echo '<br /> <b>De betaling is verricht via iDeal</b> <br />';
    }

Dit deel in de code wordt bij de betaling getoond op je website. Tijdens het testen van de betalingsmethode kun je # voor de regels weghalen om te debuggen. Zorg er ALTIJD voor dat de Sleutel en het Accepant ID in de productieomgeving NOOIT zichtbaar worden!

########### transctie ###################
?>
<FORM METHOD="post" ACTION="<?php print GATEWAY_URL ?>" id=form1 name=form1>
<INPUT type="hidden" NAME="merchantID" value="<?php print ILR_ACCEPTANT_ID ?>">
<INPUT type="hidden" NAME="subID" value="<?php print ILR_SUB ?>">
<INPUT type="hidden" NAME="amount" VALUE="<?php print $amount ?>">
<INPUT type="hidden" NAME="purchaseID" VALUE="<?php print $orderNumber ?>">
<INPUT type="hidden" NAME="language" VALUE="nl">
<INPUT type="hidden" NAME="currency" VALUE="EUR">
<INPUT type="hidden" NAME="description" VALUE="Bestelling: <?php print $orderNumber ?>">
<INPUT type="hidden" NAME="hash" size="50" VALUE="<?php print $shasign ?>">
<INPUT type="hidden" NAME="paymentType" VALUE="<?php print $paymentType ?>" >
<INPUT type="hidden" NAME="validUntil" VALUE="<?php print $validUntil ?>">
<?php
for($i=1;$i<=$tt;$i++)
{
  echo '
  <INPUT type="hidden" NAME="itemNumber'.$i.'" VALUE="'.${'itemNumber'.$i}.'">
  <INPUT type="hidden" NAME="itemDescription'.$i.'" VALUE="'.${'itemDescription'.$i}.'">
  <INPUT type="hidden" NAME="itemQuantity'.$i.'" VALUE="'.${'productq'.$i}.'">
  <INPUT type="hidden" NAME="itemPrice'.$i.'" VALUE="'.${'productp'.$i}.'">';
}

Het eerste deel van de transactie. Hieronder staat nog een extra deel, dat de returnurl's voor de transactie bevatten. Als je dat deel uit de code weglaat worden de URL's gebruikt die in het dashboard zijn opgegeven.

####### Return URL's, niet verplicht ###########
echo '<INPUT type="hidden" NAME="urlCancel" VALUE="http://www.mijnsite.nl/index.php?option=com_content&task=view&id=15&order=' . $orderNumber . ' &status=afgebroken">';
echo '<INPUT type="hidden" NAME="urlSuccess" VALUE="http://www.mijnsite.nl/index.php?option=com_content&task=view&id=15&order=' . $orderNumber . ' &status=geslaagd">';
echo '<INPUT type="hidden" NAME="urlError" VALUE="http://www.mijnsite.nl/index.php?option=com_content&task=view&id=15&order=' . $orderNumber . ' &status=error">';


In de bovenstaande returnurl's wordt teruggekeerd naar een statische contentpagina. Deze is per Joomlasite anders. Verderop in de uitleg wordt hier nader op ingegaan hoe dit in de verschillende methodes kan worden gebruikt. Dit deel van de code is NIET verplicht.

if (defined('GATEWAY_URL')) {
     echo '<img hspace="10"  alt="iDeal logo" src="/components/com_virtuemart/shop_image/iDeal.jpg" />  <INPUT name="Submit" type="submit" value="Betaal nu met iDEAL">';
     }
?>

</form>

Bovenstaande laatste deel van de code vertoond de betaalknop.
iDeal.jpg is te downloaden op deze site, en dient te worden geplaatst in ../components/com_virtuemart/shop_image/
Laatst geupdate op ( woensdag 31 oktober 2007 )
 
< Vorige   Volgende >

Aanmelden






Wachtwoord vergeten?

Weer

Gilze-Rijen, Netherlands
Temp: 15°C
Gevoel: 15°C
Vochtigh.: 94%
Snelheid: 11 km/h
Richting: 220°
Barom.: 1019.0 mb
SW
Meer gegevens
Beschikbaar gesteld door: 

Wie is er online

We hebben 12 gasten online

Laatste artikelen in Forum

1: Forum probleem (2) Last mart

Top Forum Gebruikers

Total users: 585
  • Mart Dirks (91)
  • Marlon (19)
  • Guy Clerx (19)