首页 > php教程 > php手册 > 正文

Zencart先生成订单后付款,类似淘宝后台修改订单价格,zencart生成订单

WBOY
发布: 2016-06-13 08:58:23
原创
1103 人浏览过

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、c​​onfiguration_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、c​​onfiguration_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、c​​onfiguration_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、c​​onfiguration_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、c​​onfiguration_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、c​​onfiguration_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$sniffer366 $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>
登录后复制
相关标签:
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门推荐
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!