web-dev-qa-db-ja.com

cURLを介してフォームを送信し、ブラウザをPayPalにリダイレクトします

私は顧客がPaypalPaymentsStandardを含むいくつかの支払いオプションを持っているサイトを開発しています。顧客に関するかなりの量のデータを収集しているので、ユーザーをPaypalのサーバーに送信する前に、サーバーでフォームを処理したいと思います。 1つのオプションは、データを1つの文字列に連結し、その文字列をcustomフィールドに割り当ててから、IPN応答で処理することですが、これは非常に洗練されていないソリューションであることがわかりました。代わりに、ユーザーデータを収集した後、cURLを使用して標準のHTMLPaypalフォームを送信しようとしています。チェックアウトプロセスを完了するためにユーザーをPaypalにリダイレクトするにはどうすればよいですか?

  // Process Paypal payment
  if ($method == 'Paypal') {

    // Prepare POST data
    $query = array();
    $query['notify_url'] = 'http://example.com/ipn';
    $query['cmd'] = '_cart';
    $query['upload'] = '1';
    $query['business'] = '[email protected]';
    $query['address_override'] = '1';
    $query['first_name'] = $first_name;
    $query['last_name'] = $last_name;
    $query['email'] = $email;
    $query['address1'] = $ship_to_address;
    $query['city'] = $ship_to_city;
    $query['state'] = $ship_to_state;
    $query['Zip'] = $ship_to_Zip;
    $query['item_name_'.$i] = $item['description'];
    $query['quantity_'.$i] = $item['quantity'];
    $query['amount_'.$i] = $item['info']['price'];

    // Prepare query string
    $query_string = '';
    foreach ($query as $key=>$value) {
      $query_string .= $key.'='.urlencode($value).'&';
    }
    $query_string = rtrim($query_string, '&');

    // Open connection
    $ch = curl_init();

    //set the url, number of POST vars, POST data
    curl_setopt($ch,CURLOPT_URL, 'https://www.Paypal.com/cgi-bin/webscr');
    curl_setopt($ch,CURLOPT_POST, count($query));
    curl_setopt($ch,CURLOPT_POSTFIELDS, $query_string);

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

    // Close connection
    curl_close($ch);
  }
17
David Jones

警告:この回答にはセキュリティ上の欠陥があります。クライアントを介して機密データ(アイテムや価格など)を渡すと、クライアントはトランザクションを変更できます。すなわち。アイテムを変更するか、価格を変更してください。 IPNの実装方法 に関するPaypalのドキュメントを参照してください。

Php header関数を使用してユーザーをリダイレクトし、変数をPOSTではなくGETとして送信する必要があります。

// Process Paypal payment
if ($method == 'Paypal') {

    // Prepare GET data
    $query = array();
    $query['notify_url'] = 'http://jackeyes.com/ipn';
    $query['cmd'] = '_cart';
    $query['upload'] = '1';
    $query['business'] = '[email protected]';
    $query['address_override'] = '1';
    $query['first_name'] = $first_name;
    $query['last_name'] = $last_name;
    $query['email'] = $email;
    $query['address1'] = $ship_to_address;
    $query['city'] = $ship_to_city;
    $query['state'] = $ship_to_state;
    $query['Zip'] = $ship_to_Zip;
    $query['item_name_'.$i] = $item['description'];
    $query['quantity_'.$i] = $item['quantity'];
    $query['amount_'.$i] = $item['info']['price'];

    // Prepare query string
    $query_string = http_build_query($query);

    header('Location: https://www.Paypal.com/cgi-bin/webscr?' . $query_string);
}
40
Drahcir

すべてのデータをPaypalに投稿して返送するのではなく、サーバーにデータを保持し、識別トークンのみを送信する必要があります。 (ユーザーのブラウザを介して)Paypalに送信するデータはすべて傍受され、変更される可能性があります。これは重大なセキュリティ上の危険です。

トークンのみを送信する場合、改ざんの機会はありません。

Paypalの仕様を読んでください。これらを実装する方法に関するガイドラインがあります。

支払いが実際に行われたかどうかを知っているのはPaypalだけなので、あなたはIPNまたは同様の後処理を使用する必要があります。行うnotユーザーから取得したデータを信頼します。

4
Halcyon

curlを実行すると、バックエンド側でエンドツーエンドの呼び出しが行われ、フロントエンドの動作には反映されません。

ページが読み込まれたらフォームを自動送信するには、非表示フィールドとJavaScriptを使用してフォームを作成する必要があります。

1
NLF