Doctord_Fl Posted July 5, 2018 Share Posted July 5, 2018 I am trying to call an ASP.net page on a different domain and sending variable values by the below method Header('Location: http://domain.com/PayPalPayment.aspx?InvoiceID=' . $invoiceID . '&payment=' . $payment . '&ipn_track_ID=' . $ipn_track_ID . '&payment_status=' . $payment_status . '&transID=' . $transID); I have inserted the call in different areas of the php, as you will see :) The Logs are created, but the ASP page is not called Here is my php.......... <?php namespace Listener; // Set this to true to use the sandbox endpoint during testing: $enable_sandbox = true; // Use this to specify all of the email addresses that you have attached to paypal: $my_email_addresses = array("jm@domain.com", "peteh@domain.com", "peteh-facilitator@domain.com"); // Set this to true to send a confirmation email: $send_confirmation_email = true; $confirmation_email_address = "My Name <office@domain.com>"; $from_email_address = "My Name <peteh@domain.com>"; // Set this to true to save a log file: $save_log_file = true; $log_file_dir = __DIR__ . "/logs"; // Here is some information on how to configure sendmail: // http://php.net/manual/en/function.mail.php#118210 require('PaypalIPN.php'); use PaypalIPN; $ipn = new PaypalIPN(); if ($enable_sandbox) { $ipn->useSandbox(); } $verified = $ipn->verifyIPN(); $data_text = ""; foreach ($_POST as $key => $value) { $data_text .= $key . " = " . $value . "\r\n"; } $test_text = ""; if ($_POST["test_ipn"] == 1) { $test_text = "Test "; } // Check the receiver email to see if it matches your list of paypal email addresses $receiver_email_found = false; foreach ($my_email_addresses as $a) { if (strtolower($_POST["receiver_email"]) == strtolower($a)) { $receiver_email_found = true; break; } } date_default_timezone_set("America/Los_Angeles"); list($year, $month, $day, $hour, $minute, $second, $timezone) = explode(":", date("Y:m:d:H:i:s:T")); $date = $year . "-" . $month . "-" . $day; $timestamp = $date . " " . $hour . ":" . $minute . ":" . $second . " " . $timezone; $dated_log_file_dir = $log_file_dir . "/" . $year . "/" . $month; $paypal_ipn_status = "VERIFICATION FAILED"; if ($verified) { $paypal_ipn_status = "RECEIVER EMAIL MISMATCH"; if ($receiver_email_found) { $paypal_ipn_status = "Completed Successfully"; // Process IPN // A list of variables are available here: // https://developer.paypal.com/webapps/developer/docs/classic/ipn/integration-guide/IPNandPDTVariables/ // This is an example for sending an automated email to the customer when they purchases an item for a specific amount: if ($_POST["payment_status"] == "Completed") { $invoiceID = $_POST["invoice"]; $payment = $_POST["mc_gross"]; $ipn_track_ID = $_POST["ipn_track_id"]; $payment_status = $_POST["payment_status"]; $transID = $_POST["txn_id"]; Header('Location: http://twa.domain.com/PayPalPayment.aspx?InvoiceID=' . $invoiceID . '&payment=' . $payment . '&ipn_track_ID=' . $ipn_track_ID . '&payment_status=' . $payment_status . '&transID=' . $transID); // Send EMAIL // $email_to = $_POST["first_name"] . " " . $_POST["last_name"] . " <" . $_POST["payer_email"] . ">"; // $email_subject = $test_text . "Completed order for: " . $_POST["item_name"]; // $email_body = "Thank you for purchasing " . $_POST["item_name"] . "." . "\r\n" . "\r\n" . "This is an example email only." . "\r\n" . "\r\n" . "Thank you."; // mail($email_to, $email_subject, $email_body, "From: " . $from_email_address); } } } elseif ($enable_sandbox) { if ($_POST["test_ipn"] != 1) { $paypal_ipn_status = "RECEIVED FROM LIVE WHILE SANDBOXED"; Header('Location: http://domain.com/PayPalPayment.aspx?InvoiceID=' . $invoiceID . '&payment=' . $payment . '&ipn_track_ID=' . $ipn_track_ID . '&payment_status=' . $payment_status . '&transID=' . $transID); } } elseif ($_POST["test_ipn"] == 1) { $paypal_ipn_status = "RECEIVED FROM SANDBOX WHILE LIVE"; } if ($save_log_file) { // Create log file directory if (!is_dir($dated_log_file_dir)) { if (!file_exists($dated_log_file_dir)) { mkdir($dated_log_file_dir, 0777, true); if (!is_dir($dated_log_file_dir)) { $save_log_file = false; } } else { $save_log_file = false; } } // Restrict web access to files in the log file directory $htaccess_body = "RewriteEngine On" . "\r\n" . "RewriteRule .* - [L,R=404]"; if ($save_log_file && (!is_file($log_file_dir . "/.htaccess") || file_get_contents($log_file_dir . "/.htaccess") !== $htaccess_body)) { if (!is_dir($log_file_dir . "/.htaccess")) { file_put_contents($log_file_dir . "/.htaccess", $htaccess_body); if (!is_file($log_file_dir . "/.htaccess") || file_get_contents($log_file_dir . "/.htaccess") !== $htaccess_body) { $save_log_file = false; } } else { $save_log_file = false; } } if ($save_log_file) { // Save data to text file file_put_contents($dated_log_file_dir . "/" . $test_text . "paypal_ipn_" . $date . ".txt", "paypal_ipn_status = " . $paypal_ipn_status . "\r\n" . "paypal_ipn_date = " . $timestamp . "\r\n" . $data_text . "\r\n", FILE_APPEND); Header('Location: http://domain.com/PayPalPayment.aspx?InvoiceID=' . $invoiceID . '&payment=' . $payment . '&ipn_track_ID=' . $ipn_track_ID . '&payment_status=' . $payment_status . '&transID=' . $transID); } } if ($send_confirmation_email) { // Send confirmation email Header('Location: http://domain.com/PayPalPayment.aspx?InvoiceID=' . $invoiceID . '&payment=' . $payment . '&ipn_track_ID=' . $ipn_track_ID . '&payment_status=' . $payment_status . '&transID=' . $transID); mail($confirmation_email_address, $test_text . "PayPal IPN : " . $paypal_ipn_status, "paypal_ipn_status = " . $paypal_ipn_status . "\r\n" . "paypal_ipn_date = " . $timestamp . "\r\n" . $data_text, "From: " . $from_email_address); } // Reply with an empty 200 response to indicate to paypal the IPN was received correctly header("HTTP/1.1 200 OK", False); Here is a Log file..... paypal_ipn_status = RECEIVED FROM LIVE WHILE SANDBOXED paypal_ipn_date = 2018-07-01 16:53:33 PDT mc_gross = 1086.41 invoice = INV-32223 protection_eligibility = Eligible address_status = confirmed payer_id = Private address_street = Private payment_date = 16:53:27 Jul 01, 2018 PDT payment_status = Completed charset = windows-1252 address_zip = Private first_name = Private mc_fee = 31.81 address_country_code = US address_name = Private notify_version = 3.9 custom = payer_status = unverified business = peteh@domain.com address_country = United States address_city = Private quantity = 1 verify_sign = Private payer_email = Private txn_id = Private payment_type = instant last_name = Private address_state = MI receiver_email = peteh@domain.com payment_fee = 31.81 shipping_discount = 0.00 insurance_amount = 0.00 receiver_id = Private txn_type = web_accept item_name = Private Payment discount = 0.00 mc_currency = USD item_number = residence_country = US receipt_id = Private shipping_method = Default transaction_subject = payment_gross = 1086.41 ipn_track_id = Private Quote Link to comment Share on other sites More sharing options...
Doctord_Fl Posted July 5, 2018 Author Share Posted July 5, 2018 Required PaypalIPN file..... <?php class PaypalIPN { /** * @var bool $use_sandbox Indicates if the sandbox endpoint is used. */ private $use_sandbox = false; /** * @var bool $use_local_certs Indicates if the local certificates are used. */ private $use_local_certs = true; /** Production Postback URL */ const VERIFY_URI = 'https://ipnpb.paypal.com/cgi-bin/webscr'; /** Sandbox Postback URL */ const SANDBOX_VERIFY_URI = 'https://ipnpb.sandbox.paypal.com/cgi-bin/webscr'; /** Response from PayPal indicating validation was successful */ const VALID = 'VERIFIED'; /** Response from PayPal indicating validation failed */ const INVALID = 'INVALID'; /** * Sets the IPN verification to sandbox mode (for use when testing, * should not be enabled in production). * @return void */ public function useSandbox() { $this->use_sandbox = true; } /** * Sets curl to use php curl's built in certs (may be required in some * environments). * @return void */ public function usePHPCerts() { $this->use_local_certs = false; } /** * Determine endpoint to post the verification data to. * @return string */ public function getPaypalUri() { if ($this->use_sandbox) { return self::SANDBOX_VERIFY_URI; } else { return self::VERIFY_URI; } } /** * Verification Function * Sends the incoming post data back to PayPal using the cURL library. * * @return bool * @throws Exception */ public function verifyIPN() { if ( ! count($_POST)) { throw new Exception("Missing POST Data"); } $raw_post_data = file_get_contents('php://input'); $raw_post_array = explode('&', $raw_post_data); $myPost = array(); foreach ($raw_post_array as $keyval) { $keyval = explode('=', $keyval); if (count($keyval) == 2) { // Since we do not want the plus in the datetime string to be encoded to a space, we manually encode it. if ($keyval[0] === 'payment_date') { if (substr_count($keyval[1], '+') === 1) { $keyval[1] = str_replace('+', '%2B', $keyval[1]); } } $myPost[$keyval[0]] = urldecode($keyval[1]); } } // Build the body of the verification post request, adding the _notify-validate command. $req = 'cmd=_notify-validate'; $get_magic_quotes_exists = false; if (function_exists('get_magic_quotes_gpc')) { $get_magic_quotes_exists = true; } foreach ($myPost as $key => $value) { if ($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) { $value = urlencode(stripslashes($value)); } else { $value = urlencode($value); } $req .= "&$key=$value"; } // Post the data back to PayPal, using curl. Throw exceptions if errors occur. $ch = curl_init($this->getPaypalUri()); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $req); curl_setopt($ch, CURLOPT_SSLVERSION, 6); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // This is often required if the server is missing a global cert bundle, or is using an outdated one. if ($this->use_local_certs) { curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . "/cert/cacert.pem"); } curl_setopt($ch, CURLOPT_FORBID_REUSE, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close')); $res = curl_exec($ch); if ( ! ($res)) { $errno = curl_errno($ch); $errstr = curl_error($ch); curl_close($ch); throw new Exception("cURL error: [$errno] $errstr"); } $info = curl_getinfo($ch); $http_code = $info['http_code']; if ($http_code != 200) { throw new Exception("PayPal responded with http code $http_code"); } curl_close($ch); // Check if PayPal verifies the IPN data, and if so, return true. if ($res == self::VALID) { return true; } else { return false; } } } Quote Link to comment Share on other sites More sharing options...
ginerjm Posted July 5, 2018 Share Posted July 5, 2018 Awful lot of code you expect us to review here..... How do you KNOW that your call didn't happen? Is it that the statement is never executed or is it that you aren't getting a response of some kind? Quote Link to comment Share on other sites More sharing options...
Doctord_Fl Posted July 5, 2018 Author Share Posted July 5, 2018 The code PHP code works. I am asking for help on the placement of the line to call the asp.net page I have read that a "Header('Location: " call can only be used in the beginning of the PHP If there is a better way to make the call without "Header('Location:" then I'm open to ideas Quote Link to comment Share on other sites More sharing options...
Barand Posted July 5, 2018 Share Posted July 5, 2018 It doesn't have to be at the beginning of the php code, it just has to be before any output is sent to the browser. 1 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.