Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- define('IPN_CERTIFICATE_PATH', __DIR__ . '/cert/cacert.pem');
- class ipnlistener
- {
- public $use_curl = true;
- public $force_ssl_v3 = false;
- public $follow_location = false;
- public $use_ssl = false;
- public $use_sandbox = false;
- public $timeout = 30;
- private $post_data = [];
- private $post_uri = '';
- private $response_status = '';
- private $response = '';
- const PAYPAL_HOST = 'ipnpb.paypal.com';
- const SANDBOX_HOST = 'ipnpb.sandbox.paypal.com';
- protected function curlPost($encoded_data)
- {
- if ($this->use_ssl) {
- $uri = 'https://'.$this->getPaypalHost().'/cgi-bin/webscr';
- $this->post_uri = $uri;
- } else {
- $uri = 'https://'.$this->getPaypalHost().'/cgi-bin/webscr';
- $this->post_uri = $uri;
- }
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
- curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
- curl_setopt($ch, CURLOPT_CAINFO, IPN_CERTIFICATE_PATH);
- curl_setopt($ch, CURLOPT_URL, $uri);
- curl_setopt($ch, CURLOPT_POST, true);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $encoded_data);
- curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $this->follow_location);
- curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeout);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_HEADER, true);
- if ($this->force_ssl_v3) {
- curl_setopt($ch, CURLOPT_SSLVERSION, 3);
- }
- $this->response = curl_exec($ch);
- $this->response_status = strval(curl_getinfo($ch, CURLINFO_HTTP_CODE));
- if ($this->response === false || $this->response_status == '0') {
- $errno = curl_errno($ch);
- $errstr = curl_error($ch);
- throw new Exception("cURL error: [$errno] $errstr");
- }
- }
- protected function fsockPost($encoded_data)
- {
- if ($this->use_ssl) {
- $uri = 'ssl://'.$this->getPaypalHost();
- $port = '443';
- $this->post_uri = $uri.'/cgi-bin/webscr';
- } else {
- $uri = $this->getPaypalHost();
- $port = '80';
- $this->post_uri = 'https://'.$uri.'/cgi-bin/webscr';
- }
- $fp = fsockopen($uri, $port, $errno, $errstr, $this->timeout);
- if (!$fp) {
- throw new Exception("fsockopen error: [$errno] $errstr");
- }
- $header = "POST /cgi-bin/webscr HTTP/1.1\r\n";
- $header .= 'Host: '.$this->getPaypalHost()."\r\n";
- $header .= "Content-Type: application/x-www-form-urlencoded\r\n";
- $header .= 'Content-Length: '.strlen($encoded_data)."\r\n";
- $header .= "Connection: Close\r\n\r\n";
- fputs($fp, $header.$encoded_data."\r\n\r\n");
- while (!feof($fp)) {
- if (empty($this->response)) {
- $this->response .= $status = fgets($fp, 1024);
- $this->response_status = trim(substr($status, 9, 4));
- } else {
- $this->response .= fgets($fp, 1024);
- }
- }
- fclose($fp);
- }
- private function getPaypalHost()
- {
- if ($this->use_sandbox) {
- return self::SANDBOX_HOST;
- } else {
- return self::PAYPAL_HOST;
- }
- }
- public function getPostUri()
- {
- return $this->post_uri;
- }
- public function getResponse()
- {
- return $this->response;
- }
- public function getResponseStatus()
- {
- return $this->response_status;
- }
- public function getTextReport()
- {
- $r = '';
- for ($i = 0; $i < 80; ++$i) {
- $r .= '-';
- }
- $r .= "\n[".date('m/d/Y g:i A').'] - '.$this->getPostUri();
- if ($this->use_curl) {
- $r .= " (curl)\n";
- } else {
- $r .= " (fsockopen)\n";
- }
- for ($i = 0; $i < 80; ++$i) {
- $r .= '-';
- }
- $r .= "\n{$this->getResponse() }\n";
- for ($i = 0; $i < 80; ++$i) {
- $r .= '-';
- }
- $r .= "\n";
- foreach ($this->post_data as $key => $value) {
- $r .= str_pad($key, 25)."$value\n";
- }
- $r .= "\n\n";
- return $r;
- }
- public function processIpn($post_data = null)
- {
- $encoded_data = 'cmd=_notify-validate';
- if ($post_data === null) {
- if (!empty($_POST)) {
- $this->post_data = $_POST;
- $encoded_data .= '&'.file_get_contents('php://input');
- } else {
- throw new Exception('No POST data found.');
- }
- } else {
- $this->post_data = $post_data;
- foreach ($this->post_data as $key => $value) {
- $encoded_data .= "&$key=".urlencode($value);
- }
- }
- if ($this->use_curl) {
- $this->curlPost($encoded_data);
- } else {
- $this->fsockPost($encoded_data);
- }
- if (strpos($this->response_status, '200') === false) {
- throw new Exception('Invalid response status: '.$this->response_status);
- }
- if (strpos($this->response, 'VERIFIED') !== false) {
- return true;
- } elseif (strpos($this->response, 'INVALID') !== false) {
- return false;
- } else {
- throw new Exception('Unexpected response from PayPal.');
- }
- }
- public function requirePostMethod()
- {
- if ($_SERVER['REQUEST_METHOD'] && $_SERVER['REQUEST_METHOD'] != 'POST') {
- header('Allow: POST', true, 405);
- throw new Exception('Invalid HTTP request method.');
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement