2013-11-08 4 views
1

Я новичок по большей части в мире PHP. В настоящее время я пытаюсь связать API Silverpop с формами на наших страницах. Ниже приведен код, который у меня есть.Передача данных Silverpop через curl возвращает Сессия истек или недействительна

Проблема заключается в том, что, хотя аутентификация работает просто отлично, всякий раз, когда я пытаюсь выполнить POST XML, требуемый API, мне всегда возвращается ошибка, которая говорит: «Сессия истёк или недействительна». Я буду отмечать области в коде, где происходит ошибка.

Я провел последние пол дня, исследуя, и я не могу понять, что это такое, я делаю неправильно или то, что я могу потерять. Мне было сказано неопределенно, что это связано с выходом в браузере перед функцией заголовка PHP, например cURL, но это мало помогает, так как я тестирую это в чистом (без html) php-файле.

<?php 
// Vars 
$firstname = 'a'; 
$lastname = 'a'; 
$email = '[email protected]'; 

// cURL 
function curl($url,$header,$postbody) { 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array($header)); 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postbody); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 300); 
    $ret = curl_exec($ch); 
    curl_close($ch); 

    return $ret; 
} 

///# SILVERPOP API #/// 

// SILVERPOP API URLs 
    // get_token uses oauth to retrieve an access token (works just fine) 
$get_token = 'https://api1.silverpop.com/oauth/token?*inforemoved*'; 
$xmlapi = 'https://api1.silverpop.com/XMLAPI?Authorization='; 

// XML STRINGS 
$xml_post = '<Envelope><Body><AddRecipient><LIST_ID>database#</LIST_ID><CREATED_FROM>1</CREATED_FROM><SEND_AUTOREPLY>true</SEND_AUTOREPLY><UPDATE_IF_FOUND>true</UPDATE_IF_FOUND><COLUMN><NAME>Name</NAME><VALUE>'.$firstname.'</VALUE></COLUMN><COLUMN><NAME>LastName</NAME><VALUE>'.$lastname.'</VALUE></COLUMN><COLUMN><NAME>Email</NAME><VALUE>'.$email.'</VALUE></COLUMN><COLUMN><NAME>Lead Source</NAME><VALUE>Lead_SqueezePage_5Questions</VALUE></COLUMN></AddRecipient></Body></Envelope>'; 
$xml_done = '<Envelope><Body><Logout/></Body></Envelope>'; 

// HEADER VALUES 
$h_access = 'Content-Type:x-www-form-urlencoded'; 
$h_api = 'Content-Type:text/xml;charset=UTF-8'; 

// Get API Access token 
$auth = curl($get_token,$h_access,''); 

// Pull access_token from the return string 
$auth = explode('"', $auth); 

for ($i=0; $i < count($auth); $i++) { 
    if ($auth[$i] == "access_token") { 
     $access_token = $auth[$i + 2]; 
     break; 
    } 
} 

//Append token to URL unless auth failed, then die 
if ($access_token != NULL) { 

    $xmlapi .= $access_token; 

} else { 
    // Logout API session - SESSION ERROR HERE 
    $logout = curl($xmlapi,$h_api,$xml_done); 
    //echo 'Authentication Failed!'; 
    die; 
} 

// Send Customer Data - SESSION ERROR HERE 
$inject = curl($xmlapi,$h_api,$xml_post); 

// Logout API Session - SESSION ERROR HERE 
$logout = curl($xmlapi,$h_api,$xml_done); 

///# END SILVERPOP API #/// 
?> 

ответ

5

Я смог заставить cURL работать правильно. Надеюсь, что код ниже помогает кому-то, кто работает с Silverpop API в первый раз и застревает.

Получить ключ доступа из Silverpop:

// POST Fields 
    $fields = array(
     'client_id' => CLIENT_KEY, 
     'client_secret' => CLIENT_SECRET, 
     'refresh_token' => REFRESH_TOKEN, 
     'grant_type' => 'refresh_token' 
    ); 

    // Init cURL 
    $ch = curl_init(); 

    // Set Options 
    curl_setopt($ch, CURLOPT_URL, ACCESS_KEY_URL); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_POST, count($fields)); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields)); 

    // Execute cURL 
    $result = curl_exec($ch); 

    // Check for HTTP and sever errors here if you wish 
    // with curl_getinfo($ch, CURLINFO_HTTP_CODE) 

    // Close Connection 
    curl_close($ch); 

    // Now you can work with the returned $result string 

Отправить запрос XML конверт Silverpop:

// Set POST header 
     $header = array(
      'Content-Type:text/xml;charset=UTF-8','Authorization: Bearer '.$access_key 
     ); 

     // init cURL 
     $ch = curl_init(); 

     // set cURL options 
     curl_setopt($ch, CURLOPT_URL, REQUEST_URL); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($ch, CURLOPT_HTTPHEADER, $header); 
     curl_setopt($ch, CURLOPT_POST, count($xml_post)); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_post); 
+1

Спасибо! Это было действительно полезно для быстрой и простой реализации контактной формы, где я не хотел добавлять Composer и совершенно новую библиотеку в очень простой проект ... – Jake

0

Я думаю, вам нужно отправить обратно файлы cookie, чтобы сохранить свою сессию в живых. попробуйте добавить эти параметры в свой запрос на завивание.

CURLOPT_COOKIEJAR

этот вид имя файла, где куки должны быть сохранены. Если сервер устанавливает все, они будут записаны в этот файл, и он будет создан, если он еще не существует.

CURLOPT_COOKIEFILE

Установка банка печенья, где завиток пишет печенье, но отдельный параметр необходим для завитка, чтобы отправить печенье обратно на сервер. Это параметр CURLOPT_COOKIEFILE. Если он не установлен, cookie не будет отправлено на сервер. Если файл не существует, то ошибка не выдается.

curl_setopt($ch, CURLOPT_COOKIEJAR, '/tmp/cookies.txt'); 
curl_setopt($ch, CURLOPT_COOKIEFILE, '/tmp/cookies.txt'); 

Вам нужно будет заменить /tmp/cookies.txt с вашим собственным путем.

+0

Я был хорошим стрелком, но это ничего не изменило. Мне интересно, правильно ли я применяю токен приложения. Теперь я думаю, что это меньше проблема сеанса на моем сервере и проблема на их стороне, где они почему-то не могут принять мой токен и, таким образом, создать «действительный» сеанс. Спасибо за ваше предложение. –

0

Запросить определенное количество токенов доступа можно только через час.
В вашем коде, похоже, вы смешиваете авторизацию OAuth и вход/выход из системы jsession.

Если у вас есть токен доступа (запрошенный через OAuth), сохраните токен доступа, например. сеанс, поскольку он будет действовать в течение 4 часов. локонов заголовки должны включать маркер в запросе: команда

$curlHeaders[] = "Authorization: Bearer {$accessToken}"; 

XML-выхода из системы используется, когда вы аутентифицирован апи с именем пользователя/пасс. команда входа в систему даст вам jsessionid, который затем будет использоваться в каждом запросе (вместо токена доступа).

сценарий, который я использую в настоящее время, сохраняет токен доступа в сеансе вместе с временем/датой истечения срока действия. когда Silverpop Connector запускает команду xml, он проверяет токен доступа, который впоследствии проверяет, истекает ли срок его действия или уже истек, и если да, запрашивает новый.

$getNewToken = true; //assume you need a new access token 
//check if the session has an access token 
if (!empty($_SESSION['access'])) { 

//check access token is present and not expired 
if (($expiry > (time() + 5)) && (!empty($token))) { 

//set current access token in the Connector, no new access token required 
SilverpopConnector::getInstance()->setAccessToken($token,$expiry); 
$getNewToken = false; 

//if the session wasn't set or token in session invalid/expired: 
if ($getNewToken) { 
//get access token & expiry from the Connector (will authenticate if expired/invalid) 
$accessToken = SilverpopConnector::getInstance()->getAccessToken(); 
$tokenExpiry = SilverpopConnector::getInstance()->getAccessTokenExpiry(); 
//2a. if successful, set in session 
//2b. if not successful, check if you're connected/re-connect 

Коннектор Silverpop Я упоминал выше, это скрипт, созданный mrmarkfrench на GitHub. https://github.com/mrmarkfrench/silverpop-php-connector

Надеюсь, что это поможет,
Сандра.

+1

Спасибо! Я полностью забыл об этом, но я ответил на свой вопрос несколько месяцев назад. Я отредактирую сообщение, чтобы включить мое решение. Спасибо, что уделили время независимо. Надеюсь, это поможет кому-то новому в API Silverpop. –

Смежные вопросы