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 '\n"; elseif(!is_array($value)) echo '>',htmlspecialchars($value),"\n"; else echo ">\n",XML_serialize($value, $level+1),str_repeat("\t", $level),"\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 = ''; #stores temporary cdata $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; } ?>