2012-11-14 54 views
3

我正在使用一個電子商務購物車的SOAP API,我似乎無法讓會話持續通過不同的頁面。作爲一個例子,我在下面有一些測試代碼(帶有一堆調試消息),它將一個物品添加到購物車,然後查看購物車。當我在瀏覽器中運行它時,它完美地工作,但是如果我刷新頁面,則預期在購物車中有兩個項目(兩個頁面調用中的每一個都有一個)。但是,它似乎沒有記得以前通話到該頁面的任何內容。我知道API正在工作,因爲如果我只在這個頁面上調用「AddToCart」兩次,然後調用「GetCartContents」,我就可以正確地看到購物車中的兩件物品。如何讓SoapClient尊重會話?

我錯過了什麼嗎?

<?php 
session_start(); 

$url = "https://www.example.com/soap-checkout.php?wsdl"; 
$client = new SoapClient($url, array("trace" => 1, "exception" => 0)); 

if (!empty($_SESSION['soapcookies'])) { 
    foreach($_SESSION['soapcookies'] AS $name=>$value) { 
     if (is_array($value)) { 
      foreach($value AS $k=>$v) { 
       $client->__setCookie($name[$k], $v); 
      } 
     } else { 
      $client->__setCookie($name, $value); 
     } 
    } 
} 
echo "<pre style='background: grey;'>browser cookies: ".print_r($_COOKIE, true)."</pre>";//debug 

// Add to Cart 
$data = array( 
    "domain" => 'www.example.net', 
    "sku" => "1234", 
    "qty" => 1 
); 
$result = $client->__soapCall("AddToCart", $data); 
$responseHeader = $client->__getLastResponseHeaders();//debug 
echo "<pre style='background: purple;'>responseHeader: ".print_r($responseHeader, true)."</pre>";//debug 
echo "<pre style='background: grey;'>cookies: ".print_r($client->_cookies, true)."</pre>";//debug 
echo "<pre style='background: yellow;'>Result of 'AddToCart': ".print_r($result, true)."</pre>";//debug 

// Set SOAP Cookies in PHP Session 
$_SESSION['soapcookies'] = $client->_cookies; 

// View Cart 
$data = array(
    "domain" => 'www.example.net' 
); 
$result = $client->__soapCall("GetCartContents", $data); 
echo "<pre style='background: skyblue;'>Result of 'GetCartContents': ".print_r($result, true)."</pre>";//debug 
?> 

僅供參考,PHP版本5.2.6是

+0

你是說PHP中的會話不工作,或者SOPA傳遞會話不工作?如果您調試會話數據是否被傳入,可能會有所幫助。 – Robbie

+0

@Robbie PHP會話正常工作。我想我的主要問題是我需要做些什麼來維持同一個會話。 **(1)**我試圖讀取SOAP創建的cookie,**(2)**將其保存到PHP會話中,然後**(3)**如果會話中有現有的soap cookie ,將SOAP中的Cookie設置爲與以前相同。不知道如果這是正確的方法,所以我會很感激替代品。但是,如果要走,我該如何設置cookie?當我得到cookie時,我得到一個數組,但setCookie需要每個cookie的字符串。 –

回答

0

你的方法看起來是正確的,如果你的目標是嘗試與SOAP API,以配合活動的用戶會話特定的相互作用。您在會話中存儲和設置SOAP cookie以及通過setCookie恢復到SOAP會話的方法也是一種方法。

你的代碼是不是由於線路上的錯誤可能工作:

$client->__setCookie($name[$k], $v); 

需要被:

$client->__setCookie($name, $v); 

希望有所幫助。

相關問題