2012-05-07 3 views
1

Я делаю корзину покупок. Я хотел бы сохранить заказ до перехода на платежный шлюз. Мой платежный шлюз требует, чтобы я отправил POST на внешний адрес, но не как это сделать из действия контроллера.Как отправить переменные POST на внешний URL?

public function executeBuy(sfWebRequest $request) 
{ 
    sfProjectConfiguration::getActive()->loadHelpers('Url'); 

    // save the order 
    $this->order = new Order(); 
    $this->save 
    //etc.... 

    //go to TPV Payment gateway 
    $dsAmount  = (float)$order->getPriceWithShipping() * 100; 
    $dsOrder  = (int)$order->getId() * 400; 
    $dsMerchantCode = (int)sfConfig::get('app_tpv_merchant_code'); 
    $dsCurrency  = (int)sfConfig::get('app_tpv_merchant_currency'); 
    $dsMerchantURL = url_for('cart/ipn', true, array(
    'sf_culture' => $this->getUser()->getCulture(), 
)); 
    $options = array(
    'Ds_Merchant_Amount'   => $dsAmount, 
    'Ds_Merchant_Currency'   => $dsCurrency, 
    'Ds_Merchant_Order'    => $dsOrder, 
    'Ds_Merchant_Titular'   => $order->getAddress()->getCustomer()->getNameAndLastName(), 
    'Ds_Merchant_MerchantCode'  => $dsMerchantCode, 
    'Ds_Merchant_MerchantURL'  => $dsMerchantURL, 
    'Ds_Merchant_MerchantSignature' => $digest, 
    'Ds_Merchant_Terminal'   => $dsCurrency 
); 

    //how to send post $options variables to external url? 
} 

ответ

1

Использование cURL to post data:

//set POST variables 
$dsMerchantURL = url_for('cart/ipn', true, array(
    'sf_culture' => $this->getUser()->getCulture(), 
)); 

$options = array(
    'Ds_Merchant_Amount' => urlencode($dsAmount), 
    'Ds_Merchant_Currency' => urlencode($dsCurrency), 
    'Ds_Merchant_Order' => urlencode($dsOrder), 
    'Ds_Merchant_Titular' => urlencode($order->getAddress()->getCustomer()->getNameAndLastName()), 
    'Ds_Merchant_MerchantCode' => urlencode($dsMerchantCode), 
    'Ds_Merchant_MerchantURL' => urlencode($dsMerchantURL), 
    'Ds_Merchant_MerchantSignature' => urlencode($digest), 
    'Ds_Merchant_Terminal' => urlencode($dsCurrency) 
); 

//url-ify the data for the POST 
foreach($options as $key=>$value) { $fields_string .= $key.'='.$value.'&'; } 
rtrim($fields_string,'& '); 

//open connection 
$ch = curl_init(); 

//set the url, number of POST vars, POST data 
curl_setopt($ch,CURLOPT_URL, $dsMerchantURL); 
curl_setopt($ch,CURLOPT_POST, count($options)); 
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string); 

//execute post 
$result = curl_exec($ch); 

//close connection 
curl_close($ch); 
+0

Мне нужно открыть URL-адрес с переменными сообщений! Как и тег формы и представить, но с html – Mauro

+0

завиток может сделать это за вас. – dubvfan87

+0

Как открыть в одном окне? – Mauro

0

на нашем сайте (bpremium.com) мы запускаем нашу платежную систему через AJAX, наш сайт посылает команды, как «создать продажи» или «количество обновлений» над веб-сервисов в конкретные URL-адреса и данные url записывают текущее состояние вашей корзины покупок и сохраняют идентификатор продажи в сеансе.

Затем, когда мы добираемся до TPV, мы выполняем web-сервис, чтобы захватить html для формы, сгенерированной, подписанной и хешированной, готовой к работе с одним нажатием кнопки.

Этот метод отлично подходит для высокой скорости, потому что вам не нужно переадресовывать и заставлять пользователя ждать, он намного менее тяжелый и означает, что вы можете просто открыть TPV в окно, заполнить его, а merchantURL будет извлекать данные POST из шлюза TPV, когда он преуспевает или терпит неудачу.

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