1

ショッピングカートを作っています。支払いゲートウェイに行く前に注文を保存したいと思います。私の支払いゲートウェイでは、POST を外部アドレスに送信する必要がありますが、コントローラー アクションから送信する方法は必要ありません。

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?
}
4

2 に答える 2

1

cURL を使用してデータを投稿します

//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);
于 2012-05-07T16:51:44.767 に答える
0

私たちのウェブサイト (bpremium.com) では、ajax を介して支払いシステムを実行し、ウェブサービスを介して「セールの作成」や「数量の更新」などのコマンドを特定の URL に送信し、それらの URL はショッピング カートの現在の状態を記録し、セールを保存します。セッションのID。

次に、TPV に到達したら、Web サービスを実行して、フォームの html を取得し、生成、署名、ハッシュ化して、ボタンを 1 回押すだけですぐに使用できるようにします。

この手法は高速に最適です。リダイレクトを続けてユーザーを待たせる必要がないため、はるかに軽量であり、TPV をウィンドウで開いて入力するだけで、merchantURL が POST データをキャッチします。成功または失敗したときに TPV ゲートウェイから。

于 2012-07-09T22:30:23.437 に答える