即使在页面被卸载或重定向到另一个页面后,如何继续AJAX / JQuery?

问题描述:

I have a script that sends data to and gets a response from a web service. The response is a link/url that will be used to check the registration status. I use file_get_contents to get the status from the provided url. After getting the status, the user is then redirected into a page. The registration process will take up to 10 seconds to complete so I need to check the registration status again using the provided url/link.

PHP does not allow to header location redirects so what I did was I used jQuery and AJAX to check for the registration status. It works when the page is not yet redirected. But in this case, it won't work since the page redirects first to another URL before checking the registration status after 10 seconds.

I hope this isn't confusing.

Here's the code I use:

<?php
    function sendRequest($url, $params)
    {
        $request = curl_init($url); // initiate curl object
        curl_setopt($request, CURLOPT_HEADER, 0); // set to 0 to eliminate header info from response
        curl_setopt($request, CURLOPT_RETURNTRANSFER, 1); // Returns response data instead of TRUE(1)
        curl_setopt($request, CURLOPT_POSTFIELDS, $params); // use HTTP POST to send form data
        curl_setopt($request, CURLOPT_SSL_VERIFYPEER, FALSE); // uncomment this line if you get no gateway response.
        $response = curl_exec($request); // execute curl post and store results in $post_response
        curl_close ($request); // close curl object
        return $response;
    }

    function sendJSONRequest($url, $data)
    {             
        $data_string = json_encode($data);
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);               
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);             
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);     
        curl_setopt($ch, CURLOPT_TIMEOUT ,50);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(                       
            'Content-Type: application/json',
            'Accept: application/json',
            'X-MP-Version: 10072013')                      
        );
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        ob_start();
        $result = curl_exec($ch);
        $info = curl_getinfo($ch);
        if ($result === false || $info['http_code'] == 400) {
          return "0";
        } else {
          return $result;
        }
        ob_end_clean();
        curl_close($ch);
    }

    function WriteLog($offer,$values)
    {
        $Filename = "./reports/".$offer.date('Ym').".txt";
        $fh = fopen($Filename, 'a') or die("can't open file");
        $filecontent = date('Y-m-d G:i').',';
        $filecontent .= $values;
        $filecontent .= PHP_EOL;
        fwrite($fh,$filecontent);
        fclose($fh);
    }

    // Get Variables sent from websites
    $uname = $_GET['un'];
    $usname = $_GET['ul'];
    $uphone = $_GET['up'];
    $uemail = $_GET['ue'];
    $testlive = $_GET['test'];
    $aff_id = $_GET['aff'];
    $unique_id = $_GET['uid'];
    $password = md5($_GET['pass']);
    $mnumber = $_GET['meter'];
    $bank = $_GET['bank'];
    $camp = $_GET['camp'];
    // Convert URL and Name split
    $rurl = 'http://'.$_GET['rurl'];

    // Determine if ReturnURL contains variables
    $pos = strpos($rurl,'?');
    if($pos === false) {
        $urlconnector = '?';
    } else {
        $urlconnector = '&';
    }

    // Split Name if no surname entered
    if (strlen($usname) > 0) {
        $firstname = $uname;
        $lastname = $usname; // I have a first and lastname
    } else {
        list($firstname, $lastname) = explode(" ",$uname,2); // I only entered my firstname
    }
    // Determine phone number format
    $phoneformat = strpos($uphone,'-');
    if($phoneformat === false) {
     // string - NOT found in haystack
     $phonesubmit = $uphone; 
    } else {
        $phone1 = substr($uphone,0,3);
        $phone2 = substr($uphone,4,3);
        $phone3 = substr($uphone,8,4);
        $phonesubmit = $phone1.$phone2.$phone3;
    }
    // Determine Live or Test
    $testlive = strtolower($testlive);
    switch ($testlive) {
        case "test":
            $debug=true; //Set this to 'false' to redirect users
            $mpurl = 'http://stageapi.myprepaid.co.za/api/ConsumerRegisterRequest'; // Set to TEST environment
            break;
        case "live":
            $mpurl = 'https://api.myprepaid.co.za/api/ConsumerRegisterRequest'; // Set to LIVE environment
            break;
    }

    // Set Variables
    $data = array("Email" => "$uemail", "Mobile" => "$phonesubmit", "Password" => "$password", "MeterNumber" => "$mnumber", "Bank" => "$bank", "CampaignID" => "$camp");

    $response = sendJSONRequest($mpurl, $data);
    ?>
    <!-- Hidden Fields for AJAX -->
    <input type='hidden' id='resp' value='<?php echo $response;?>' />
    <input type='hidden' id='rurl' value='<?php echo $rurl;?>' />
    <input type='hidden' id='urlconnector' value='<?php echo $urlconnector;?>' />
    <input type='hidden' id='firstname' value='<?php echo $firstname;?>' />
    <input type='hidden' id='lastname' value='<?php echo $lastname;?>' />
    <input type='hidden' id='phonesubmit' value='<?php echo $phonesubmit;?>' />
    <input type='hidden' id='uemail' value='<?php echo $uemail;?>' />
    <?php

    if($debug) echo "Response: ".$response."<br />";

    // If Customer Exists
    if ($response == "0"){
        header ("location: https://www.myprepaid.co.za?affid=1040");
    } else {

        $res = json_decode(file_get_contents($response), true);

        if($debug) echo "<pre>";
        if($debug) "
" .print_r($res). "
";
        $now = time();

        //Read values from response
        $rid = $res["ID"];
        $stat = $res["Status"];

        // Post to Trax

        $traxurl = "http://trax1.internetmarketingupstart.com/SP3o?"; //Trax URL
        $trax_post_string = 'aff_id='.$aff_id.'&aff_sub='.$unique_id;
        $trax_post_string .= '&aff_sub2='.urlencode($uname).'+'.urlencode($usname);
        $trax_post_string .= '&aff_sub3='.urlencode($uphone);
        $trax_post_string .= '&aff_sub4='.urlencode($uemail);
        $trax_post_string .= '&aff_sub5=';
        $trax = sendRequest($traxurl, $trax_post_string);

        if($debug) echo("
Trax Result: {$trax} 
");

        // Redirect to Confirmation page provided
        $URL=$rurl.$urlconnector.'un='.urlencode($firstname).'&ul='.urlencode($lastname).'&up='.urlencode($phonesubmit).'&ue='.urlencode($uemail).'&status='.urlencode($stat);
        if($debug) echo("Redirect to Confirmation URL:
{$URL}");
        if(!$debug) header("Location: {$URL}");


        if ($stat != "Successful"){

        //Recheck the registration status after 50 seconds using AJAX.

        echo "
        <script src='//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js'></script>
        <script>
            alert('Registration may take about 50 seconds to complete. Please wait. You will be redirected when registration is complete.');
            setTimeout(function() {
                var value = $('#resp').val();
                var rurlval = $('#rurl').val();
                var urlconnectorval = $('#urlconnector').val();
                var firstnameval = $('#firstname').val();
                var lastnameval = $('#lastname').val();
                var phonesubmitval = $('#phonesubmit').val();
                var uemailval = $('#uemail').val();
                var rurl = rurlval+urlconnectorval+'un='+firstnameval+'&ul='+lastnameval+'&up='+phonesubmitval+'&ue='+uemailval+'&status=';
                $.ajax({
                    type: 'post',
                    url: 'get_resp.php',
                    data: {
                        resp:value,
                        rurl:rurlval,
                        urlconnector:urlconnectorval,
                        firstname:firstnameval,
                        lastname:lastnameval,
                        phonesubmit:phonesubmitval,
                        uemail:uemailval                    
                    },
                    success:function(data){

                        $('.response').html(data);
                        if (data == 'Successful'){
                            window.location.href = rurl+'Successful';
                        }
                    }
                });
            }, 10000);
        </script>";
    ?>
        <div class="response"></div>
    <?php
    }

    if(isset($_COOKIE['stat'])){
        $lateststat = $_COOKIE['stat'];
    } else {
        $lateststat = $stat;
    }

        unset($_COOKIE['stat']); 

    // Log Leads
        $logdetail = $aff_id.','.$unique_id.','.$testlive.','.$firstname.','.$lastname.','.$phonesubmit.','.$uemail.','.$rid.','.$lateststat.','.$trax;
        WriteLog("mypepaid",$logdetail);
    }

    ?>

If you have suggestions on how I could accomplish this, I would be very grateful. Thanks.

You can't continue to access the results of an ajax call after the window in which it was started has been redirected to another URL. That whole context has been cleaned up by the browser and is no longer available.

You would need to stop doing the redirection until you are done with the ajax call. Some possibilities:

  1. Change from redirection to loading content via ajax so you can keep the original document open during the whole process so the ajax call will continue and you can access its results, but you're also showing the new content.

  2. Don't do the redirect until after the ajax call completes (in its completion handler).

  3. Open a new window for the redirect and when the ajax call completes, close that window. If these windows are in the same domain, you can access data between them. Personally, I'd avoid the extra window if possible.

Make the redirect be a part of the success callback for the jQuery AJAX call.

If you redirect during the AJAX call, then it is essentially lost, because there is no longer any registered callbacks to handle the returned data. You cannot wire up a callback on the new page either.