NAVIGATION
This is an old revision of the document!
translate
Forum: http://forum.phpwcms.org/viewtopic.php?f=8&t=18505&start=15
Spezifikation: https://www.paypalobjects.com/de_DE/html/IntegrationCenter/ic_home.html
Danke an: nebenaube für PayPal Vorarbeit & OG für den Shop
Autor: Robert/ q23.media
CMS version: = ab r421 und größer
Verzeichnis: /include/inc_module/mod_shop_paypal/
Es muß eine neuen Zwischenspeicher-Tabelle angelegt werden.
SQL-Anweisung in phpmyadmin ausführen:
CREATE TABLE IF NOT EXISTS `phpwcms_shop_transactions` ( `transaction_id` int(10) unsigned NOT NULL auto_increment, `receiver_email` varchar(60) collate latin1_bin default NULL, `order_number` varchar(10) collate latin1_bin default NULL, `payment_status` varchar(10) collate latin1_bin default NULL, `pending_reason` varchar(10) collate latin1_bin default NULL, `payment_date` varchar(20) collate latin1_bin default NULL, `mc_gross` varchar(20) collate latin1_bin default NULL, `mc_fee` varchar(20) collate latin1_bin default NULL, `tax` varchar(20) collate latin1_bin default NULL, `mc_currency` varchar(3) collate latin1_bin default NULL, `txn_id` varchar(20) collate latin1_bin default NULL, `txn_type` varchar(10) collate latin1_bin default NULL, `first_name` varchar(30) collate latin1_bin default NULL, `last_name` varchar(40) collate latin1_bin default NULL, `address_street` varchar(50) collate latin1_bin default NULL, `address_city` varchar(30) collate latin1_bin default NULL, `address_state` varchar(30) collate latin1_bin default NULL, `address_zip` varchar(20) collate latin1_bin default NULL, `address_country` varchar(30) collate latin1_bin default NULL, `address_status` varchar(10) collate latin1_bin default NULL, `payer_email` varchar(60) collate latin1_bin default NULL, `contact_phone` varchar(50) collate latin1_bin default NULL, `payer_status` varchar(10) collate latin1_bin default NULL, `payment_type` varchar(10) collate latin1_bin default NULL, `notify_version` varchar(10) collate latin1_bin default NULL, `verify_sign` varchar(10) collate latin1_bin default NULL, `referrer_id` varchar(10) collate latin1_bin default NULL, PRIMARY KEY (`transaction_id`) ) ENGINE=MyISAM AUTO_INCREMENT=14 ;
- front_order_process.inc.php
- paypal.class.php
hier herunterladen
phpwcms_paypal.zip (10.39 KiB, 129 downloads)
und auf den Server/ in include/inc_module/mod_shop_paypal/inc kopieren.
Falls nicht bereits vorhanden in der default.html (bzw. diejenige Templatedatei die verwendet wird) folgende Einstellungen
Den Abschnitt:
<--- Config_Start ---> label_payby_prepay = "Cash with order" label_payby_pod = "Cash on delivery" label_payby_onbill = "On account"
mit folgendem erweitern:
label_payby_paypal = "PayPal"
Im Abschnitt:
<!--MAIL_CUSTOMER_START//-->
nach
Payment:
Ausgabe der Zahlart in der eMail mit
[PAYBY_PAYPAL]You have paid via Paypal.[/PAYBY_PAYPAL]
erreichen.
Nach
<!--MAIL_NEWORDER_END//-->
<!--PAYPAL_ORDER_DONE_START//--> <h2>Order {ORDER} successfully sent</h2> <p>Hello <strong>{INV_FIRSTNAME} {INV_NAME}</strong>,<br /> Thanks for your order. You will receive a notification of your oder status at <strong>{EMAIL}</strong> once confirmation of your payment has been received...</p> <p>Your order number is: <strong>{ORDER}</strong>. Please use this number in case you need to contact us by email.</p> <!--PAYPAL_ORDER_DONE_END//--> <!--PAYPAL_ORDER_DEBUG_START//--> <h2>Paypal class error message</h2> <p><strong>{DEBUG_MSG1} </strong></p> <p><strong>{DEBUG_MSG2} </strong></p> <!--PAYPAL_ORDER_DEBUG_END//--> <!--PAYPAL_ORDER_CANCELED_START//--> <h3>{MESSAGE}</h3> <!--PAYPAL_ORDER_CANCELED_END//-->
Damit ist die Templatedatei für PayPal angepasst.
Nach
$_tmpl['mail_neworder'] = get_tmpl_section('MAIL_NEWORDER', $_tmpl['source']);
das hinzufügen
$_tmpl['paypal_order_success'] = get_tmpl_section('PAYPAL_ORDER_DONE', $_tmpl['source']); $_tmpl['paypal_order_debug'] = get_tmpl_section('PAYPAL_ORDER_DEBUG', $_tmpl['source']); $_tmpl['paypal_order_canceled'] = get_tmpl_section('PAYPAL_ORDER_CANCELED', $_tmpl['source']);
und hinter
// merge config settings like translations and so on
'mail_neworder_subject' => "[#{ORDER}] New order",
das hinzufügen:
'label_payby_paypal' => "Paypal",
Suche nach
$order_process = str_replace('{ORDER}', $order_num, $order_process);
danach einfügen
} elseif( isset($_GET['shop_order_process']) ) { //process order via paypal ipn include($phpwcms['modules']['shop']['path'].'inc/front.order_process.inc.php');
Hinter der stelle
// receive order db ID
$order_data = _dbInsert('phpwcms_shop_orders', $order_data);
ein switch einfügen:
// success inserting db record of order $_SESSION['shopping_cart']['order_number'] = $order_num; switch( $_SESSION['shopping_cart']['payby'] ){ case 'paypal': headerRedirect(PHPWCMS_URL.$_tmpl['config']['cart_url']."&shop_order_process"); break; default:
ACHTUNG: switch nach routine
// NO success
mit
} //endswitch
wieder schließen.
Ersetzungen wie folgt. Nach
$plugin['data']['shop_pref_email_from'] = clean_slweg($_POST['pref_email_from']);
ggf. das einfügen
$plugin['data']['shop_pref_email_paypal'] = clean_slweg($_POST['pref_email_paypal']);
nach
if(! is_valid_email($plugin['data']['shop_pref_email_from']) ) $plugin['data']['shop_pref_email_from'] = '';
ggf. das einfügen:
if(! is_valid_email($plugin['data']['shop_pref_email_paypal']) ) $plugin['data']['shop_pref_email_paypal'] = '';
vor
'prepay' => empty($_POST['pref_payment_prepay']) ? 0 : 1,
ggf. das einfügen
'paypal' => empty($_POST['pref_payment_paypal']) ? 0 : 1,
nach
_setConfig('shop_pref_email_from', $plugin['data']['shop_pref_email_from'], 'module_shop');
ggf. das einfügen
_setConfig('shop_pref_email_paypal', $plugin['data']['shop_pref_email_paypal'], 'module_shop');
nach
'shop_pref_email_from' => '',
ggf. das einfügen
'shop_pref_email_paypal' => '',
nach
'prepay'=> 1,
ggf. das einfügen
'paypal' => 1,
Ggf. die language files unter /include/inc_module/mod_shop/lang mit paypal anreichern.
Das sollte eigentlich bei phpwcms > 2007 bereits vorhanden sein.
Bspw. für deutsch nach
$BLM['shopprod_payment_method'] = 'Zahlungsmethoden';
das einfügen
$BLM['shopprod_payby_paypal'] = 'PayPal'; $BLM['shopprod_email_paypal'] = 'PayPal E-Mail';
Ab jetzt müßte
a. die Zahlart PayPal Auswahl im Shop verfügbar sein \\ b. eine Weiterleitung zu PayPal geschehen (derzeit ist noch die Sandbox Testumgebung aktiv) \\ c. der Shop innerhalb seiner normalen Parameter funktionieren. \\
Sollte eine der oben aufgeführten Punkte nicht zutreffen gibt es ein Problem. Kontrollier bitte noch einmal ganz genau die Punkt eins bis drei.
Sollte es zu eigenartigen Weiterleitungen beim ABschliessen des Bestellprozesses kommen, dann trifft dies zu:
Die zur Verfügung gestellte Datei front.order_process.inc.php enthält einen Abschitt, zum Überprüfen des Referrer.
switch ($_GET['action']) {
case 'process': // Process and order...
validateReferrer( $phpwcms['site_domain'],
$phpwcms['machine_alias'].'.'.$phpwcms['site_domain']
);//or bail...
Diese Parameter $phpwcms['machine_alias'] und $phpwcms['site_domain'] existieren Standardmäßig nicht und sollten ggf. in die config.inc.php nachgetragen werden. Konkret wäre das:
$phpwcms['site_domain'] = 'domain.de'; // ohne www oder subdomain $phpwcms['machine_alias'] = 'alias'; // www oder subdomain
Bitte ggf auch die frontend.render.php ⇒ function validateReferrer() einsehen und verstehen was da passiert!
Wird ein Kunde zu Paypal weiter geleitet erscheint eine Meldung. Diese ist derzeit in englischer Sprache. Unter paypal.class.php kann dies verändert werden.
Such nach
// Generate the request header
und ersetze das darauf folgende
echo "<html>\n"; echo "<head><title>PayPal Zahlung...</title></head>\n"; echo "<body onLoad=\"document.forms['paypal_form'].submit();\">\n"; echo "<center><h2>Bitte warten. Sie werden jetzt zu PayPal weiter geleitet.</h2></center>\n"; echo "<form method=\"post\" name=\"paypal_form\" "; echo "action=\"".$this->paypal_url."\">\n"; foreach ($this->fields as $name => $value) { echo "<input type=\"hidden\" name=\"$name\" value=\"$value\"/>\n"; } echo "<center><br/><br/>Sollten Sie nicht innerhalb der nächsten Sekunden weitergeleitet werden "; echo "klicken Sie bitte hier...<br/><br/>\n"; echo "<input type=\"submit\" value=\"Zu PayPal\"></center>\n"; echo "</form>\n"; echo "</body></html>\n";
Die Success/ Error Page muß ebenso angepasst werden. Diese -wie zuvor angelegt/ eingefügt- im Template ganz am Ende zu finden.
beispielhafte deutsche übersetzung:
<!--PAYPAL_ORDER_DONE_START//--> <h2>Bestellung #{ORDER} erfolgreich platziert</h2> <p>Hallo <strong>{INV_FIRSTNAME} {INV_NAME}</strong>,<br /> Vielen Dank für deine Bestellung. Du erhälst eine Benachrichtigung an <strong>{EMAIL}</strong> sobald uns Deine Bezahlung von PayPal bestätigt wurde.</p> <p>Deine Bestellnummer lautet: <strong>{ORDER}</strong>. Bitte verwende die Nummer bei Rückfragen.</p> <!--PAYPAL_ORDER_DONE_END//--> <!--PAYPAL_ORDER_DEBUG_START//--> <h2>Paypal Fehler</h2> <p><strong>{DEBUG_MSG1} </strong></p> <p><strong>{DEBUG_MSG2} </strong></p> <!--PAYPAL_ORDER_DEBUG_END//-->
Zwar gibt es unter Shop > Produkte die Möglichkeit zu bestimmen ob ein Preis in brutto oder netto vorliegt. Die Erweiterung wertet dies jedoch nicht aus sondern geht standardmäßig von einem Netto-Preis aus. Das bedeutet PayPal rechnet noch einmal die Mehrwertsteuer oben drauf. Diese Erweiterung beseitigt das unerwünschte Verhalten.
ACHTUNG: Hier wäre eine Abfrage wünschenswert die anhand der Erfassung im Backend entscheidet ob Artikel mit oder ohne MwSt. an Paypal übergeben werden muß. Der folgende Core-Hack erfordert alle Produkte des Shops als Brutto.
Vorgehensweise: Quick&Dirty wird die Tax-Zeile aus der Übergabe an PayPal entfernt.
foreach ($this->fields as $name => $value) { echo "<input type=\"hidden\" name=\"$name\" value=\"$value\"/>\n"; }
foreach ($this->fields as $name => $value) { //remove tax from data-output + q23.media 23102011 if (substr($name, 0, 3) != 'tax') { echo "<input type=\"hidden\" name=\"$name\" value=\"$value\"/>\n"; } }