web-dev-qa-db-fra.com

Envoi de post à la base de données, puis redirection vers paypal

J'essaie de soumettre des données de formulaire à la base de données, puis envoie le client à Paypal qui utilisera IPN pour envoyer une réponse.

À l'heure actuelle, j'ai le formulaire à soumettre à la base de données, j'ai l'IPN qui fonctionne, mon problème est la partie redirection. Je veux que tout se fasse en un clic de souris ...

Mon formulaire ne fait que renvoyer à la page en cours où il valide les données et ajoute à la base de données. Je n'arrive pas à utiliser l'en-tête car les données sont déjà envoyées à l'en-tête.

Quelles sont mes options/solutions. La solution la plus simple serait la meilleure mais je suis ouvert à tout.

Pour une tâche aussi simple, on pourrait penser qu'il existe une solution simple ...

Voici mon code qui imprime le formulaire:

function display_form() { ?>
        <div class="culis-module">
            <form action="<?php echo str_replace( '%7E', '~', $_SERVER['REQUEST_URI']); ?>" method="post">      
                <div class="clearfix culis-module-body">
                    <?php 
                    if ( $_POST['culis_add_listing'] == 'Y' && $this->no_errors()) { 
                        $this->addto_db();
                        ?><div class="alert alert-success"><button type="button" class="close" data-dismiss="alert">x</button> <?php _e('Thank You, your company will be listed as soon as payment is processed.')?></div><?php 
                    }

                    if ( $_POST['culis_add_listing'] == 'Y' && !$this->no_errors()) { 
                        $this->prepare_fields('saved'); 
                    } 
                    else {
                        $this->prepare_fields();
                    }?>
                </div>
                <div class="modal-footer">  
                    <button class="btn btn-primary" type="submit" name="culis_add_listing" value="Y">Submit</button>
                    <button class="btn" type="submit" name="form_reset" value="Y">Clear</button>
                </div>
            </form>
        </div>
    <?php 
    }

Mise à jour: Voici un exemple de ce que j'essaie de faire https://stackoverflow.com/a/6753281/1445460

3
Kirill Fuchs

Je ne sais pas comment j'ai rencontré cette question un an plus tard, mais comme elle reste sans réponse ...

Au lieu de soumettre le formulaire automatiquement, puis de le rediriger vers Paypal, vous pouvez utiliser l'URL Paypal comme action de votre formulaire, mais utilisez Ajax pour enregistrer les données du formulaire avant que le formulaire ne soit envoyé à Paypal. Vous pouvez également utiliser la réponse Ajax pour préparer le formulaire avant la soumission, par exemple. remplir des champs cachés

Voici un exemple:

myform.php :

<form id="myform" method="post" action="<?php echo $Paypal_url; ?>">
   <input type="text" ...>
   <input type="hidden" name="my-hidden-field" id="my-hidden-field" value="this is hidden"> 
   ...other form fields...
</form>

saveform.php : Traite la demande Ajax et renvoie une réponse pouvant être utilisée pour manipuler le formulaire avant la soumission.

<?php 
  if (!empty($_POST)) {
     //save $_POST data to the database
     ...
     //also, fill some data as response
     $response = array('my_hidden_field' => 'this is now filled in');
     //next line returns the response
     echo json_encode($response);  
  }

myform.js : envoie les données du formulaire à saveform.php avant de le soumettre à Paypal

$j = jQuery.noConflict();

$j(document).ready(function() {
    $j('#myform').submit(submit_myform);
});

function submit_myform() {
    if (!myform_is_valid()) {
        window.location.href = "#myform"; 
        return false;//prevent normal browser submission, to display validation errors
    } else {
        $j.ajax({
           url: 'saveform.php',
           type: 'POST',
           data: $j(this).serialize(),
           dataType:'json', //data type of Ajax response expected from server
           success: myform_success //callback to handle Ajax response and submit to Paypal
        });
       return false;//prevent normal browser submission, since the form is submitted in the callback
   } 
}

function myform_is_valid() {
    $valid = true;
    //validate data; if there's a validation error, set $valid=false and display errors on page
    ...
    return $valid;
}

function myform_success(response) {
    //this is called whenever the ajax request returns a "200 Ok" http header
    //manipulate the form as you wish
    $j('#my-hidden-field').val(response.my_hidden_field);
    //submit the form (to the form's action attribute, i.e $Paypal_url)
    document.forms['myform'].submit(); 
}

Au lieu de l'appel jquery.ajax, vous pouvez également utiliser le plus court:

$j.post('saveform.php',$j('#myform').serialize(),myform_success,"json")
1
adelval
$j = jQuery.noConflict();

$j(document).ready(function() {
    $j('#myform').submit(submit_myform);
});

function submit_myform() {
    if (!myform_is_valid()) {
        window.location.href = "#myform"; 
        return false;//prevent normal browser submission, to display validation errors
    } else {
        $j.ajax({
           url: 'saveform.php',
           type: 'POST',
           data: $j(this).serialize(),
           dataType:'json', //data type of Ajax response expected from server
           success: myform_success //callback to handle Ajax response and submit to Paypal
        });
       return false;//prevent normal browser submission, since the form is submitted in the callback
   } 
}

function myform_is_valid() {
    $valid = true;
    //validate data; if there's a validation error, set $valid=false and display errors on page
    ...
    return $valid;
}

function myform_success(response) {
    //this is called whenever the ajax request returns a "200 Ok" http header
    //manipulate the form as you wish
    $j('#my-hidden-field').val(response.my_hidden_field);
    //submit the form (to the form's action attribute, i.e $Paypal_url)
    document.forms['myform'].submit();

enter image description here

0
anita

En effet, il existe une solution simple. Je suppose que vous traitez le formulaire et tentez de le rediriger dans votre modèle? Vous devez créer une action antérieure , avant que les en-têtes ne soient envoyés. Exemple:

function wpa66284_process_my_form(){
    if( isset( $_POST['myform'] ) ){
        // process form and redirect
    }
}
add_action( 'init', 'wpa66284_process_my_form' );
0
Milo