2011-04-05 59 views
4

我是Magento Web服務的新手,必須對其進行擴展。 Webservice shell能夠登錄客戶,將會話cookie返回給我,以便我可以重定向到一個文件,該文件再次設置cookie,重定向我,我可以看到我的購物車並繼續在Magento商店結帳。PHP - > SOAP - > Magento Webservice:獲取由Magento設置的Cookie

問題: Magento創建一個cookie(包含會話ID或任何其他內容,我試圖設置這個cookie手冊,他們即時登錄),而不是客戶登錄時設置會話。 我試過現在需要幾個小時才能得到這個由magento在我的magento網絡服務中設置的cookie。看來cookie不會設置我的呼喚

$session = Mage::getSingleton('customer/session'); 
return $session->getCookie()->get('frontend'); 

我的繼承人完整的代碼: Magento的web服務API:

<?php 
class Customapi_Model_Core_Api 
{ 

public function __construct() 
{ 
} 

public function checkout($user, $cart) 
{ 
    $ret['cookie'] = $this->login($user); 

    //$coreCookie = Mage::getSingleton('core/cookie'); 
    //$ret['cookie'] = $_COOKIE['frontend']; 
    return $ret; 
} 

function login($user) 
{ 
    Mage::getSingleton('core/session', array('name'=>'frontend')); 
    $session = Mage::getSingleton('customer/session'); 
    try 
    { 
     $session->loginById($user['id']); 
    } 
    catch (Exception $e) 
    { 
    } 
    return $session->getCookie()->get('frontend'); 
} 

} 
?> 

我的繼承人API調用在PHP中:

<?php 
$teambook_path = 'http://localhost/magento/'; 

$soap = new SoapClient('http://localhost/magento/api/?wsdl'); 
$soap->startSession(); 
$sessionId = $soap->login('ApiUser', 'ApiKey'); 

$userSession = $soap->call(
    $sessionId, 
    'customapi.checkout', 
    array(
     array(
      'id' => 1, 
      'username' => '[email protected]', 
      'password' => '***' 
     ), 
     array(
     ) 
    ) 
); 

echo '<pre>'; 
var_dump($userSession)."\n"; 
if(isset($userSession['sid'])) 
    echo '<a href="'.$teambook_path.'session.php?sid='.$userSession['sid'].'" target="_blank">'.$userSession['sid'].'</a>'."\n"; 
echo '</pre>'; 

$soap->endSession($sessionId); 
?> 

謝謝爲每一個幫助! MRU


對不起,我正在寫一個答案,但評論框拒絕了我寫的多...字母。

我試過你發佈的兩個代碼,所有我得到的是一個空數組或布爾假。 我寫了一個靜態函數:

private static $cookie = array(); 
public static function cookie($key, $value) 
{ 
    if($key == 'frontend') { 
     self::$cookie['key'] = $key; 
     self::$cookie['value'] = $value; 
    } 
} 

,被稱作Mage_Core_Model_Session_Abstract_Varien ::開始,我得到了前端cookie值:

Customapi_Model_Core_Api::cookie($sessionName, $this->getSessionId()); 

在管線125

但是,didnt解決我的基本問題: 在Api調用中創建的會話無法恢復,儘管它設置爲正確的值。

感謝您的幫助!

+0

你好@MRU,我是新的magento與同樣的任務,請你指導我如何創建web服務的客戶登錄magento一步一步? – Deep 2015-04-24 14:22:12

回答

7

你可以得到所有你的cookies的使用以下命令的數組:

Mage::getModel('core/cookie')->get(); 

的前端cookie可以這樣進行檢索:

Mage::getModel('core/cookie')->get('frontend'); 

從你註釋掉的代碼,我可以看到你已經知道了。

據我知道,當你登錄一個用戶,Magento的不只是創建一個新的會話ID,它採用活動連接(這是由PHP本身產生)的會話ID。您正在登錄該用戶並將其關聯到您的API客戶端剛剛使用Magento創建的會話。因此,您所評論的代碼似乎對您正在嘗試實現的內容而言是正確的。

現在你應該只需要得到返回的會話ID,並用它在你的新的請求爲「前端」的cookie。

編輯(第二次)

Magento的具有它使用不同的作用域單個PHP會話內的不同的會話。例如,核心範圍,客戶範圍等。但是,客戶範圍也針對特定網站。所以,你可以有一個customer_website_one和一個customer_website_two範圍。

如果你想登錄你的用戶,你必須告訴Magento在哪個網站。以下面的代碼爲例

// This code goes inside your Magento API class method 

// These two lines get your website code for the website with id 1 
// You can obviously simply hardcode the $code variable if you prefer 
// It must obviously be the website code to which your users will be redirected in the end 
$webSites = Mage::app()->getWebsites(); 
$code = $webSites[1]->getCode(); 

$session = Mage::getSingleton("customer/session"); // This initiates the PHP session 
// The following line is the trick here. You simulate that you 
// entered Magento through a website (instead of the API) so if you log in your user 
// his info will be stored in the customer_your_website scope 
$session->init('customer_' . $code); 
$session->loginById(4); // Just logging in some example user 
return session_id();  // this holds your session id 

如果我理解正確的話,你現在想要讓用戶打開你的服務器中的PHP腳本,設置了Magento的餅乾你剛纔在您的API方法返回。我寫了下面的例子中,你會像這樣訪問:example.com/set_cookie.php?session=THE_RETURNED_SESSION_ID

<?php 
// Make sure you match the cookie path magento is setting 
setcookie('frontend', $_GET['session'], 0, '/your/magento/cookie/path'); 
header('Location: http://example.com'); 
?> 

應該這樣做。你的用戶現在已經登錄(至少我已經在我的測試環境中工作了)。有一點你應該記住的是,Magento有一個會話驗證機制,如果啓用將會失敗。這是因爲您的會話存儲了有關您正在使用哪個瀏覽器的信息,您連接的IP等。這些數據在以後通過API方法和瀏覽器進行的調用之間不匹配。下面是一個命令print_r($session->getData())的輸出例如,在API的方法設置在會議結束後

[_session_validator_data] => Array 
(
    [remote_addr] => 172.20.1.1 
    [http_via] => 
    [http_x_forwarded_for] => 
    [http_user_agent] => PHP-SOAP/5.3.5 
) 

確保你把在Magento管理中設置的驗證>配置>常規>網絡>會話驗證設置

+0

我發佈了一個答案,因爲這裏沒有足夠的字符允許。 對不起:) – michiruf 2011-04-05 16:05:53

+0

再次感謝您的艱辛。但是這並沒有解決我的問題。在我試圖獲取cookie之前,我嘗試了這一點,但它不起作用,導致會話無法「恢復」。我嘗試再次描述我的問題:當我重定向到magento(設置cookie的腳本工作正常)時,由soap api調用創建的會話不會「恢復」。你知道在Api調用之後是否有任何類型的會話清除嗎? – michiruf 2011-04-05 16:24:49

+0

我用我的新發現擴大了我的答案。實際上,你可以看到很棘手的問題。我希望我現在已經完全理解你的問題。 – 2011-04-08 01:26:59