Zencart は最初に注文を生成してから支払います。注文価格を変更する淘宝バックエンドと同様に、Zencart は注文を生成します
Zencart は Paypal を使用して支払いを行います。注文漏れが発生します。つまり、Paypal が顧客の支払いを受け取りました。しかし、Web サイトのバックエンドでは顧客からの注文はありません。 Paypal で注文が届かない主な理由は、顧客が Paypal の Web サイトにジャンプして支払いを完了したときに、ウィンドウを直接閉じたり、ネットワークが不安定で Web サイトに正常にジャンプしないことです。
Paypal での注文漏れの問題を解決するには、いくつかの解決策があります:
1. カート内の詳細項目オプションをオンにします。
原則: zencart バックエンド モジュールで [カートの詳細項目] オプションを開きます --> 支払い --> PayPal ウェブサイト支払い標準 - IPN。このオプションでは、すべての注文商品情報が PayPal に転送され、顧客が正常に支払ったものの、バックエンドが注文を正常に生成できなかった場合、PayPal アカウントの取引情報を通じて顧客がどの商品を購入したかを確認することもできます。
if ( (zen_not_null($module)) && (in_array($module.'.php', $this->modules)) && (isset($GLOBALS) [$module]->paynow_action_url)) ) {
$this->paynow_action_url = $GLOBALS[$module]->paynow_action_url;
}
paynow_button($order_id) 関数を追加するには、支払いクラスの最後の関数の後に次のコードを追加してください:
リーリー
2. PayPal 支払い方法を例として、その実装方法を説明します。ここで paypal.php ファイルを直接変更します。必ずこのファイルをバックアップしてください。コードは以下のとおりです。ここでは、form_action_url の指定が削除され、paynow_action_url が指定されていることがわかります。これは、ユーザーが「注文の確認」をクリックした後に直接 checkout_process に入ってほしいためです。そのため、form_action_url が指定されていない場合は、注文を確認するためのフォームは checkout_process ページに直接送信され、paynow_action_url は前の form_action_url の値です。 paynow_button 関数の実装も非常に簡単です。ここでは、元の process_button() 関数の内容を切り取っているだけですが、グローバル $order 変数を使用する代わりに、$order = new order($order_id) を使用して再作成します。過去の注文で今すぐ支払うボタンを表示する準備として構築されたオブジェクト。 paypal.phpの変更後のファイルは以下の通りです:
1 php
2 /**
3 * PayPal Website Payments Standard (IPN) メソッドの paypal.php 支払いモジュール クラス
4 *
5 * @packagepaymentMethod
6 * @copyright Copyright 2003-2010 Zen Cart 開発チーム
7 * @copyright 部分の著作権 2003 osCommerce
8 * @license http://www.zen-cart.com/license/2_0.txt GNU パブリック ライセンス V2.0
9 * @version $Id: paypal.php 15735 2010-03-29 07:13:53Z drbyte $
10 */
11
12 define('MODULE_PAYMENT_PAYPAL_TAX_OVERRIDE', 'true'
);
13
14/**
15 * 依存関係がロードされていることを確認してください
16 */
17 include_once((IS_ADMIN_FLAG ===
true ? DIR_FS_CATALOG_MODULES : DIR_WS_MODULES) . 'payment/paypal/paypal_functions.php'
);
18
19/**
20 * PayPal Website Payments Standard (IPN) メソッドの paypal.php 支払いモジュール クラス
21 *
22 */
23クラスペイパル
拡張ベース{
24 /**
25 * 支払い方法を表す文字列
26 *
27 * @var 文字列
28 */
29 var $code;
30 /**
31 * $title はこの支払い方法の表示名です
32 *
33 * @var 文字列
34 */
35 var $title;
36 /**
37 * $description は、この支払い方法のソフト名です
38 *
39 * @var 文字列
40 */
41 var $説明;
42 /**
43 * $enabled は、このモジュールがカタログに表示されるかどうかを決定します。
44 *
45 * @var boolean
46 */
47 var $有効;
48 /**
49 * コンストラクター
50 *
51 * @param int $paypal_ipn_id
52 * @return paypal
53 */
54 機能 paypal(
$paypal_ipn_id = ''
) {
55 グローバル $order、
$messageStack;
56 $this->コード = 'ペイパル'
;
57 $this->codeVersion = '1.3.9'
;
58 if (IS_ADMIN_FLAG ===
true) {
59 $this->title = MODULE_PAYMENT_PAYPAL_TEXT_ADMIN_TITLE;
// 管理者の支払いモジュールのタイトル
60 if (IS_ADMIN_FLAG ===
true &&
定義('MODULE_PAYMENT_PAYPAL_IPN_DEBUG') && MODULE_PAYMENT_PAYPAL_IPN_DEBUG != 'オフ') ;title .= '
(デバッグ モードがアクティブ)'
;
61 if (IS_ADMIN_FLAG ===
true && MODULE_PAYMENT_PAYPAL_TESTING == 'テスト')
$this->title .= '
(開発/テスト モードがアクティブ)'
;
62 }
else {
63 $this->title = MODULE_PAYMENT_PAYPAL_TEXT_CATALOG_TITLE;
// カタログ内の支払いモジュールのタイトル
64 } 65 $this->説明 =
MODULE_PAYMENT_PAYPAL_TEXT_DESCRIPTION;
66 $this->sort_order =
MODULE_PAYMENT_PAYPAL_SORT_ORDER;
67 $this->有効 = ((MODULE_PAYMENT_PAYPAL_STATUS == 'True') ?
true :
false);
68 if ((int)MODULE_PAYMENT_PAYPAL_ORDER_STATUS_ID > 0
) {
69 $this->order_status =
MODULE_PAYMENT_PAYPAL_ORDER_STATUS_ID;
70 }
71 if (
is_object(
$order))
$this->
update_status();
72 $this->paynow_action_url = 'https://' .
MODULE_PAYMENT_PAYPAL_HANDLER;
73
74 if (PROJECT_VERSION_MAJOR != '1' &&
substr(PROJECT_VERSION_MINOR, 0, 3) != '3.9')
$this->有効 =
false;
75
76 // テーブル構造を検証する
77 if (IS_ADMIN_FLAG ===
true)
$this->
tableCheckup();
78 }
79 /**
80 * ゾーンの一致とフラグ設定を計算して、このモジュールを顧客に表示するかどうかを決定します
81 *
82 */
83 関数 update_status() {
84 グローバル $order、
$db;
85
86 if ( (
$this->有効 ==
true) && ((int)MODULE_PAYMENT_PAYPAL_ZONE > 0
) ) {
87 $check_flag =
false;
88 $check_query =
$db->Execute("selectzone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_PAYPAL_ZONE . "' およびzone_country_id = '" .
$注文-> billing['country']['id'] . "' ゾーン ID で注文します
);
89 ながら (!
$check_query->
EOF) {
90 if (
$check_query->フィールド['zone_id'] ) {
91 $check_flag =
true;
92 休憩;
93 }
elseif (
$check_query->fields['zone_id'] ==
$order->billing['zone_id'
]) {
94 $check_flag =
true;
95 休憩;
96 }
97 $check_query->
MoveNext();
98 }
99
100 if (
$check_flag ==
false) {
101 $this->有効 =
false;
102 }
103 }
104 }
105 /**
106 * このモジュールが使用するように選択されている場合にデータ入力のエラーチェックを行う JS 検証
107 * (番号、所有者、および CVV の長さ)
108 *
109 * @return string
110 */
111 関数 javascript_validation() {
112 戻る false;
113 }
114 /**
115 * チェックアウト支払いページにクレジット カード情報送信フィールド (存在する場合) とともに支払い方法名が表示されます
116 *
117 * @return 配列
118 */
119 関数セレクション() {
120 return array('id' =>
$this->コード,
121 'モジュール' => MODULE_PAYMENT_PAYPAL_TEXT_CATALOG_LOGO、
122 'アイコン' =>
MODULE_PAYMENT_PAYPAL_TEXT_CATALOG_LOGO
123 );
124 }125 /**
126 * 通常、クレジット カードのタイプが受け入れられるかどうか、およびクレジット カード番号と有効期限が有効であるかどうかを評価します。
127 * PayPal モジュールは情報を収集していないため、このステップをスキップします。
128 *
129 * @return boolean
130 */
131 関数 pre_confirmation_check() {
132 戻る false;
133 }
134 /**
135 * チェックアウト確認ページにクレジットカード情報を表示します
136 * PayPal サイトに転送する前に PayPal 用に何も収集されないため、これはスキップされます
137 *
138 * @return boolean
139 */
140 関数確認() {
141 戻る false;
142 }
143 /**
144 * 注文確認画面で「送信」ボタンが押されたときに処理するデータとアクションを構築します。
145 * これにより、処理のためにデータが支払いゲートウェイに送信されます。
146 * (これらはチェックアウト確認ページの非表示フィールドです)
147 *
148 * @return string
149 */
150 関数 process_button() {
151 戻る false;
152 }
153 /**
154 * PayPal サイトにアクセスするときに使用する言語を決定します
155 */
156 関数 getLanguageCode() {
157 グローバル $order;
158 $lang_code = ''
;
159 $orderISO = zen_get_countries(
$order->customer['country']['id'],
true);
160 $storeISO = zen_get_countries(STORE_COUNTRY,
true);
161 if (
in_array(
strtoupper(
$orderISO['countries_iso_code_2']),
array('US', 'AU', 'DE', 'FR', 'IT' 、'GB'、'ES'、'AT'、'BE'、'CA'、'CH'、'CN'、'NL'、'PL'
))) {
162 $lang_code =
strtoupper(
$orderISO['countries_iso_code_2'
]);
163 }
elseif (
in_array(
strtoupper(
$storeISO['countries_iso_code_2'])),
array('US', 'AU', 'DE', 'FR', 'IT '、'GB'、'ES'、'AT'、'BE'、'CA'、'CH'、'CN'、'NL'、'PL'
))) {
164 $lang_code =
strtoupper(
$storeISO['countries_iso_code_2'
]);
165 }
elseif (
in_array(
strtoupper(
$_SESSION['言語コード']),
array('EN', 'US', 'AU', 'DE', 'FR '、'IT'、'GB'、'ES'、'AT'、'BE'、'CA'、'CH'、'CN'、'NL'、'PL'
))) {
166 $lang_code =
$_SESSION['言語コード'
];
167 if (
strtoupper(
$lang_code) == 'EN')
$lang_code = 'US'
;
168 }
169 //return $orderISO['countries_iso_code_2'];
170 return strtoupper(
$lang_code);
171 }
172 /**
173 * トランザクション情報を注文に保存し、支払いゲートウェイから返された結果を処理します
174 */
175 関数 before_process() {
176 戻る false;
177 }
178 /**
179 * リファラーを確認します
180 *
181 * @param string $zf_domain
182 * @return boolean
183 */
184 関数 check_referrer(
$zf_domain) {
185 戻る 本当;
186 }187 /**
188 * 管理ページコンポーネントを構築する
189 *
190 * @param int $zf_order_id
191 * @return string
192 */
193 関数 admin_notification(
$zf_order_id) {
194 グローバル $db;
195 $output = ''
;
196 $sql = "select * from " . TABLE_PAYPAL 。 " ここで order_id = '" 。 (int)
$zf_order_id 。 "' paypal_ipn_id による注文 DESC LIMIT 1"
;
197 $ipn =
$db->Execute(
$sql);
198 if (
$ipn->RecordCount() > 0 &&
file_exists(DIR_FS_CATALOG . DIR_WS_MODULES . 'payment/paypal/paypal_admin_notification.php'))
require( DIR_FS_CATALOG .DIR_WS_MODULES 。 Payment/paypal/paypal_admin_notification.php'
);
199 return $output;
200 }
201 /**
202 * 後処理アクティビティ
203 * 注文がプロセッサーから返されるとき、PDT が成功した場合、結果が order-status-history に保存され、後続の参照のためにデータが記録されます。
204 *
205 * @return boolean
206 */
207 関数 after_process() {
208 戻る false;
209 }
210 /**
211 * エラーメッセージの詳細を表示するために使用されます
212 *
213 * @return boolean
214 */
215 関数 Output_error() {
216 戻る false;
217 }
218 /**
219 * モジュールがインストールされているかどうかを確認します
220 *
221 * @return boolean
222 */
223 関数 check() {
224 グローバル $db;
225 if (IS_ADMIN_FLAG ===
true) {
226 グローバル $スニッファー;
227 if (
$sniffer->field_exists(TABLE_PAYPAL, 'zen_order_id'))
$db->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE COLUMN zen_order_id order_id int (11) そうではないNULL デフォルト '0'"
);
228 }
229 if (!
isset(
$this->
_check)) {
230 $check_query =
$db->Execute("selectconfiguration_value from " . TABLE_CONFIGURATION . " whereconfiguration_key = 'MODULE_PAYMENT_PAYPAL_STATUS'"
);
231 $this->_check =
$check_query->
RecordCount();
232 }
233 戻る $this->
_check;
234 }
235 /**
236 * 支払いモジュールとその構成設定をインストールします
237 *
238 */
239 関数 install() {
240 グローバル $db、
$messageStack;
241 if (
定義('MODULE_PAYMENT_PAYPAL_STATUS'
)) {
242 $messageStack->add_session('PayPal ウェブサイト決済標準モジュールはすでにインストールされています。', 'error'
);
243 zen_redirect(zen_href_link(FILENAME_MODULES, 'set=payment&module=paypal', 'NONSSL'
));
244 return '失敗しました'
;
245 }246 if (
定義('MODULE_PAYMENT_PAYPALWPP_STATUS'
)) {
247 $messageStack->add_session('注: PayPal Express Checkout モジュールはすでにインストールされています。Express がインストールされている場合は、Standard は必要ありません。', 'error'
);
248 zen_redirect(zen_href_link(FILENAME_MODULES, 'set=payment&module=paypalwpp', 'NONSSL'
));
249 return '失敗しました'
;
250 }251 $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title、configuration_key、configuration_value、configuration_description、configuration_group_id、sort_order、set_function、date_added) 値 ('PayPal モジュールを有効にする', 'MODULE_PAYMENT_PAYPAL_STAT)米国」、 'True', 'PayPal 支払いを受け入れますか?', '6', '0', 'zen_cfg_select_option(array('True', 'False'), ', now())"
);
252$db
-> execute( "Inserting"。table_configuration。 "(configuration_title、configuration_key、configuration_value、configuration_description、configuration_group_id、sort_order、date_added)values( 'business id'、 'module_pay_pay_usiness_id' '' '' STORE_OWNER_EMAIL_ADDRESS."', 'PayPal アカウントのメインのメール アドレス。
注: これは、PayPal アカウント設定のメインのメール アドレスと 正確に 一致する必要があります。 大文字と小文字が区別されるため、paypal.com で PayPal プロフィール設定を確認し、ここに正確に同じメインのメール アドレスを入力してください。', '6', '2', now())") ;
253
$db
->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title、configuration_key、configuration_value、configuration_description、configuration_group_id、sort_order、set_function、date_added) 値 ('トランザクション通貨', 'MODULE_PAYMENT_PAYPAL_CURRENCY) 「、」選択した通貨', '注文を PayPal に送信する通貨はどれですか?
注: サポートされていない通貨を PayPal に送信すると、自動的に USD に変換されます。', '6', '3 ', 'zen_cfg_select_option(array('選択された通貨', 'USDのみ', 'AUDのみ', 'CADのみ', 'EURのみ', 'GBPのみ', 'CHFのみ', 'CZKのみ', 'DKKのみ'、'HKD のみ'、'HUF のみ'、'JPY のみ'、'NOK のみ'、'NZD のみ'、'PLN のみ'、'SEK のみ'、'SGD のみ'、'THB のみ'、'MXN のみ', 'ILSのみ', 'PHPのみ', 'TWDのみ', 'BRLのみ', 'MYRのみ'), ', now())");
254
$db
->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title,configuration_key,configuration_value,configuration_description,configuration_group_id,sort_order,use_function,set_function,date_added)values('Payment Zone', 'MODULE_PAYMENT_PAYPAL_Z)ワン」 , '0', 'ゾーンが選択されている場合は、そのゾーンに対してのみこの支払い方法を有効にします。', '6', '4', 'zen_get_zone_class_title', 'zen_cfg_pull_down_zone_classes(', now())");
255
$db
->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title,configuration_key,configuration_value,configuration_description,configuration_group_id,sort_order,set_function,use_function,date_added)values('保留通知ステータスの設定', ' MODULE_PAYMENT_PAYPAL_PROCESSING_STATUS_ID', '" . DEFAULT_ORDERS_STATUS_ID . "', 'この支払いモジュールで行われた、まだ完了していない注文のステータスをこの値に設定します
(「保留中」を推奨)', '6', '5' , 'zen_cfg_pull_down_order_statuses(', 'zen_get_order_status_name', now())");
256
$db
->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title、configuration_key、configuration_value、configuration_description、configuration_group_id、sort_order、set_function、use_function、date_added) 値 ('注文ステータスの設定'、'MODULE_PAYMENT_PAYPAL_ORDER) _STATUS_ID ', '2', '支払いが完了したこの支払いモジュールでの注文のステータスをこの値に設定します
('処理中'を推奨)', '6', '6', 'zen_cfg_pull_down_order_statuses(', 'zen_get_order_status_name'、now())");
257
$db
->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title,configuration_key,configuration_value,configuration_description,configuration_group_id,sort_order,set_function,use_function,date_added)values('Set Refund Order Status', ' MODULE_PAYMENT_PAYPAL_REFUND_ORDER_STATUS_ID', '1', 'この支払いモジュールで返金された注文のステータスをこの値に設定します
(「保留中」を推奨)', '6', '7', 'zen_cfg_pull_down_order_statuses(' 、'zen_get_order_status_name'、now())");
258
$db-> execute( "inserting"。table_configuration。 "(configuration_title、configuration_key、configuration_description、configuration_group_id、sort_order、date_added)values( 'sort of displa '0', '表示のソート順序は低いものが最初に表示されます。', '6', '8', now())"
);
259 $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title,configuration_key,configuration_value,configuration_description,configuration_group_id,sort_order,set_function,date_added)values('Address Override', 'MODULE_PAYMENT_PAYPAL_ADDRESS_OVERRIDE', '1', '1 に設定した場合) 、Zen Cart で選択された顧客の配送先住所は、PayPal に保存されている顧客のアドレス帳を上書きします。顧客には Zen Cart から住所が表示されますが、PayPal で編集することはできません。
(無効な住所です。) PayPal では提供されていないものとして扱われます。または、override=0)
0=上書きなし
1=ZC アドレスは PayPal アドレスの選択を上書きします', '6', '18', 'zen_cfg_select_option (array('0','1'), ', now())"
);
260 $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title、configuration_key、configuration_value、configuration_description、configuration_group_id、sort_order、set_function、date_added) 値 ('配送先住所の要件?'、'MODULE_PAYMENT_PAYPAL_ADDRESS) _必須' , '2', '購入者の配送先住所。0 に設定すると、顧客は配送先住所を入力するよう求められます。2 に設定すると、顧客は配送先住所を入力する必要があります。
0=確認する
1=質問されません
2=必須
注:顧客が独自の配送先住所を入力できるようにしてから、注文を処理するときに PayPal 確認の詳細を手動で確認して、適切な住所を確認してください。 Web ペイメント スタンダード (IPN) を使用する場合、Zen Cart は顧客が別の住所を選択したかどうかを認識しません。 PayPal での配送先住所と注文時に入力した配送先住所の比較。', '6', '20', 'zen_cfg_select_option(array('0','1','2'), ', now( ))"
);
261 $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title、configuration_key、configuration_value、configuration_description、configuration_group_id、sort_order、set_function、date_added) 値 ('カート内の詳細な項目', 'MODULE_PAYMENT_PAYPAL_DE) TAILED_CART '、'いいえ'、'PayPal に品目の詳細を提供しますか? True に設定すると、割引が適用されず、税金と送料が単純な場合、品目の詳細が PayPal と共有されます。それ以外の場合は、カートの集計が行われます。 ', '6', '22', 'zen_cfg_select_option(array('No','Yes'), ', now())"
);
262 $db->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',アリ」 , '支払いページのカスタム支払いページ スタイルを設定します。page_style の値は、ページ スタイルを追加または編集するときに選択したページ スタイル名と同じです。[マイ] の [プロファイル] サブタブからカスタム支払いページ スタイルを追加および編集できます。 PayPal サイトの [アカウント] タブ。常にプライマリ スタイルを参照したい場合は、これを「プライマリ」に設定します。デフォルトの PayPal ページ スタイルを参照したい場合は、これを「paypal」に設定します。', '6', '25'、今())"
);
263 $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title,configuration_key,configuration_value,configuration_description,configuration_group_id,sort_order,set_function,date_added)values('PayPal Web サービスのモード
デフォルト:
www.paypal.com/cgi-bin/webscr
または
www.paypal.com/us/cgi-bin/webscr
または英国の場合、
www.paypal.com/uk/cgi-bin/ webscr
', 'MODULE_PAYMENT_PAYPAL_HANDLER', 'www.paypal.com/cgi-bin/webscr', 'PayPal ライブ処理用の URL を選択してください', '6', '73', '', now()) "
);
264 // サンドボックス: www.sandbox.paypal.com/cgi-bin/webscr
265 $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title,configuration_key,configuration_value,configuration_description,configuration_group_id,sort_order,date_added,use_function)values('PDT トークン (支払いデータ転送)', ' MODULE_PAYMENT_PAYPAL_PDTTOKEN', '', '処理後すぐにトランザクションをアクティブ化するには (検証に合格した場合)、PDT トークンの値をここに入力してください。', '6', '25', now(), 'zen_cfg_password_display')"
);
266 // Paypalのテストオプションはこちら
267 $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title,configuration_key,configuration_value,configuration_description,configuration_group_id,sort_order,set_function,date_added)values('Debug Mode', 'MODULE_PAYMENT_PAYPAL_IPN_DEBUG', 'Off', 'デバッグログを有効にしますか?
注: これにより、メールの受信トレイが非常に乱雑になる可能性があります!
ログは /includes/modules/payment/paypal/logs フォルダに保存されます
メールはストア所有者のアドレスに送信されます.
電子メール オプションは推奨されません。
通常の操作ではオフのままにしておきます。', '6', '71', 'zen_cfg_select_option(array('Off ','ログ ファイル','ログとメール'), ',now())"
);
268 $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title、configuration_key、configuration_value、configuration_description、configuration_group_id、sort_order、date_added) 値 ('デバッグ電子メール アドレス'、'MODULE_PAYMENT_PAYPAL_DEBUG_EMAIL_住所「、」 .STORE_OWNER_EMAIL_ADDRESS."', 'PayPal のデバッグに使用するメール アドレス', '6', '72', now())"
);
269
270 $this->notify('NOTIFY_PAYMENT_PAYPAL_INSTALLED'
);
271 }
272 /**
273 * モジュールとそのすべての設定を削除します
274 *
275 */
276 関数 Remove() {
277 グローバル $db;
278 $db->Execute("delete from " . TABLE_CONFIGURATION . " whereconfiguration_key LIKE 'MODULE_PAYMENT_PAYPAL_%'"
);
279 $this->notify('NOTIFY_PAYMENT_PAYPAL_UNINSTALLED'
);
280 }
281 /**
282 * モジュールの構成に使用される構成キーの内部リスト
283 *
284 * @return 配列
285 */
286 関数キー() {
287 $keys_list =
配列(
288 'MODULE_PAYMENT_PAYPAL_STATUS',
289 'MODULE_PAYMENT_PAYPAL_BUSINESS_ID',
290 'MODULE_PAYMENT_PAYPAL_PDTTOKEN',
291 'MODULE_PAYMENT_PAYPAL_CURRENCY',
292 'MODULE_PAYMENT_PAYPAL_ZONE',
293 'MODULE_PAYMENT_PAYPAL_PROCESSING_STATUS_ID',
294 'MODULE_PAYMENT_PAYPAL_ORDER_STATUS_ID',
295 'MODULE_PAYMENT_PAYPAL_REFUND_ORDER_STATUS_ID',
296 'MODULE_PAYMENT_PAYPAL_SORT_ORDER',
297 'MODULE_PAYMENT_PAYPAL_DETAILED_CART',
298 'MODULE_PAYMENT_PAYPAL_ADDRESS_OVERRIDE' ,
299 'MODULE_PAYMENT_PAYPAL_ADDRESS_REQUIRED' ,
300 'MODULE_PAYMENT_PAYPAL_PAGE_STYLE' 、
301 'MODULE_PAYMENT_PAYPAL_HANDLER',
302 'MODULE_PAYMENT_PAYPAL_IPN_DEBUG',
303 );
304
305 // Paypalのテスト/デバッグオプションはここにあります:
306 if (IS_ADMIN_FLAG ===
true) {
307 if (
isset(
$_GET['debug']) &&
$_GET['debug']=='on'
) {
308 $keys_list[]='MODULE_PAYMENT_PAYPAL_DEBUG_EMAIL_ADDRESS';
/* デフォルトはストア所有者のメールアドレス */
309 }
310 }
311 戻る $keys_list;
312 }313
314 function _getPDTresults(
$orderAmount,
$my_currency,
$pdtTX) {
315 グローバル $db;
316 $ipnData = ipn_postback('PDT',
$pdtTX);
317 $respdata =
$ipnData['info'
];
318
319 // データを解析する
320 $lines =
explode("n",
$respdata);
321 $this->pdtData =
array();
322 for (
$i=1;
$icount(
$lines);
$i++
){
323 if (!
strstr(
$lines[
$i], "="))
続ける;
324 list(
$key,
$val) =
explode("=",
$lines[
$i]);
325 $this->pdtData[
urldecode(
$key)] =
urldecode(
$val);
326 }
327
328 if (
$this->pdtData['txn_id'] == '' ||
$this->pdtData['payment_status'] == ''
) {
329 ipn_debug_email('PDT が無効なデータを返しました。代わりに IPN が処理するまで待つ必要があります。' . "n" .
print_r(
$this->pdtData,
true));
330 戻る FALSE;
331 }
else {
332 ipn_debug_email('PDT 返されたデータ ' .
print_r(
$this->pdtData,
true));
333 }
334
335 $_POST['mc_gross'] =
$this->pdtData['mc_gross'
];
336 $_POST['mc_currency'] =
$this->pdtData['mc_currency'
];
337 $_POST['ビジネス'] =
$this->pdtData['ビジネス'
];
338 $_POST['receiver_email'] =
$this->pdtData['receiver_email'
];
339
340 $PDTstatus = (ipn_validate_transaction(
$respdata,
$this->pdtData, 'PDT') && valid_payment(
$orderAmount,
$my_currency, 'PDT') &&
$これ->pdtData['payment_status'] == '完了'
);
341 if (
$this->pdtData['payment_status'] != '' &&
$this->pdtData['payment_status'] != 'Completed'
) {
342 ipn_debug_email('PDT 警告 :: 注文は「完了」としてマークされていません。保留中の理由を確認するか、IPN が完了するまでお待ちください。' . "n" . '[payment_status] => ' .
$this- >pdtData['payment_status'] . '[pending_reason] =>
$this->pdtData['pending_reason'
]);
343 }
344
345 $sql = "
SELECT order_id、paypal_ipn_id、payment_status、txn_type、pending_reason
346「 . TABLE_PAYPAL . 」から
347 WHERE txn_id = :transactionID またはparent_txn_id = :transactionID
348 order_id DESC で注文 "
;
349 $sql =
$db->bindVars(
$sql, ':transactionID',
$this->pdtData['txn_id'], 'string'
);
350 $ipn_id =
$db->Execute(
$sql);
351 if (
$ipn_id->RecordCount() != 0
) {
352 ipn_debug_email('PDT 警告 :: トランザクションはすでに存在します。おそらく IPN がすでに追加しています。PDT 処理は終了しました。'
);
353 $pdtTXN_is_unique =
false;
354 }
else {
355 $pdtTXN_is_unique =
true;
356 }
357
358 $PDTstatus = (
$pdtTXN_is_unique &&
$PDTstatus);
359
360 戻る $PDTステータス;
361 }362
363
364 関数 tableCheckup() {
365 グローバル $db、
$スニファー;
366 $field大丈夫1 = (
method_exists(
$sniffer, 'field_type')) ?
$sniffer->field_type(TABLE_PAYPAL, 'txn_id', 'varchar(20)',
true) : -1
;
367 $field大丈夫2 = (
$sniffer->field_exists(TABLE_PAYPAL, 'module_name')) ?
本当 : -1
;
368 $field大丈夫3 = (
$sniffer->field_exists(TABLE_PAYPAL, 'order_id')) ?
本当 : -1
;
369
370 if (
$field大丈夫1 == -1
) {
371 $sql = "「 .
TABLE_PAYPAL 」のフィールドを表示します。
372 $result =
$db->Execute(
$sql);
373 ながら (!
$結果->
EOF) {
374 if (
$result->fields['フィールド'] == 'txn_id'
) {
375 if (
$result->fields['Type'] == 'varchar(20)'
) {
376 $field大丈夫1 =
true;
// が存在し、必要なタイプと一致するため、他の検査にスキップします
377 }
else {
378 $fieldHealthy1 =
$result->fields['Type'];
//は一致しないので、「そのまま」を返します
379 休憩;
380 }
381 }
382 $result->
MoveNext();
383 }
384 }385
386 if (
$field大丈夫1 !==
true) {
387 // v1.3.7.x のテーブル構造の一時的な修正 -- 後のリリースでは削除される可能性があります
388 $db->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGEpayment_typepayment_type varchar(40) NOT NULL デフォルト ''"
);
389 $db->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE txn_type txn_type varchar(40) NOT NULL デフォルト ''"
);
390 $db->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGEpayment_statuspayment_status varchar(32) NOT NULL デフォルト ''"
);
391 $db->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGEreason_codereason_code varchar(40)defaultNULL"
);
392 $db->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE pending_reason pending_reason varchar(32) default NULL"
);
393 $db->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE 請求書請求書 varchar(128) デフォルト NULL"
);
394 $db->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE payer_business_name payer_business_name varchar(128) デフォルト NULL"
);
395 $db->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE address_name address_name varchar(64) default NULL"
);
396 $db->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE address_street address_street varchar(254) default NULL"
);
397 $db->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE address_city address_city varchar(120) default NULL"
);
398 $db->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE address_state address_state varchar(120) デフォルト NULL"
);
399 $db->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE payer_email payer_email varchar(128) NOT NULL デフォルト ''"
);
400 $db->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE business business varchar(128) NOT NULL default ''"
);
401 $db->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGEReceiver_emailreceiver_email varchar(128) NOT NULL デフォルト ''"
);
402 $db->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE txn_id txn_id varchar(20) NOT NULL デフォルト ''"
);
403 $db->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGEparent_txn_idparent_txn_id varchar(20)defaultNULL"
);
404 }
405 if (
$field大丈夫2 !==
true) {
406 $db->Execute("ALTER TABLE " . TABLE_PAYPAL . " ADD COLUMN module_name varchar(40) NOT NULL default '' after txn_type"
);
407 $db->Execute("ALTER TABLE " . TABLE_PAYPAL . " ADD COLUMN module_mode varchar(40) NOT NULL default '' after module_name"
);
408 }
409 if (
$field大丈夫3 !==
true) {
410 $db->Execute("ALTER TABLE " . TABLE_PAYPAL . " CHANGE zen_order_id order_id int(11) NOT NULL デフォルト '0'"
);
411 }
412 }413
414 関数 paynow_button(
$order_id) {
415 グローバル $db、
$order、
$currency、
$currency;
416 require_once(DIR_WS_CLASSES . 'order.php'
);
417 $order =
新しい order(
$order_id);
418 $options =
array();
419 $optionsCore =
array();
420 $optionsPhone =
array();
421 $optionsShip =
array();
422 $optionsLineItems =
array();
423 $optionsAggregate =
array();
424 $optionsTrans =
array();
425 $buttonArray =
array();
426
427 $this->totalsum =
$order->info['total'
];
428
429 // PayPal がセッションを失った場合に備えて、セッション内容を永久に保存します
430 $_SESSION['pipn_key_to_remove'] =
session_id();
431 $db->Execute("delete from " . TABLE_PAYPAL_SESSION . " where session_id = '" . zen_db_input(
$_SESSION['pipn_key_to_remove']) . "'"
);
432
433 $sql = "に挿入" 。 TABLE_PAYPAL_SESSION 。 "
(session_id、saved_session、expiry) 値 (
434 '" .zen_db_input(
$_SESSION['pipn_key_to_remove']) . "
',
435 '" .
base64_encode(
serialize(
$_SESSION)) . "
',
436 '" . (
時間() + (1*60*60*24*2)) . "')"
;
437
438 $db->Execute(
$sql);
439
440 $my_currency =
select_pp_currency();
441 if(!
空(
$order->情報['通貨'
])){
442 $my_currency=
$order->info['通貨'
];
443 }
444 $this->transaction_currency =
$my_currency;
445
446 $this->transaction_amount = (
$this->totalsum *
$currency->get_value(
$my_currency));
447
448 $telephone =
preg_replace('/D/', '',
$order->customer['telephone'
]);
449 if (
$電話 != ''
) {
450 $optionsPhone['H_PhoneNumber'] =
$telephone;
451 if (
in_array(
$order->顧客['country']['iso_code_2'],
array('US','CA'
))) {
452 $optionsPhone['night_phone_a'] =
substr(
$telephone,0,3
);
453 $optionsPhone['night_phone_b'] =
substr(
$telephone,3,3
);
454 $optionsPhone['night_phone_c'] =
substr(
$telephone,6,4
);
455 $optionsPhone['day_phone_a'] =
substr(
$telephone,0,3
);
456 $optionsPhone['day_phone_b'] =
substr(
$telephone,3,3
);
457 $optionsPhone['day_phone_c'] =
substr(
$telephone,6,4
);
458 }
else {
459 $オプション電話['night_phone_b'] =
$電話;
460 $optionsPhone['day_phone_b'] =
$telephone;
461 }
462 }463
464 $optionsCore =
配列(
465 'lc' =>私たち、
466 //'lc' => $order->顧客['国']['iso_code_2'],
467 '文字セット' =>文字コード、
468 'page_style' => MODULE_PAYMENT_PAYPAL_PAGE_STYLE、
469 'カスタム' => zen_session_name() 。 '=' 。 zen_session_id()、
470 '請求書' =>
$order->情報['num']、
471 'ビジネス' => MODULE_PAYMENT_PAYPAL_BUSINESS_ID、
472 '戻る' => zen_href_link(FILENAME_CHECKOUT_PROCESS, 'referer=paypal', 'SSL'),
473 'cancel_return' => zen_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'),
474 'ショッピング URL' => zen_href_link(FILENAME_SHOPPING_CART, '', 'SSL'),
475 'notify_url' => zen_href_link('ipn_main_handler.php', '', 'SSL',
false,
false,
true),
476 'redirect_cmd' => '_xclick','rm' => 2,'bn' => 'zencart','mrb' => 'R-6C7952342H795591R','pal' => '9E82WJBKKGPLQ',
477 );
478 $optionsCust =
配列(
479 '名' => replace_accents(
$order->顧客['名']),
480 '姓' => replace_accents(
$order->顧客['姓']),
481 'アドレス1' => replace_accents(
$order->顧客['番地']),
482 '都市' => replace_accents(
$order->customer['city']),
483 '状態' => zen_get_zone_code(
$order->顧客['country']['id'],
$order->顧客['zone_id'],
$order->顧客['state']),
484 'zip' =>
$order->顧客['郵便番号']、
485 '国' =>
$order->顧客['国']['iso_code_2'],
486 'メール' =>
$order->顧客['email_address'],
487 );
488 // 住所 2 行目はオプションです
489 if (
$order->顧客['郊外'] != '')
$optionsCust['住所2'] =
$order->顧客['郊外'
];
490 // 日本語の住所レイアウトの異なる形式:
491 if (
$order->customer['country']['iso_code_2'] == 'JP')
$optionsCust['zip'] =
substr(
$order- >顧客['郵便番号'], 0, 3) 。 「-」。
substr(
$order->顧客['郵便番号'], 3
);
492 if (MODULE_PAYMENT_PAYPAL_ADDRESS_REQUIRED == 2
) {
493 $optionsCust =
配列(
494 '名' => replace_accents(
$order->delivery['firstname'] != '' ?
$order->delivery['firstname'] :
$order->billing['firstname']),
495 '姓' => replace_accents(
$order->delivery['lastname'] != '' ?
$order->delivery['lastname'] :
$order->billing['lastname']),
496 'アドレス1' => replace_accents(
$order->delivery['street_address'] != '' ?
$order->delivery['street_address'] :
$order->billing['street_address']),
497 '都市' => replace_accents(
$order->delivery['city'] != '' ?
$order->delivery['city'] :
$order->billing['city']),
498 '状態' => (
$order->delivery['country']['id'] != '' ? zen_get_zone_code(
$order->delivery['country']['id'],
$order- >delivery['zone_id'],
$order->delivery['state']) : zen_get_zone_code(
$order->billing['country']['id'],
$order- >billing['zone_id'],
$order->billing['state'])),
499 'zip' => (
$order->delivery['郵便番号'] != '' ?
$order->delivery['郵便番号'] :
$order->billing['postcode']),
500 '国' => (
$注文->配送['国']['タイトル'] != '' ?
$order->配送['country']['title'] :
$order->billing['country']['title'])、
501 '国コード' => (
$order->delivery['country']['iso_code_2'] != '' ?
$order->delivery['country']['iso_code_2'] :
$order->請求['国']['iso_code_2'])、
502 'メール' =>
$order->顧客['email_address'],
503 );
504 if (
$order->delivery['郊外'] != '')
$optionsCust['address2'] =
$order->delivery['郊外'
] ;
505 if (
$order->delivery['country']['iso_code_2'] == 'JP')
$optionsCust['zip'] =
substr(
$order) ->配達['郵便番号']、0、3) 。 「-」。
substr(
$order->delivery['郵便番号'], 3
);
506 }
507 $optionsShip['no_shipping'] =
MODULE_PAYMENT_PAYPAL_ADDRESS_REQUIRED;
508 if (MODULE_PAYMENT_PAYPAL_ADDRESS_OVERRIDE == '1')
$optionsShip['address_override'] =
MODULE_PAYMENT_PAYPAL_ADDRESS_OVERRIDE;
509 // 可能な場合はカートの内容の詳細を準備してください
510 if (MODULE_PAYMENT_PAYPAL_DETAILED_CART == 'はい')
$optionsLineItems =
ipn_getLineItemDetails();
511 if (
sizeof(
$optionsLineItems) > 0
) {
512 $optionsLineItems['cmd'] = '_cart'
;
513 // $optionsLineItems['num_cart_items'] = sizeof($order->products);
514 if (
isset(
$optionsLineItems['shipping'
])) {
515 $optionsLineItems['shipping_1'] =
$optionsLineItems['shipping'
];
516 unset(
$optionsLineItems['shipping'
]);
517 }
518 unset(
$optionsLineItems['小計'
]);
519 // 計算の不一致や割引などにより品目の詳細を保持できなかった場合、デフォルトで集計モードになります
520 if (!
isset(
$optionsLineItems['item_name_1']) ||
$optionsLineItems['creditsExist'] ==
TRUE)
$optionsLineItems =レイ
() ;
521
//
if ($optionsLineItems['amount'] != $this->transaction_amount) $optionsLineItems = array();
522
// デバッグ:
523
//ipn_debug_email('品目の詳細 (空白の場合、データの不一致またはクレジットが適用されたためバイパスされたことを意味します): ' . "n" . print_r($optionsLineItems, true));
524
unset
($optionsLineItems
['creditsExist']);
525
}
526 $optionsAggregate =
array(
527 'cmd' => '_ext-enter',
528 'アイテム名' => MODULE_PAYMENT_PAYPAL_PURCHASE_DESCRIPTION_TITLE、
529 'アイテム番号' => MODULE_PAYMENT_PAYPAL_PURCHASE_DESCRIPTION_ITEMNUM、
530 //'num_cart_items' => sizeof($order->products),
531 '金額' =>
number_format(
$this->transaction_amount,
$currency->get_Decimal_places(
$my_currency)),
532 '配送' => 「0.00」、
533 );
534 if (MODULE_PAYMENT_PAYPAL_TAX_OVERRIDE == 'true')
$optionsAggregate['tax'] = '0.00'
;
535 if (MODULE_PAYMENT_PAYPAL_TAX_OVERRIDE == 'true')
$optionsAggregate['tax_cart'] = '0.00'
;
536 $optionsTrans =
array(
537 'アップロード' => (int)(
sizeof(
$order->商品) > 0),
538 '通貨コード' =>
$my_currency、
539 //'paypal_order_id' => $paypal_order_id、
540 //'no_note' => 「1」、
541 //'請求書' => ”、
542 );
543
544 // 項目情報が無効な場合は、aggregate:を使用します
545 if (
sizeof(
$optionsLineItems) > 0)
$optionsAggregate =
$optionsLineItems;
546
547 //提出物を準備します
548 $options =
array_merge(
$optionsCore,
$optionsCust,
$optionsPhone,
$optionsShip,
$optionsTrans$,オプション集約
);
549
//
ipn_debug_email('送信用のキー: ' .print_r($options, true));
550
551
// ボタンフィールドを構築します
552
foreach
($options
as
$name
=> $value
) {
553
//
引用符を削除してください
554
$value
= str_replace
('"', '', $value
);
555
//
無効な文字をチェック
556
if
(preg_match
('/[^a-zA-Z_0-9]/', $name
)) {
557
ipn_debug_email('datacheck - ABORTING - preg_match で無効な送信キーが見つかりました: ' . $name
. ' (' . $value
. ')');
558
休憩
;
559
}
560
//
& および = 記号には特別な処理が必要ですか?
561
//if (strpos($value, '&') !== false || strpos($value, '=') !== false) $value = urlencode($value);
562
563
$buttonArray
[] = zen_draw_hidden_field($name
, $value
);
564
}
565
$process_button_string
= implode
("n", $buttonArray
) 。 「ん」;
566
567
$_SESSION
['paypal_transaction_info'] = array
($this
->transaction_amount, $this
->transaction_currency);
568
return
$process_button_string
;
569
}
570
571
}
コードを表示
3. その後、Order.php 内の作成メソッドを変更し、注文を作成するときに、顧客が選択する支払い方法が Paypal であることを指定します。契約の状態は未払いになる可能性があります。
<span> 1</span> <span>関数</span> create(<span>$zf_ot_modules</span>, <span>$zf_mode</span> = 2<span>) {
</span><span> 2</span> <span>グローバル</span> <span>$db</span><span>;
</span><span> 3</span> <span>$t1</span> = <span>日付</span>("YmdGhs"<span>);
</span><span> 4</span> <span>srand</span> ((<span>float</span>) <span>microtime</span>() * 10000000<span>);
</span><span> 5</span> <span>$input</span> = <span>array</span> ("1", "2", "3", "4", "5", "6", "7", "8", "9", " 0"<span>);
</span><span> 6</span> <span>$rand_keys</span> = <span>array_rand</span> (<span>$input</span>, 2<span>);
</span><span> 7</span> <span>$l1</span> = <span>$input</span>[<span>$rand_keys</span>[0<span>]];
</span><span> 8</span> <span>$l2</span> = <span>$input</span>[<span>$rand_keys</span>[1<span>]];
</span><span> 9</span> <span>$r1</span> = <span>rand</span>(0,9<span>);
</span><span>10</span> <span>$ordernum</span> = <span>$t1</span>.<span>$l1</span>.<span>$l2</span>.<span>$r1</span><span>;
</span><span>11</span>
<span>12</span> <span>if</span> (<span>$this</span>->info['total'] == 0<span>) {
</span><span>13</span> <span>if</span> (DEFAULT_ZERO_BALANCE_ORDERS_STATUS_ID == 0<span>) {
</span><span>14</span>
ログイン後にコピー