17

PayPal Payments Standard など、顧客が複数の支払いオプションを利用できるサイトを開発しています。顧客に関するかなりの量のデータを収集しているので、ユーザーを PayPal のサーバーに送信する前にサーバーでフォームを処理したいと考えています。1 つのオプションは、データを 1 つの文字列に連結し、その文字列をcustomフィールドに割り当ててから、IPN 応答で処理することですが、これは非常に洗練されていないソリューションであることがわかりました。代わりに、ユーザー データを収集した後、cURL を使用して標準の HTML PayPal フォームを送信しようとしています。ユーザーを 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@example.com';
    $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);
  }
4

3 に答える 3

40

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

phpheader関数を使用してユーザーをリダイレクトし、変数を 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'] = 'social@jackeyes.com';
    $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);
}
于 2013-02-12T23:24:28.107 に答える
4

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

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

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

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

于 2013-02-12T22:46:29.133 に答える
1

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

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

于 2013-02-12T22:45:28.530 に答える