I am working on a shopping cart with several payment options using different APIs.
The flow I want is that the user chooses which payment option to use and the according form shows.
On submit the form fields regarding address etc should be saved in my DB and the fields regarding payment is sent with POST to the payment handler api.
It is important that the user only have to click once so the save-in-db has to be squeezed in between the click on the submit button开发者_开发问答 and when the data is sent to the payment server.
I have thought of a redirect where all data gets POSTED to and that save the data in DB and redirect to payment server BUT how do I redirect along with POST data (GET is not working unfortunately).
You can't send a traditional Location:
header to the HTTP client to do a redirect and include POST data. What you could do instead is:
- use an AJAX request to fetch the correct target URL
- update the form action with that URL via JavaScript (in the AJAX callback function)
- submit the form
Easiest thing to do is have a form submit handler in JavaScript code that will make an AJAX POST request to save the customer-related info.
- The payment form's action should point to the payment gateway
- Attach a JavaScript on submit event to the payment form
- In the submit handler, gather all of the customer info (name, address, etc) and make an AJAX POST to your server.
- Make sure that the submit handler returns false so that the POST does not submit to the payment gateway just yet
- Once the AJAX POST succeeds submit the payment form using JavaScript.
This also saves you because you can control what parameters to send to your server (the customer's credit card / CVV numbers should not be sent to your server unless you are certified to handle them).
If you have the PECL http extension installed (it'll show up in phpinfo() as pecl_http) you can create an HTTP POST request and spit out the results after the following pattern:
// your DB code above here
$pay_request = new HttpRequest($remote_url, HTTP_METH_POST);
$pay_request->addPostFields($_POST);
$pay_request->send()->send();
Last line's not a typo - the request returns a response, and then the response gets dumped in the output buffer.
Try this
$context = stream_context_create(array(
'http' => array(
'method' => 'POST',
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'content' => http_build_query($_POST)
),
));
echo file_get_contents($url, false, $context);
精彩评论