PHP 注文の見逃しを防ぐために zen-cart の注文と支払いプロセスを変更する_PHP チュートリアル
zen-cart を使用したことがある人なら、zen-cart で注文する手順は次のとおりであることをご存知でしょう ([] 内の式は不要です)。
1. ショッピングカート
2.【配送方法】
3.お支払い方法
4. 注文確認
5. [サードパーティウェブサイトでの支払い]
6. 注文処理 (チェックアウトプロセス) - ショッピングカート内の情報がここでの注文に書き込まれるため、このステップはより重要です
7. 注文が成功しました (チェックアウトが成功しました)
通常の状況ではこのプロセスに問題はありません。ただし、ステップ 5 からステップ 6 までのプロセスでは、ユーザーが支払いが成功したと考えて Web ページを直接閉じたり、ネットワーク上の理由によりユーザーが正常に checkout_process ページにジャンプできない可能性があります。注文を正常に作成できないため、これは非常に深刻です。
上記の分析に基づいて、私たちはプロセスを少し変更することを望んでいます。つまり、支払いの前に注文が作成されるようにすることで、たとえ支払いがサードパーティの支払いウェブサイトからジャンプバックできなかったとしても、ユーザーが支払いは正常に完了しましたが、バックグラウンドで注文が残っていません。変更されたブループリントは基本的に次のようになります:
1. checkour_confirmation ページで注文を確認した後、直接処理して checkour_success ページに入り、支払いページに入ることができます。下の写真に示すように:
2. 顧客がその時点で支払いを怠った場合、独自のバックエンドに入って過去の注文の支払いを行うこともできます。下の写真に示すように:
上記の機能を実装する方法を段階的に見てみましょう。
1. まず、既存の支払いモジュールを変換する必要があります。支払い用のページ URL を表すフィールド paynow_action_url を支払いメソッド クラスに追加する必要があります。さらに、支払いフォームのパラメータ隠しフィールド コードを取得するために関数 paynow_button($order_id) を追加する必要があります。
paynow_action_url フィールドを追加するには、支払いクラスのコンストラクターの最後に次のコードを追加してください:
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) 関数を追加するには、支払いクラスの最後の関数の後に次のコードを追加してください:
function paynow_button($order_id) {
if (is_array($this->modules)) {
if (is_object($GLOBALS[$this->selected_module])) {
return $GLOBALS[$ this->selected_module]->paynow_button( $order_id);
}
}
}
2. PayPal 支払い方法を例として、その実装方法を説明します。 paypal の元のコードを破壊しないように、paypal.php ファイルのコピーを作成し、paypalsimple.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) を使用して再実行します。過去の注文で今すぐ支払うボタンを表示する準備として構築されたオブジェクト。
paypalsimple.php
/**
* @package paypalsimple 支払いモジュール
* @copyright Copyright 2003-2006 Zen Cart Development Team
* @copyright Portions Copyright 2003 osCommerce
* @license http://www.zen-cart.com/license/2_0.txt GNU Publicライセンス V2.0
* @version $Id: paypalsimple.php 4960 2009-12-29 11:46:46Z ゲイリー $
*/
// 依存関係がロードされていることを確認します
include_once((IS_ADMIN_FLAG === true ? DIR_FS_CATALOG_MODULES : DIR_WS_MODULES) . 'payment/paypal/paypal_functions.php');
class paypalsimple {
var $code, $title, $description, $enabled;
// クラス コンストラクター
function paypalsimple() {
global $order;
$this->code = 'paypalsimple';
$this->title = MODULE_PAYMENT_PAYPAL_SIMPLE_TEXT_TITLE;
if(IS_ADMIN_FLAG === true){
$this->title = MODULE_PAYMENT_PAYPAL_SIMPLE_TEXT_ADMIN_TITLE;
}
$this->description = MODULE_PAYMENT_PAYPAL_SIMPLE_TEXT_DESCRIPTION;
$this->sort_order = MODULE_PAYMENT_PAYPAL_SIMPLE_SORT_ORDER;
$this->enabled = ((MODULE_PAYMENT_PAYPAL_SIMPLE_STATUS == 'True') ? true : false);
if ((int)MODULE_PAYMENT_PAYPAL_SIMPLE_ORDER_STATUS_ID > 0) {
$this->order_status = MODULE_PAYMENT_PAYPAL_SIMPLE_ORDER_STATUS_ID;
}
$this->paynow_action_url = 'https://' 。 MODULE_PAYMENT_PAYPAL_SIMPLE_HANDLER;
if (is_object($order)) $this->update_status();
}
// クラスメソッド
function update_status() {
global $order, $db;
if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_PAYPAL_SIMPLE_ZONE > 0) ) {
$check_flag = false;
$check = $db->Execute("selectzone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_PAYPAL_SIMPLE_ZONE . "' およびzone_country_id = '" . $order->billing['country']['id '] . "' ゾーン ID による順序");
while (!$check->EOF) {
if ($check->fields['zone_id'] $check_flag = true;
休憩;
} elseif ($check->fields['zone_id'] == $order->billing['zone_id']) {
$check_flag = true;
休憩;
}
$check->MoveNext();
}
if ($check_flag == false) {
$this->有効 = false;
}
}
}
function javascript_validation() {
return false;
}
関数セレクション() {
$text = MODULE_PAYMENT_SIMPLE_PAYPAL_TEXT_CATALOG_LOGO.' '.MODULE_PAYMENT_PAYPAL_SIMPLE_TEXT_TITLE 。 '
' 。 MODULE_PAYMENT_PAYPAL_SIMPLE_ACCEPTANCE_MARK_TEXT 。 '
';
return array('id' => $this->code,
'module' => $text
);
}
関数 pre_confirmation_check() {
false を返す;
}
関数confirmation() {
return false;
}
関数 process_button() {
false を返す;
}
関数 before_process() {
false を返す;
}
関数 after_process() {
false を返す;
}
function get_error() {
return false;
}
関数 check() {
グローバル $db;
if (!isset($this->_check)) {
$check_query = $db->Execute("selectconfiguration_value from " . TABLE_CONFIGURATION . " whereconfiguration_key = 'MODULE_PAYMENT_PAYPAL_SIMPLE_STATUS'");
$this->_check = $check_query->RecordCount();
}
return $this->_check;
}
関数 install() {
グローバル $db;
$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-Simple モジュールを有効にする', 'MODULE_PAYMENT_PAYPAL_SIMPLE_STATUS', 'True' , 'PayPal-Simple 支払いを受け入れますか?', '6', '0', 'zen_cfg_select_option(array('True', 'False'), ', now())");
$db-> ;Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title,configuration_key,configuration_value,configuration_description,configuration_group_id,sort_order,date_added)values('表示のソート順。', 'MODULE_PAYMENT_PAYPAL_SIMPLE_SORT_ORDER', '0', '表示のソート順。最も低いものが最初に表示されます。', '6', '8', now())");
$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) 値 ('支払いゾーン'、'MODULE_PAYMENT_PAYPAL_SIMPLE_ZONE'、'0'、'ゾーンが選択されている場合、そのゾーンに対してのみこの支払い方法を有効にします。'、'6'、'2'、'zen_get_zone_class_title ', 'zen_cfg_pull_down_zone_classes(', now())");
$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 Order Status', 'MODULE_PAYMENT_PAYPAL_SIMPLE_ORDER_STATUS_ID', '0' , 'この支払いモジュールで行われた注文のステータスをこの値に設定します', '6', '0', 'zen_cfg_pull_down_order_statuses(', 'zen_get_order_status_name', now())");
$db->Execute(" 「 .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
または
www.paypal.com/us/cgi-bin/webscr<br>英国の場合、<br><code>www.paypal.com/uk/cgi-bin/webscr
'、'MODULE_PAYMENT_PAYPAL_SIMPLE_HANDLER'、'www. paypal.com/cgi-bin/webscr', 'PayPal ライブ処理用の URL を選択してください', '6', '73', '', now())"); }
関数の削除() {
グローバル $db;
$db->Execute("delete from " . TABLE_CONFIGURATION . " whereconfiguration_key in ('" . implode("', '", $this->keys()) . "')");
}
関数キー() {
return array('MODULE_PAYMENT_PAYPAL_SIMPLE_STATUS','MODULE_PAYMENT_PAYPAL_SIMPLE_SORT_ORDER','MODULE_PAYMENT_PAYPAL_SIMPLE_ZONE','MODULE_PAYMENT_PAYPAL_SIMPLE_ORDER_STATUS_ID', 'MODULE_PAYMENT_PAYPAL_SIMPLE_HANDLER');
}
function paynow_button($order_id){
グローバル $db, $order, $currency, $currency;
require_once(DIR_WS_CLASSES . 'order.php');
$order = 新しい注文($order_id);
$options = array();
$optionsCore = array();
$optionsPhone = array();
$optionsShip = array();
$optionsLineItems = array();
$optionsAggregate = array();
$optionsTrans = array();
$buttonArray = array();
$this->totalsum = $order->info['total'];
// Paypal がセッションを失った場合に備えて、セッション内容を永久に保存します
$_SESSION['pipn_key_to_remove'] = session_id();
$db->Execute("delete from " . TABLE_PAYPAL_SESSION . " where session_id = '" . zen_db_input($_SESSION['pipn_key_to_remove']) . "'");
$sql = "に挿入" 。 TABLE_PAYPAL_SESSION 。 " (session_id、saved_session、expiry) 値 (
'" . zen_db_input($_SESSION['pipn_key_to_remove']) . "',
'" .base64_encode(serialize($_SESSION)) . "',
'" . (時間() + (1*60*60*24*2)) 。
$db->実行($sql);
$my_currency = select_pp_currency();
$this->transaction_currency = $my_currency;
$this->transaction_amount = ($this->totalsum * $currency->get_value($my_currency));
$telephone = preg_replace('/D/', '', $order->customer['telephone']);
if ($telephone != '') {
$optionsPhone['H_PhoneNumber'] = $telephone;
if (in_array($order->customer['country']['iso_code_2'], array('US','CA'))) {
$optionsPhone['night_phone_a'] = substr($telephone,0 ,3);
$optionsPhone['night_phone_b'] = substr($telephone,3,3);
$optionsPhone['night_phone_c'] = substr($telephone,6,4);
$optionsPhone['day_phone_a'] = substr($telephone,0,3);
$optionsPhone['day_phone_b'] = substr($telephone,3,3);
$optionsPhone['day_phone_c'] = substr($telephone,6,4);
} else {
$optionsPhone['night_phone_b'] = $telephone;
$optionsPhone['day_phone_b'] = $telephone;
}
}
$optionsCore = array(
'charset' => CHARSET,
'lc' => $order->customer['country']['iso_code_2'],
'page_style' => MODULE_PAYMENT_PAYPAL_PAGE_STYLE,
'カスタム' => zen_session_name() . zen_session_id()、
' ビジネス' => zen_href_link(FILENAME_PAY_SUCCESS、'referer=paypal')、
』 cancel_return' => zen_href_link(FILENAME_PAY_FAILED, '', 'SSL'),
'shopping_url' => zen_href_link(FILENAME_SHOPPING_CART, '', 'SSL'),
'notify_url' => 、''、'SSL'、false、false、true)、
'redirect_cmd' => '_xclick'、
'rm' => 'zencart'、
'mrb' => 'R-6C7952342H795591R',
' パル' => '9E82WJBKKGPLQ',
);
$optionsCust = array(
'first_name' => replace_accents($order->customer['firstname']),
'last_name' => replace_accents($order->customer['lastname']),
'address1' => replace_accents($order->customer['street_address'])、
'city' => replace_accents($order->customer['city'])、
'state' => ; zen_get_zone_code($order->customer['country']['id'], $order->customer['zone_id'], $order->customer['zone_id']),
'zip' = > $order->顧客['郵便番号']、
'国' => $order->顧客['国']['iso_code_2']、
'メール' => customer['email_address'],
);
if ($order->customer['suburb'] != '') $optionsCust['address2'] = $order->customer['suburb'];
if (MODULE_PAYMENT_PAYPAL_ADDRESS_REQUIRED == 2) $optionsCust = array(
'address_name' => replace_accents($order->customer['firstname'] . ' ' . $order->customer['lastname']),
'address_street' => replace_accents($order->customer['street_address'])、
'address_city' => replace_accents($order->customer['city'])、
'address_state' => ; zen_get_zone_code($order->customer['country']['id'], $order->customer['zone_id'], $order->customer['zone_id']),
'address_zip' = > $order->顧客['郵便番号'],
'住所_国' => $order->顧客['国']['タイトル'],
'住所_国コード' => customer['country']['iso_code_2'],
'payer_email' => $order->customer['email_address'],
);
$optionsShip = array(
//'address_override' => MODULE_PAYMENT_PAYPAL_ADDRESS_OVERRIDE,
'no_shipping' => MODULE_PAYMENT_PAYPAL_ADDRESS_REQUIRED,
);
if (MODULE_PAYMENT_PAYPAL_DETAILED_CART == 'はい') $optionsLineItems = ipn_getLineItemDetails();
if (sizeof($optionsLineItems) > 0) {
$optionsLineItems['cmd'] = '_cart';
// $optionsLineItems['num_cart_items'] = sizeof($order->products);
if (isset($optionsLineItems['shipping'])) {
$optionsLineItems['shipping_1'] = $optionsLineItems['shipping'];
unset($optionsLineItems['shipping']);
}
if (isset($optionsLineItems['handling'])) {
$optionsLineItems['handling_1'] = $optionsLineItems['handling'];
unset($optionsLineItems['handling']);
}
unset($optionsLineItems['subtotal']);
// 計算の不一致や割引などにより品目の詳細を保持できなかった場合、デフォルトで集計モードになります
if (!isset($optionsLineItems['item_name_1'])) $optionsLineItems = array();
//if ($optionsLineItems['amount'] != $this->transaction_amount) $optionsLineItems = array();
ipn_debug_email('明細項目の詳細 (空白の場合、データの不一致があったためバイパスされたことを意味します): ' . "n" . print_r($optionsLineItems, true));
}
$products_name_display = "";
/*
for ($i=0, $n=sizeof($order->products); $iif(i > 0) {
$products_name_display.= ', ';
}
$products_name_display.= $order->products[$i]['name']。 '('. $order->products[$i]['qty'] .','.$order->products[$i]['dhisys_web_order_number'].')';
}*/
$optionsAggregate = array(
'cmd' => '_ext-enter',
'item_name' => $products_name_display,
'item_number' => $order_id,
'num_cart_items' => sizeof( $order->products),
'amount' =>number_format($this->transaction_amount, $currency->get_Decimal_places($my_currency)),
'shipping' => '0.00',
);
if (MODULE_PAYMENT_PAYPAL_TAX_OVERRIDE == 'true') $optionsAggregate['tax'] = '0.00';
if (MODULE_PAYMENT_PAYPAL_TAX_OVERRIDE == 'true') $optionsAggregate['tax_cart'] = '0.00';
$optionsTrans = array(
'upload' => (int)(sizeof($order->products) > 0),
'currency_code' => $my_currency,
// 'paypal_order_id' => $paypal_order_id,
//'no_note' => '1',
//'invoice' =>
// ラインアイテム情報が無効な場合は、集約を使用します:
if (sizeof($optionsLineItems) > 0) $optionsAggregate = $optionsLineItems;
// 送信を準備します
$options = array_merge($optionsCore, $optionsCust, $optionsPhone, $optionsShip, $optionsTrans, $optionsAggregate);
ipn_debug_email('送信用のキー: ' .print_r($options, true));
if(sizeof($order->products) > 0){
$options['cmd'] = '_cart';
for ($i=0, $n=sizeof($order->products); $i$options['item_name_'. (文字列)($i+1)] = $order->products[$i]['name'];
$options['item_number_'. (文字列)($i+1)] = $order->products[$i]['dhisys_web_order_number'];
$オプション['金額_'. (文字列)($i+1)] =number_format((float)$order->products[$i]['final_price'],2);
$オプション['数量_'. (文字列)($i+1)] = $order->製品[$i]['数量'];
}
}
// ボタンフィールドを構築します
foreach ($options as $name => $value) {
// 引用符を削除します
$value = str_replace('"', '', $value);
// 無効な文字をチェックします
if (preg_match('/[^a-zA-Z_0-9]/', $name)) {
ipn_debug_email('datacheck - ABORTING - preg_match で無効な送信キーが見つかりました: ' . $name . ' (' . $value . ')');
break;
}
// & および = 記号には特別な処理が必要ですか?
//if (strpos($value, '&') !== false | | strpos($value, '=') !== false) $value = urlencode($value);
$buttonArray[] = zen_draw_hidden_field($name, $value)
}
$_SESSION['paypal_transaction_info'] = array($this->transaction_amount, $this->transaction_currency);
$process_button_string = implode("n", $buttonArray)
?>
3. checkout_success 画面に pay now が表示されます。ファイル「includes/modules/pages/checkout_success/header.php」を開くと、ファイルの末尾に次のコードが追加されます (場合によっては、zen-cart を掌握済みの場合)ユーザーモードであり、また Zen-cart コアコードの破壊を望まない場合は、NOTIFY_HEADER_END_CHECKOUT_SUCCESS を実行するための観察クラスを作成することもできます。
require_once(DIR_WS_CLASSES . 'order.php');
require_once(DIR_WS_CLASSES . 'payment.php');
$payment_modules = 新しい支払い($orders->fields['payment_module_code']);
打文ファイル"includes/modules/templates/template_default/templates/tpl_checkout_success_default.php",以下の如く適切な位置にあります,ここで承認済みの状態は未付与です款状態态,才显示该按钮、
//&& $orders->fields['orders_status'] == '1'
echo('

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPは1994年に発信され、Rasmuslerdorfによって開発されました。もともとはウェブサイトの訪問者を追跡するために使用され、サーバー側のスクリプト言語に徐々に進化し、Web開発で広く使用されていました。 Pythonは、1980年代後半にGuidovan Rossumによって開発され、1991年に最初にリリースされました。コードの読みやすさとシンプルさを強調し、科学的コンピューティング、データ分析、その他の分野に適しています。

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

PHPは、多数のWebサイトとアプリケーションをサポートし、フレームワークを通じて開発ニーズに適応するため、近代化プロセスで依然として重要です。 1.PHP7はパフォーマンスを向上させ、新機能を紹介します。 2。Laravel、Symfony、Codeigniterなどの最新のフレームワークは、開発を簡素化し、コードの品質を向上させます。 3.パフォーマンスの最適化とベストプラクティスは、アプリケーションの効率をさらに改善します。

phphassiblasifly-impactedwebdevevermentandsbeyondit.1)itpowersmajorplatformslikewordpratsandexcelsindatabase interactions.2)php'sadaptableability allowsitale forlargeapplicationsusingframeworkslikelavel.3)

PHPタイプは、コードの品質と読みやすさを向上させるためのプロンプトがあります。 1)スカラータイプのヒント:php7.0であるため、基本データ型は、int、floatなどの関数パラメーターで指定できます。 3)ユニオンタイプのプロンプト:PHP8.0であるため、関数パラメーターまたは戻り値で複数のタイプを指定することができます。 4)Nullable Typeプロンプト:null値を含めることができ、null値を返す可能性のある機能を処理できます。

PHPでは、クローンキーワードを使用してオブジェクトのコピーを作成し、\ _ \ _クローンマジックメソッドを使用してクローン動作をカスタマイズします。 1.クローンキーワードを使用して浅いコピーを作成し、オブジェクトのプロパティをクローン化しますが、オブジェクトのプロパティはクローニングしません。 2。\ _ \ _クローン法は、浅いコピーの問題を避けるために、ネストされたオブジェクトを深くコピーできます。 3.クローニングにおける円形の参照とパフォーマンスの問題を避けるために注意し、クローニング操作を最適化して効率を向上させます。

PHPはWeb開発およびコンテンツ管理システムに適しており、Pythonはデータサイエンス、機械学習、自動化スクリプトに適しています。 1.PHPは、高速でスケーラブルなWebサイトとアプリケーションの構築においてうまく機能し、WordPressなどのCMSで一般的に使用されます。 2。Pythonは、NumpyやTensorflowなどの豊富なライブラリを使用して、データサイエンスと機械学習の分野で驚くほどパフォーマンスを発揮しています。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

Dreamweaver Mac版
ビジュアル Web 開発ツール

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。
