2015-01-06 4 views
0

Моей реализации SagePay уже сейчас работает нормально некоторое время, однако в последнее время пользователей, которые имеют% 27 символ («) была возвращается с ошибкой:SagePay характера (% 27) UrlEncode вопросы

» Invalid: 3035 : Недопустимый формат VendorTxCode. '

В настоящее время я URLEncoding фамилию, прежде чем отправить его в мой createVendorTxCode функции:

$encodedSurname = urlencode(Input::get('BillingSurname')); 

    // Create a custom VendorTxCode. This must be unique every time. 
    $VendorTxCode = $this->createVendorTxCode($encodedSurname, $ids); 

...

public function createVendorTxCode($lastName, $ids) { 
    $lesson_ids = str_replace(',', '-', $ids); 

    $VendorTxCode = $lastName; 
    $VendorTxCode .= date("-YmdHis-"); 
    $VendorTxCode .= rand(0,32000)*rand(0,32000); 

    return $VendorTxCode; 
} 

С именем, таким как O'Neil это теперь возвращает фамилию как O % 27Neil, который, как я думаю, вызывает проблемы (все остальные пользователи без этого персонажа работают). После построения остальной части URL и отправить его в моей функции requestPost (как показано ниже), SagePay возвращается с начала над

public function requestPost($url, $data){ 
    set_time_limit(60); 
    $output = array(); 
    $curlSession = curl_init(); 
    curl_setopt ($curlSession, CURLOPT_URL, $url); 
    curl_setopt ($curlSession, CURLOPT_HEADER, 0); 
    curl_setopt ($curlSession, CURLOPT_POST, 1); 
    curl_setopt ($curlSession, CURLOPT_POSTFIELDS, $data); 
    curl_setopt($curlSession, CURLOPT_RETURNTRANSFER,1); 
    curl_setopt($curlSession, CURLOPT_TIMEOUT,30); 
    curl_setopt($curlSession, CURLOPT_SSL_VERIFYPEER, FALSE); 
    curl_setopt($curlSession, CURLOPT_SSL_VERIFYHOST, 2); 

    $rawresponse = curl_exec($curlSession); 
    $_SESSION["rawresponse"]=$rawresponse; 

    $response = explode(chr(10), $rawresponse); 
    // Check that a connection was made 
    if (curl_error($curlSession)){ 
     $output['Status'] = "FAIL"; 
     $output['StatusDetail'] = curl_error($curlSession); 
    } 

    curl_close ($curlSession); 

    for ($i=0; $i<count($response); $i++){ 
     $splitAt = strpos($response[$i], "="); 
     $output[trim(substr($response[$i], 0, $splitAt))] = trim(substr($response[$i], ($splitAt+1))); 
    } 
    return $output; 
} 

Здесь недействительна ошибка выход из ответа:

array(3) { ["VPSProtocol"]=> string(4) "2.23" ["Status"]=> string(7) "INVALID" ["StatusDetail"]=> string(42) "3035 : The VendorTxCode format is invalid." } 

Как Я сказал, что это прекрасно работает с любой другой фамилией, просто не с этим конкретным персонажем.

Любая помощь или понимание были бы оценены. Благодарю.

ответ

1

Поле vendorTxCode допускает только a-z A-Z - _. (макс. длина 40 символов), так что он не работает на «персонаже». Я боюсь, что опасность встраивания фамилии в vendorTxCode.

+0

Спасибо, Рик, это очищает это. Считаете ли вы, что написать функцию для поломок незаконных символов из фамилии будет иметь пагубное влияние на процесс Sagepay? –

+0

Лично я бы оставил поле billingsurname/deliverysurname, как потребительский ввод, и просто вычеркнул его, когда вы построите его в vendorTxcode. Сказав это, он не будет вызывать никаких проблем со стороны Sagepay, если вы сначала удалите его из этих полей. –