Zencart先生成订单后付款,类似淘宝后台修改订单价格,zencart生成订单
Zencart 使用 Paypal 付款,会出现漏单的情况,即 paypal 已经收到客户的付款,但是网站后台没有客户的订单。导致 paypal 漏单的原因大致会是当客户跳转到Paypal 网站付款完毕之后,直接关闭了窗口,或者网络不稳定,没有正常跳转到网站。
解决 Paypal 漏单问题的方案有好几种:
一. 开启 Detailed Line Items in Cart 选项。
原理:在 zencart 后台 Module --> Payment --> PayPal Website Payments Standard - IPN 开启 Detailed Line Items in Cart 选项。这个选项会把你所有的订单物品信息传给 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)函数,请在payment类的最后一个函数之后加上如下的代码:
<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. 以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),来重新构造的一个对象,这样做是为在历史订单中显示pay now按钮做准备的。paypal.php修改后的文件如下:
1 php
2 /**
3 * paypal.php PayPal 网站付款标准 (IPN) 方法的付款模块类
4 *
5 * @package paymentMethod
6 * @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 定义('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.php PayPal 网站付款标准 (IPN) 方法的付款模块类
21*
22*/
23 类 paypal
扩展 基础 {
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 布尔值
46 */
47 var $enabled;
48 /**
49 * 构造函数
50 *
51 * @param int $paypal_ipn_id
52 * @return paypal
53 */
54 函数 paypal(
$paypal_ipn_id = ''
) {
55 全局 $order,
$messageStack;
56 $这个->code = 'paypal'
;
57 $this->codeVersion = '1.3.9'
;
58 如果 (IS_ADMIN_FLAG ===
true) {
59 $这个->title = MODULE_PAYMENT_PAYPAL_TEXT_ADMIN_TITLE;
// 管理中的付款模块标题
60 if (IS_ADMIN_FLAG ===
true &&
已定义('MODULE_PAYMENT_PAYPAL_IPN_DEBUG') && MODULE_PAYMENT_PAYPAL_IPN_DEBUG != '关闭')
$this->title .= '
; (调试模式处于活动状态)'
;
61 if (IS_ADMIN_FLAG ===
true && MODULE_PAYMENT_PAYPAL_TESTING == '测试')
$this->title 。 = '
; (开发/测试模式处于活动状态)'
;
62 }
其他 {
63 $这个->title = MODULE_PAYMENT_PAYPAL_TEXT_CATALOG_TITLE;
//目录中的支付模块标题
64 } 65 $这个->描述 =
MODULE_PAYMENT_PAYPAL_TEXT_DESCRIPTION;
66 $这个->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 $这个->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 ->启用=
假;
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("从 " . TABLE_ZONES_TO_GEO_ZONES . " 中选择 zone_id,其中 geo_zone_id = '" . MODULE_PAYMENT_PAYPAL_ZONE . " ' and zone_country_id = '" .
$order->billing['country']['id'] ."' order by zone_id"
);
89 while (!
$check_query->
EOF) {
90 if (
$check_query->fields['zone_id'] <1
) {
91 $check_flag =
true;
92休息;
93 }
elseif (
$check_query->fields['zone_id'] ==
$order->账单['zone_id'
]) {
94 $check_flag =
true;
95 休息;
96}
97 $check_query->
MoveNext();
98}
99
100 if (
$check_flag ==
false) {
101 $这个->启用 =
false;
102 }
103 }
104 }
105 /**
106 * JS 验证,如果选择使用此模块,则会对数据输入进行错误检查
107 *(号码、所有者和 CVV 长度)
108 *
109 * @return 字符串
110 */
111 函数 javascript_validation() {
112 返回 假;
113 }
114 /**
115 * 在结账付款页面上显示付款方式名称以及信用卡信息提交字段(如果有)
116 *
117 * @return 数组
118 */
119 函数选择(){
120 返回 数组('id' =>
$this->code,
121'模块'=> MODULE_PAYMENT_PAYPAL_TEXT_CATALOG_LOGO,
122'图标'=>
MODULE_PAYMENT_PAYPAL_TEXT_CATALOG_LOGO
123 );
124 }125 /**
126 * 通常评估信用卡类型是否接受以及信用卡号和到期日期的有效性
127 * 由于 paypal 模块不收集信息,因此它会跳过此步骤。
128 *
129 * @return 布尔值
130 */
131 函数 pre_confirmation_check() {
132 返回 假;
133 }
134 /**
135 * 在结账确认页面显示信用卡信息
136 * 由于在转发到 paypal 网站之前不会为 paypal 收集任何内容,因此跳过此部分
137 *
138 * @return 布尔值
139 */
140 函数确认(){
141 返回 假;
142 }
143 /**
144 * 构建在订单确认屏幕上按下“提交”按钮时要处理的数据和操作。
145 * 这会将数据发送到支付网关进行处理。
146 *(这些是结帐确认页面上的隐藏字段)
147 *
148 * @return 字符串
149 */
150 函数 process_button() {
151 返回 假;
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']),
数组('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']),
数组('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['语言代码']),
数组('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 = '美国'
;
168 }
169 //return $orderISO['countries_iso_code_2'];
170 返回 strtoupper(
$lang_code);
171}
172 /**
173 * 将交易信息存储到订单并处理从支付网关返回的任何结果
174 */
175 函数 before_process() {
176 返回 假;
177 }
178 /**
179 * 检查推荐人
180 *
181 * @param string $zf_domain
182 * @return 布尔值
183 */
184 函数 check_referrer(
$zf_domain) {
185 返回 true;
186 }187 /**
188 * 构建管理页面组件
189 *
190 * @param int $zf_order_id
191 * @return 字符串
192 */
193 函数 admin_notification(
$zf_order_id) {
194 全球 $db;
195 $output = ''
;
196 $sql = "从 " 选择 * 。表_PAYPAL。 “其中 order_id = '”。 (int)
$zf_order_id 。 "' 按 paypal_ipn_id DESC LIMIT 1 订购"
;
197 $ipn =
$db->执行(
$sql);
198 if (
$ipn->RecordCount() > 0 &&
file_exists(DIR_FS_CATALOG . DIR_WS_MODULES . '付款/paypal/paypal_admin_notification.php'))
需要(DIR_FS_CATALOG . DIR_WS_MODULES . ' payment/paypal/paypal_admin_notification.php'
);
199 返回 $output;
200 }
201 /**
202 * 后处理活动
203 * 当订单从处理器返回时,如果 PDT 成功,则会将结果存储在 order-status-history 中,并记录数据以供后续参考
204 *
205 * @return 布尔值
206 */
207 函数 after_process() {
208 返回 假;
209}
210 /**
211 * 用于显示错误消息详细信息
212 *
213 * @return 布尔值
214 */
215 函数output_error() {
216 返回 假;
217}
218 /**
219 * 检查模块是否安装
220 *
221 * @return 布尔值
222 */
223 函数 check() {
224 全球 $db;
225 if (IS_ADMIN_FLAG ===
true) {
226 全球 $sniffer;
227 if (
$sniffer->field_exists(TABLE_PAYPAL, 'zen_order_id'))
$db->执行("ALTER TABLE " . TABLE_PAYPAL . " CHANGE COLUMN zen_order_id order_id int(11) NOT NULL 默认 '0'"
);
228 }
229 if (!
isset(
$this->
_check)) {
230 $check_query =
$db->Execute("从 " . TABLE_CONFIGURATION . " 中选择配置值,其中 configuration_key = 'MODULE_PAYMENT_PAYPAL_STATUS'"
);
231 $this->_check =
$check_query->
RecordCount();
232 }
233 返回 $这个->
_check;
234 }
235 /**
236 * 安装支付模块及其配置设置
237 *
238 */
239 函数 install() {
240 全局 $db,
$messageStack;
241 if (
已定义('MODULE_PAYMENT_PAYPAL_STATUS'
)) {
242 $messageStack->add_session('PayPal 网站支付标准模块已安装。', '错误'
);
243 zen_redirect(zen_href_link(FILENAME_MODULES, 'set= payment&module=paypal', 'NONSSL'
));
244 返回'失败'
;
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 返回'失败'
;
250 }251 $db->执行("插入" . TABLE_CONFIGURATION . " (configuration_title,configuration_key,configuration_value,configuration_description,configuration_group_id,sort_order,set_function,date_added)值( '启用 PayPal 模块', 'MODULE_PAYMENT_PAYPAL_STATUS', 'True', '您想接受 PayPal 付款吗?', '6', '0', 'zen_cfg_select_option(array('True', 'False'), ', now ())"
);
252 $db->执行("插入 " . TABLE_CONFIGURATION . " (configuration_title,configuration_key,configuration_value,configuration_description,configuration_group_id,sort_order,date_added) 值 ('业务ID', 'MODULE_PAYMENT_PAYPAL_BUSINESS_ID','".STORE_OWNER_EMAIL_ADDRESS."', '您 PayPal 帐户的主电子邮件地址。
注意:这必须与
完全匹配的主电子邮件地址您的 PayPal 帐户设置。它
区分大小写,因此请在 paypal.com 上检查您的 PayPal 个人资料首选项,并确保在此处输入完全相同的主电子邮件地址。', '6', ' 2', 现在())"
);
253 $db->执行("插入 " . 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('所选货币', '仅美元', '仅澳元', '仅加元', '仅欧元', '仅英镑', '仅瑞士法郎', '仅捷克克朗', '仅丹麦克朗', '仅港币', '仅匈牙利福林', '仅日元', '仅挪威克朗', '仅新西兰元', '仅波兰兹罗提', '仅瑞典克朗', '仅新加坡元', '仅泰铢', '仅MXN', '仅ILS', '仅PHP', '仅TWD', '仅BRL', '仅MYR'), ', now())"
);
254 $db->执行("插入" . TABLE_CONFIGURATION . " (configuration_title,configuration_key,configuration_value,configuration_description,configuration_group_id,sort_order,use_function,set_function,date_added) value ('Payment Zone', 'MODULE_PAYMENT_PAYPAL_ZONE', '0', '如果选择了某个区域,则仅对该区域启用此付款方式。', '6', '4', 'zen_get_zone_class_title', 'zen_cfg_pull_down_zone_classes(',现在())"
);
255 $db->执行("插入" . TABLE_CONFIGURATION . " (configuration_title,configuration_key,configuration_value,configuration_description,configuration_group_id,sort_order,set_function,use_function,date_added) value ('设置待处理通知状态', '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->执行("插入到" . 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_ORDER_STATUS_ID', '2', '将使用此支付模块完成支付的订单状态设置为该值
(推荐'处理中')', '6' , '6', 'zen_cfg_pull_down_order_statuses(', 'zen_get_order_status_name', now())"
);
257 $db->执行("插入" . 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_REFUND_ORDER_STATUS_ID', '1', '将此支付模块已退款的订单状态设置为此值
(推荐'待处理')', '6 ', '7', 'zen_cfg_pull_down_order_statuses(', 'zen_get_order_status_name', now())"
);
258 $db->执行(“插入到” . TABLE_CONFIGURATION . “(configuration_title,configuration_key,configuration_value,configuration_description,configuration_group_id,sort_order,date_linked)值('排序显示顺序。', 'MODULE_PAYMENT_PAYPAL_SORT_ORDER', '0', '显示排序顺序。首先显示最低的顺序。', '6', '8', now())"
);
259 $db-> 执行(“插入”。TABLE_CONFIGURATION。“(configuration_title,configuration_key,configuration_value,configuration_description,configuration_group_id,sort_order,set_function,date_linked)值('地址覆盖','MODULE_PAYMENT_PAYPAL_ADDRESS_OVERRIDE','1','如果设置为1 ,Zen Cart 中选择的客户送货地址将覆盖客户 PayPal 存储的地址簿。客户将从 Zen Cart 中看到他们的地址,但无法在 PayPal 中对其进行编辑。
(地址无效)。将被 PayPal 视为未提供,或覆盖=0)
0=无覆盖
1=ZC 地址覆盖 PayPal 地址选择', '6', '18', 'zen_cfg_select_option (array('0','1'), ', now())"
);
260 $db->执行(“插入到” . TABLE_CONFIGURATION . “(configuration_title、configuration_key、configuration_value、configuration_description、configuration_group_id、sort_order、set_function、date_added)值( '送货地址要求?', 'MODULE_PAYMENT_PAYPAL_ADDRESS_REQUIRED', '2', '如果设置为 0,将提示您的客户提供送货地址。如果设置为 1,则不会要求您的客户提供送货地址。如果设置为 2,您的客户将需要提供送货地址。
0=提示
1=未询问
2=必需
注意:如果您允许客户输入自己的送货地址,请确保您在填写订单时亲自手动验证 PayPal 确认详细信息以验证正确的地址。 Zen Cart 不知道他们是否在 PayPal 上选择了备用送货地址,而不是下订单时输入的地址。', '6', '20', 'zen_cfg_select_option(array('0','1') ,'2'), ', now())"
);
261 $db->执行("插入到 " . TABLE_CONFIGURATION . " (configuration_title、configuration_key、configuration_value、configuration_description、configuration_group_id、sort_order、set_function、date_added) 值 ( '购物车中的详细行项目', 'MODULE_PAYMENT_PAYPAL_DETAILED_CART', '否', '您想向 PayPal 提供行项目详细信息吗? 如果设置为 True,如果不适用折扣且含税,行项目详细信息将与 PayPal 共享否则,将发送聚合购物车摘要。', '6', '22', 'zen_cfg_select_option(array('No','Yes'), ', now())"
);
262 $db->执行("插入 " . TABLE_CONFIGURATION . " (configuration_title,configuration_key,configuration_value,configuration_description,configuration_group_id,sort_order,date_driven) 值 ('Page Style', 'MODULE_PAYMENT_PAYPAL_PAGE_STYLE', 'Primary', '设置付款页面的自定义付款页面样式 page_style 的值与您在添加或编辑页面样式时选择的页面样式名称相同 您可以添加和编辑自定义。 PayPal 网站上“我的帐户”选项卡的“个人资料”子选项卡中的“付款页面样式” 如果您希望始终引用您的主要样式,请将其设置为“主要”。如果您希望引用默认的 PayPal 页面样式,请将其设置为“主要”。 “贝宝”。', '6', '25', now())"
);
263 $db->执行(“插入到” . TABLE_CONFIGURATION . “(configuration_title、configuration_key、configuration_value、configuration_description、configuration_group_id、sort_order、set_function、date_added)值( 'PayPal Web 服务模式
默认:
www.paypal.com/cgi-bin/webscr
gt;或
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', '', 现在())"
);
264 // 沙箱:www.sandbox.paypal.com/cgi-bin/webscr
265 $db->执行("插入" . TABLE_CONFIGURATION . " (configuration_title、configuration_key、configuration_value、configuration_description、configuration_group_id、sort_order、date_added、use_function) 值 ('PDT 令牌(付款数据传输)', 'MODULE_PAYMENT_PAYPAL_PDTTOKEN', '', '在此处输入您的 PDT 令牌值,以便在处理后立即激活交易(如果它们通过验证)。', '6', '25', now(), 'zen_cfg_password_display')"
);
266 //此处为 Paypal 测试选项
267 $db->执行(“插入”。TABLE_CONFIGURATION。“(configuration_title,configuration_key,configuration_value,configuration_description,configuration_group_id,sort_order,set_function,date_added)值('调试模式','MODULE_PAYMENT_PAYPAL_IPN_DEBUG','关闭','启用调试日志记录?
注意:这真的会让您的电子邮件收件箱变得混乱!
日志记录将转到 /includes/modules/ payment/paypal/logs 文件夹
>电子邮件将转到商店所有者地址.
不建议使用电子邮件选项。
正常操作时保持关闭状态。', '6', '71', 'zen_cfg_select_option(array('Off) ','日志文件','日志和电子邮件'), ', now())"
);
268 $db->执行(“插入” . TABLE_CONFIGURATION . “(configuration_title、configuration_key、configuration_value、configuration_description、configuration_group_id、sort_order、date_linked)值('调试电子邮件地址', 'MODULE_PAYMENT_PAYPAL_DEBUG_EMAIL_ADDRESS','".STORE_OWNER_EMAIL_ADDRESS."', '用于 PayPal 调试的电子邮件地址', '6', '72', now())"
);
269
270 $this->notify('NOTIFY_PAYMENT_PAYPAL_INSTALLED'
);
271}
272 /**
273 * 删除模块及其所有设置
274 *
275 */
276 函数 删除() {
277 全球 $db;
278 $db->Execute("从 " . TABLE_CONFIGURATION . " 中删除,其中 configuration_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['调试']) &&
$_GET[ '调试']=='开启'
) {
308 $keys_list[]='MODULE_PAYMENT_PAYPAL_DEBUG_EMAIL_ADDRESS';
/* 默认为商店所有者电子邮件地址 */
309 }
310 }
311 返回 $keys_list;
312 }313
314 函数 _getPDTresults(
$orderAmount,
$my_currency,
$pdtTX) {
315 全球 $db;
316 $ipnData = ipn_postback('PDT',
$pdtTX);
317 $respdata =
$ipnData['info'
];
318
319 //解析数据
320 $lines =
爆炸("n",
$respdata);
321 $this->pdtData =
数组();
322 对于 (
$i=1;
$i<
计数(
$lines);
$i ){
323 if (!
strstr(
$lines[
$i], "=") )
继续;
324 列表(
$key,
$val) =
爆炸("=,
$lines[
$i]);
325 $this->pdtData[
urldecode(
$key)] =
urldecode(
$val);
326 }
327
328 if (
$this->pdtData['txn_id'] == '' ||
$this->pdtData ['付款状态'] == ''
) {
329 ipn_debug_email('PDT 返回无效数据。必须等待 IPN 处理。' . "n" .
print_r(
$this-> ;pdtData,
true));
330 返回 假;
331 }
其他 {
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') &&
$this->pdtData[' payment_status'] == '已完成'
);
341 if (
$this->pdtData[' payment_status'] != '' &&
$this-> ;pdtData[' payment_status'] != '已完成'
) {
342 ipn_debug_email('PDT 警告 :: 订单未标记为“已完成”。检查待处理原因或等待 IPN 完成。' . "n" . '[ payment_status] => ' .
$this->pdtData[' payment_status'] '[pending_reason] => ' . >]);
343
}
344
345
$sql
= "选择 order_id、paypal_ipn_id、 payment_status、txn_type、pending_reason
346
来自“.TABLE_PAYPAL”。
347
其中 txn_id = :transactionID 或parent_txn_id = :transactionID
348
ORDER BY order_id DESC ";
349
$sql
= $db
->bindVars($sql
, ':transactionID', $这个
->pdtData['txn_id'], 'string');
350
$ipn_id
= $db
->执行($sql
);
351
if
($ipn_id
->RecordCount() != 0) {
352
ipn_debug_email('PDT 警告:: 事务已存在。也许 IPN 已添加它。PDT 处理结束。');
353
$pdtTXN_is_unique
= 假
;
354
} 其他
{
355
$pdtTXN_is_unique
= true
;
356
}
357
358
$PDTstatus
= ($pdtTXN_is_unique
&& $PDTstatus
);
359
360
返回
$PDTstatus
;
361
}
362
363
364 函数 tableCheckup() {
365 全局 $db,
$sniffer;
366 $fieldOkay1 = (
method_exists(
$sniffer, 'field_type')) ?
$sniffer->field_type(TABLE_PAYPAL, 'txn_id', 'varchar(20)',
true) : -1
;
367 $fieldOkay2 = (
$sniffer->field_exists(TABLE_PAYPAL, 'module_name')) ?
true : -1
;
368 $fieldOkay3 = (
$sniffer->field_exists(TABLE_PAYPAL, 'order_id')) ?
true : -1
;
369
370 if (
$fieldOkay1 == -1
) {
371 $sql = "显示来自 " .
TABLE_PAYPAL 的字段;
372 $结果 =
$db->执行(
$sql);
373 while (!
$结果->
EOF) {
374 if (
$结果->fields['Field'] == 'txn_id'
) {
375 if (
$结果->fields['Type'] == 'varchar(20)'
) {
376 $fieldOkay1 =
true;
// 存在且符合所需类型,因此请跳至其他检查
377 }
其他 {
378 $fieldOkay1 =
$结果->fields['Type'];
// 不匹配,因此返回它“是什么”
379 休息;
380 }
381}
382 $结果->
MoveNext();
383 }
384}385
386 if (
$fieldOkay1 !==
true) {
387 // v1.3.7.x 表结构的临时修复 -- 可能会在以后的版本中删除
388 $db->执行("ALTER TABLE " . TABLE_PAYPAL . " CHANGE payment_type payment_type varchar(40) NOT NULL default ''"
);
389 $db->执行("ALTER TABLE " . TABLE_PAYPAL . " CHANGE txn_type txn_type varchar(40) NOT NULL default ''"
);
390 $db->执行("ALTER TABLE " . TABLE_PAYPAL ." CHANGE payment_status payment_status varchar(32) NOT NULL default ''"
);
391 $db->Execute("ALTER TABLE " . TABLE_PAYPAL ." CHANGE Reason_code Reason_code varchar(40) 默认 NULL"
);
392 $db->Execute("ALTER TABLE " . TABLE_PAYPAL ." CHANGEending_reasonending_reason varchar(32) 默认 NULL"
);
393 $db->执行("ALTER TABLE " . TABLE_PAYPAL ." CHANGE 发票发票 varchar(128) 默认 NULL"
);
394 $db->执行("ALTER TABLE " . TABLE_PAYPAL . " CHANGE payer_business_name payer_business_name varchar(128) 默认 NULL"
);
395 $db->执行("ALTER TABLE " . TABLE_PAYPAL ." CHANGE 地址名称 地址名称 varchar(64) 默认 NULL"
);
396 $db->执行("ALTER TABLE " . TABLE_PAYPAL ." CHANGE address_street address_street varchar(254) 默认 NULL"
);
397 $db->执行("ALTER TABLE " . TABLE_PAYPAL . " CHANGE address_city address_city varchar(120) default NULL"
);
398 $db->执行("ALTER TABLE " . TABLE_PAYPAL . " CHANGE address_state address_state varchar(120) default NULL"
);
399 $db->执行("ALTER TABLE " . TABLE_PAYPAL . " CHANGE payer_email payer_email varchar(128) NOT NULL default ''"
);
400 $db->执行("ALTER TABLE " . TABLE_PAYPAL ." CHANGE 业务 Business varchar(128) NOT NULL default ''"
);
401 $db->执行("ALTER TABLE " . TABLE_PAYPAL . " CHANGE receive_email receive_email varchar(128) NOT NULL default ''"
);
402 $db->执行("ALTER TABLE " . TABLE_PAYPAL . " CHANGE txn_id txn_id varchar(20) NOT NULL default ''"
);
403 $db->执行("ALTER TABLE " . TABLE_PAYPAL ." CHANGE Parent_txn_id Parent_txn_id varchar(20) 默认 NULL"
);
404 }
405 if (
$fieldOkay2 !==
true) {
406 $db->执行("ALTER TABLE " . TABLE_PAYPAL ." ADD COLUMN module_name varchar(40) NOT NULL default '' after txn_type"
) ;
407 $db->执行("ALTER TABLE " . TABLE_PAYPAL ." ADD COLUMN module_mode varchar(40) NOT NULL default '' after module_name"
) ;
408 }
409 if (
$fieldOkay3 !==
true) {
410 $db->执行("ALTER TABLE " . TABLE_PAYPAL . " CHANGE zen_order_id order_id int(11) NOT NULL default '0'"
);
411 }
412 }413
414 函数 paynow_button(
$order_id) {
415 全球 $db、
$order、
$货币、
$currency;
416 require_once(DIR_WS_CLASSES . 'order.php'
);
417 $order =
新订单(
$order_id);
418 $选项 =
数组();
419 $optionsCore =
数组();
420 $optionsPhone =
数组();
421 $optionsShip =
数组();
422 $optionsLineItems =
数组();
423 $optionsAggregate =
数组();
424 $optionsTrans =
数组();
425 $buttonArray =
数组();
426
427 $this->totalsum =
$order->info['total'
];
428
429 //永久保存会话内容,以防 PayPal 丢失会话
430 $_SESSION['ppipn_key_to_remove'] =
session_id();
431 $db->Execute("从 " . TABLE_PAYPAL_SESSION . " 删除,其中 session_id = '" . zen_db_input(
$_SESSION['ppipn_key_to_remove ']) 。
432
433
$sql
= "插入到 " 。 TABLE_PAYPAL_SESSION 。 “(session_id、saved_session、过期)值(
434
'" .zen_db_input($_SESSION
['ppipn_key_to_remove']) ."',
435
'" .base64_encode
(序列化
($_SESSION
)) ."',
436
'" . (时间
() (1*60*60*24*2)) . "')";
437
438
$db
->执行($sql
);
439
440
$my_currency
= select_pp_currency();
441
if
(!空
($order
->info['currency'])){
442
$my_currency
=$order
->info['currency'];
443
}
444
$this
->transaction_currency = $my_currency
;
445
446
$this
->transaction_amount = ($this
->总金额 * $currencies
->get_value( $my_currency
));
447
448
$电话
= preg_replace
('/D/', '', $order
->客户['电话']);
449
if
($电话
!= '') {
450
$optionsPhone
['H_PhoneNumber'] = $电话
;
451
if
(in_array
($order
->customer['country']['iso_code_2'], 数组
('美国','加拿大'))) {
452
$optionsPhone
['night_phone_a'] = substr
($电话
,0,3);
453
$optionsPhone
['night_phone_b'] = substr
($电话
,3,3);
454
$optionsPhone
['night_phone_c'] = substr
($电话
,6,4);
455
$optionsPhone
['day_phone_a'] = substr
($电话
,0,3);
456
$optionsPhone
['day_phone_b'] = substr
($电话
,3,3);
457
$optionsPhone
['day_phone_c'] = substr
($电话
,6,4);
458
} 其他
{
459
$options电话
['night_phone_b'] = $电话
;
460
$options电话
['day_phone_b'] = $电话
;
461
}
462
}
463
464 $optionsCore =
数组(
465 'lc' =>我们,
466 //'lc' => $order->customer['country']['iso_code_2'],
467'字符集'=>字符集,
468 'page_style' => MODULE_PAYMENT_PAYPAL_PAGE_STYLE,
469'自定义'=> zen_session_name() 。 '=' 。 zen_session_id(),
470'发票'=>
$order->info['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'shopping_url'=> zen_href_link(FILENAME_SHOPPING_CART, '', 'SSL'),
475'notify_url'=> zen_href_link('ipn_main_handler.php', '', 'SSL',
假,
假,
真),
476'redirect_cmd'=> '_xclick','rm' => 2、'bn' => 'zencart','mrb' =>; 'R-6C7952342H795591R','朋友' => '9E82WJBKKGPLQ',
477 );
478 $optionsCust =
数组(
479'名字'=> Replace_accents(
$order->customer['firstname']),
480 'last_name' => Replace_accents(
$order->customer['lastname']),
481'地址1'=> Replace_accents(
$order->customer['street_address']),
482'城市'=> Replace_accents(
$order->customer['city']),
483'状态'=> zen_get_zone_code(
$order->客户['国家']['id'],
$order->客户['zone_id'],
$order->客户['州']),
484'zip'=>
$order->客户['邮政编码'],
485'国家'=>
$order->客户['国家']['iso_code_2'],
486'电子邮件'=>
$order->客户['email_address'],
487 );
488 //地址行 2 可选
489 if (
$order->customer['suburb'] != '')
$optionsCust['address2'] =
$order->customer['郊区'
];
490 //日语地址布局的不同格式:
491 if (
$order->customer['country']['iso_code_2'] == 'JP')
$optionsCust['zip'] =
substr(
$order->customer['postcode'], 0, 3) . '-'。
substr(
$order->客户['邮政编码'], 3
);
492 如果 (MODULE_PAYMENT_PAYPAL_ADDRESS_REQUIRED == 2
) {
493 $optionsCust =
数组(
494'名字'=> Replace_accents(
$order->delivery['firstname'] != '' ?
$order->delivery['firstname'] :
$order -> 计费['名字']),
495'last_name'=> Replace_accents(
$order->delivery['lastname'] != '' ?
$order->delivery['lastname'] :
$order -> 账单['姓氏']),
496'地址1'=> Replace_accents(
$order->delivery['street_address'] != '' ?
$order->delivery['street_address'] :
$order -> 计费['street_address']),
497'城市'=> Replace_accents(
$order->delivery['city'] != '' ?
$order->delivery['city'] :
$order -> 计费['城市']),
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 -> 计费['国家']['id'],
$order->计费['zone_id'],
$order->计费['州'] )),
499'zip'=> (
$订单->送货['邮政编码'] != '' ?
$订单->送货['邮政编码'] :
$订单- > 账单['邮政编码']),
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['suburb'] != '')
$optionsCust['地址2'] =
$订单->送货['郊区'
];
505 if (
$订单->送货['国家']['iso_code_2'] == '日本')
$ optionsCust['zip'] =
substr(
$order->delivery['postcode'], 0, 3) 。 '-'。
substr(
$order->送货['邮政编码'], 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 取消设置(
$optionsLineItems['shipping'
]);
517 }
518 取消设置(
$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 取消设置(
$optionsLineItems['creditsExist'
]);
525 }526 $optionsAggregate =
数组(
527'cmd'=> '_ext-输入',
528 'item_name' => MODULE_PAYMENT_PAYPAL_PURCHASE_DESCRIPTION_TITLE,
529 'item_number' => MODULE_PAYMENT_PAYPAL_PURCHASE_DESCRIPTION_ITEMNUM,
530 //'num_cart_items' => sizeof($order->产品),
531'金额'=>
number_format(
$this->transaction_amount,
$currencies->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 =
数组(
537'上传'=> (int)(
sizeof(
$order->产品) > 0),
538'货币代码'=>
$my_currency,
539 //'paypal_order_id' => $paypal_order_id,
540 //'no_note' =>; '1',
541 //'发票'=>; '',
542 );
543
544 // 如果行项目信息无效,请使用聚合:
545 if (
sizeof(
$optionsLineItems) > 0)
$optionsAggregate =
$optionsLineItems ;
546
547 //准备提交
548 $options =
array_merge(
$optionsCore,
$optionsCust,
$optionsPhone ,
$optionsShip,
$optionsTrans,
$optionsAggregate);
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 - 正在中止 - preg_match 发现无效的提交密钥:' .
$name . ' (' .
$value . ')'
);
558 休息;
559 }
560 // 我们需要对 & 和 = 符号进行特殊处理吗?
561 //if (strpos($value, '&') !== false || strpos($value, '=') !== false) $value = urlencode ($值);
562
563 $buttonArray[] = zen_draw_hidden_field(
$name,
$value);
564 }
565 $process_button_string =
内爆("n",
$buttonArray) 。 “n”
;
566
567 $_SESSION['paypal_transaction_info'] =
数组(
$this->transaction_amount,
$this ->
transaction_currency);
568 返回 $process_button_string;
569 }
570
571 }
查看代码
3. 在网站后台Orders Status(地给你单状态)中,增加一个Unpaid(未付款)选项。然后修改Order.php中create方法,指定如果生成订单的时候,客户选择的付款方式是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>浮点</span>) <span>微时间</span>() * 10000000<span>);
</span><span> 5</span> <span>$input</span> = <span>数组</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>兰特</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>如果</span> (DEFAULT_ZERO_BALANCE_ORDERS_STATUS_ID == 0<span>) {
</span><span>14</span> <span>$this</span>->info['order_status'] =<span>DEFAULT_ORDERS_STATUS_ID;
</span><span>15</span> } <span>其他</span><span> {
</span><span>16</span> <span>if</span> (<span>$_SESSION</span>['付款'] != '免费充电器'<span>) {
</span>
登录后复制