Differences

This shows you the differences between two versions of the page.

deutsch:module:shop:paypal-neu [2012/02/26 13:58]
Robert
deutsch:module:shop:paypal-neu [2018/06/03 18:09] (current)
Line 17: Line 17:
==== #1: DB-Update ==== ==== #1: DB-Update ====
-Es muß eine neuen Zwischenspeicher-Tabelle angelegt werden.+Es muß eine neue Zwischenspeicher-Tabelle angelegt werden.
<code php|h SQL-Anweisung in phpmyadmin ausführen:|h> <code php|h SQL-Anweisung in phpmyadmin ausführen:|h>
Line 51: Line 51:
) ENGINE=MyISAM AUTO_INCREMENT=14 ; ) ENGINE=MyISAM AUTO_INCREMENT=14 ;
</code> </code>
 + \\
 + \\
 + \\
 + \\
==== #2: Einspielen der notwendige Dateien ==== ==== #2: Einspielen der notwendige Dateien ====
- front_order_process.inc.php \\ - front_order_process.inc.php \\
- paypal.class.php \\ - paypal.class.php \\
-hier herunterladen +hier herunterladen \\ 
-{{:deutsch:module:shop:phpwcms_paypal.zip|}} +{{:deutsch:module:shop:phpwcms_r421andup_paypal.zip|}} 
-und auf den Server/ in include/inc_module/mod_shop_paypal/inc kopieren.+und auf den Server in include/inc_module/mod_shop_paypal/inc kopieren.
 \\  \\
-==== #3: Modifizieren des bestehenden Orderprocess ==== 
 \\  \\
 \\  \\
 + \\
 +
 +==== #3: Modifizieren des bestehenden Orderprocess ====
=== 1. Template File === === 1. Template File ===
Line 123: Line 129:
-=== 2.1: frontend.render.php ===+=== 2: frontend.render.php ===
Nach Nach
<code> <code>
Line 173: Line 179:
$_SESSION['shopping_cart']['order_number'] = $order_num; $_SESSION['shopping_cart']['order_number'] = $order_num;
- switch( $_SESSION['shopping_cart']['payby'] ){ + switch( $_SESSION[CART_KEY]['payby'] ){ 
- +
case 'paypal': case 'paypal':
headerRedirect(PHPWCMS_URL.$_tmpl['config']['cart_url']."&shop_order_process"); headerRedirect(PHPWCMS_URL.$_tmpl['config']['cart_url']."&shop_order_process");
Line 191: Line 197:
} //endswitch } //endswitch
</code> </code>
-wieder schließen. \\+wieder schließen.
 \\  \\
- 
- 
- 
- 
- 
- 
- 
-=== 7. processing.preferences.inc.php === 
-Ersetzungen wie folgt. Nach 
-<code> 
-  $plugin['data']['shop_pref_email_from'] = clean_slweg($_POST['pref_email_from']); 
-</code> 
-ggf. das einfügen 
-<code> 
- $plugin['data']['shop_pref_email_paypal'] = clean_slweg($_POST['pref_email_paypal']); 
-</code> 
 \\  \\
-nach 
-<code> 
- if(! is_valid_email($plugin['data']['shop_pref_email_from']) ) $plugin['data']['shop_pref_email_from'] = ''; 
-</code> 
-ggf. das einfügen: 
-<code> 
- if(! is_valid_email($plugin['data']['shop_pref_email_paypal']) ) $plugin['data']['shop_pref_email_paypal'] = ''; 
-</code> 
 \\  \\
-vor+ \\  
 +Suche
<code> <code>
- 'prepay' => empty($_POST['pref_payment_prepay']) ? 0 : 1,+$supported = array('prepay' => 0, 'pod' => 0, 'onbill' => 0);
</code> </code>
-ggf. das einfügen +und überschreiben mit 
-<code> +<code php|h $supported mit:|h
- 'paypal' => empty($_POST['pref_payment_paypal']) ? 0 : 1, +$supported = array('paypal' => 0, 'prepay' => 0, 'pod' => 0, 'onbill' => 0);
-</code> +
- \\  +
-nach +
-<code> +
- _setConfig('shop_pref_email_from', $plugin['data']['shop_pref_email_from'], 'module_shop'); +
-</code> +
-ggf. das einfügen +
-<code> +
- _setConfig('shop_pref_email_paypal', $plugin['data']['shop_pref_email_paypal'], 'module_shop');+
</code> </code>
 +überschreiben.
 \\  \\
-nach 
-<code> 
- 'shop_pref_email_from' => '', 
-</code> 
-ggf. das einfügen 
-<code> 
- 'shop_pref_email_paypal' => '', 
-</code> 
 \\  \\
-nach 
-<code> 
- 'prepay'=> 1,  
-</code> 
-ggf. das einfügen 
-<code> 
- 'paypal' => 1, 
-</code> 
 \\  \\
- \\  
-=== 8. Language-Files === 
-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 +Das ans ende vor dem schließenden PHP-Tag kopieren: 
-<code> +<code php|h |h
-$BLM['shopprod_payment_method'] = 'Zahlungsmethoden'; +function validateReferrer( $yoursite, //Your site url without 'http://' or subdomain 
-</code> + $domain_name //Type your domain with www. this time 
-das einfügen +
-<code> +{
-$BLM['shopprod_payby_paypal'] = 'PayPal'; +
-$BLM['shopprod_email_paypal'] = 'PayPal E-Mail'; +
-</code+
- \\ +
- \\ +
- \\ +
-==== #4: Zwischenzusammenfassung ==== +
-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. +
-<code+
- switch ($_GET['action']) { +
-  +
-    case 'process':      // Process and order... +
- validateReferrer(  $phpwcms['site_domain'], +
-    $phpwcms['machine_alias'].'.'.$phpwcms['site_domain']  +
- );//or bail... +
-</code> +
-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: +
-<code> +
-$phpwcms['site_domain'] = 'domain.de'; // ohne www oder subdomain +
-$phpwcms['machine_alias'] = 'alias'; // www oder subdomain +
-</code>+
-Bitte ggf auch die frontend.render.php =&gt; function validateReferrer() einsehen und verstehen was da passiert!+ $referer = $_SERVER['HTTP_REFERER']; 
 + //Check if browser sends referrer url or not 
 + if ($referer == &quot;") { //If not, set referrer as your domain 
 + $domain = $yoursite; 
 + } else { 
 + $domain = parse_url($referer); //If yes, parse referrer 
 + }
-==== #5.1: Übersetzung ==== + if($domain['host'] == $yoursite || $domain['host'] == $domain_name) {
-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 +
-<code> +
-// Generate the request header +
-</code> +
-und ersetze das darauf folgende +
-<code php|h beispielhaft mit:|h> +
- echo "<html>\n"; +
- echo "<head><title>PayPal Zahlung...</title></head>\n";+
- echo "<body onLoad=\"document.forms['paypal_form'].submit();\">\n";+ //Run your dowloading code here normally
- echo "<center><h2>Bitte warten. Sie werden jetzt zu PayPal weiter geleitet.</h2></center>\n"; + } else { 
- echo "<form method=\"post\" name=\"paypal_form\" "; + 
- echo "action=\"".$this->paypal_url."\">\n";;+ //The referrer is not your site, we bail and redirect to  home page 
 + header("Location: http://".$domain_name."/index.php"); 
 + 
 + exit(); //Stop running the script
- 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&gt;\n"; + 
- echo "&lt;/body&gt;&lt;/html&gt;\n";+ 
 +function reinitialize_session(&$_tmpl){ 
 + 
 + $_SESSION['shopping_cart']['order_number'] = ( isset($_POST['invoice']) ? clean_slweg($_POST['invoice']) : '' ); 
 + $_SESSION['shopping_cart']['step1'] = array( 
 +  
 + 'INV_FIRSTNAME' => isset($_POST['first_name']) ? clean_slweg($_POST['first_name']) : '', 
 + 'INV_NAME' => isset($_POST['last_name']) ? clean_slweg($_POST['last_name']) : '', 
 + 'INV_ADDRESS' => isset($_POST['address_street']) ? clean_slweg($_POST['address_street']) : '', 
 + 'INV_ZIP' => isset($_POST['address_zip']) ? clean_slweg($_POST['address_zip']) : '', 
 + 'INV_CITY' => isset($_POST['address_city']) ? clean_slweg($_POST['address_city']) : '', 
 + 'INV_REGION' => isset($_POST['address_state']) ? clean_slweg($_POST['address_state']) : '', 
 + 'INV_COUNTRY' => isset($_POST['address_country']) ? clean_slweg($_POST['address_country']) : '', 
 + 'EMAIL' => isset($_POST['payer_email']) ? clean_slweg($_POST['payer_email']) : '', 
 + 'PHONE' => isset($_POST['contact_phone']) ? clean_slweg($_POST['contact_phone']) : '' 
 +  
 + ); 
 +  
 +  
 +
 + 
 +function reinitialize_cart_products( $order_num ){ 
 + 
 + $cart_data = Array(); 
 + $cart_data[0] = "uninitialized"; 
 +  
 +  
 + $q_result = _dbQuery("SELECT * FROM ".DB_PREPEND."phpwcms_shop_orders WHERE order_number='".$order_num."' LIMIT 1"); 
 + 
 + if(isset($q_result[0])){ 
 +  
 + $cart_data  = unserialize($q_result[0]['order_data']); 
 + 
 +
 +  
 + return $cart_data; 
 +  
 +
 + 
 +function update_transactions_table(&$cart_data, &$P){ 
 + $temp = Array(   
 + "txn_id",  
 + "reason_code", 
 + "receiver_email",  
 + "mc_gross",  
 + "protection_eligibility",  
 + "address_status",  
 + "payer_id",  
 + "tax",  
 + "address_street",  
 + "payment_date",  
 + "payment_status",  
 + "charset",  
 + "address_zip",  
 + "mc_shipping",  
 + "mc_handling",  
 + "first_name",  
 + "mc_fee",  
 + "address_country_code",  
 + "address_name",  
 + "notify_version",  
 + "custom",  
 + "invoice",  
 + "num_cart_items", 
 + "payer_status",  
 + "business",  
 + "address_country", 
 + "address_city",  
 + "payer_email",  
 + "contact_phone", 
 + "verify_sign",  
 + "payment_type",  
 + "last_name",  
 + "address_state",  
 + "payment_fee",  
 + "pending_reason",  
 + "receiver_id",  
 + "txn_type",  
 + "mc_currency",  
 + "residence_country",  
 + "receipt_id",  
 + "test_ipn",  
 + "transaction_subject",  
 + "payment_gross",  
 + "merchant_return_link",  
 + "form_charset"  
 + ); 
 + 
 +  
 + $trans = Array(); 
 +  
 + foreach( $temp  as $key ){ 
 + 
 + $trans[$key] = ( isset( $_POST[$key]) ? clean_slweg($_POST[$key]) : ''); 
 +  
 +
 + 
 + for( $i=0; $i < $trans['num_cart_items']; $i++ ){ 
 +  
 +  
 + $trans['item_number'.($i+1)] = ( isset( $_POST['item_number' . ($i+1)]) ? clean_slweg($_POST['item_number'. ($i+1)]) : ''); 
 + $trans['mc_gross_'.($i+1)] = ( isset( $_POST['mc_gross_'   . ($i+1)]) ? clean_slweg($_POST['mc_gross_'  . ($i+1)]) : ''); 
 + $trans['quantity'.($i+1)] = ( isset( $_POST['quantity'    . ($i+1)]) ? clean_slweg($_POST['quantity'   . ($i+1)]) : ''); 
 +  
 +  
 + }  
 +  
 + $validTransaction = true; 
 +  
 + // test the txn_id; if txn_id is used and it's not a chargeback then it's invalid 
 + $txn_id_is_used = _dbCount(&quot;SELECT * FROM ".DB_PREPEND."phpwcms_shop_transactions WHERE txn_id='".$trans['txn_id']."'");  
 +  
 + if(  $txn_id_is_used && !isset($trans['reason_code']) && !( empty($trans['txn_type']) && ($trans['reason_code'] === "chargeback")) ){ 
 + $validTransaction = false; 
 + $lastError  .= "Failed Anti-fraud test 1: txn_id is used: ".$txn_id_is_used."   txn_type: ".$trans['txn_type']."  trans_reason_code: ".$trans['reason_code'].";\n"; 
 + }  
 +  
 + // test receiver_email 
 + if( $validTransaction && !( $trans['receiver_email'] === _getConfig( 'shop_pref_email_paypal', '_shopPref' ) ) ){ 
 + $validTransaction = false; 
 + $lastError  .= "Failed Anti-fraud test 2: unmatched email addresses for receiver_email: &quot;.$trans['receiver_email']." vs "._getConfig( 'shop_pref_email_paypal', '_shopPref' )."\n"; 
 +
 +  
 + // validate number of items  
 + if( $validTransaction &amp;&amp; ( count($cart_data['cart']) != $trans['num_cart_items'])){ 
 + $validTransaction = false; 
 + $lastError .= "Failed Anti-fraud test 3: number of items mismatch: items in cart: ".count($cart_data['cart'])." vs items in post: ".$trans['num_cart_items']."\n"; 
 +
 +  
 + // test to see that cart items match 
 + if( $validTransaction ){ 
 +  
 + for( $i=0; $i &lt; $trans['num_cart_items']; $i++ ){ 
 +  
 +  
 + if( $cart_data['cart'][$i]['shopprod_id']       != $trans['item_number'.($i+1)] ||  
 + $cart_data['cart'][$i]['shopprod_price']    != $trans['mc_gross_'.($i+1)] ||  
 +    $cart_data['cart'][$i]['shopprod_quantity'] != $trans['quantity'.($i+1)] ){ 
 + 
 + $validTransaction = false; 
 + 
 + $lastError  .= ";\n\nFailed Anti-fraud test 3: product mismatch: \n"; 
 + $lastError  .= $cart_data['cart'][$i]['shopprod_id']." != ".$trans['item_number'.($i+1)].",\n"; 
 + $lastError  .= $cart_data['cart'][$i]['shopprod_price']." != ".$trans['mc_gross_'.($i+1)].",\n"; 
 + $lastError  .= $cart_data['cart'][$i]['shopprod_quantity']." != ".$trans['quantity'.($i+1)]."\n\n"; 
 +  
 +
 +  
 +
 +  
 +  
 +
 + 
 +  
 + if( $validTransaction ){  // No fraud detected 
 + $data = Array( 
 + 'receiver_email' => $trans['receiver_email'], 
 + 'order_number' => $trans['invoice'], 
 + 'payment_status' => $trans['payment_status'], 
 + 'pending_reason' => $trans['pending_reason'], 
 + 'payment_date' => $trans['payment_date'], 
 + 'mc_gross' => $trans['mc_gross'], 
 + 'mc_fee' => $trans['mc_fee'], 
 + 'tax' => $trans['tax'], 
 + 'mc_currency' => $trans['mc_currency'], 
 + 'txn_id' => $trans['txn_id'], 
 + 'txn_type' => $trans['txn_type'], 
 + 'first_name' => $trans['first_name'], 
 + 'last_name' => $trans['last_name'], 
 + 'address_street' => $trans['address_street'], 
 + 'address_city' => $trans['address_city'], 
 + 'address_state' => $trans['address_state'], 
 + 'address_zip' => $trans['address_zip'], 
 + 'address_country'   => $trans['address_country'], 
 + 'address_status'   => $trans['address_status'], 
 + 'payer_email'     => $trans['payer_email'], 
 + 'contact_phone'     => $trans['contact_phone'], 
 + 'payer_status'     => $trans['payer_status'], 
 + 'payment_type'     => $trans['payment_type'], 
 + 'notify_version'   => $trans['notify_version'], 
 + 'verify_sign'       => $trans['verify_sign'], 
 + 'referrer_id'     => $trans['referrer_id'] 
 + );  
 +  
 +  
 +  
 + _dbInsertOrUpdate( DB_PREPEND."phpwcms_shop_transactions", $data, "txn_id = '".$trans['txn_id']."'", ''); 
 +  
 +  
 + }else{ 
 +  
 + $P->log_error($lastError ); 
 +
 + 
 + return $validTransaction; 
 +  
 +}
</code> </code>
 \\  \\
 \\  \\
-==== #5.2: Übersetzung ==== 
-Die Success/ Error Page muß ebenso angepasst werden. Diese -wie zuvor angelegt/ eingefügt- im Template ganz am Ende zu finden. \\ 
 \\  \\
-<code php|h beispielhafte deutsche übersetzung:|h> + \\
-<!--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//--> +==== #4: Zusammenfassung ==== 
- <h2>Paypal Fehler</h2> +Jetzt müßte \\ 
- <p><strong>{DEBUG_MSG1} </strong></p> +  a. die Zahlart PayPal Auswahl im Shop verfügbar sein 
- <p><strong>{DEBUG_MSG2} </strong></p> +  b. der Shop innerhalb seiner normalen Parameter funktionieren 
-<!--PAYPAL_ORDER_DEBUG_END//--> +  c. eine Weiterleitung geschehen (höchstwahrscheinlich fehlerhaft!)
-</code>+
 \\  \\
 +Sollte eine der oben aufgeführten Punkte nicht zutreffen gibt es ein Problem. Kontrollier bitte noch einmal ganz genau die Punkt eins bis drei.
 \\  \\
 \\  \\
-==== #6: Beheben des Steuerbug ==== 
-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. \\ +==== #5: config.inc.php ==== 
- \\ +Mit großer Wahrscheinlichkeit ist die Weiterleitungen beim Abschliessen des Bestellprozesses fehlerhaft. Die Parameter $phpwcms['machine_alias'] und $phpwcms['site_domain'] existieren Standardmäßig nicht und sollten in die config.inc.php nachgetragen werden. 
-Vorgehensweise: Quick&Dirty wird die Tax-Zeile aus der Übergabe an PayPal entfernt. \\ +Konkret wäre das
- \\ +<code> 
-<code php|h Suche in paypal.class.php: |h> +$phpwcms['site_domain'] = 'domain.de'; // ohne www oder subdomain 
-      foreach ($this->fields as $name => $value) { +$phpwcms['machine_alias'] = 'alias'; // www oder subdomain
-        echo "<input type=\"hidden\" name=\"$name\" value=\"$value\"/>\n"; +
-      } +
-</code> +
-<code php|h Ersetze die Funktion mit: |h> +
-      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"; +
-+
-      }+
</code> </code>
 + \\
 +In diesem Zusammenhang auch die frontend.render.php => function validateReferrer() einsehen und verstehen was da passiert!
deutsch/module/shop/paypal-neu.1330261124.txt.gz · Last modified: 2018/06/03 18:07 (external edit)
www.planmatrix.de www.chimeric.de Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0