2012-11-14 28 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); 

希望有所帮助。

相关问题