Nou het lukte mij niet precies met de return en report urls. Wat daar nou precies de bedoeling van was. Dit is mij nu goed duidelijk en heb mijn eigen script hieraan aangepast. Nu werkt het, evt wil ik het wel posten.
Likes: 0
Nou het lukte mij niet precies met de return en report urls. Wat daar nou precies de bedoeling van was. Dit is mij nu goed duidelijk en heb mijn eigen script hieraan aangepast. Nu werkt het, evt wil ik het wel posten.
- Edit -
Laat maar Erik had al gereageerd![]()
geen idee of iemand hier wat aan heeft, het is misschien een zooitje, maar ik heb alle MYSQL STRINGS eruit gehaald, meer als voorbeeld hoe ik alles ophaal en verwerk, misschien dat iemand er een idee van krijg. Ik heb er ook de parser bij gestopt.
Code:<? function xml2array($contents, $get_attributes=1) { if(!$contents) return array(); if(!function_exists('xml_parser_create')) { //print "'xml_parser_create()' function not found!"; return array(); } //Get the XML parser of PHP - PHP must have this module for the parser to work $parser = xml_parser_create(); xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, 0 ); xml_parser_set_option( $parser, XML_OPTION_SKIP_WHITE, 1 ); xml_parse_into_struct( $parser, $contents, $xml_values ); xml_parser_free( $parser ); if(!$xml_values) return;//Hmm... //Initializations $xml_array = array(); $parents = array(); $opened_tags = array(); $arr = array(); $current = &$xml_array; //Go through the tags. foreach($xml_values as $data) { unset($attributes,$value);//Remove existing values, or there will be trouble extract($data);//We could use the array by itself, but this cooler. $result = ''; if($get_attributes) {//The second argument of the function decides this. $result = array(); if(isset($value)) $result['value'] = $value; //Set the attributes too. if(isset($attributes)) { foreach($attributes as $attr => $val) { if($get_attributes == 1) $result['attr'][$attr] = $val; //Set all the attributes in a array called 'attr' /** :TODO: should we change the key name to '_attr'? Someone may use the tagname 'attr'. Same goes for 'value' too */ } } } elseif(isset($value)) { $result = $value; } //See tag status and do the needed. if($type == "open") {//The starting of the tag '<tag>' $parent[$level-1] = &$current; if(!is_array($current) or (!in_array($tag, array_keys($current)))) { //Insert New tag $current[$tag] = $result; $current = &$current[$tag]; } else { //There was another element with the same tag name if(isset($current[$tag][0])) { array_push($current[$tag], $result); } else { $current[$tag] = array($current[$tag],$result); } $last = count($current[$tag]) - 1; $current = &$current[$tag][$last]; } } elseif($type == "complete") { //Tags that ends in 1 line '<tag />' //See if the key is already taken. if(!isset($current[$tag])) { //New Key $current[$tag] = $result; } else { //If taken, put all things inside a list(array) if((is_array($current[$tag]) and $get_attributes == 0)//If it is already an array... or (isset($current[$tag][0]) and is_array($current[$tag][0]) and $get_attributes == 1)) { array_push($current[$tag],$result); // ...push the new element into that array. } else { //If it is not an array... $current[$tag] = array($current[$tag],$result); //...Make it an array using using the existing value and the new value } } } elseif($type == 'close') { //End of tag '</tag>' $current = &$parent[$level-1]; } } return($xml_array); } IF($_GET['invoice'] && $_GET['payd']=="yes") { ?> <script> javascript:opener.location.reload(); opener.focus(); window.close(); </script> <center>Betaling voldaan</center> <? } else { //mijn MYSQL CONNECTOR $db = new DB_SQL; $query = "een SQL string"; $db->query($query); if ($db->num_rows()=="0") { die("factuur bestaat niet, je hebt geen recht om deze factuur in te zien of hij is al betaald."); } $smarty = new Smarty(); while($db->next_record()) { $invoiceNR= strip($db->Record["InvoiceNumber"]); // add to template $smarty->assign("INVOICEnumber", strip($db->Record["InvoiceNumber"])); $smarty->assign("INVOICEclientname", clientname($db->Record["ClientId"])); //sellect items for the total price $db_qry = new DB_SQL; $query_qry = "SELECT $db->Record["InvoiceId"]"; $db_qry->query($query_qry); $sub = array(); $sub1 = array(); $a = "1"; while($db_qry->next_record()) { $TotalPrice = htmlspecialchars($db_qry->Record["Cost"]) + $TotalPrice; } // add to template $smarty->assign("INVOICEPricetotalvat", sprintf("€ %02.2f", $TotalPrice/100 * 19 + $TotalPrice)); } IF($_POST['bankid']) { IF( $_SERVER['HTTPS'] && $_SERVER['HTTPS'] == 'on') { $url="https://"; } else { $url="http://"; } $price = $TotalPrice / 100 * 19 + $TotalPrice; $host="http://www.mollie.nl/xml/ideal?"; $data= 'a=fetch'. '&partnerid='.urlencode($cfg->config["mollieuser"]). '&bank_id='.urlencode($_POST['bankid']). '&amount='.urlencode($price * 100). '&reporturl='.urlencode($url.$_SERVER["HTTP_HOST"].strip($cfg->config["pad"])."/page/goto/mollie/checkpage.php"). '&description='.urlencode(strip($cfg->config["CompanyName"]).' '.$invoiceNR). '&returnurl='.urlencode($url.$_SERVER["HTTP_HOST"].strip($cfg->config["pad"])."/index.php?page=ideal&invoice=".$invoiceNR."&payd=yes"); $parsed = file_get_contents($host.$data); $parsed = xml2array($parsed,0); $parsed = $parsed['response']; $parsed = $parsed['order']; //print_r ($parsed); $db = new DB_SQL; $query = "SELECT strip($invoiceNR)"; $db->query($query); if ($db->num_rows()=="0") { $dbnew = new DB_SQL; $querynew = "INSERT $parsed['transaction_id']"; $dbnew->query($querynew); } else { $dbupdate = new DB_SQL; $queryupdate = "UPDATE $parsed['transaction_id']"; $dbupdate->query($queryupdate); } header("Location: ".$parsed['URL']); } else { //if notting get bankID $parsed = file_get_contents('http://www.mollie.nl/xml/ideal?a=banklist');//Or however you what it $parsed = xml2array($parsed,0); $parsed = $parsed['response']; $parsed = $parsed['bank']; $banklist = array(); $banklist1 = array(); for ($i = 0; $i < count($parsed); $i++) { $banklist = array("Bankid" => $parsed[$i]['bank_id'],"Bankname" => $parsed[$i]['bank_name']); array_push($banklist1, $banklist ); } // done go to template $smarty->assign("banklist", $banklist1); $smarty->assign("POSTuri", $_SERVER['REQUEST_URI']); $smarty->compile_dir = $_SERVER['DOCUMENT_ROOT'].strip($cfg->config["pad"]).'/page/templates_c'; $smarty->display($_SERVER['DOCUMENT_ROOT'].strip($cfg->config["pad"]).'/page/templates/idealMollie.tpl'); } } ?>
En de check page om door te krijgen of de betaling echt voldaan is:
Code:If($_GET['transaction_id']) { $db = new DB_SQL; $query = "SELECT $_GET['transaction_id'].""; $db->query($query); if ($db->num_rows()=="1") { $host="http://www.mollie.nl/xml/ideal?"; $data= 'a=check'. '&partnerid='.urlencode($cfg->config["mollieuser"]). '&transaction_id='.urlencode($_GET['transaction_id']); $parsed = file_get_contents($host.$data); $parsed = xml2array($parsed,0); $parsed = $parsed['response']; $parsed = $parsed['order']; $cparsed = $parsed['consumer']; IF($parsed['payed']=="true") { $dbupdate = new DB_SQL; $queryupdate = "UPDATE amount='".$parsed['amount']."',consumerName='".$cparsed['consumerName']."',consumerAccount= '".$cparsed['consumerAccount']."',consumerCity= '".$cparsed['consumerCity']."',payed= '".$parsed['payed']."' WHERE transaction_id = '".$_GET['transaction_id']."' LIMIT 1"; $dbupdate->query($queryupdate); } etc.....
Laatst gewijzigd door MaffeMuis; 09/01/07 om 12:39.
Ik heb dit gewoon even snel geschreven aangezien ik het werkend wou hebben. Ik zal het een deze dagen nog opschonen en het e.e.a. aanpassen.PHP Code:<?php
include('include/classes/class.ideal.php');
//
if($_POST['bank'] && $_POST['klantnr'] && $_POST['factuurnr']){
$klantnr = $_POST['klantnr'];
$factuurnr = $_POST['factuurnr'];
//
$query = mysql_query("SELECT *, SUM(bedrag) as bedrag, SUM(setup) as setup FROM facturen WHERE klantnr = '$klantnr' AND factuurnr = '$factuurnr' GROUP BY factuurnr");
$row = mysql_fetch_object($query);
//
$row = mysql_num_rows($query);
if($row < 1){
echo "Foutieve aanvraag.";
}
else{
$query = mysql_query("SELECT *, SUM(bedrag) as bedrag, SUM(setup) as setup FROM facturen WHERE klantnr = '$klantnr' AND factuurnr = '$factuurnr' GROUP BY factuurnr");
$row = mysql_fetch_object($query);
//
$bedrag = $row->bedrag + $row->setup;
$bedrag = $bedrag * 100 + 100;
//
$ideal = new ideal();
$ideal->setPartnerid($config['id_partnerid']);
$ideal->setDescription("Factuur $row->factuurnr");
$ideal->setReturnURL($config['id_return']);
$ideal->setReportURL($config['id_report']);
$ideal->setAmount($bedrag);
$ideal->setBankid($_POST['bank']);
//
if(!$ideal->createPayment()){
echo "Betaling mislukt. Neem contact op met <a href=\"mailto:sales@ek-hosting.nl\">sales@ek-hosting.nl</a>.";
}
else{
$query = mysql_query("SELECT *, SUM(bedrag) as bedrag, SUM(setup) as setup FROM facturen WHERE klantnr = '$klantnr' AND factuurnr = '$factuurnr' GROUP BY factuurnr");
$row = mysql_fetch_object($query);
//
$query = "UPDATE betalingen SET transactie = '%s' WHERE factuurnr = '%s'";
$query = sprintf(
$query,
mysql_real_escape_string($ideal->transaction_id),
mysql_real_escape_string($row->factuurnr)
);
mysql_query($query);
//
echo "<META HTTP-EQUIV=\"refresh\" CONTENT=\"1; URL=$ideal->bankurl\">";
echo "<blink>U wordt doorgestuurd naar uw bank...</blink>";
}
}
}
elseif(isset($_GET['report'])){
$transactie = $_GET['transaction_id'];
//
$ideal = new ideal();
$ideal->setPartnerid($config['id_partnerid']);
$ideal->setTransactionId($transactie);
//
if($ideal->checkPayment()){
$query = mysql_query("SELECT * FROM betalingen WHERE transactie = '$transactie'");
$row = mysql_fetch_object($query);
//
$query2 = "UPDATE facturen SET status = '1' WHERE factuurnr = '$row->factuurnr'";
mysql_query($query2);
}
}
elseif(isset($_GET['return'])){
$transactie = $_GET['transaction_id'];
//
$query = mysql_query("SELECT * FROM betalingen WHERE transactie = '$transactie'");
$row = mysql_fetch_object($query);
//
$query2 = mysql_query("SELECT *, SUM(bedrag) as bedrag, SUM(setup) as setup FROM facturen WHERE factuurnr = '$row->factuurnr' GROUP BY factuurnr");
$row2 = mysql_fetch_object($query2);
//
if($row2->status == 1){
echo "Bedankt voor uw betaling, het bestelde product zal indien nodig zo snel mogelijk worden aangemaakt.";
}
else{
echo "Betaling mislukt, indien dit probleem zich blijft voordoen vragen wij u contact op te nemen met <a href=\"mailto:sales@ek-hosting.nl\">sales@ek-hosting</a>.";
}
}
elseif(isset($_GET['klantnr']) && isset($_GET['factuurnr'])){
?>
Hier kunt u uw bank kiezen om de betaling te voltooien. U zult vanaf hier worden doorgestuurd naar de desgewenste bank.
<br><br>
<form method="post" action="<? echo $_SERVER['REQUEST_URI']; ?>">
<input name="klantnr" type="hidden" value="<? echo $_GET['klantnr']; ?>">
<input name="factuurnr" type="hidden" value="<? echo $_GET['factuurnr']; ?>">
<select style="width:202px" name="bank">
<?
$ideal = new ideal();
$ideal->fetchBanks();
//
foreach($ideal->banks as $bank_id => $bank_name){
echo "<option value=\"$bank_id\">$bank_name</option>";
}
?>
</select>
<br><br>
Bij het betalen per iDeal gaat u akkoord met een extra toeslag van € 1,- bij elke transactie.
<br><br>
<input type="submit" name="submit" value="Volgende">
</form>
<br><br>
<center><img src="ideal/ideal.gif" border="0"></center>
<?
}
else{
echo "Foutieve aanvraag.";
}
?>
Voor de ideal strings ben je onderstaande nodig:
Oja en de 'class.ideal.php' nog:PHP Code:<?php
$config = array('id_partnerid' => '20031',
'id_return' => 'http://www.domein.tld/ideal.php?return',
'id_report' => 'http://www.domein.tld/ideal.php?report');
?>
PHP Code:<?php
/* COPYRIGHT MOLLIE.NL */
class ideal {
var $partnerid = null;
var $transaction_id = null;
var $bankid = null;
var $amount = null;
var $description = null;
var $reporturl = null;
var $returnurl = null;
var $country = 31;
var $currency = 'EUR';
var $payed = false;
var $bankurl = null;
var $statusmessage = null;
var $banks = array();
//
function setPartnerID($partnerid) {
if(is_numeric($partnerid)) {
$this->partnerid = $partnerid;
return true;
}
else
return false;
}
function setAmount($amount) {
if (is_numeric($amount)) {
$this->amount = $amount;
return true;
}
else
return false;
}
function setCountry($country) {
if (is_numeric($country)) {
$this->country = $country;
return true;
}
else
return false;
}
function setReportURL($reporturl) {
if (preg_match('|(\w+)://([^/:]+)(:\d+)?/(.*)|',$reporturl)) {
$this->reporturl = $reporturl;
return true;
}
else
return false;
}
function setReturnURL($returnurl) {
if (preg_match('|(\w+)://([^/:]+)(:\d+)?/(.*)|',$returnurl)) {
$this->returnurl = $returnurl;
return true;
}
else
return false;
}
function setDescription($description) {
if ($description!='') {
$this->description = substr($description,0,29);
return true;
}
else
return false;
}
function setBankid($bankid) {
if ($bankid!='') {
$this->bankid = $bankid;
}
else
return false;
}
function setTransactionId($transaction_id) {
if ($transaction_id!='') {
$this->transaction_id = $transaction_id;
}
else
return false;
}
function fetchBanks() {
$result = $this->sendToHost('www.mollie.nl', '/xml/ideal/', 'a=banklist');
if (!$result) return false;
//
list($headers, $xml) = preg_split("/(\r?\n){2}/", $result, 2);
//
$data = @array_shift(@array_shift(XML_unserialize($xml)));
//
$this->banks=array();
foreach ($data as $bank) {
$this->banks[$bank[bank_id]]=$bank[bank_name];
}
return $this->banks;
}
function createPayment() {
if($this->partnerid=='' OR $this->amount=='' OR $this->reporturl=='' OR $this->returnurl=='' OR $this->description=='' OR $this->bankid=='')
return false;
$result = $this->sendToHost('www.mollie.nl', '/xml/ideal/',
'a=fetch'.
'&partnerid='.urlencode($this->partnerid).
'&bank_id='.urlencode($this->bankid).
'&amount='.urlencode($this->amount).
'&reporturl='.urlencode($this->reporturl).
'&description='.urlencode($this->description).
'&returnurl='.urlencode($this->returnurl));
if (!$result) return false;
//
list($headers, $xml) = preg_split("/(\r?\n){2}/", $result, 2);
//
$data = @array_shift(@array_shift(XML_unserialize($xml)));
//
$this->transaction_id = $data['transaction_id'];
$this->amount = $data['amount'];
$this->currency = $data['currency'];
$this->bankurl = html_entity_decode($data['URL']);
$this->statusmessage = $data['message'];
//
return true;
}
function checkPayment() {
$result = $this->sendToHost('www.mollie.nl', '/xml/ideal/',
'a=check'.
'&partnerid='.urlencode($this->partnerid).
'&transaction_id='.urlencode($this->transaction_id));
if (!$result) return false;
//
list($headers, $xml) = preg_split("/(\r?\n){2}/", $result, 2);
//
$data = @array_shift(@array_shift(XML_unserialize($xml)));
//
$this->payed = ($data['payed'] == 'true');
$this->amount = $data['amount'];
$this->statusmessage = $data['message'];
//
return $this->payed;
}
function sendToHost($host,$path,$data) {
$fp = @fsockopen($host,80);
if ($fp) {
@fputs($fp, "POST $path HTTP/1.0\n");
@fputs($fp, "Host: $host\n");
@fputs($fp, "Content-type: application/x-www-form-urlencoded\n");
@fputs($fp, "Content-length: " . strlen($data) . "\n");
@fputs($fp, "Connection: close\n\n");
@fputs($fp, $data);
while (!feof($fp))
$buf .= fgets($fp,128);
fclose($fp);
}
return $buf;
}
}
function & XML_unserialize(&$xml){
$xml_parser = &new XML();
$data = &$xml_parser->parse($xml);
$xml_parser->destruct();
return $data;
}
function & XML_serialize(&$data, $level = 0, $prior_key = NULL){
if($level == 0){ ob_start(); echo '<?xml version="1.0"',"\n"; }
while(list($key, $value) = each($data))
if(!strpos($key, ' attr'))
if(is_array($value) and array_key_exists(0, $value)){
XML_serialize($value, $level, $key);
}else{
$tag = $prior_key ? $prior_key : $key;
echo str_repeat("\t", $level),'<',$tag;
if(array_key_exists("$key attr", $data)){
while(list($attr_name, $attr_value) = each($data["$key attr"]))
echo ' ',$attr_name,'="',htmlspecialchars($attr_value),'"';
reset($data["$key attr"]);
}
if(is_null($value)) echo " />\n";
elseif(!is_array($value)) echo '>',htmlspecialchars($value),"</$tag>\n";
else echo ">\n",XML_serialize($value, $level+1),str_repeat("\t", $level),"</$tag>\n";
}
reset($data);
if($level == 0){ $str = &ob_get_contents(); ob_end_clean(); return $str; }
}
class XML{
var $parser;
var $document;
var $parent;
var $stack;
var $last_opened_tag;
//
function XML(){
$this->parser = &xml_parser_create();
xml_parser_set_option(&$this->parser, XML_OPTION_CASE_FOLDING, false);
xml_set_object(&$this->parser, &$this);
xml_set_element_handler(&$this->parser, 'open','close');
xml_set_character_data_handler(&$this->parser, 'data');
}
function destruct(){
xml_parser_free(&$this->parser);
}
function & parse(&$data){
$this->document = array();
$this->stack = array();
$this->parent = &$this->document;
return xml_parse(&$this->parser, &$data, true) ? $this->document : NULL;
}
function open(&$parser, $tag, $attributes){
$this->data = '';
$this->last_opened_tag = $tag;
if(is_array($this->parent) and array_key_exists($tag,$this->parent)){
if(is_array($this->parent[$tag]) and array_key_exists(0,$this->parent[$tag])){
$key = count_numeric_items($this->parent[$tag]);
}else{
if(array_key_exists("$tag attr",$this->parent)){
$arr = array('0 attr'=>&$this->parent["$tag attr"], &$this->parent[$tag]);
unset($this->parent["$tag attr"]);
}else{
$arr = array(&$this->parent[$tag]);
}
$this->parent[$tag] = &$arr;
$key = 1;
}
$this->parent = &$this->parent[$tag];
}else{
$key = $tag;
}
if($attributes) $this->parent["$key attr"] = $attributes;
$this->parent = &$this->parent[$key];
$this->stack[] = &$this->parent;
}
function data(&$parser, $data){
if($this->last_opened_tag != NULL)
$this->data .= $data;
}
function close(&$parser, $tag){
if($this->last_opened_tag == $tag){
$this->parent = $this->data;
$this->last_opened_tag = NULL;
}
array_pop($this->stack);
if($this->stack) $this->parent = &$this->stack[count($this->stack)-1];
}
}
function count_numeric_items(&$array){
return is_array($array) ? count(array_filter(array_keys($array), 'is_numeric')) : 0;
}
?>
Laatst gewijzigd door ErikKosters; 09/01/07 om 16:37.
Heeft iemand al ervaring met Mollie?
Goed dat je iets als toeslag toepast Erik. Ik zat ook al over te denken om alleen betalingen van 20 euro en hoger toe te staan of toeslag te gaan toepassen. Echter moet je die toeslag dan niet ook vermelden op het factuur en hier ook BTW over rekenen?
Wij rekenen hier de BTW niet van. Aangezien deze toeslag ten laste komt van de betaalwijze.
-knip-, dat lijkt me wat op reclame... niet?
Laatst gewijzigd door wonko; 07/02/07 om 17:35. Reden: oplossingen graag, geen verborgen reclame
Een Postbank rekening geeft je een flatfee van 75ct per transactie, zonder maandelijkse kosten. Daar kan volgens mij geen service provider en in ieder geval géén van de andere banken tegenop.
Daarnaast zijn zowel Mollie als bovengenoemde FS geen bank instanties. Dat betekent effectief dat je bij fraude en of faillisement geen enkele bescherming geniet die je bij een door de Nederlandse staat erkende bank wel hebt.
Niet de moeite willen nemen een nieuwe zakelijke rekening te openen (gratis!) is dus, bij een succesvol bedrijf, dief zijn van je eigen portomonnee en een onnodig zakelijk risico introduceren.
Daarmee zeg ik overigens niets over het gemak en of de dienstverlening van bedrijven als Mollie - daar kan en wil ik niet over oordelen.
In sommige punten heeft Easewood wel gelijk, alleen je kunt het ook anders bekijken, omdat Mollie en wij over veel iDEAL-klanten beschikken kunnen wij aantal transacties garanderen, hierdoor kunnen wij met de bank onderhandelen over de transactiekosten. Daarom kunnen wij hele lage tarieven hanteren. In je eentje kan je niet tegen de bank op. Maar met meerdere wel. Waarom zou je 75 euro cent aan de bank betalen terwijl je maar 50 cent kunt betalen bij wijze van?
Je kunt dus profiteren van de lage transactiekosten, en bovendien vaak heb je te maken met een shared hosting, ssh certificate beveiliging, veiligheid kan je niet garanderen als je niet eens weet wie allemaal op die server login heeft.
Ga je overstappen naar een eigen server, daar komt ook veel bijkijken wat kosten betreft.
Er is trouwens nog een ander bedrijf zoals wij en Mollie: internetkassa.nl (voor de mensen die de zaakjes willen vergelijken).