我正在使用电子商务购物车的 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
如果您的目标是尝试将活动用户会话与 SOAP API 的特定交互联系起来,那么您的方法看起来是正确的。在会话中存储和设置 SOAP cookie 并通过 setCookie 恢复到 SOAP 会话的方法也是可行的方法。
您的代码无法工作可能是由于线路上的错误:
$client->__setCookie($name[$k], $v);
其中需要是:
$client->__setCookie($name, $v);
希望有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)