如何让SoapClient尊重会话?

时间:2012-11-14 22:38:51

标签: php session soap soap-client

我正在使用电子商务购物车的SOAP API,我似乎无法通过不同的页面来保持会话。

作为一个例子,我在下面有一些测试代码(带有一堆调试消息),它将一个项目添加到购物车,然后查看购物车。当我在浏览器中运行它时,它运行得很好,但如果我刷新页面,我希望在那里有两个项目(两个页面调用中的一个)。但是,它似乎没有记住以前调用该页面的任何内容。我知道API正在运行,因为如果我只是在此页面上调用“AddToCart”两次然后调用“GetCartContents”,我会正确看到购物车中的2个项目。

我错过了什么吗?

<?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

1 个答案:

答案 0 :(得分:0)

如果您的目标是尝试将活动用户会话与SOAP API的特定交互联系起来,那么您的方法看起来是正确的。您在会话中存储和设置SOAP cookie以及通过setCookie恢复到SOAP会话的方法也是可行的方法。

您的代码无法正常运行,原因可能是该行错误:

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

需要:

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

希望有所帮助。