So - hier jetzt mal eine Fassung, die folgende Sachen abdeckt:
- Übergabe an api.afterbuy.de
- Übergabe der 2. Adresszeile
- Kundenerkennung über die Mailadresse
- Lieferanschrift=0 setzen, wenn Liefer- und Rechnungsadresse identisch
- Stammartikelerkennung + setzen ArtikelStammID_x auf products_model
- Übergabe, von welchem Bestand abgezogen werden soll (shop/auktion)
- Übergabe als bezahlt für PayPal (mit zusätzlichem Warnhinweis in VMemo + Markierung)
- ot_payment integriert (Zahlartenrabatt/-aufschlag)
- $error statt $result bei Fehlermeldung durch Afterbuy ausgeben
- AID und UID von Afterbuy übernehmen und mit Kundennummer in orders_ident_key speichern
- CheckVID=1 zur Vermeidung doppelter Einträge bei Afterbuy
Die ganzen Sachen mit Steuer und Ausland habe ich noch nicht prüfen können. Da fehlt vermutlich noch einiges.
Außerdem könnte man sich die Umkodierung auf ISO-8859-1 sparen, weil Afterbuy UTF8 verarbeiten kann (andere URL-Adresse). Statt iconv() sollte urlencode() reichen.
Code: Alles auswählen
<?php
/** ----------------------------------------------------------------------------
**
*F afterbuy.php
**
** WEB-Shop Software http://www.webs.de
**
** ----------------------------------------------------------------------------
** based on:
** (c) 2000-2001 The Exchange Project (earlier name of osCommerce)
** (c) 2002-2003 osCommerce; www.oscommerce.com
** (c) 2003 nextcommerce; www.nextcommerce.org
** (c) 2006 XT-Commerce
**
** Released under the GNU General Public License
**
** @author Mathis Klooß <webs@gunah.eu>
** @version $Id: afterbuy.php 1772 2010-12-30 13:29:50Z joerg $
** @copyright 2010 WEB-Shop Software http://www.webs.de/
**
** changes (xtsell.de):
** 2012-07-07 changed $ShopInterface to 'api.afterbuy.de', changed $ShopInterface_path to '/afterbuy/ShopInterface.aspx'
** 2012-07-08 added billing_suburb, delivery suburb to query and pass to Kstrasse2, KLstrasse2
** 2012-07-08 added Kundenerkennung
** 2012-07-08 added test for billing address equals delivery address and set Lieferanschrift=0 if equal
** 2012-07-08 added Artikelerkennung, Bestandart, set ArtikelStammID_x to products_model
** 2012-07-10 added SetPay=1 for ZahlartFID=5
** 2012-07-10 added handling for ot_payment
** 2012-07-10 use $error for error mail
** 2012-07-11 extract AID and UID, store in orders_ident_key
** 2012-07-11 added CheckVID=1
** 2012-07-14 set ZahlartFID=1 for eustandardtransfer
** 2012-07-15 set VMemo= and MarkierungID= for SetPay
**
** ------------------------------------------------------------------------- */
class xtc_afterbuy_functions {
var $order_id;
var $PartnerID = AFTERBUY_PARTNERID;
var $PartnerPass = AFTERBUY_PARTNERPASS;
var $UserID = AFTERBUY_USERID;
var $order_status = AFTERBUY_ORDERSTATUS;
var $ShopInterface = 'api.afterbuy.de';
var $ShopInterface_path = '/afterbuy/ShopInterface.aspx';
var $user_agent = 'Mozilla/5.0 (compatible, cURL, PHP5) - Afterbuy API';
/** ---------------------------------------------------------------------------------
*
*F xtc_afterbuy_functions::xtc_afterbuy_functions
*
* @param int $order_id
*/
function xtc_afterbuy_functions($order_id) {
require_once (DIR_FS_INC.'xtc_product_link.inc.php');
$this->order_id = $order_id;
$this->template_path_afterbuy = DIR_FS_CATALOG . 'templates/' . CURRENT_TEMPLATE . '/afterbuy';
$this->afterbuy_crt = $this->template_path_afterbuy . '/curl-auth.pem';
if(AFTERBUY_DEALERS) {
$this->dealers = explode("," , AFTERBUY_DEALERS);
}
if(AFTERBUY_IGNORE_GROUPE) {
$this->ignore = explode("," , AFTERBUY_IGNORE_GROUPE);
}
}
/** ---------------------------------------------------------------------------------
*
*F xtc_afterbuy_functions::process_order
*
*/
function process_order() {
if( @!array_key_exists($_SESSION['customers_status']['customers_status_id'], $this->ignore) ) {
$nr = 0;
$anzahl = 0;
// get order-data
$o_query = xtc_db_query("SELECT customers_id,
billing_gender,
billing_company,
billing_firstname,
billing_lastname,
billing_street_address,
billing_suburb,
billing_postcode,
billing_city,
customers_telephone AS billing_telephone,
customers_email_address,
billing_country_iso_code_2,
delivery_gender,
delivery_company,
delivery_firstname,
delivery_lastname,
delivery_street_address,
delivery_suburb,
delivery_postcode,
delivery_city,
delivery_country_iso_code_2,
payment_method,
shipping_method,
orders_status,
comments
FROM ".TABLE_ORDERS."
WHERE orders_id='".$this->order_id."'
LIMIT 1;");
$oData = xtc_db_fetch_array($o_query);
$afterbuy = array();
// Start Auth
$afterbuy[] = "Action=new";
$afterbuy[] = "PartnerID=".$this->iconv($this->PartnerID);
$afterbuy[] = "PartnerPass=".$this->iconv($this->PartnerPass);
$afterbuy[] = "UserID=".$this->iconv($this->UserID);
// Kundenerkennung (0=Kbenutzername, 1=Kemail, 2=EKundenNr)
$afterbuy[] = "Kundenerkennung=1";
// User IDs
$afterbuy[] = "Kbenutzername=".$this->iconv($oData['customers_id'])."_XTC-ORDER_".$this->iconv($this->order_id);
$afterbuy[] = "VID=".$this->iconv($this->order_id);
$afterbuy[] = "CheckVID=1";
// billing Address
$afterbuy[] = "KVorname=".$this->iconv($oData['billing_firstname']);
$afterbuy[] = "KNachname=".$this->iconv($oData['billing_lastname']);
$afterbuy[] = "KStrasse=".$this->iconv($oData['billing_street_address']);
$afterbuy[] = "KStrasse2=".$this->iconv($oData['billing_suburb']);
$afterbuy[] = "KPLZ=".$this->iconv($oData['billing_postcode']);
$afterbuy[] = "KOrt=".$this->iconv($oData['billing_city']);
$afterbuy[] = "Kemail=".$this->iconv($oData['customers_email_address']);
$afterbuy[] = "KLand=".$this->iconv($oData['billing_country_iso_code_2']);
if($oData['billing_company']) {
$afterbuy[] = "KFirma=".$this->iconv($oData['billing_company']);
}
if($oData['billing_gender']) {
switch($oData['billing_gender']) {
case 'm':
$oData['billing_gender'] = 'Herr';
break;
default:
$oData['billing_gender'] = 'Frau';
}
$afterbuy[] = "Kanrede=".$this->iconv($oData['billing_gender']);
}
if($oData['billing_telephone']) {
$afterbuy[] = "Ktelefon=".$this->iconv($oData['billing_telephone']);
}
// check for billing_address equals delivery_address
if( ($oData['billing_company'] == $oData['delivery_company']) &&
($oData['billing_firstname'] == $oData['delivery_firstname']) &&
($oData['billing_lastname'] == $oData['delivery_lastname']) &&
($oData['billing_street_address'] == $oData['delivery_street_address']) &&
($oData['billing_suburb'] == $oData['delivery_suburb']) &&
($oData['billing_postcode'] == $oData['delivery_postcode']) &&
($oData['billing_city'] == $oData['delivery_city']) &&
($oData['billing_country_iso_code_2'] == $oData['delivery_country_iso_code_2'])) {
$afterbuy[] = "Lieferanschrift=0";
} else {
$afterbuy[] = "Lieferanschrift=1";
// Delivery Address
$afterbuy[] = "KLFirma=".$this->iconv($oData['delivery_company']);
$afterbuy[] = "KLVorname=".$this->iconv($oData['delivery_firstname']);
$afterbuy[] = "KLNachname=".$this->iconv($oData['delivery_lastname']);
$afterbuy[] = "KLStrasse=".$this->iconv($oData['delivery_street_address']);
$afterbuy[] = "KLStrasse2=".$this->iconv($oData['delivery_suburb']);
$afterbuy[] = "KLPLZ=".$this->iconv($oData['delivery_postcode']);
$afterbuy[] = "KLOrt=".$this->iconv($oData['delivery_city']);
$afterbuy[] = "KLLand=".$this->iconv($oData['delivery_country_iso_code_2']);
}
// Artikelerkennung (0 = ProduktID, 1 = Artikelnummer, 2 = externe Artikelnummer, 13 = Hersteller EAN
$afterbuy[] = "Artikelerkennung=0";
// Bestandart (auktion/shop)
$afterbuy[] = "Bestandart=shop";
// products_data
// get products related to order
$p_query = xtc_db_query("SELECT products_model,
products_name,
products_id,
products_tax,
products_price,
products_quantity
FROM ".TABLE_ORDERS_PRODUCTS."
WHERE orders_id='".$this->order_id."'");
/*
*/
$p_count = xtc_db_num_rows($p_query);
while ($pDATA = xtc_db_fetch_array($p_query)) {
$nr ++;
if ( empty($pDATA['products_model']) ) {
$pDATA['products_model'] = $pDATA['products_id'];
}
$afterbuy[] = "Artikelnr_".$nr."=".$pDATA['products_model'];
$afterbuy[] = "ArtikelStammID_".$nr."=".$pDATA['products_model'];
$afterbuy[] = "Artikelname_".$nr."=".$this->iconv( $pDATA['products_name']);
if ($_SESSION['customers_status']['customers_status_show_price_tax'] == 0 &&
$_SESSION['customers_status']['customers_status_add_tax_ot'] == 1) {
$pDATA['products_price'] = $pDATA['products_price'] + $pDATA['products_tax'];
}
if ($_SESSION['customers_status']['customers_status_show_price_tax'] == 0 &&
$_SESSION['customers_status']['customers_status_add_tax_ot'] == 0) {
$pDATA['products_tax'] = 0;
}
$price = $this->currency( $pDATA['products_price'] );
$tax = $this->currency( $pDATA['products_tax']);
$afterbuy[] = "ArtikelEPreis_".$this->iconv($nr)."=".$this->iconv($price);
$afterbuy[] = "ArtikelMwst_".$this->iconv($nr)."=".$this->iconv($tax);
$afterbuy[] = "ArtikelMenge_".$this->iconv($nr)."=".$this->iconv($pDATA['products_quantity']);
$url = $this->url('product_info.php',xtc_product_link($pDATA['products_id'],$pDATA['products_name']));
$afterbuy[] = "ArtikelLink_".$this->iconv($nr)."=".$this->iconv($url);
$a_query = xtc_db_query("SELECT products_options_values,
products_options
FROM ".TABLE_ORDERS_PRODUCTS_ATTRIBUTES."
WHERE orders_id='".$this->order_id."'
AND orders_products_id='".$pDATA['orders_products_id']."'");
$options = array();
while ($aDATA = xtc_db_fetch_array($a_query)) {
$options[] = $aDATA['products_options'].":".$aDATA['products_options_values'];
}
if ($options) {
$options = implode('|',$options);
$afterbuy[] = "Attribute_".$this->iconv($nr)."=".$this->iconv($options);
}
}
$order_total_query = xtc_db_query("SELECT
class,
value,
sort_order
FROM ".TABLE_ORDERS_TOTAL."
WHERE orders_id='".$this->order_id."'
ORDER BY sort_order ASC");
while ($order_total_values = xtc_db_fetch_array($order_total_query)) {
$order_total[] = array ('CLASS' => $order_total_values['class'], 'VALUE' => $order_total_values['value']);
// shippingcosts
if ($order_total_values['class'] == 'ot_shipping') {
$vK = $this->currency( $order_total_values['value'] );
$afterbuy[] = "Versandkosten=".$this->iconv($vK);
}
// nachnamegebuer
if ($order_total_values['class'] == 'ot_cod_fee') {
$cod_fee = $this->currency( $order_total_values['value']);
$afterbuy[] = "Zahlartenaufschlag=".$this->iconv($cod_fee);
}
// payment fee
if ($order_total_values['class'] == 'ot_payment') {
$pay_fee = $this->currency( $order_total_values['value']);
$afterbuy[] = "Zahlartenaufschlag=".$this->iconv($pay_fee);
}
// rabatt
if ($order_total_values['class'] == 'ot_discount') {
$nr ++;
$p_count ++;
$afterbuy[] = "Artikelnr_".$this->iconv($nr)."=99999998";
$afterbuy[] = "Artikelname_".$this->iconv($nr)."=Rabatt";
$discount = $this->currency( $order_total_values['value'] );
$afterbuy[] = "ArtikelEPreis_".$this->iconv($nr)."=".$this->iconv($discount);
$afterbuy[] = "ArtikelMwst_".$this->iconv($nr)."=".$this->iconv($tax);
$afterbuy[] = "ArtikelMenge_".$this->iconv($nr)."=1";
}
// Gutschein
if ($order_total_values['class'] == 'ot_gv') {
$nr ++;
$afterbuy[] = "Artikelnr_".$this->iconv($nr)."=99999997";
$afterbuy[] = "Artikelname_".$this->iconv($nr)."=Gutschein";
$gv = $this->currency( ($order_total_values['value'] * (-1)));
$afterbuy[] = "ArtikelEPreis_".$this->iconv($nr)."=".$this->iconv($gv);
$afterbuy[] = "ArtikelMwst_".$this->iconv($nr)."=0";
$afterbuy[] = "ArtikelMenge_".$this->iconv($nr)."=1";
$p_count ++;
}
if ($order_total_values['class'] == 'ot_coupon') {
$nr ++;
$afterbuy[] = "Artikelnr_".$this->iconv($nr)."=99999996";
$afterbuy[] = "Artikelname_".$this->iconv($nr)."=Kupon";
$coupon = $this->currency( ($order_total_values['value'] * (-1)));
$afterbuy[] = "ArtikelEPreis_".$this->iconv($nr)."=".$this->iconv($coupon);
$afterbuy[] = "ArtikelMwst_".$this->iconv($nr)."=0";
$afterbuy[] = "ArtikelMenge_".$this->iconv($nr)."=1";
$p_count ++;
}
}
$afterbuy[] = "PosAnz=".$this->iconv($p_count);
if($oData['comments']) {
$afterbuy[] = "kommentar=".$this->iconv($oData['comments']);
}
$s_method = explode( '(' , $oData['shipping_method'] );
$s_method['0'] = trim($s_method['0']);
$afterbuy[] = "Versandart=".$this->iconv($s_method['0']);
$afterbuy[] = "Zahlart=".$this->iconv( $this->payment($oData['payment_method']) );
$ZFID = $this->iconv( $this->payment_FID($oData['payment_method']) );
$afterbuy[] = "ZFunktionsID=".$ZFID;
if($ZFID == 5) {
$afterbuy[] = "SetPay=1";
$afterbuy[] = "VMemo=".$this->iconv("ACHTUNG: Vorgang wurde als bezahlt übergeben. Überprüfung erforderlich!");
$afterbuy[] = "MarkierungID=324";
}
//banktransfer data
if ($oData['payment_method']=='banktransfer') {
$b_query = xtc_db_query("SELECT banktransfer_bankname,
banktransfer_blz,
banktransfer_number,
banktransfer_owner
FROM ".TABLE_BANKTRANSFER."
WHERE orders_id='".$this->order_id."'
LIMIT 1;");
if (xtc_db_numrows($b_query)) {
$b_data = xtc_db_fetch_array($b_query);
$afterbuy[] = "Bankname=".$this->iconv($b_data['banktransfer_bankname']);
$afterbuy[] = "BLZ=".$this->iconv($b_data['banktransfer_blz']);
$afterbuy[] = "Kontonummer=".$this->iconv($b_data['banktransfer_number']);
$afterbuy[] = "Kontoinhaber=".$this->iconv($b_data['banktransfer_owner']);
}
}
$afterbuy[] = $this->extra();
$afterbuy[] = "NoVersandCalc=1";
if(isset($this->dealers) && !empty($this->dealers) &&
@array_key_exists($_SESSION['customers_status']['customers_status_id'], $this->dealers) ) {
$afterbuy[] = 'Haendler=1';
}
if($xml = $this->submit($afterbuy)) {
$result = simplexml_load_string ( $xml );
if ($result->success == '1') {
$cdr = $result->data->KundenNr;
//build string of AID/UID/KundenNr
$AB = $result->data->AID . $result->data->UID . $cdr;
xtc_db_query("UPDATE ".TABLE_ORDERS." SET afterbuy_success='1',afterbuy_id='".$cdr."',orders_ident_key='".$AB."' WHERE orders_id='".$this->order_id."'");
//set new order status
if ($this->order_status != '') {
xtc_db_query("UPDATE ".TABLE_ORDERS." SET orders_status='".$this->order_status."' WHERE orders_id='".$this->order_id."'");
}
} else {
$error = array();
foreach($result->errorlist->error as $row) {
$error[] = $row;
}
// mail to shopowner
$mail_content_html = 'Fehler bei Uebertragung der Bestellung: '.$this->order_id."<br />\r\n".'Folgende Fehlermeldung wurde vom afterbuy.de zurueckgegeben:'."<br />\r\n"."<br />\r\n".implode("<br />\r\n",$error);
$mail_content_txt = 'Fehler bei Uebertragung der Bestellung: '.$this->order_id."\r\n".'Folgende Fehlermeldung wurde vom afterbuy.de zurueckgegeben:'."\r\n\r\n".implode("\r\n",$error);
xtc_php_mail(EMAIL_BILLING_ADDRESS,STORE_NAME.'-Afterbuy',EMAIL_BILLING_ADDRESS, STORE_NAME,'',EMAIL_BILLING_ADDRESS, STORE_NAME,'','', "Afterbuy-Error", $mail_content_html,$mail_content_txt);
}
}
}
}
/** ---------------------------------------------------------------------------------
*
*F xtc_afterbuy_functions::order_send
*
* @return boolean
*/
function order_send() {
$check_query = xtc_db_query("SELECT afterbuy_success FROM ".TABLE_ORDERS." WHERE orders_id='".$this->order_id."' LIMIT 1;");
$data = xtc_db_fetch_array($check_query);
if ($data['afterbuy_success'] == 1) {
return false;
}
return true;
}
/** ---------------------------------------------------------------------------------
*
*PF xtc_afterbuy_functions::iconv
*
* convert strings to iso-8859-1 for afterbuy and urlencoded
*
* @param string $str
* @return string
*/
private function iconv( $str ) {
if(defined('DB_SERVER_CHARSET')) {
if(function_exists('iconv')) {
return urlencode( iconv( charset_mapper(DB_SERVER_CHARSET) , 'ISO-8859-1' , $str ) );
} elseif( DB_SERVER_CHARSET == 'utf8' ) {
return urlencode( utf8_decode( $str ) );
} else {
return urlencode( $str );
}
} else {
return urlencode( $str );
}
}
/** ---------------------------------------------------------------------------------
*
*PF xtc_afterbuy_functions::submit
*
* connector to Afterbuy API
*
* @param string $str
* @return string
*/
private function submit( $POST_ARRAY ) {
$POST_ARRAY = implode('&',$POST_ARRAY);
if(function_exists('curl_init')) {
$ch = curl_init();
@curl_setopt($ch, CURLOPT_URL, 'https://'.$this->ShopInterface.$this->ShopInterface_path);
if(file_exists($this->afterbuy_crt) && is_readable($this->afterbuy_crt)) {
@curl_setopt($ch, CURLOPT_CAFILE, $this->afterbuy_crt);
@curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
}
@curl_setopt($ch, CURLOPT_USERAGENT, $this->user_agent);
@curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
@curl_setopt($ch, CURLOPT_POST, 1);
@curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
@curl_setopt($ch, CURLOPT_POSTFIELDS, $POST_ARRAY);
$return = @curl_exec($ch);
if(curl_errno($ch)) {
$error = @curl_error($ch);
$error = strip_tags($error);
$s = array("\r","\n","\t");
$r = array(""," "," ");
$error = str_replace($s,$r,$error);
$return = '<?xml version="1.0" encoding="UTF-8" ?>'."\n<result>\n<success>0</success>\n<errorlist>\n<error>" . $error . "</error>\n</errorlist>\n</result>";
}
@curl_close($ch);
} else {
$return = '<?xml version="1.0" encoding="UTF-8" ?>'."\n<result>\n<success>0</success>\n<errorlist>\n<error>Die Funktionen von cURL konnten nicht gefunden werden.</error>\n<error>Um diesen API zu nutzen, wird PHP cURL benoetigt: http://www.php.net/curl</error>\n</errorlist>\n</result>";
}
return $return;
}
/** ---------------------------------------------------------------------------------
*
*PF xtc_afterbuy_functions::url
*
* create URLs like xtc_href_link
*
* @param string $page
* @param string $params (optional)
* @param string $connect (optioal [only NONSSL or SSL])
* @return url address
*/
private function url($page='index.php' , $params='' , $connect='NONSSL') {
switch($connect) {
case 'NONSSL':
$connect = 'NONSSL';
break;
default:
$connect = 'SSL';
}
if(!function_exists('xtc_catalog_href_link')) {
return xtc_href_link($page , $params , $connect);
} else {
return xtc_catalog_href_link($page , $params , $connect);
}
}
/** ---------------------------------------------------------------------------------
*
*PF xtc_afterbuy_functions::payment
*
* english to german
*
* @param string $payment
* @return string
*/
private function payment($payment) {
switch($payment) {
case 'banktransfer':
$payment = 'Lastschrift';
break;
case 'cash':
$payment = 'Barzahlung';
break;
case 'cc':
$payment = 'Kreditkarte';
break;
case 'cod':
$payment = 'Nachnahme';
break;
case 'eustandardtransfer':
$payment = 'Überweisung/Vorkasse';
break;
case 'iclear':
$payment = 'iClear Payment System';
break;
case 'invoice':
$payment = 'Rechnung';
break;
case 'ipayment':
$payment = 'iPayment';
break;
case 'ipaymentelv':
$payment = 'iPayment Lastschriftverfahren';
break;
case 'ogone':
$payment = 'Ogone - Payment Service Provider';
break;
case 'moneyorder':
$payment = 'Überweisung/Vorkasse';
break;
case 'paypal':
$payment = 'PayPal';
break;
case 'paypalexpress':
$payment = 'PayPal Express';
break;
case 'sofortueberweisung':
case 'sofortueberweisung_direct':
case 'sofortueberweisungredirect':
case 'sofortueberweisungvorkasse':
$payment = 'Sofortüberweisung';
break;
case 'worldpay':
$payment = 'Secure Credit Card Payment';
break;
}
return $payment;
}
/** ---------------------------------------------------------------------------------
*
*PF xtc_afterbuy_functions::payment_FID
*
* payment names to intengers by afterbuy
*
* @param string $payment
* @return int
*/
private function payment_FID($payment) {
switch($payment) {
case 'banktransfer':
$payment = '7';
break;
case 'cash':
$payment = '2';
break;
case 'cod':
$payment = '4';
break;
case 'invoice':
$payment = '6';
break;
case 'eustandardtransfer':
case 'moneyorder':
$payment = '1';
break;
case 'paypal':
$payment = '5';
break;
case 'paypalexpress':
$payment = '5';
break;
case 'sofortueberweisung':
$payment = '12';
break;
case 'sofortueberweisungredirect':
$payment = '12';
break;
case 'sofortueberweisungvorkasse':
$payment = '12';
break;
default:
$payment = '99';
}
return $payment;
}
/** ---------------------------------------------------------------------------------
*
*PF xtc_afterbuy_functions::currency
*
* US dez. numbers to DE dez. numbers
*
* @param flood $flood
* @return flood
*/
private function currency( $flood ) {
return str_replace('.', ',', $flood );
}
function extra() {
}
}
?>