WordPress using AJAX connections to third-party server - php

I'm okay with WordPress and editing files but I've had to take over a website from the designers and I'm a bit stuck.
What they've done is create an AJAX file that is used for all website submitted forms, and all of those forms are redirected to their own servers, before being sent on to the customer.
Obviously this is not ideal for a variety of reasons, but I'm unsure how to fix it. There is a rule for each form/contact method, then a final rule at the bottom of the file that I presume applies to all the previous rules.
This is:
function postThis($data_to_post) {
$form_url = "https://abcdef.co.uk/__mailer/__send123456.php";
$curl = curl_init();
curl_setopt($curl,CURLOPT_URL, $form_url);
curl_setopt($curl,CURLOPT_POST, sizeof($data_to_post));
curl_setopt($curl,CURLOPT_POSTFIELDS, $data_to_post);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
$result = curl_exec($curl);
curl_close($curl);
return $result;
}
I'm not sure how to replace the https (which I've changed the URL of) bit with something that will simply send the forms from the website to the website owners email address, without the intercept.

You could set up individual jquery functions that are returned on form submit to point to a php email function.
Form:
<form onsubmit="return someFunction();">
</form>
Javascript:
function someFunction(){
var data = $('form').serialize();
$.ajax({
url: phpMailClass.php,
data: data,
method: 'post',
success: function(resp){
// Handle the response upon success
}
});
}
Receive the user inputs in a php file then use PHP's mail() function to send the form(s) to the desired recipients.

Related

Accept POST from other application

I have a CodeIgniter User Panel and a login form out of CodeIgniter Environment and I need to know how can I accept the post coming from this.
Basically, is:
My app send a POST with (login an password) to CodeIgniter application to login in successfully.
Obs: I read about CrossDomain POST with AJAX but doesn't work.
I tried this:
$("form").submit(function() {
$.ajax({
url: 'http://localhost/cp/login/auth',
type: 'POST',
crossDomain: true,
data: {login: $('#login').val(), passwd: $('#passwd').val()},
})
});
But when I click in submit button, I redirect to login page (CI) but don't log in.
I appreciate your patience. Thank you!
Add this header to your page. (http://localhost/cp/login/auth page)
header('Access-Control-Allow-Origin: *');
Say No for crossdomain ajax. Send data with post. And in your application check data and login user or redirect back if has errors.
I feel that you are trying to send data from ajax to a codeigniter function via post. Then you should do this:
function makeAjaxCall(){
$.ajax({
type: "post",
url: '<?php echo base_url(); ?>" + "MyController/Myfunction',
cache: false,
data: $('#MyForm').serialize()}); }
The form should be as
<form name="MyForm" id="MyForm" action="">
Submit Button as
<input type="button" onclick="makeAjaxCall();" value="Submit"/>
Then on the controller
class MyController extends CI_Controller{
public function Myfunction(){
$username = $this->input->post('username_field');
$password = $this->input->post('password_field');
//Do my stuff then redirect
}}
Hope that is helpful.
Hi to get info from other login app, you need to make a webservices or using curl
assuming that you app that make login and return data is working fine
in the other app, you need to make a call using curl like
// create curl resource
$ch = curl_init();
// set url
curl_setopt($ch, CURLOPT_URL, "username:password#example.com/controller/method/parm1/param2");
//return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// $output contains the output string
$output = curl_exec($ch);
// close curl resource to free up system resources
curl_close($ch);
//print result
var_dump($output);

Upload image from client web application to RESTful API

I've been working on building an API as a learning purpose. It is essentially a twitter-like micro post API. Alongside the API I've been building a client web application powered off of the API. I am able to successfully post statuses without any problems. But now I am trying to allow users to upload an image along with the post. The client application is built using the mvc pattern. I post the submitted post to my post controller via jQuery ajax like so:
$.ajax({
url: '../../posts/newPost',
type: 'POST',
data: formData,
async: true,
success: function (data) {
console.log(data);
$('#post-form-area').removeClass('loading');
$('#post-body').val('');
$('#files').val('');
$('#attached').find('img').remove();
$('#attached').hide();
},
cache: false,
contentType: false,
processData: false
});
I am able to successfully get the file data using the $_FILES array within my controller. However, I am having a lot of difficulty figuring out how to send this to my RESTful API. I created a class to handle my API calls and here is the code for my POST method:
$ds = json_encode($params);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $ds);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//execute the request
$result = curl_exec($ch);
Here is the data that I pass to post a text only status:
$data = array('user_id' => $_SESSION['user_id'], 'body' => $body, 'time' => $timestamp);
I have tried passing $_FILES['file']['tmp_name'] as part of the array, but on API side the $_FILES array is null. I tried following this example, but I ran in to the same problem.
The way my API is set up, if the $_SERVER['request_method'] is POST I get the contents from cURL from php://input and then pass these parameters to the necessary controller. Do I need to add anything here that will give me access to the $_FILES array? I've been digging for about 3 hours now and haven't been able to find anything that has helped me, so I appreciate any help.
Thanks!
Edit:
I don't see how this is a duplicate as the link you posted that it is a duplicate of has nothing to do with uploading an image through a RESTful service...
Edit 2:
I've narrowed it down to how I am sending the data from my client application because I am successfully able to use the following command line code to upload a file:
curl -X POST -F "image=#test.JPG" http://rest.mattaltepeter.com/posts/upload
And then the code to receive it:
public function uploadAction() {
$result['success'] = move_uploaded_file($_FILES['image']['tmp_name'], SITE_ROOT . '/uploads/' . $_FILES['image']['name']);
$result['data'] = UPLOAD_DIR . $_FILES['image']['name'];
return $result;
}
I came across this tutorial and have been able to implement it fine with a static URL to an image, but that isn't very helpful as I want a user to be able to select their own image to upload with their post. So it looks like my issue is revolved around getting the full path as that tutorial mentions on line 4 of the first code block and sending it to the api. So how do I get that same information from the $_FILES array instead of a static file URL?
Finally figured it out. It had to do with using json_encode() to send my POST data. As soon as I tried it with out json_encode(), I had access to the $_FILES array. I think I'll have to add a parameter to my ApiCall->post() method to tell it if I want to json_encode() the data I wish to pass.

PHP REST put/delete options

Trying to understand the REST method of creating apps in PHP.
I'm having a problem in understanding how to send put/delete from php script.
In the internet I can only find how to determine which php method has been sent.
if($_SERVER['REQUEST_METHOD'] == 'DELETE')
But how to send this DELETE method?
Normaly what I do when want to delete some record from DB i have normal html form with method set to post/get and record db id then I press submit button to send post/get form.
How to create this submit to send delete/put methods?
There are two common ways to send a request from an HTML page, using an http method other than GET or POST.
#1: use an html form to send a POST request, but include a hidden form field that tells the server to treat the request as though it were using a different method. This is the approach outlined by #xdazz.
<form method="post" action="my_resource.php">
...
<input type="hidden" name="REQUEST_METHOD" value="PUT" />
<form>
In your PHP script, "my_resource.php", you'll have to look at both the real request method, and the submitted form field, to determine which logic to invoke:
/* my_resource.php */
$method = strtolower($_SERVER['REQUEST_METHOD']);
if( $method === 'post' && isset($_REQUEST['REQUEST_METHOD'])) {
$tmp = strtolower((string)$_REQUEST['REQUEST_METHOD']);
if( in_array( $tmp, array( 'put', 'delete', 'head', 'options' ))) {
$method = $tmp;
}
unset($tmp);
}
// now, just run the logic that's appropriate for the requested method
switch( $method ) {
case "get":
// logic for GET here
break;
case "put":
// logic for PUT here
break;
case "post":
// logic for POST here
break;
case "delete":
// logic for DELETE here
break;
case "head":
// logic for DELETE here
break;
case "options":
// logic for DELETE here
break;
default:
header('HTTP/1.0 501 Not Implemented');
die();
}
Note: you can put the above logic into each page (or call it from each page). An alternative is to build a proxy script, (eg. "rest-form-proxy.php"). Then, all forms in your site will submit to the proxy, including a request_method, and a target url. The proxy will extract the provided information, and forward the request on to the desired url using the proper requested http method.
The proxy approach is a great alternative to embedding the logic in each script. If you do build the proxy though, be sure to check the requested URL, and dis-allow any url that doesn't point back to your own site. Failure to do this check will allow others to use your proxy to launch malicious attacks on other websites; and it could also compromise security and/or privacy on your website.
--
#2: Use Javascript, in your HTML page, to initiate an XMLHttpRequest. This is a more complex approach, which requires a bit of javascript, but it can be more flexible in some cases. It allows you to send requests to the server without re-loading the page. It also allows you to send data in many different formats (you are not limited to sending only data from an html form). For example:
<button onclick="doSave()">Save</button>
<script>
var myObject = {
// ... some object properties that
// that you'll eventually want to save ...
};
function doSave() {
var xhr = createxmlhttprequest();
// initialize the request by specifying the method
// (ie: "get", "put", "post", "delete", etc.), and the
// url (in this case, "my_resource.php"). The last param
// should always be `true`.
xhr.open("put", "my_resource.php", true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onreadystatechange = function() {
if (xhr.readystate != 4) { return; }
var serverresponse = xhr.responsetext;
// ... this code runs when the response comes back
// from the server. you'll have to check for success
// and handle the response document (if any).
};
// this initiates the request, sending the contents
// of `myObject` as a JSON string.
xhr.send(JSON.stringify(myObject));
// The request runs in the background
// The `onreadystatechange` function above
// detects and handles the completed response.
}
</script>
There's a lot more to XMLHttpRequest than I've shown in the basic example above. If you choose this route, please research it thoroughly. Among other things, make sure you handle the various error conditions properly. There are also a number of issues with cross-browser compatibility, many of which can be addressed by using an intermediary, like jQuery's $.ajax() function.
Finally, I should note that the two methods above are not mutually exclusive. It's quite possible to use forms for some requests, and XMLHttpRequest for others, as long as you build your server so that it can handle either kind of request (as shown in #1 above).
HTML forms only support GET and POST, so in a normal web application, you need to use a hidden field to specify the request method, which is most frameworks do.
<form method="post" action="...">
...
<input type="hidden" name="REQUEST_METHOD" value="PUT" />
<form>
The usual way to do this is to use cURL
$ch = curl_init('YOUR_URL');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE'); // curl_setopt($ch, CURLOPT_PUT, true); - for PUT
curl_setopt($ch, CURLOPT_POSTFIELDS, 'some_data');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0); // DO NOT RETURN HTTP HEADERS
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // RETURN THE CONTENTS OF THE CALL
$result = curl_exec($ch);
If you are on Chrome, you can use Postman to test your REST service. It allows sending any type of command - DELETE, PUT, but also OPTIONS, PATCH, etc.
On Firefox, you can use RESTClient among others.

Submit external form without leaving the page/site

I looked through the site for answers to this, but nothing's spot on to what I need (this is close, except it doesn't actually submit the form: Prevent form redirect OR refresh on submit?).
I'm trying to incorporate a mailing list sign-up (code borrowed from a sign-up page hosted on ReverbNation) to a website.
The form submits properly, but the signee is redirected to a hideously rendered page on ReverbNation's site. I cannot modify their script and don't think there's an API I can use to keep things tidy.
Is there a way I can submit the form in the background, without the user being redirected?
Here's an example in PHP for tunneling a POST.
//set POST variables
$url = 'http://domain.com/url-to-post-to';
$fields = array(
// Add the fields you want to pass through
// Remove stripslashes if get_magic_quotes_gpc() returns 0.
'last_name'=>urlencode(stripslashes($_POST['last_name'])),
'first_name'=>urlencode(stripslashes($_POST['first_name'])),
'email'=>urlencode(stripslashes($_POST['email']))
);
//url-ify the data for the POST
foreach($fields 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,$url);
curl_setopt($ch,CURLOPT_POST,count($fields));
// returns the response as a string instead of printing it
curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
//execute post
$result = curl_exec($ch);
//close connection
curl_close($ch);
echo $result;
If you're posting to the same domain, you can use an AJAX post. However, it seems you're trying to POST to different domain, so the browser's same origin policy will prevent you from doing so (http://en.wikipedia.org/wiki/Same_origin_policy). (JSONP can get around this but it doesn't work for POST)
Another way to get around this is to have your server do the POST and tunnel the response back to your page.
<form id='yourForm' action="" onsubmit="javascript: doPostToTunnelPage(); return false;">
<!-- inputs...-->
</form>
Make sure to return false, or your page will be redirected.
in my understand, you need send a form without redirect?
consider my example
$(function() {
$('#myForm').submit(function (e) {
e.preventDefault();
$.ajax({ /* params to send the form */ });
return false;
});
});
IIT it will work just because of the e.preventDefault.
If this method is called, the default action of the event will not be triggered.
See jQuery documentation here for more information.
Hope it help you

Submit a form and email it with PHP

I'm currently trying to get a script to submit a form to a page that is external to my site but will also e-mail the answers given by the customer to me. The mail() function has worked fine for the mail... but how do I then take these values and also submit them to the external page?
Thanks for your help!
If you get the form to submit to your script, can could first send the email and then use cURL to make a HTTP request to the external page, POSTing the values you want to send. This won't work though if the external site is relying on any cookies the user has, because the request is made from your web server.
e.g.
<?php
//data to post
$data = array( 'name' => 'tom', 'another_form_field'=>'a' );
//external site url (this should be the 'action' of the remote form you are submitting to)
$url = "http://example.com/some/url";
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
//make curl return the content returned rather than printing it straight out
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($curl);
if ($result === false) {
//curl error
}
curl_close($curl);
//this is what the webserver sent back when you submitted the form
echo $result;
You're going to have to dig through the source of the external form to determine the HTML name's of the relevant fields and whether the form is submitted using GET or POST.
If the form uses the GET method, you can easily generate a query-string that follows the same form as the actual form: http://example.com/form.php?name1=value1&name2=value2 ...
If, on the other hand, the form uses the POST method, you'll have to generate a HTTP POST request using something like the cURL library (http://us2.php.net/curl).
You could send a custom HTTP POST request from the script that you're using to send the email. Try fsockopen to establish the connection and then send your own HTTP request containing the data you just received from the form.
Edit:
A bit more specific. There's this example that shows you how to send a simple HTTP POST request. Just seed it with your $_POST array like this:
do_post_request(your_url, $_POST);
and that should do the trick. Afterwards, you could optionally evaluate the response to check whether everything went OK.
For POST, you'll need to set the external page as the processing action:
<form action="http://external-page.com/processor.php" method="POST">
<!-- Form fields go here --->
</form>
If it's GET, you can either change the form method to GET, or create a custom query string:
submit
Edit: I just realized you probably want to send these from within your PHP processing class. In that case, you could use set the location header with the custom query string:
header("Location: http://external-page.com/processor.php?field1=value1&field2=value2");

Categories