Heim >Backend-Entwicklung >PHP-Tutorial >Zencart zahlt nach der Bestellung, ähnlich wie bei der Änderung des Bestellpreises im Taobao-Backend.
Wenn Zencart Paypal zur Zahlung verwendet, kommt es zu verpassten Bestellungen, d. h. Paypal hat die Zahlung des Kunden erhalten, es liegt jedoch keine Bestellung des Kunden im Backend der Website vor. Der Hauptgrund für fehlende Bestellungen bei Paypal liegt darin, dass der Kunde, wenn er zur Paypal-Website springt und die Zahlung abschließt, das Fenster direkt schließt oder das Netzwerk instabil ist und nicht normal zur Website springt.
Es gibt mehrere Lösungen für das Problem verpasster Bestellungen bei Paypal:
1 Aktivieren Sie die Option „Detaillierte Einzelposten im Warenkorb“.
Prinzip: Aktivieren Sie die Option „Detaillierte Einzelposten im Warenkorb“ im zencart-Backend-Modul –> PayPal Website Payments Standard – IPN. Mit dieser Option werden alle Artikelinformationen Ihrer Bestellung an PayPal übertragen. Wenn der Kunde erfolgreich bezahlt, das Backend die Bestellung jedoch nicht erfolgreich generieren kann, können Sie auch sehen, welche Artikel der Kunde über die Transaktionsinformationen des PayPal-Kontos gekauft hat.
2. Verwenden Sie das Paypal Sessions Viewer-Plugin, um von Paypal verpasste Bestellungen abzurufen.
Prinzip: Wenn die Artikel im zencart-Einkaufswagen über Paypal bezahlt werden, werden alle Datensätze der Zahlung in der Tabelle paypal_session gespeichert. Wenn die Zahlung erfolgreich ist, springt die Paypal-Website zur Shopping-Website und an Wenn eine Bestellung generiert wird, löscht das zencart-System automatisch diesen paypal_session-Datensatz und generiert keine erfolgreiche Bestellung. Bei Verwendung von Paypal werden diese Zahlungsdatensätze immer gespeichert Mit dem Session Viewer-Plugin können Sie alle aufgezeichneten Daten anzeigen, einschließlich Kundeninformationen, Einkaufszeit und Produktinformationen. Wenn Sie sicher sind, dass die Zahlung eingegangen ist, können Sie diese paypal_session-Informationen in die Bestellung übertragen und eine Bestellung generieren.
Plug-in-Download-Adresse: http://www.zen-cart.cn/english-version-modules/admin-tools/paypal-sessions-viewer
3. Ändern Sie den Zahlungsvorgang, geben Sie zuerst eine Bestellung auf und bezahlen Sie dann.
Grundsatz: Jeder, der zen-cart verwendet hat, weiß, dass die Bestellschritte in zen-cart wie folgt sind (die Ausdrücke in [] sind nicht erforderlich):
1 🎜>
2. [Lieferart]3. Bestellbestätigung (Bestätigung)[Zahlung durch Dritte]6. Bestellabwicklung (Bezahlvorgang) – Dieser Schritt ist wichtiger, da hier die Informationen im Warenkorb in die Bestellung übernommen werdenBestellung erfolgreich (Bezahlvorgang erfolgreich)Unter normalen Umständen gibt es bei diesem Vorgang kein Problem. Im Prozess von Schritt 5 bis Schritt 6 denkt der Benutzer jedoch möglicherweise, dass die Zahlung erfolgreich war, und schließt die Webseite direkt, oder der Benutzer kann aus Netzwerkgründen möglicherweise nicht normal zur Seite „checkout_process“ springen Dies ist sehr schwerwiegend, da die Bestellung nicht normal erstellt werden kann. Basierend auf der obigen Analyse hoffen wir, den Prozess leicht zu ändern, d. h. die Bestellung wurde vor der Zahlung erstellt, sodass wir den Benutzer nicht bezahlen müssen, selbst wenn die Zahlung nicht von der Zahlungswebsite des Drittanbieters zurückgesprungen werden kann erfolgreich, aber im Hintergrund wird kein Fehler angezeigt. Der Status der Bestellung. Ich habe das Tutorial von Herrn Dongguo zum Ändern des Zen-Cart-Bestell- und Zahlungsprozesses befolgt, um fehlende Bestellungen zu vermeiden. Da dieses Tutorial relativ alt und nicht sehr umfassend ist, habe ich es auf meinen eigenen tatsächlichen Bedürfnissen basiert sollte es perfekter und detaillierter machen. Der geänderte Entwurf sieht im Wesentlichen wie folgt aus: 1 Nachdem Sie die Bestellung auf der Seite „checkour_confirmation“ bestätigt haben, gelangen Sie direkt zur Seite „account_history_info“, auf der Sie die Zahlungsseite aufrufen können. Wie im Bild unten gezeigt:
2. Wenn der Kunde zu diesem Zeitpunkt nicht zahlt, kann er auch sein eigenes Backend eingeben, um für historische Bestellungen zu bezahlen. Wie im Bild unten gezeigt:
3. Bei unbezahlten Bestellungen können Sie den Preis im Hintergrund ändern, wie Taobao, der Ladenbesitzer wird den Preis vor der Zahlung für Sie ändern. Wie in der Abbildung unten gezeigt:
Lassen Sie uns den Code formal ändern. Zuerst liste ich alle zu ändernden Dateien auf:
1 /zahlung .php2. Includes/modules/paypal.php3. Includes/modules/pages/ checkout_process/ header_php.php5. Includes/modules/pages/account_history_info/header_php.php6. Includes/templates/Ihr Vorlagenverzeichnis/templates/tpl_account_history_info_default.php 7. Includes/templates/Ihr Vorlagenverzeichnis/templates/tpl_account_history_default.php8. ipn_main_handler.php9. admin (Backend-Verzeichnis)/orders.phpDa Sie zuerst eine Bestellung erstellen und dann bezahlen, ist der Zahlungsschritt ein Schritt mehr als zuvor. Um den Zahlungsvorgang zu vereinfachen, habe ich zuvor das Plug-in „Fast And Easy Checkout For Zencart“ installiert Wenn Sie dieses Plug-in installieren, müssen Sie ein weiteres Plug-in Css Js Loader für Zencart installieren, das ein abhängiges Plug-in des Fast-Payment-Plug-ins ist. Es besteht kein kausaler Zusammenhang zwischen der schnellen Zahlung und der Zahlung nach der Bestellung, Sie können es also ignorieren, wenn Sie es nicht installieren möchten.
Befolgen Sie die Schritte, um die oben aufgeführten Dateien zu ändern:
Zuerst müssen wir das vorhandene Zahlungsmodul umwandeln. Sie müssen der Zahlungsmethodenklasse ein Feld „paynow_action_url“ hinzufügen, um die Seiten-URL für die Zahlung darzustellen. Darüber hinaus müssen Sie eine Funktion „paynow_button($order_id)“ hinzufügen, um den versteckten Parameterfeldcode des Zahlungsformulars zu erhalten.
Um die Variable paynow_action_url hinzuzufügen, fügen Sie bitte den folgenden Code am Ende des Konstruktors der Klassenzahlung hinzu:
<span>if</span> ( (zen_not_null(<span>$module</span>)) && (<span>in_array</span>(<span>$module</span>.'.php', <span>$this</span>->modules)) && (<span>isset</span>(<span>$GLOBALS</span>[<span>$module</span>]-><span>paynow_action_url)) ) { </span><span>$this</span>->paynow_action_url = <span>$GLOBALS</span>[<span>$module</span>]-><span>paynow_action_url; }</span>
Um die Variable paynow_button($order_id) hinzuzufügen Funktion, Bitte fügen Sie nach der letzten Funktion der Zahlungsklasse den folgenden Code hinzu:
<span>function</span> paynow_button(<span>$order_id</span><span>){ </span><span>if</span> (<span>is_array</span>(<span>$this</span>-><span>modules)) { </span><span>if</span> (<span>is_object</span>(<span>$GLOBALS</span>[<span>$this</span>-><span>selected_module])) { </span><span>return</span><span>$GLOBALS</span>[<span>$this</span>->selected_module]->paynow_button(<span>$order_id</span><span>); } } }</span>
2. Nehmen Sie die PayPal-Zahlungsmethode als Beispiel, um die Implementierung zu erklären. Ändern Sie die Datei paypal.php direkt hier. Stellen Sie sicher, dass Sie diese Datei sichern. Der Code ist wie unten gezeigt. Sie können sehen, dass die Angabe von form_action_url hier entfernt und paynow_action_url angegeben wird. Da wir hoffen, dass der Benutzer nach dem Klicken auf „Bestellung bestätigen“ direkt in den Checkout-Prozess eintritt. Wenn form_action_url nicht angegeben ist, wird der Code angezeigt Das Formular zur Bestätigung der Bestellung wird direkt an die Seite checkout_process gesendet, und paynow_action_url ist der Wert der vorherigen form_action_url. Die Implementierung der paynow_button-Funktion ist ebenfalls sehr einfach. Hier haben wir lediglich den Inhalt der ursprünglichen Funktion „process_button()“ herausgeschnitten, aber anstatt die globale Variable $order zu verwenden, verwenden wir $order = new order($order_id), um An Objekt, das zur Vorbereitung der Anzeige der Schaltfläche „Jetzt bezahlen“ in historischen Bestellungen erstellt wurde. Die geänderte Datei von paypal.php lautet wie folgt:
<span> 1</span> <?<span>php </span><span>2</span><span>/*</span><span>* </span><span> 3</span><span> * paypal.php-Zahlungsmodulklasse für die PayPal Website Payments Standard (IPN)-Methode </span><span> 4</span><span> * </span><span> 5</span><span> * @package paymentMethod </span><span> 6</span><span> * @copyright Copyright 2003-2010 Zen Cart Development Team </span><span> 7</span><span> * @copyright Teile Copyright 2003 osCommerce </span><span> 8</span><span> * @license http://www.zen-cart.com/license/2_0.txt GNU Public License V2.0 </span><span> 9</span><span> * @version $Id: paypal.php 15735 2010-03-29 07:13:53Z drbyte $ </span><span> 10</span><span>*/</span><span> 11</span><span> 12</span><span>define</span>('MODULE_PAYMENT_PAYPAL_TAX_OVERRIDE', 'true'<span> ); </span><span>13</span><span>14</span><span>/*</span><span>* </span><span> 15</span><span> * Stellen Sie sicher, dass Abhängigkeiten geladen werden </span><span> 16</span><span>*/</span><span> 17</span><span>include_once</span>((IS_ADMIN_FLAG === <span>true</span> ? DIR_FS_CATALOG_MODULES : DIR_WS_MODULES) . 'zahlung/paypal/paypal_functions.php'<span>); </span><span>18</span><span>19</span><span>/*</span><span>* </span><span> 20</span><span> * paypal.php-Zahlungsmodulklasse für die PayPal Website Payments Standard (IPN)-Methode </span><span>21</span><span> * </span><span>22</span><span>*/</span><span>23</span><span>Klasse</span> Paypal <span>verlängert</span><span> Basis { </span><span>24</span><span>/*</span><span>* </span><span> 25</span><span> * Zeichenfolge, die die Zahlungsmethode darstellt </span><span>26</span><span> * </span><span> 27</span><span> * @var string </span><span>28</span><span>*/</span><span>29</span><span>var</span><span>$code</span><span>; </span><span>30</span><span>/*</span><span>* </span><span> 31</span><span> * $title ist der angezeigte Name für diese Zahlungsmethode </span><span>32</span><span> * </span><span> 33</span><span> * @var string </span><span> 34</span><span>*/</span><span> 35</span><span>var</span><span>$title</span><span>; </span><span>36</span><span>/*</span><span>* </span><span> 37</span><span> * $description ist ein weicher Name für diese Zahlungsmethode </span><span>38</span><span> * </span><span> 39</span><span> * @var string </span><span> 40</span><span>*/</span><span> 41</span><span>var</span><span>$description</span><span>; </span><span>42</span><span>/*</span><span>* </span><span> 43</span><span> * $enabled bestimmt, ob dieses Modul im Katalog angezeigt wird oder nicht. </span><span>44</span><span> * </span><span> 45</span><span> * @var boolean </span><span> 46</span><span>*/</span><span> 47</span><span>var</span><span>$enabled</span><span>; </span><span>48</span><span>/*</span><span>* </span><span> 49</span><span> * Konstruktor </span><span>50</span><span> * </span><span> 51</span><span> * @param int $paypal_ipn_id </span><span> 52</span><span> * @return paypal </span><span> 53</span><span>*/</span><span> 54</span><span>Funktion</span> paypal(<span>$paypal_ipn_id</span> = ''<span>) { </span><span> 55</span><span>global</span><span>$order</span>, <span>$messageStack</span><span>; </span><span> 56</span><span>$this</span>->code = 'paypal'<span>; </span><span> 57</span><span>$this</span>->codeVersion = '1.3.9'<span>; </span><span> 58</span><span>if</span> (IS_ADMIN_FLAG === <span>true</span><span>) { </span><span> 59</span><span>$this</span>->title = MODULE_PAYMENT_PAYPAL_TEXT_ADMIN_TITLE; <span>//</span><span>Titel des Zahlungsmoduls in Admin</span><span> 60</span><span>if</span> (IS_ADMIN_FLAG === <span>true</span> && <span>definiert </span>('MODULE_PAYMENT_PAYPAL_IPN_DEBUG') && MODULE_PAYMENT_PAYPAL_IPN_DEBUG != 'Aus') <span>$this</span>->title .= '<span> (Debug-Modus aktiv)</span>'<span>; </span><span> 61</span><span>if</span> (IS_ADMIN_FLAG === <span>true</span> && MODULE_PAYMENT_PAYPAL_TESTING == 'Test') <span>$this</span>->title . = '<span> (Entwicklungs-/Testmodus aktiv)</span>'<span>; </span><span> 62</span> } <span>else</span><span> { </span><span> 63</span><span>$this</span>->title = MODULE_PAYMENT_PAYPAL_TEXT_CATALOG_TITLE; <span>//</span><span>Titel des Zahlungsmoduls im Katalog</span><span> 64</span><span> }</span><span> 65</span><span>$this</span>->description =<span> MODULE_PAYMENT_PAYPAL_TEXT_DESCRIPTION; </span><span> 66</span><span>$this</span>->sort_order =<span> MODULE_PAYMENT_PAYPAL_SORT_ORDER; </span><span> 67</span><span>$this</span>->enabled = ((MODULE_PAYMENT_PAYPAL_STATUS == 'True') ? <span>true</span> : <span>false</span><span>); </span><span> 68</span><span>if</span> ((int)MODULE_PAYMENT_PAYPAL_ORDER_STATUS_ID > 0<span>) { </span><span> 69</span><span>$this</span>->order_status =<span> MODULE_PAYMENT_PAYPAL_ORDER_STATUS_ID; </span><span>70</span><span> } </span><span> 71</span><span>if</span> (<span>is_object</span>(<span>$order</span>)) <span>$this</span>-><span> update_status(); </span><span> 72</span><span>$this</span>->paynow_action_url = 'https://' .<span> MODULE_PAYMENT_PAYPAL_HANDLER; </span><span> 73</span><span> 74</span><span>if</span> (PROJECT_VERSION_MAJOR != '1' && <span>substr</span>(PROJECT_VERSION_MINOR, 0, 3) != '3.9 ') <span>$this</span>->enabled = <span>false</span><span>; </span><span> 75</span><span> 76</span><span>//</span><span> Tabellenstruktur überprüfen</span><span> 77</span><span>if</span> (IS_ADMIN_FLAG === <span>true</span>) <span>$this</span>-><span>tableCheckup(); </span><span> 78</span><span> } </span><span>79</span><span>/*</span><span>* </span><span> 80</span><span> * Berechnen Sie Zonenübereinstimmungen und Flaggeneinstellungen, um zu bestimmen, ob dieses Modul den Kunden angezeigt werden soll oder nicht </span><span>81</span><span> * </span><span> 82</span><span>*/</span><span> 83</span><span>Funktion</span><span> update_status() { </span><span> 84</span><span>global</span><span>$order</span>, <span>$db</span><span>; </span><span> 85</span><span> 86</span><span>if</span> ( (<span>$this</span>->enabled == <span>true</span>) && ( (int)MODULE_PAYMENT_PAYPAL_ZONE > 0<span>) ) { </span><span> 87</span><span>$check_flag</span> = <span>false</span><span>; </span><span> 88</span><span>$check_query</span> = <span>$db</span>->Execute("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_PAYPAL_ZONE . " ' und zone_country_id = '" . <span>$order</span>->billing['country']['id'] . "' order by zone_id"<span>); </span><span> 89</span><span>while</span> (!<span>$check_query</span>-><span>EOF) { </span><span> 90</span><span>if</span> (<span>$check_query</span>->fields['zone_id'] < 1<span>) { </span><span> 91</span><span>$check_flag</span> = <span>true</span><span>; </span><span>92</span><span>Pause</span><span>; </span><span> 93</span> } <span>elseif</span> (<span>$check_query</span>->fields['zone_id'] == <span>$order</span>->billing ['zone_id'<span>]) { </span><span> 94</span><span>$check_flag</span> = <span>true</span><span>; </span><span>95</span><span>Pause</span><span>; </span><span> 96</span><span> } </span><span> 97</span><span>$check_query</span>-><span>MoveNext(); </span><span> 98</span><span> } </span><span>99</span><span>100</span><span>if</span> (<span>$check_flag</span> == <span>false</span><span>) { </span><span>101</span><span>$this</span>->enabled = <span>false</span><span>; </span><span>102</span><span> } </span><span>103</span><span> } </span><span>104</span><span> } </span><span>105</span><span>/*</span><span>* </span><span>106</span><span> * JS-Validierung, die eine Fehlerprüfung der Dateneingabe durchführt, wenn dieses Modul zur Verwendung ausgewählt ist </span><span>107</span><span> * (Nummer, Besitzer und CVV-Längen) </span><span>108</span><span> * </span><span>109</span><span> * @return string </span><span>110</span><span>*/</span><span>111</span><span>Funktion</span><span> javascript_validation() { </span><span>112</span><span>return</span><span>false</span><span>; </span><span>113</span><span> } </span><span>114</span><span>/*</span><span>* </span><span>115</span><span> * Zeigt den Namen der Zahlungsmethode zusammen mit den Eingabefeldern für Kreditkarteninformationen (falls vorhanden) auf der Zahlungsseite zur Kasse an </span><span>116</span><span> * </span><span>117</span><span> * @return-Array </span><span>118</span><span>*/</span><span>119</span><span>Funktion</span><span>selection() { </span><span>120</span><span>return</span><span>array</span>('id' => <span>$this</span>->code, <span>121</span> 'module' => MODULE_PAYMENT_PAYPAL_TEXT_CATALOG_LOGO, <span>122</span> 'icon' =><span> MODULE_PAYMENT_PAYPAL_TEXT_CATALOG_LOGO </span><span>123</span><span> ); </span><span>124</span><span> }</span><span>125</span><span>/*</span><span>* </span><span>126</span><span> * Bewertet normalerweise den Kreditkartentyp auf Akzeptanz und die Gültigkeit der Kreditkartennummer und des Ablaufdatums </span><span>127</span><span> * Da das Paypal-Modul keine Informationen sammelt, wird dieser Schritt einfach übersprungen. </span><span>128</span><span> * </span><span>129</span><span> * @return boolean </span><span>130</span><span>*/</span><span>131</span><span>Funktion</span><span> pre_confirmation_check() { </span><span>132</span><span>return</span><span>false</span><span>; </span><span>133</span><span> } </span><span>134</span><span>/*</span><span>* </span><span>135</span><span> * Kreditkarteninformationen auf der Checkout-Bestätigungsseite anzeigen </span><span>136</span><span> * Da vor der Weiterleitung an die PayPal-Seite keine Daten für PayPal erfasst werden, wird dies übersprungen </span><span>137</span><span> * </span><span>138</span><span> * @return boolean </span><span>139</span><span>*/</span><span>140</span><span>Funktion</span><span> Bestätigung() { </span><span>141</span><span>return</span><span>false</span><span>; </span><span>142</span><span> } </span><span>143</span><span>/*</span><span>* </span><span>144</span><span> * Erstellen Sie die Daten und Aktionen, die verarbeitet werden sollen, wenn auf dem Bestellbestätigungsbildschirm die Schaltfläche „Senden“ gedrückt wird. </span><span>145</span><span> * Dadurch werden die Daten zur Verarbeitung an das Zahlungsgateway gesendet. </span><span>146</span><span> * (Dies sind ausgeblendete Felder auf der Checkout-Bestätigungsseite) </span><span>147</span><span> * </span><span>148</span><span> * @return string </span><span>149</span><span>*/</span><span>150</span><span>Funktion</span><span>process_button() { </span><span>151</span><span>return</span><span>false</span><span>; </span><span>152</span><span> } </span><span>153</span><span>/*</span><span>* </span><span>154</span><span> * Bestimmen Sie die Sprache, die beim Besuch der PayPal-Website verwendet werden soll </span><span>155</span><span>*/</span><span>156</span><span>Funktion</span><span> getLanguageCode() { </span><span>157</span><span>global</span><span>$order</span><span>; </span><span>158</span><span>$lang_code</span> = ''<span>; </span><span>159</span><span>$orderISO</span> = zen_get_countries(<span>$order</span>->customer['country']['id'], <span>true</span><span>); </span><span>160</span><span>$storeISO</span> = zen_get_countries(STORE_COUNTRY, <span>true</span><span>); </span><span>161</span><span>if</span> (<span>in_array</span>(<span>strtoupper</span>(<span>$orderISO</span>['countries_iso_code_2']), <span>Array</span>('US', 'AU', 'DE', 'FR', 'IT', 'GB', 'ES', 'AT', 'BE', 'CA', 'CH' , 'CN', 'NL', 'PL'<span>))) { </span><span>162</span><span>$lang_code</span> = <span>strtoupper</span>(<span>$orderISO</span>['countries_iso_code_2'<span>]); </span><span>163</span> } <span>elseif</span> (<span>in_array</span>(<span>strtoupper</span>(<span>$storeISO</span>['countries_iso_code_2']), <span>Array</span>('US', 'AU', 'DE', 'FR', 'IT', 'GB', 'ES', 'AT', 'BE', 'CA', 'CH ', 'CN', 'NL', 'PL'<span>))) { </span><span>164</span><span>$lang_code</span> = <span>strtoupper</span>(<span>$storeISO</span>['countries_iso_code_2'<span>]); </span><span>165</span> } <span>elseif</span> (<span>in_array</span>(<span>strtoupper</span>(<span>$_SESSION</span>['linguals_code']), <span>Array</span>('EN', 'US', 'AU', 'DE', 'FR', 'IT', 'GB', 'ES', 'AT', 'BE', 'CA ', 'CH', 'CN', 'NL', 'PL'<span>))) { </span><span>166</span><span>$lang_code</span> = <span>$_SESSION</span>['linguals_code'<span>]; </span><span>167</span><span>if</span> (<span>strtoupper</span>(<span>$lang_code</span>) == 'EN') <span>$lang_code</span> = 'USA'<span>; </span><span>168</span><span> } </span><span>169</span><span>//</span><span>return $orderISO['countries_iso_code_2'];</span><span>170</span><span>return</span><span> strtoupper</span>(<span>$lang_code</span><span>); </span><span>171</span><span> } </span><span>172</span><span>/*</span><span>* </span><span>173</span><span> * Speichern Sie Transaktionsinformationen zur Bestellung und verarbeiten Sie alle Ergebnisse, die vom Zahlungsgateway zurückkommen </span><span>174</span><span>*/</span><span>175</span><span>Funktion</span><span> before_process() { </span><span>176</span><span>return</span><span>false</span><span>; </span><span>177</span><span> } </span><span>178</span><span>/*</span><span>* </span><span>179</span><span> * Überprüft den Referrer </span><span>180</span><span> * </span><span>181</span><span> * @param string $zf_domain </span><span>182</span><span> * @return boolean </span><span>183</span><span>*/</span><span>184</span><span>function</span> check_referrer(<span>$zf_domain</span><span>) { </span><span>185</span><span>return</span><span>true</span><span>; </span><span>186</span><span> }</span><span>187</span><span>/*</span><span>* </span><span>188</span><span> * Erstellen Sie Admin-Seitenkomponenten </span><span>189</span><span> * </span><span>190</span><span> * @param int $zf_order_id </span><span>191</span><span> * @return string </span><span>192</span><span>*/</span><span>193</span><span>function</span> admin_notification(<span>$zf_order_id</span><span>) { </span><span>194</span><span>global</span><span>$db</span><span>; </span><span>195</span><span>$output</span> = ''<span>; </span><span>196</span><span>$sql</span> = "select * from " . TABLE_PAYPAL . "wo order_id = '" . (int)<span>$zf_order_id</span> . "' order by paypal_ipn_id DESC LIMIT 1"<span>; </span><span>197</span><span>$ipn</span> = <span>$db</span>->Execute(<span>$sql</span><span>); </span><span>198</span><span>if</span> (<span>$ipn</span>->RecordCount() > 0 && <span>file_exists</span>(DIR_FS_CATALOG . DIR_WS_MODULES . 'Zahlung /paypal/paypal_admin_notification.php')) <span>require</span>(DIR_FS_CATALOG . DIR_WS_MODULES . ' payment/paypal/paypal_admin_notification.php'<span>); </span><span>199</span><span>return</span><span>$output</span><span>; </span><span>200</span><span> } </span><span>201</span><span>/*</span><span>* </span><span>202</span><span> * Nachbearbeitungsaktivitäten </span><span>203</span><span> * Wenn die Bestellung vom Prozessor zurückkommt und die PDT erfolgreich war, werden die Ergebnisse im Bestellstatusverlauf gespeichert und Daten zur späteren Bezugnahme protokolliert </span><span>204</span><span> * </span><span>205</span><span> * @return boolean </span><span>206</span><span>*/</span><span>207</span><span>Funktion</span><span> after_process() { </span><span>208</span><span>return</span><span>false</span><span>; </span><span>209</span><span> } </span><span>210</span><span>/*</span><span>* </span><span>211</span><span> * Wird zur Anzeige von Fehlermeldungsdetails verwendet </span><span>212</span><span> * </span><span>213</span><span> * @return boolean </span><span>214</span><span>*/</span><span>215</span><span>Funktion</span><span>output_error() { </span><span>216</span><span>return</span><span>false</span><span>; </span><span>217</span><span> } </span><span>218</span><span>/*</span><span>* </span><span>219</span><span> * Überprüfen Sie, ob das Modul installiert ist </span><span>220</span><span> * </span><span>221</span><span> * @return boolean </span><span>222</span><span>*/</span><span>223</span><span>Funktion</span><span> check() { </span><span>224</span><span>global</span><span>$db</span><span>; </span><span>225</span><span>if</span> (IS_ADMIN_FLAG === <span>true</span><span>) { </span><span>226</span><span>global</span><span>$sniffer</span><span>; </span><span>227</span><span>if</span> (<span>$sniffer</span>->field_exists(TABLE_PAYPAL, 'zen_order_id')) <span>$db</span>->Execute ("ALTER TABLE " . TABLE_PAYPAL . " CHANGE COLUMN zen_order_id order_id int(11) NOT NULL default '0'"<span>); </span><span>228</span><span> } </span><span>229</span><span>if</span> (!<span>isset</span>(<span>$this</span>-><span>_check)) { </span><span>230</span><span>$check_query</span> = <span>$db</span>->Execute("wähle den Konfigurationswert aus " . TABLE_CONFIGURATION . " wobei der Konfigurationsschlüssel = 'MODULE_PAYMENT_PAYPAL_STATUS' ist"<span>); </span><span>231</span><span>$this</span>->_check = <span>$check_query</span>-><span>RecordCount(); </span><span>232</span><span> } </span><span>233</span><span>return</span><span>$this</span>-><span>_check; </span><span>234</span><span> } </span><span>235</span><span>/*</span><span>* </span><span>236</span><span> * Installieren Sie das Zahlungsmodul und seine Konfigurationseinstellungen </span><span>237</span><span> * </span><span>238</span><span>*/</span><span>239</span><span>Funktion</span><span> install() { </span><span>240</span><span>global</span><span>$db</span>, <span>$messageStack</span><span>; </span><span>241</span><span>if</span> (<span>definiert</span>('MODULE_PAYMENT_PAYPAL_STATUS'<span>)) { </span><span>242</span><span>$messageStack</span>->add_session('PayPal Website Payments Standard-Modul bereits installiert.', 'error'<span>); </span><span>243</span> zen_redirect(zen_href_link(FILENAME_MODULES, 'set= payment&module=paypal', 'NONSSL'<span>)); </span><span>244</span><span>return</span> 'fehlgeschlagen'<span>; </span><span>245</span><span> } </span><span>246</span><span>if</span> (<span>definiert</span>('MODULE_PAYMENT_PAYPALWPP_STATUS'<span>)) { </span><span>247</span><span>$messageStack</span>->add_session('HINWEIS: PayPal Express Checkout-Modul bereits installiert. Sie benötigen Standard nicht, wenn Sie Express installiert haben.', 'error' <span>); </span><span>248</span> zen_redirect(zen_href_link(FILENAME_MODULES, 'set= payment&module=paypalwpp', 'NONSSL'<span>)); </span><span>249</span><span>Rückgabe</span> 'fehlgeschlagen'<span>; </span><span>250</span><span> }</span><span>251</span><span>$db</span>->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, Configuration_key, Configuration_value, Configuration_Description, Configuration_Group_ID, Sort_order, Set_Function, Date_Added) Werte ( 'PayPal-Modul aktivieren', 'MODULE_PAYMENT_PAYPAL_STATUS', 'True', 'Möchten Sie PayPal-Zahlungen akzeptieren?', '6', '0', 'zen_cfg_select_option(array('True', 'False'), ', jetzt ())"<span>); </span><span>252</span><span>$db</span>->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, Configuration_key, Configuration_value, Configuration_Description, Configuration_Group_ID, Sort_Order, Date_Added) Values ('Business ID', 'MODULE_PAYMENT_PAYPAL_BUSINESS_ID','".STORE_OWNER_EMAIL_ADDRESS."', 'Primäre E-Mail-Adresse für Ihr PayPal-Konto.<br />HINWEIS: Dies muss <strong>GENAU </strong>der primären E-Mail-Adresse auf entsprechen In den Einstellungen Ihres PayPal-Kontos wird die Groß-/Kleinschreibung beachtet. Überprüfen Sie daher bitte Ihre PayPal-Profileinstellungen auf paypal.com und geben Sie hier GENAU dieselbe primäre E-Mail-Adresse ein.', '6', ' 2', now())"<span>); </span><span>253</span><span>$db</span>->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, Configuration_key, Configuration_value, Configuration_Description, Configuration_Group_ID, Sort_order, Set_Function, Date_Added) Werte ( „Transaktionswährung“, „MODULE_PAYMENT_PAYPAL_CURRENCY“, „Ausgewählte Währung“, „Als welche Währung soll die Bestellung an PayPal gesendet werden? <br />HINWEIS: Wenn eine nicht unterstützte Währung an PayPal gesendet wird, wird diese automatisch umgerechnet USD.', '6', '3', 'zen_cfg_select_option(array('Ausgewählte Währung', 'Nur USD', 'Nur AUD', 'Nur CAD', 'Nur EUR', 'Nur GBP', 'Nur CHF ', 'Nur CZK', 'Nur DKK', 'Nur HKD', 'Nur HUF', 'Nur JPY', 'Nur NOK', 'Nur NZD', 'Nur PLN', 'Nur SEK', 'Nur SGD ', 'Nur THB', 'Nur MXN', 'Nur ILS', 'Nur PHP', 'Nur TWD', 'Nur BRL', 'Nur MYR'), ', now())"<span>); 254 Werte ('Zahlungszone', 'MODULE_PAYMENT_PAYPAL_ZONE', '0', 'Wenn eine Zone ausgewählt ist, aktivieren Sie diese Zahlungsmethode nur für diese Zone.', '6', '4', 'zen_get_zone_class_title', 'zen_cfg_pull_down_zone_classes(', now())"</span>); 255 Werte ('Ausstehenden Benachrichtigungsstatus festlegen', 'MODULE_PAYMENT_PAYPAL_PROCESSING_STATUS_ID', '". DEFAULT_ORDERS_STATUS_ID . "', 'Setzen Sie den Status von Bestellungen mit diesem Zahlungsmodul, die noch nicht abgeschlossen sind, auf diesen Wert<br />('Ausstehend' empfohlen )', '6', '5', 'zen_cfg_pull_down_order_statuses(', 'zen_get_order_status_name', now())"<span>); 256 Werte ('Bestellstatus festlegen', 'MODULE_PAYMENT_PAYPAL_ORDER_STATUS_ID', '2', 'Setzen Sie den Status von Bestellungen mit diesem Zahlungsmodul, deren Zahlung auf diesen Wert abgeschlossen wurde<br />('Verarbeitung' empfohlen)', '6' , '6', 'zen_cfg_pull_down_order_statuses(', 'zen_get_order_status_name', now())"</span>); <span></span>257<span></span>$db<span>->Execute("einfügen in " . TABLE_CONFIGURATION . " (Konfigurationstitel, Konfigurationsschlüssel, Konfigurationswert, Konfigurationsbeschreibung, Konfigurationsgruppen-ID, Sortierreihenfolge, Set_Funktion, Verwendungsfunktion, Datum_hinzugefügt) Werte ('Rückerstattungsauftragsstatus festlegen', 'MODULE_PAYMENT_PAYPAL_REFUND_ORDER_STATUS_ID', '1', 'Setzen Sie den Status von Bestellungen, die mit diesem Zahlungsmodul erstattet wurden, auf diesen Wert<br />('Ausstehend' empfohlen)', '6 ', '7', 'zen_cfg_pull_down_order_statuses(', 'zen_get_order_status_name', now())"</span>); <span></span>258<span></span>$db<span>->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, Configuration_key, Configuration_Value, Configuration_Description, Configuration_Group_ID, Sort_Order, Date_Added) Values ('Sort Reihenfolge der Anzeige.', 'MODULE_PAYMENT_PAYPAL_SORT_ORDER', '0', 'Sortierreihenfolge der Anzeige wird zuerst angezeigt.', '6', '8', now())"</span>); <span></span>259<span></span>$db<span>->Execute("einfügen in " . TABLE_CONFIGURATION . " (Konfigurationstitel, Konfigurationsschlüssel, Konfigurationswert, Konfigurationsbeschreibung, Konfigurationsgruppen-ID, Sortierreihenfolge, Set_Funktion, Datum hinzugefügt) Werte ('Adressüberschreibung', 'MODULE_PAYMENT_PAYPAL_ADDRESS_OVERRIDE', '1', 'Wenn auf 1 gesetzt , überschreibt die in Zen Cart ausgewählte Kundenversandadresse das im PayPal-Konto des Kunden gespeicherte Adressbuch. Der Kunde sieht seine Adresse in Zen Cart, kann sie jedoch NICHT bei PayPal bearbeiten.<br />(Eine ungültige Adresse wird von PayPal als nicht bereitgestellt behandelt oder override=0)<br />0=No Override<br />1=ZC-Adresse überschreibt die PayPal-Adressauswahl', '6', '18', 'zen_cfg_select_option (array('0','1'), ', now())"<span>); 260 „Anforderungen an die Lieferadresse?“, „MODULE_PAYMENT_PAYPAL_ADDRESS_REQUIRED“, „2“, „Die Lieferadresse des Käufers“. Bei „0“ wird Ihr Kunde aufgefordert, eine Lieferadresse anzugeben. Bei „1“ wird Ihr Kunde nicht nach einer Lieferadresse gefragt . Wenn auf 2 eingestellt, wird Ihr Kunde aufgefordert, eine Lieferadresse anzugeben.<br />0=Aufforderung<br />1=Nicht gefragt<br />2=Erforderlich<br /><br /><strong>HINWEIS: Wenn Sie Ihren Kunden erlauben, ihre eigene Lieferadresse einzugeben, stellen Sie sicher, dass Sie die PayPal-Bestätigungsdetails persönlich überprüfen, um die richtige Adresse beim Ausfüllen von Bestellungen zu überprüfen, wenn Sie Website Payments Standard (IPN) verwenden. Zen Cart weiß nicht, ob sie bei PayPal eine andere Lieferadresse als die bei der Bestellung angegebene Adresse wählen.</strong>', '6', '20', 'zen_cfg_select_option(array('0','1' ,'2'), ', now())"</span>); <span></span>261<span></span>$db<span>->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, Configuration_key, Configuration_value, Configuration_Description, Configuration_Group_ID, Sort_order, Set_Function, Date_Added) Werte ( „Detaillierte Einzelposten im Warenkorb“, „MODULE_PAYMENT_PAYPAL_DETAILED_CART“, „Nein“, „Möchten Sie Einzelpostendetails an PayPal weitergeben? Wenn auf „True“ gesetzt, werden Einzelpostendetails an PayPal weitergegeben, wenn keine Rabatte gelten und wenn Steuern anfallen und Versand sind einfach. Andernfalls wird eine aggregierte Warenkorbzusammenfassung gesendet.', '6', '22', 'zen_cfg_select_option(array('No','Yes'), ', now())"</span>); <span></span>262<span></span>$db<span>->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, Configuration_key, Configuration_value, Configuration_Description, Configuration_Group_ID, Sort_order, Date_Added) Values ('Page Style“, „MODULE_PAYMENT_PAYPAL_PAGE_STYLE“, „Primary“, „Legt den benutzerdefinierten Zahlungsseitenstil für Zahlungsseiten fest. Der Wert von page_style ist derselbe wie der Seitenstilname, den Sie beim Hinzufügen oder Bearbeiten des Seitenstils ausgewählt haben Zahlungsseitenstile auf der Unterregisterkarte „Profil“ der Registerkarte „Mein Konto“ auf der PayPal-Website. Wenn Sie immer auf Ihren primären Stil verweisen möchten, stellen Sie dies auf „primär“ ein "paypal".', '6', '25', now())"</span>); <span></span>263<span></span>$db<span>->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, Configuration_key, Configuration_value, Configuration_Description, Configuration_Group_ID, Sort_order, Set_Function, Date_Added) Werte ( 'Modus für PayPal-Webdienste<br /><br />Standard:<br /><code>www.paypal.com/cgi-bin/webscr</code><br /> oder<br /><code>www.paypal.com/us/cgi-bin/webscr</code><br />oder für das Vereinigte Königreich,<br /><code>www. paypal.com/uk/cgi-bin/webscr</code>', 'MODULE_PAYMENT_PAYPAL_HANDLER', 'www.paypal.com/cgi-bin/webscr', 'Wählen Sie die URL für die PayPal-Live-Verarbeitung', '6', ' 73', '', now())"</span>); <span></span>264<span></span>//<span></span> Sandbox: www.sandbox.paypal.com/cgi-bin/webscr<span></span>265<span></span>$ db<span>->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, Configuration_key, Configuration_value, Configuration_Description, Configuration_Group_ID, Sort_order, Date_Added, Use_Function) Values ('PDT Token (Payment Data Transfer)', 'MODULE_PAYMENT_PAYPAL_PDTTOKEN', '', 'Geben Sie hier Ihren PDT-Token-Wert ein, um Transaktionen sofort nach der Verarbeitung zu aktivieren (wenn sie die Validierung bestehen).', '6', '25', now(), 'zen_cfg_password_display')"</span>); <span></span>266<span></span>//<span></span> Paypal-Testoptionen hier<span></span>267<span></span>$db<span>->Execute("einfügen in " . TABLE_CONFIGURATION . " (Konfigurationstitel, Konfigurationsschlüssel, Konfigurationswert, Konfigurationsbeschreibung, Konfigurationsgruppen-ID, Sortierreihenfolge, Set_Funktion, Datum_hinzugefügt) Werte ('Debug-Modus', 'MODULE_PAYMENT_PAYPAL_IPN_DEBUG', 'Aus', 'Debug-Protokollierung aktivieren? <br />HINWEIS: Dies kann Ihren E-Mail-Posteingang WIRKLICH überladen!<br />Die Protokollierung erfolgt im Ordner /includes/modules/zahlung/paypal/logs<br />E-Mails gehen an die Adresse des Shop-Inhabers .<br />E-Mail-Option NICHT empfohlen.<br /><strong>Für den Normalbetrieb auf AUS lassen.</strong>', '6', '71', 'zen_cfg_select_option(array('Off ','Protokolldatei','Protokoll und E-Mail'), ', now())"<span>); </span><span>268</span><span>$db</span>->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, Configuration_key, Configuration_value, Configuration_Description, Configuration_Group_ID, Sort_order, Date_Added) Values ('Debug E-Mail-Adresse', 'MODULE_PAYMENT_PAYPAL_DEBUG_EMAIL_ADDRESS','".STORE_OWNER_EMAIL_ADDRESS."', 'Die für das PayPal-Debugging zu verwendende E-Mail-Adresse', '6', '72', now())"<span>); </span><span>269</span><span>270</span><span>$this</span>->notify('NOTIFY_PAYMENT_PAYPAL_INSTALLED'<span>); </span><span>271</span><span> } </span><span>272</span><span>/*</span><span>* </span><span>273</span><span> * Entfernen Sie das Modul und alle seine Einstellungen </span><span>274</span><span> * </span><span>275</span><span>*/</span><span>276</span><span>Funktion</span><span> remove() { </span><span>277</span><span>global</span><span>$db</span><span>; </span><span>278</span><span>$db</span>->Execute("delete from " . TABLE_CONFIGURATION . " where configure_key LIKE 'MODULE_PAYMENT_PAYPAL_%'"<span>); </span><span>279</span><span>$this</span>->notify('NOTIFY_PAYMENT_PAYPAL_UNINSTALLED'<span>); </span><span>280</span><span> } </span><span>281</span><span>/*</span><span>* </span><span>282</span><span> * Interne Liste der Konfigurationsschlüssel, die zur Konfiguration des Moduls verwendet werden </span><span>283</span><span> * </span><span>284</span><span> * @return-Array </span><span>285</span><span>*/</span><span>286</span><span>Funktion</span><span> Tasten() { </span><span>287</span><span>$keys_list</span> = <span>array</span><span>( </span><span>288</span> 'MODULE_PAYMENT_PAYPAL_STATUS', <span>289</span> 'MODULE_PAYMENT_PAYPAL_BUSINESS_ID', <span>290</span> 'MODULE_PAYMENT_PAYPAL_PDTTOKEN', <span>291</span> 'MODULE_PAYMENT_PAYPAL_CURRENCY', <span>292</span> 'MODULE_PAYMENT_PAYPAL_ZONE', <span>293</span> 'MODULE_PAYMENT_PAYPAL_PROCESSING_STATUS_ID', <span>294</span> 'MODULE_PAYMENT_PAYPAL_ORDER_STATUS_ID', <span>295</span> 'MODULE_PAYMENT_PAYPAL_REFUND_ORDER_STATUS_ID', <span>296</span> 'MODULE_PAYMENT_PAYPAL_SORT_ORDER', <span>297</span> 'MODULE_PAYMENT_PAYPAL_DETAILED_CART', <span>298</span> 'MODULE_PAYMENT_PAYPAL_ADDRESS_OVERRIDE' , <span>299</span> 'MODULE_PAYMENT_PAYPAL_ADDRESS_REQUIRED' , <span>300</span> 'MODULE_PAYMENT_PAYPAL_PAGE_STYLE' , <span>301</span> 'MODULE_PAYMENT_PAYPAL_HANDLER', <span>302</span> 'MODULE_PAYMENT_PAYPAL_IPN_DEBUG', <span>303</span><span> ); </span><span>304</span><span>305</span><span>//</span><span> Paypal-Test-/Debug-Optionen finden Sie hier:</span><span>306</span><span>if </span> (IS_ADMIN_FLAG === <span>true</span><span>) { </span><span>307</span><span>if</span> (<span>isset</span>(<span>$_GET</span>['debug']) && <span>$_GET</span>[ 'debug']=='on'<span>) { </span><span>308</span><span>$keys_list</span>[]='MODULE_PAYMENT_PAYPAL_DEBUG_EMAIL_ADDRESS'; <span>/*</span><span> Dies ist standardmäßig die E-Mail-Adresse des Shopbesitzers </span><span>*/</span><span>309</span><span> } </span><span>310</span><span> } </span><span>311</span><span>return</span><span>$keys_list</span><span>; </span><span>312</span><span> }</span><span>313</span><span>314</span><span>Funktion</span> _getPDTresults(<span>$orderAmount</span>, <span>$my_currency</span>, <span>$pdtTX</span><span>) { </span><span>315</span><span>global</span><span>$db</span><span>; </span><span>316</span><span>$ipnData</span> = ipn_postback('PDT', <span>$pdtTX</span><span>); </span><span>317</span><span>$respdata</span> = <span>$ipnData</span>['info'<span>]; </span><span>318</span><span>319</span><span>//</span><span> Daten analysieren</span><span>320</span><span>$lines</span> = <span>explode</span>("n", <span>$respdata</span><span>); </span><span>321</span><span>$this</span>->pdtData = <span>array</span><span>(); </span><span>322</span><span>für</span> (<span>$i</span>=1; <span>$i</span><<span>Anzahl</span>(<span> $lines</span>);<span>$i</span> <span>){ </span><span>323</span><span>if</span> (!<span>strstr</span>(<span>$lines</span>[<span>$i</span>], "=") ) <span>weiter</span><span>; </span><span>324</span><span>list</span>(<span>$key</span>,<span>$val</span>) = <span>explode</span>("=", <span>$lines</span>[<span>$i</span><span>]); </span><span>325</span><span>$this</span>->pdtData[<span>urldecode</span>(<span>$key</span>)] = <span>urldecode</span>( <span>$val</span><span>); </span><span>326</span><span> } </span><span>327</span><span>328</span><span>if</span> (<span>$this</span>->pdtData['txn_id'] == '' || <span>$this</span>->pdtData['zahlungsstatus'] == ''<span>) { </span><span>329</span> ipn_debug_email('PDT hat UNGÜLTIGE Daten zurückgegeben. Muss stattdessen warten, bis IPN verarbeitet wird. ' . "n" . <span>print_r</span>(<span>$this</span>-> ;pdtData, <span>true</span><span>)); </span><span>330</span><span>return</span><span>FALSE</span><span>; </span><span>331</span> } <span>sonst</span><span> { </span><span>332</span> ipn_debug_email('PDT Returned Data ' . <span>print_r</span>(<span>$this</span>->pdtData, <span>true</span><span>) ); </span><span>333</span><span> } </span><span>334</span><span>335</span><span>$_POST</span>['mc_gross'] = <span>$this</span>->pdtData['mc_gross'<span> ]; </span><span>336</span><span>$_POST</span>['mc_currency'] = <span>$this</span>->pdtData['mc_currency'<span>]; </span><span>337</span><span>$_POST</span>['business'] = <span>$this</span>->pdtData['business'<span>]; </span><span>338</span><span>$_POST</span>['receiver_email'] = <span>$this</span>->pdtData['receiver_email'<span>]; </span><span>339</span><span>340</span><span>$PDTstatus</span> = (ipn_validate_transaction(<span>$respdata</span>, <span>$this</span>->pdtData , 'PDT') && valid_zahlung(<span>$orderAmount</span>, <span>$my_currency</span>, 'PDT') && <span>$this</span>->pdtData['zahlungsstatus'] == 'Abgeschlossen'<span>); </span><span>341</span><span>if</span> (<span>$this</span>->pdtData['zahlungsstatus'] != '' && <span>$this</span>-> ;pdtData['zahlungsstatus'] != 'Abgeschlossen'<span>) { </span><span>342</span> ipn_debug_email('PDT-WARNUNG: Bestellung nicht als „Abgeschlossen“ markiert. Überprüfen Sie die Gründe für „Ausstehend“ oder warten Sie, bis IPN abgeschlossen ist.' . "n" . '[paid_status] => ' . <span>$this</span>->pdtData['zahlungsstatus'] "n" '[pending_reason] => >]); <span></span>343<span></span> } <span></span>344<span></span>345<span></span>$sql<span> = "</span>SELECT order_id, paypal_ipn_id, payment_status, txn_type, pending_reason <span></span>346<span> FROM " . TABLE_PAYPAL . " </span>347<span></span> WHERE txn_id = :transactionID OR parent_txn_id = :transactionID <span></span>348<span> ORDER BY order_id DESC "</span>; <span></span>349<span></span>$sql<span> = </span>$db<span>->bindVars(</span>$sql<span>, ':transactionID', </span>$ this<span>->pdtData['txn_id'], 'string'</span>); <span></span>350<span></span>$ipn_id<span> = </span>$db<span>->Execute(</span>$sql<span></span>); <span></span>351<span></span>if<span> (</span>$ipn_id<span>->RecordCount() != 0</span>) { <span></span>352<span> ipn_debug_email('PDT WARNUNG :: Transaktion existiert bereits. Möglicherweise hat IPN sie bereits hinzugefügt. PDT-Verarbeitung beendet.'</span>); <span></span>353<span></span>$pdtTXN_is_unique<span> = </span>false<span></span>; <span></span>354<span> } </span>sonst<span></span> { <span></span>355<span></span>$pdtTXN_is_unique<span> = </span>true<span></span>; <span></span>356<span></span> } <span></span>357<span></span>358<span></span>$PDTstatus<span> = (</span>$pdtTXN_is_unique<span> && </span>$PDTstatus<span></span>); <span></span>359<span></span>360<span></span>return<span></span>$PDTstatus<span></span>; <span></span>361<span></span> }</span><span>362</span><span>363</span><span>364</span><span>Funktion</span><span> tableCheckup() { </span><span>365</span><span>global</span><span>$db</span>, <span>$sniffer</span><span>; </span><span>366</span><span>$fieldOkay1</span> = (<span>method_exists</span>(<span>$sniffer</span>, 'field_type')) ? <span>$sniffer</span>->field_type(TABLE_PAYPAL, 'txn_id', 'varchar(20)', <span>true</span>) : -1<span>; </span><span>367</span><span>$fieldOkay2</span> = (<span>$sniffer</span>->field_exists(TABLE_PAYPAL, 'module_name')) ? <span>wahr</span> : -1<span>; </span><span>368</span><span>$fieldOkay3</span> = (<span>$sniffer</span>->field_exists(TABLE_PAYPAL, 'order_id')) ? <span>wahr</span> : -1<span>; </span><span>369</span><span>370</span><span>if</span> (<span>$fieldOkay1</span> == -1<span>) { </span><span>371</span><span>$sql</span> = "Felder anzeigen von " .<span> TABLE_PAYPAL; </span><span>372</span><span>$result</span> = <span>$db</span>->Execute(<span>$sql</span><span>); </span><span>373</span><span>while</span> (!<span>$result</span>-><span>EOF) { </span><span>374</span><span>if</span> (<span>$result</span>->fields['Field'] == 'txn_id'<span>) { </span><span>375</span><span>if</span> (<span>$result</span>->fields['Type'] == 'varchar(20)'<span>) { </span><span>376</span><span>$fieldOkay1</span> = <span>true</span>; <span>//</span><span> existiert und entspricht dem erforderlichen Typ, also fahren Sie mit der anderen Prüfung fort</span><span>377</span> } <span>else</span><span> { </span><span>378</span><span>$fieldOkay1</span> = <span>$result</span>->fields['Type']; <span>//</span><span> stimmt nicht überein, also gib zurück, was es „ist“</span><span>379</span><span>break</span><span>; </span><span>380</span><span> } </span><span>381</span><span> } </span><span>382</span><span>$result</span>-><span>MoveNext(); </span><span>383</span><span> } </span><span>384</span><span> } </span><span>385</span><span>386</span><span>if</span> (<span>$fieldOkay1</span> !== <span>true</span><span>) { </span><span>387</span><span>//</span><span> Vorübergehende Korrektur der Tabellenstruktur für v1.3.7.x – kann in späteren Versionen entfernt werden</span><span>388</span><span>$db</span>->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE payment_type payment_type varchar(40) NOT NULL default ''"<span>); </span><span>389</span><span>$db</span>->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE txn_type txn_type varchar(40) NOT NULL default ''"<span>); </span><span>390</span><span>$db</span>->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE payment_status payment_status varchar(32) NOT NULL default ''"<span>); </span><span>391</span><span>$db</span>->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE reason_code reason_code varchar(40) default NULL"<span>); </span><span>392</span><span>$db</span>->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE pending_reason pending_reason varchar(32) default NULL"<span>); </span><span>393</span><span>$db</span>->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGErechnung Rechnung varchar(128) default NULL"<span>); </span><span>394</span><span>$db</span>->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE payer_business_name payer_business_name varchar(128) default NULL"<span>); </span><span>395</span><span>$db</span>->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE Adressname Adressname varchar(64) Standard NULL"<span>); </span><span>396</span><span>$db</span>->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE address_street address_street varchar(254) default NULL"<span>); </span><span>397</span><span>$db</span>->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE address_city address_city varchar(120) default NULL"<span>); </span><span>398</span><span>$db</span>->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE address_state address_state varchar(120) default NULL"<span>); </span><span>399</span><span>$db</span>->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE payer_email payer_email varchar(128) NOT NULL default ''"<span>); </span><span>400</span><span>$db</span>->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE business business varchar(128) NOT NULL default ''"<span>); </span><span>401</span><span>$db</span>->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE Receiver_Email Receiver_Email varchar(128) NOT NULL Standard ''"<span>); </span><span>402</span><span>$db</span>->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE txn_id txn_id varchar(20) NOT NULL default ''"<span>); </span><span>403</span><span>$db</span>->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE parent_txn_id parent_txn_id varchar(20) default NULL"<span>); </span><span>404</span><span> }</span><span>405</span><span>if</span> (<span>$fieldOkay2</span> !== <span>true</span><span>) { </span><span>406</span><span>$db</span>->Execute("ALTER TABLE " . TABLE_PAYPAL . " ADD COLUMN module_name varchar(40) NOT NULL default '' after txn_type"<span>) ; </span><span>407</span><span>$db</span>->Execute("ALTER TABLE " . TABLE_PAYPAL . " ADD COLUMN module_mode varchar(40) NOT NULL default '' after module_name"<span>) ; </span><span>408</span><span> } </span><span>409</span><span>if</span> (<span>$fieldOkay3</span> !== <span>true</span><span>) { </span><span>410</span><span>$db</span>->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE zen_order_id order_id int(11) NOT NULL default '0'"<span>); </span><span>411</span><span> } </span><span>412</span><span> } </span><span>413</span><span>414</span><span>function</span> paynow_button(<span>$order_id</span><span>) { </span><span>415</span><span>global</span><span>$db</span>, <span>$order</span>, <span>$currencies</span>, <span>$currency</span><span>; </span><span>416</span><span>require_once</span>(DIR_WS_CLASSES . 'order.php'<span>); </span><span>417</span><span>$order</span> = <span>new</span> order(<span>$order_id</span><span>); </span><span>418</span><span>$options</span> = <span>array</span><span>(); </span><span>419</span><span>$optionsCore</span> = <span>array</span><span>(); </span><span>420</span><span>$optionsPhone</span> = <span>array</span><span>(); </span><span>421</span><span>$optionsShip</span> = <span>array</span><span>(); </span><span>422</span><span>$optionsLineItems</span> = <span>array</span><span>(); </span><span>423</span><span>$optionsAggregate</span> = <span>array</span><span>(); </span><span>424</span><span>$optionsTrans</span> = <span>array</span><span>(); </span><span>425</span><span>$buttonArray</span> = <span>array</span><span>(); </span><span>426</span><span>427</span><span>$this</span>->totalsum = <span>$order</span>->info['total'<span>] ; </span><span>428</span><span>429</span><span>//</span><span> Speichern Sie die Sitzungsinhalte dauerhaft für den Fall, dass PayPal die Sitzung verliert</span><span>430</span><span>$_SESSION</span>['ppipn_key_to_remove'] = <span>session_id</span><span>(); </span><span>431</span><span>$db</span>->Execute("delete from " . TABLE_PAYPAL_SESSION . " where session_id = '" . zen_db_input(<span>$_SESSION</span>['ppipn_key_to_remove ']) . "'"<span>); </span><span>432</span><span>433</span><span>$sql</span> = "insert into " . TABLE_PAYPAL_SESSION . „<span> (Sitzungs-ID, gespeicherte Sitzung, Ablauf) Werte ( </span><span>434</span> '" . zen_db_input(<span>$_SESSION</span>['ppipn_key_to_remove']) . "<span>', </span><span>435</span> '" . <span>base64_encode</span>(<span>serialize</span>(<span>$_SESSION</span>)) . "<span>', </span><span>436</span> '" . (<span>Zeit</span>() (1*60*60*24*2)) . "')"<span>; </span><span>437</span><span>438</span><span>$db</span>->Execute(<span>$sql</span><span>); </span><span>439</span><span>440</span><span>$my_currency</span> =<span> select_pp_currency(); </span><span>441</span><span>if</span>(!<span>empty</span>(<span>$order</span>->info['currency'<span>])){ </span><span>442</span><span>$my_currency</span>=<span>$order</span>->info['currency'<span>]; </span><span>443</span><span> } </span><span>444</span><span>$this</span>->transaction_currency = <span>$my_currency</span><span>; </span><span>445</span><span>446</span><span>$this</span>->transaction_amount = (<span>$this</span>->totalsum * <span>$currencies</span>->get_value(<span>$my_currency</span><span>)); </span><span>447</span><span>448</span><span>$telephone</span> = <span>preg_replace</span>('/D/', '', <span>$order</span>->customer['telephone'<span>]); </span><span>449</span><span>if</span> (<span>$telephone</span> != ''<span>) { </span><span>450</span><span>$optionsPhone</span>['H_PhoneNumber'] = <span>$telephone</span><span>; </span><span>451</span><span>if</span> (<span>in_array</span>(<span>$order</span>->customer['country']['iso_code_2'], <span>array</span>('US','CA'<span>))) { </span><span>452</span><span>$optionsPhone</span>['night_phone_a'] = <span>substr</span>(<span>$telephone</span>,0,3<span>); </span><span>453</span><span>$optionsPhone</span>['night_phone_b'] = <span>substr</span>(<span>$telephone</span>,3,3<span>); </span><span>454</span><span>$optionsPhone</span>['night_phone_c'] = <span>substr</span>(<span>$telephone</span>,6,4<span>); </span><span>455</span><span>$optionsPhone</span>['day_phone_a'] = <span>substr</span>(<span>$telephone</span>,0,3<span>); </span><span>456</span><span>$optionsPhone</span>['day_phone_b'] = <span>substr</span>(<span>$telephone</span>,3,3<span>); </span><span>457</span><span>$optionsPhone</span>['day_phone_c'] = <span>substr</span>(<span>$telephone</span>,6,4<span>); </span><span>458</span> }<span>sonst</span><span> { </span><span>459</span><span>$optionsPhone</span>['night_phone_b'] = <span>$telephone</span><span>; </span><span>460</span><span>$optionsPhone</span>['day_phone_b'] = <span>$telephone</span><span>; </span><span>461</span><span> } </span><span>462</span><span> }</span><span>463</span><span>464</span><span>$optionsCore</span> = <span>array</span><span>( </span><span>465</span> 'lc' => UNS, <span>466</span><span>//</span><span>'lc' => $order->customer['country']['iso_code_2'],</span><span>467</span> 'charset' => CHARSET, <span>468</span> 'page_style' => MODULE_PAYMENT_PAYPAL_PAGE_STYLE, <span>469</span> 'custom' => zen_session_name() . '=' . zen_session_id(), <span>470</span> 'Rechnung' => <span>$order</span>->info['num'], <span>471</span> 'business' => MODULE_PAYMENT_PAYPAL_BUSINESS_ID, <span>472</span> 'return' => zen_href_link(FILENAME_CHECKOUT_PROCESS, 'referer=paypal', 'SSL'), <span>473</span> 'cancel_return' => zen_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'), <span>474</span> 'shopping_url' => zen_href_link(FILENAME_SHOPPING_CART, '', 'SSL'), <span>475</span> 'notify_url' => zen_href_link('ipn_main_handler.php', '', 'SSL',<span>false</span>,<span>false</span>,<span>true</span>), <span>476</span> 'redirect_cmd' => '_xclick','rm' => 2,'bn' => 'zencart','mrb' => 'R-6C7952342H795591R','pal' => '9E82WJBKKGPLQ', <span>477</span><span> ); </span><span>478</span><span>$optionsCust</span> = <span>array</span><span>( </span><span>479</span> 'Vorname' => replace_accents(<span>$order</span>->customer['firstname']), <span>480</span> 'last_name' => replace_accents(<span>$order</span>->customer['lastname']), <span>481</span> 'address1' => replace_accents(<span>$order</span>->customer['street_address']), <span>482</span> 'Stadt' => replace_accents(<span>$order</span>->customer['city']), <span>483</span> 'state' => zen_get_zone_code(<span>$order</span>->customer['country']['id'], <span>$order</span>->customer['zone_id'], <span>$order</span>->Kunde['Staat']), <span>484</span> 'zip' => <span>$order</span>->Kunde['Postleitzahl'], <span>485</span> 'Land' => <span>$order</span>->customer['country']['iso_code_2'], <span>486</span> 'email' => <span>$order</span>->customer['email_address'], <span>487</span><span> ); </span><span>488</span><span>//</span><span> Adresszeile 2 ist optional</span><span>489</span><span>if</span> (<span>$order</span>->customer['suburb'] != '') <span>$optionsCust</span>['address2'] = <span>$order</span>->customer['suburb'<span>] ; </span><span>490</span><span>//</span><span> anderes Format für japanisches Adresslayout:</span><span>491</span><span>if</span> (<span>$ order</span>->customer['country']['iso_code_2'] == 'JP') <span>$optionsCust</span>['zip'] = <span>substr</span>(<span>$ order</span>->customer['postcode'], 0, 3) . '-' . <span>substr</span>(<span>$order</span>->customer['postcode'], 3<span>); </span><span>492</span><span>if</span> (MODULE_PAYMENT_PAYPAL_ADDRESS_REQUIRED == 2<span>) { </span><span>493</span><span>$optionsCust</span> = <span>array</span><span>( </span><span>494</span> 'Vorname' => replace_accents(<span>$order</span>->delivery['firstname'] != '' ? <span>$order</span>->delivery['firstname'] : <span>$order</span> ->billing['firstname']), <span>495</span> 'last_name' => replace_accents(<span>$order</span>->delivery['lastname'] != '' ? <span>$order</span>->delivery['lastname'] : <span>$order</span> ->billing['lastname']), <span>496</span> 'address1' => replace_accents(<span>$order</span>->delivery['street_address'] != '' ? <span>$order</span>->delivery['street_address'] : <span>$order</span> ->billing['street_address']), <span>497</span> 'Stadt' => replace_accents(<span>$order</span>->delivery['city'] != '' ? <span>$order</span>->delivery['city'] : <span>$order</span> ->billing['city']), <span>498</span> 'state' => (<span>$order</span>->delivery['country']['id'] != '' ? zen_get_zone_code(<span>$order</span>->delivery['country']['id '], <span>$order</span>->delivery['zone_id'], <span>$order</span>->delivery['state']): zen_get_zone_code(<span>$order</span> ->billing['country']['id'], <span>$order</span>->billing['zone_id'], <span>$order</span>->billing['state'] )), <span>499</span> 'zip' => (<span>$order</span>->delivery['postcode'] != '' ? <span>$order</span>->delivery['postcode'] : <span>$order</span>- >billing['postcode']), <span>500</span> 'Land' => (<span>$order</span>->delivery['country']['title'] != '' ? <span>$order</span>->delivery['country']['title'] : <span>$order</span>->billing['country']['title']), <span>501</span> 'country_code' => (<span>$order</span>->delivery['country']['iso_code_2'] != '' ? <span>$order</span>->delivery['country']['iso_code_2'] : <span>$order</span>->billing['country']['iso_code_2']), <span>502</span> 'email' => <span>$order</span>->customer['email_address'], <span>503</span><span> ); </span><span>504</span><span>if</span> (<span>$order</span>->delivery['suburb'] != '') <span>$optionsCust</span>[' address2'] = <span>$order</span>->delivery['suburb'<span>]; </span><span>505</span><span>if</span> (<span>$order</span>->delivery['country']['iso_code_2'] == 'JP') <span>$ optionsCust</span>['zip'] = <span>substr</span>(<span>$order</span>->delivery['postcode'], 0, 3) . '-' . <span>substr</span>(<span>$order</span>->delivery['postcode'], 3<span>); </span><span>506</span><span> } </span><span>507</span><span>$optionsShip</span>['no_shipping'] =<span> MODULE_PAYMENT_PAYPAL_ADDRESS_REQUIRED; </span><span>508</span><span>if</span> (MODULE_PAYMENT_PAYPAL_ADDRESS_OVERRIDE == '1') <span>$optionsShip</span>['address_override'] =<span> MODULE_PAYMENT_PAYPAL_ADDRESS_OVERRIDE; </span><span>509</span><span>//</span><span> Bereiten Sie nach Möglichkeit Details zum Warenkorbinhalt vor</span><span>510</span><span>if</span> (MODULE_PAYMENT_PAYPAL_DETAILED_CART == 'Ja ') <span>$optionsLineItems</span> =<span> ipn_getLineItemDetails(); </span><span>511</span><span>if</span> (<span>sizeof</span>(<span>$optionsLineItems</span>) > 0<span>) { </span><span>512</span><span>$optionsLineItems</span>['cmd'] = '_cart'<span>; </span><span>513</span><span>//</span><span> $optionsLineItems['num_cart_items'] = sizeof($order->products);</span><span>514</span><span>if</span> (<span>isset</span>(<span>$optionsLineItems</span>['shipping'<span>])) { </span><span>515</span><span>$optionsLineItems</span>['shipping_1'] = <span>$optionsLineItems</span>['shipping'<span>]; </span><span>516</span><span>unset</span>(<span>$optionsLineItems</span>['shipping'<span>]); </span><span>517</span><span> } </span><span>518</span><span>unset</span>(<span>$optionsLineItems</span>['subtotal'<span>]); </span><span>519</span><span>//</span><span> Wenn Einzelpostendetails aufgrund von Berechnungskonflikten oder Rabatten usw. nicht beibehalten werden konnten, wird standardmäßig der Aggregationsmodus verwendet</span><span>520 </span><span>if</span> (!<span>isset</span>(<span>$optionsLineItems</span>['item_name_1']) || <span>$optionsLineItems</span>['creditsExist'] = = <span>TRUE</span>) <span>$optionsLineItems</span> = <span>array</span><span>(); </span><span>521</span><span>//</span><span>if ($optionsLineItems['amount'] != $this->transaction_amount) $optionsLineItems = array(); </span><span>522</span><span> // debug: </span><span>523</span><span> //ipn_debug_email('Einzelpostendetails (wenn leer, bedeutet dies, dass eine Dateninkongruenz vorliegt oder Gutschriften angewendet und somit umgangen wurden): ' . "n" . print_r($ optionsLineItems, true));</span><span>524</span><span>unset</span>(<span>$optionsLineItems</span>['creditsExist'<span>]); </span><span>525</span><span> }</span><span>526</span><span>$optionsAggregate</span> = <span>array</span><span>( </span><span>527</span> 'cmd' => '_ext-enter', <span>528</span> 'item_name' => MODULE_PAYMENT_PAYPAL_PURCHASE_DESCRIPTION_TITLE, <span>529</span> 'item_number' => MODULE_PAYMENT_PAYPAL_PURCHASE_DESCRIPTION_ITEMNUM, <span>530</span><span>//</span><span>'num_cart_items' => sizeof($order->products),</span><span>531</span> 'amount' => <span>Zahlenformat</span>(<span>$this</span>->transaction_amount, <span>$currencies</span>->get_decimal_places(<span>$my_currency</span>)), <span>532</span> 'Versand' => '0,00', <span>533</span><span> ); </span><span>534</span><span>if</span> (MODULE_PAYMENT_PAYPAL_TAX_OVERRIDE == 'true') <span>$optionsAggregate</span>['tax'] = '0.00'<span>; </span><span>535</span><span>if</span> (MODULE_PAYMENT_PAYPAL_TAX_OVERRIDE == 'true') <span>$optionsAggregate</span>['tax_cart'] = '0.00'<span>; </span><span>536</span><span>$optionsTrans</span> = <span>array</span><span>( </span><span>537</span> 'upload' => (int)(<span>sizeof</span>(<span>$order</span>->products) > 0), <span>538</span> 'currency_code' => <span>$my_currency</span>, <span>539</span><span>//</span><span>'paypal_order_id' => $paypal_order_id, </span><span>540</span><span> //'no_note' => '1', </span><span>541</span><span> //'invoice' => '',</span><span>542</span><span> ); </span><span>543</span><span>544</span><span>//</span><span> Wenn die Einzelposteninformationen ungültig sind, verwenden Sie das Aggregat:</span><span>545</span><span>if</span> (<span>sizeof</span>(<span>$optionsLineItems</span>) > 0) <span>$optionsAggregate</span> = <span>$optionsLineItems</span><span>; </span><span>546</span><span>547</span><span>//</span><span> Einreichung vorbereiten</span><span>548</span><span>$options</span> = <span>array_merge</span>(<span>$optionsCore</span>, <span>$optionsCust</span>, <span>$optionsPhone</span>, <span>$optionsShip</span>, <span>$optionsTrans</span>, <span>$optionsAggregate</span><span>); </span><span>549</span><span>//</span><span>ipn_debug_email('Schlüssel für die Übermittlung: ' . print_r($options, true)); </span><span>550</span><span>551</span><span> // Schaltflächenfelder erstellen</span><span>552</span><span>foreach</span> (<span>$options</span><span>as</span><span>$name</span> => <span></span>553<span></span>//<span></span> Anführungszeichen entfernen<span></span>554<span></span>$value<span> = </span>str_replace<span> ('"', '', </span>$value<span></span>); <span></span>555<span></span>//<span></span>auf ungültige Zeichen prüfen<span></span>556<span></span>if<span> (</span>preg_match<span> ('/[^a-zA-Z_0-9]/', </span>$name<span></span>)) { <span></span>557<span> ipn_debug_email('datacheck - ABORTING - preg_match hat einen ungültigen Übermittlungsschlüssel gefunden: ' . </span>$name<span> . ' (' . </span>$value<span> . ')' </span>); <span></span>558<span></span>Pause<span></span>; <span></span>559<span></span> } <span></span>560<span></span>//<span></span> Benötigen wir eine spezielle Behandlung für &- und =-Symbole? <span></span>561<span></span> //if (strpos($value, '&') !== false || strpos($value, '=') !== false) $value = URL-Code ($value);<span></span>562<span></span>563<span></span>$bu</span>