Опубликован: 08.05.2007 | Доступ: свободный | Студентов: 12883 / 3013 | Оценка: 4.13 / 3.77 | Длительность: 12:58:00
Дополнительный материал 1:

Приложение PHP E-Commerce

< Лекция 12 || Дополнительный материал 1: 123456789101112 || Дополнительный материал 2 >

Покупка онлайн

Когда заказчик завершил выбор программного обеспечения для покупки и готов оплатить продукты, он нажимает кнопку "Checkout" ("Оплатить"), чтобы завершить свою покупку.


Обычно заказчики соединяются с онлайновой процессинговой компанией кредитных карт, которая получает информацию о кредитной карте, санкционирует покупку и соединяется с национальной банковской системой, чтобы дебетовать и кредитовать соответствующие банковские счета. Когда эти транзакции завершаются, заказчик возвращается на сайт магазина, где получает подтверждение своего заказа.

В то же самое время компания по обслуживанию кредитных карт возвращает на сайт полученную от заказчика несекретную информацию, имеющую отношение к выставлению счета. Эта информация затем может использоваться для создания постоянной записи заказа для этого клиента для будущих ссылок и для воссоздания исходного заказа, если потребуется. Возвращаемая информация может, на самом деле, применяться для соединения с системами бухгалтерского учета и склада компании. Хотя мы не можем соединиться с федеральной банковской системой для этого модельного приложения, мы можем достаточно точно промоделировать обработку в компании по обслуживанию кредитных карт и можем архивировать информацию о заказе, даже хотя и не будем соединяться непосредственно с какими-либо другими системами.

Отправка информации о заказе

Страница shopcart.php содержит кнопку "Checkout" в отдельной форме, отличной от той, которая используется для обновления покупаемого количества товара. Это связано с тем, что форма оформления передается компании по обслуживанию кредитных карт, в то время как форма обновления снова соединяется со страницей shopcart.php.

<?php if ($OrderTotal != 0) {?>

  <div style="width:375px; line-height:8pt">
  <form action="https://.../creditcheck.php" method="post">
    <input type="hidden" name="ReturnURL" value="https://..../ordercapture.php">
    <input type="hidden" name="CompanyID" value="Webwarehouse.com">
    <input type="hidden" name="CustomerID" value="<?php echo $_SESSION[OrderNo]?>">
    <input type="hidden" name="Amount" value="<?php echo $OrderTotal ?>">
    <input type="submit" name="CheckoutButton" class="buttonM" 
      style="float:left;margin-right:5px" value="Checkout"
      onMouseOver="OverMouse(this)"; onMouseOut="OutMouse(this)">
    <span class="small">Щелкните, чтобы оплатить онлайн покупку через защищенное соединение с Системами оплаты с помощью кредитных карт. 
   </span>
    
  </form>
  </div>
  
<?php }
Пример I.15.

Для целей этого примера ACTION URL формы будет

../php/ecommerce/creditcheck.php

Этот адрес соединяется с модельной компанией обслуживания кредитных карт, которая является просто страницей в каталоге сайта. Но можно точно так же просто соединиться с реальной компанией.

Обычный метод взаимодействия с компанией по обслуживанию кредитных карт состоит в передаче информации, связанной с текущей покупкой с помощью множества скрытых полей формы. Как минимум компании необходимо знать: 1) общую стоимость покупки, 2) идентификатор сайта, присылающего информацию ( ID счета в компании по обслуживанию кредитных карт), и 3) URL страницы, на которую будет возвращено подтверждение о выполнении транзакции. Сайту продаж необходимо также отправить 4) идентификатор заказчика, который может возвращаться вместе с подтверждением. Эти четыре скрытых поля содержатся в форме с кнопкой "Checkout".

Поле ReturnURL используется для предоставления адреса, в который возвращается информация компании кредитных карт. В данном примере информация возвращается на страницу ordercapture.php по адресу

../php/ecommerce/ordercapture.php

Заказчик возвращается из компании кредитных карт на эту промежуточную страницу, прежде чем попасть на страницу salesorder.php, на которой представляется окончательный заказ на покупку и подтверждающее сообщение. На этой странице ordercapture.php мы получаем возвращаемую из компании кредитных карт информацию для создания записи о заказе на продажу и очистки корзины покупателя. Заказчик не видит эту страницу. Она содержит только сценарий PHP для обработки возвращаемой информации и затем автоматически переадресуется на страницу salesorder.php для вывода заказчику. Позже мы рассмотрим это подробнее.

Поле CompanyID содержит идентификатор счета сайта, отправившего заказ. В качестве такого идентификатора мы применяем "Webwarehouse.com". При использовании этого URL для проверки кредитных карт можно ввести в это поле любую текстовую строку.

Поле CustomerID содержит идентификатор заказчика. Это значение возвращается компанией кредитных карт, чтобы мы знали, какому заказчику или какому заказу соответствует возвращаемая информация. Здесь для идентификации заказчика используется значение $_SESSION[OrderNo].

Поле Amount содержит общую стоимость заказа. Значение этого поля задается с помощью переменной OrderTotal, которая доступна на этой странице.

После отправки формы остается только подождать. Компания кредитных карт выполняет в это время обработку. Когда компания завершит обработку, она автоматически создает адрес ReturnURL для возврата на страницу ordercapture.php, где продолжается обработка.

Обработка кредитных карт

Когда заказчик направляется в компанию кредитных карт, первая представленная форма появляется в следующем виде:


Заказчик заполняет информацию о кредитной карте и выставленном счете и щелкает на кнопке "Continue Purchase". Форма проверяется, чтобы убедиться, что имеется вся информация, и затем выводится страница подтверждения:


Когда заказчик проверяет информацию, щелкая на кнопке "Verify Information", проверяется информация о кредитной карте. Используется следующая процедура: если первые четыре цифры номера счета ( Account ) будут "0000", то заказ отвергается, если первые четыре цифры будут любыми другими цифрами, то заказ принимается. После обработки заказчик видит экран с подтверждением или отказом:


Когда заказчик щелкает на кнопке "Continue", делается обратная ссылка на страницу, определенную в отправляемой форме как ReturnURL. Эта страница, в примере ordercapture.php, получает информацию о заказе и выставленном счете, которая была получена от заказчика. Ее получение и обработка обсуждаются далее.

Запись информации о продажах

Подтверждение покупки и информация о выставленном заказчику счете возвращается из компании кредитных карт на страницу, указанную в ReturnURL, представленной формы. Это будет в нашем случае страница ordercapture.php. Информация посылается как скрытые поля и доступна на этой странице в массиве $_POST[] с помощью следующих имен:

$_POST[Approval]	 true (заказ принят) или false (заказ отвергнут)
$_POST[Amount]	 	 Общая сумма заказа в долларах 
$_POST[CustomerID]	 Номер заказа заказчика 
$_POST[Name]		 Имя в счете к оплате заказчика 
$_POST[Address]		 Адрес в счете к оплате заказчика 
$_POST[City]		 Город в счете к оплате заказчика 
$_POST[State]		 Штат в счете к оплате заказчика 
$_POST[Zip]			 Zip-код в счете к оплате заказчика 
$_POST[Phone]		 Номер телефона заказчика 
$_POST[Email]		 Адрес e-mail заказчика

Страница ordercapture.php является страницей на PHP без какого-либо кода XHTML. Эта страница не выводится заказчику, но используется для выполнения фоновой обработки возвращаемой информации, прежде чем направить заказчика на страницу salesorder.php.

Существенная часть работы, которая должна быть выполнена на этой странице, состоит в фиксации информации о заказа на продажу, чтобы о нем существовала постоянная запись. Эту запись можно использовать для восстановления заказа, если понадобится, и для предоставления информации для взаимодействия с системами бухгалтерии и склада (если они существуют, так как в данном примере они отсутствуют).

Записи заголовка заказа и деталей заказа

Традиционный способ отслеживания заказов на продажу состоит в создании двух типов записей о продажах. Запись заголовка заказа содержит идентификационную информацию заказа, такую как номер заказа, дату заказа, и информацию о счете к оплате заказчика. Для каждого заказа существует одна запись заголовка заказа. Запись деталей заказа содержит детали о купленных товарах – код товара, количество, и цену. Существует одна запись деталей заказа для каждого купленного товара. Такая информация поддерживается в этих файлах, чтобы можно было восстановить исходный заказ.

Файлы заголовка заказа и деталей заказа являются таблицами базы данных, содержащимися в базе данных eCommerce.mdb. Их формат показан ниже.

OrderHeader (таблица)
Имя поля Тип поля Размер поля
OrderNo Text 10
OrderDate Date/Time
CustomerName Text 50
CustomerAddress Text 50
CustomerCity Text 50
CustomerState Text 2
CustomerZip Text 10
CustomerPhone Text 15
CustomerEmail Text 50
OrderDetail (таблица)
Имя поля Тип поля Размер поля
OrderNo Text 10
ItemNumber Text 6
ItemTitle Text 50
ItemPrice Валюта с 2 знаками после запятой
ItemQuantity Числовое long integer

Получение информации заказа

Первая часть сценария на странице ordercapture.php собирает информацию, посланную из компании кредитных карт через массив $_POST[] и присваивает ее переменным для упрощения записи кода.

<?php
'—Сбор информации, возвращаемой компанией кредитных карт 
$Approval = $_POST[Approval];
$Amount = $_POST[Amount];
$OrderNo = $_POST[CustomerID];
$Name = $_POST[Name];
$Address = $_POST[Address];
$City = $_POST[City];
$State = $_POST[State];
$Zip = $_POST[Zip];
$Phone = $_POST[Phone];
$Email = $_POST[Email]; ...

Компания кредитных карт посылает флаг Approval, задаваемый как "True" или "False" в зависимости от того, был подтвержден заказ или нет. Если заказ подтвержден, необходимо сохранить информацию о заказе в таблицах OrderHeader и OrderDetail ; если заказ не был подтвержден, то информация не сохраняется, так как продажа не была сделана. В любом случае, однако, необходимо очистить корзину покупателя этого заказа. Не существует пока никаких ожидающих заказов.

Общая логика сценария для обработки этих задач обработки показана ниже.

if ($Approval) {

  '—Создать запись OrderHeader 

  '—Создать запись OrderDetail 

}

'—Создать таблицу ShopCart

Создание записи OrderHeader

Сценарий начинается с открытия соединения с базой данных eCommerce. Это соединение необходимо для очистки корзины покупателя, независимо от того, будут или нет созданы записи заказа. Затем, если было получено подтверждение от компании кредитных карт, сценарий создает запись OrderHeader.

$conn = odbc_connect('Driver={Microsoft Access Driver 
(*.mdb)};DBQ=c:\inetpub\wwwroot\PHPTutorial\Ecommerce\
  databases\ecommerce.mdb','',''); 
if ($Approval) 
{ 
$sqlInsert = "INSERT INTO OrderHeader (OrderNo,OrderDate,CustomerName,
  CustomerAddress,CustomerCity,CustomerState,
    CustomerZip,CustomerPhone,CustomerEmail) 
Values('$OrderNo','$Date','$Name',
  '$Address','$City','$State','
$Zip','$Phone','$Email')"; $rsInsert = odbc_exec($conn,$sqlInsert); 
}

Этот процесс состоит просто в создании новой записи в таблице OrderHeader и копировании полей, посланных из компании кредитных карт в новую запись. Поле OrderDate заполняется текущей системной датой. После того как запись заполнена и обновлена, множество записей закрывается.

Создание записей OrderDetail

Затем сценарий создает одну или несколько записей в таблице OrderDetail. Информация для этой таблицы, однако, приходит не из компании кредитных карт. Часть ее находится в таблице ShopCart, а часть — в таблице Products. Мы, фактически, переносим детали текущего заказа в подобное множество записей OrderDetail. Мы начинаем сценарий с создания трех множеств записей, необходимых для работы: множество записей $RSDetail для доступа к таблице OrderDetail, множество записей $RSShopCart для доступа к таблице ShopCart и множество записей $RSProducts для доступа к таблице Products.

'—Создание записи OrderDetail 
$sqlDetail ="SELECT * FROM OrderDetail WHERE NULL";
$rsDetail = odbc_exec($conn,$sqlDetail);

$sqlShopCart ="SELECT * FROM ShopCart WHERE OrderNo ='$OrderNo'";
$rsShopCart = odbc_exec($conn,$sqlShopCart);

  while ($row = odbc_fetch_array($rsShopCart))
  
  { 
  
  $sqlProd ="SELECT ItemTitle,ItemPrice FROM Products WHERE ItemNumber ='$row[OrderItem]'";
  $rsProd = odbc_exec($conn,$sqlProd);
  
  $ProdTitle = odbc_result($rsProd,ItemTitle);
  $ProdPrice = odbc_result($rsProd,ItemPrice);
  
	$sqlInsertDetail = "INSERT INTO OrderDetail (OrderNo,ItemNumber,ItemQuantity,ItemTitle,ItemPrice) Values ('$row[OrderNo]','$row[OrderItem]','$row[OrderQuantity]','$ProdTitle','$ProdPrice')";
	
	$rsInsertDetail = odbc_exec($conn,$sqlInsertDetail);
  
  }
Пример I.16.

Сценарий выполняет итерации по записям корзины покупок в поиске соответствующих OrderNo, копирует поля OrderNo, OrderItem и OrderQuantity в соответствующие поля записи OrderDetail. Затем поле OrderItem используется для извлечения ItemTitle и ItemPrice для этого продукта из таблицы Products и копирования их в поля the ItemTitle и ItemPrice записи OrderDetail. Подготовленная запись обновляется в таблице OrderDetail, и начинается обработка следующей записи корзины покупок. В конце мы будет иметь запись в таблице OrderDetail для каждой записи корзины покупателя.

Очистка корзины покупателя

Конечная часть сценария очищает корзину покупок от купленных товаров. Эти записи идентифицируются наличием OrderNo, соответствующим OrderNo подтвержденного или отвергнутого заказа.

'—Очистка ShopCart 
$sqlDelete = "DELETE FROM ShopCart WHERE OrderNo='$OrderNo'";
$rsDelete = odbc_exec($conn,$sqlDelete);

header("Location:salesorder.php?Approval=$Approval")

Когда эта "фоновая" обработка завершается (вспомните, что на этой странице нет кода XHTML), происходит немедленная переадресация на страницу salesorder.php. Подтверждающее уведомление также передается на эту страницу для управления обработкой, которая там происходит.

< Лекция 12 || Дополнительный материал 1: 123456789101112 || Дополнительный материал 2 >
Максим Матросов
Максим Матросов
Наталья Джабасова
Наталья Джабасова