05-03-2008, 11:59 PM
|
#4 (permalink)
|
|
The Acquainted
Join Date: Feb 2008
Posts: 119
Thanks: 17
|
Thanks.
I read a bit more about it.
I use a class made by Micah Carrick, I found it on phpclasses.org
And I'm using authors example script. The problem is that I don't receive a notification from paypal. I'm testing it with my sandbox account...
This is the test file:
PHP Code:
<?php
require_once('paypal.class.php'); // include the class file $p = new paypal_class; // initiate an instance of the class $p->paypal_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr'; // testing paypal url
$this_script = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
// if there is not action variable, set the default action of 'process' if (empty($_GET['action'])) $_GET['action'] = 'process';
switch ($_GET['action']) { case 'process': // Process and order...
$p->add_field('business', 'anton._1209229536_biz@gmail.com'); $p->add_field('return', $this_script.'?action=success'); $p->add_field('cancel_return', $this_script.'?action=cancel'); $p->add_field('notify_url', $this_script.'?action=ipn'); $p->add_field('item_name', 'Paypal Test Transaction'); $p->add_field('amount', '1.99');
$p->submit_paypal_post(); // submit the fields to paypal break; case 'success': // Order was successful... echo "<html><head><title>Success</title></head><body><h3>Thank you for your order.</h3>"; foreach ($_POST as $key => $value) { echo "$key: $value<br>"; } echo "</body></html>"; break; case 'ipn': // Paypal is calling page for IPN validation... if ($p->validate_ipn()) {
$fp = fopen("pp.txt","a"); fwrite($fp, "test"); fclose($fp); } break; }
And this is the class:
PHP Code:
<?php /******************************************************************************* * PHP Paypal IPN Integration Class ******************************************************************************* * Author: Micah Carrick * Email: email@micahcarrick.com * Website: http://www.micahcarrick.com * * File: paypal.class.php * Version: 1.00 * Copyright: (c) 2005 - Micah Carrick * You are free to use, distribute, and modify this software */ class paypal_class { var $last_error; // holds the last error encountered var $ipn_log; // bool: log IPN results to text file? var $ipn_log_file; // filename of the IPN log var $ipn_response; // holds the IPN response from paypal var $ipn_data = array(); // array contains the POST values for IPN var $fields = array(); // array holds the fields to submit to paypal
function paypal_class() { // initialization constructor. Called when class is created. $this->paypal_url = 'https://www.paypal.com/cgi-bin/webscr'; $this->last_error = ''; $this->ipn_log_file = 'ipn_log.txt'; $this->ipn_log = true; $this->ipn_response = ''; $this->add_field('rm','2'); // Return method = POST $this->add_field('cmd','_xclick'); } function add_field($field, $value) { $this->fields["$field"] = $value; }
function submit_paypal_post() { echo "<html>\n"; echo "<head><title>Processing Payment...</title></head>\n"; echo "<body onLoad=\"document.form.submit();\">\n"; echo "<center><h3>Please wait, your order is being processed...</h3></center>\n"; echo "<form method=\"post\" name=\"form\" action=\"".$this->paypal_url."\">\n";
foreach ($this->fields as $name => $value) { echo "<input type=\"hidden\" name=\"$name\" value=\"$value\">"; } echo "</form>\n"; echo "</body></html>\n"; } function validate_ipn() {
// parse the paypal URL $url_parsed=parse_url($this->paypal_url);
// generate the post string from the _POST vars aswell as load the // _POST vars into an arry so we can play with them from the calling // script. $post_string = ''; foreach ($_POST as $field=>$value) { $this->ipn_data["$field"] = $value; $post_string .= $field.'='.urlencode($value).'&'; } $post_string.="cmd=_notify-validate"; // append ipn command
// open the connection to paypal $fp = fsockopen($url_parsed[host],"80",$err_num,$err_str,30); if(!$fp) { // could not open the connection. If loggin is on, the error message // will be in the log. $this->last_error = "fsockopen error no. $errnum: $errstr"; $this->log_ipn_results(false); return false; } else { // Post the data back to paypal fputs($fp, "POST $url_parsed[path] HTTP/1.1\r\n"); fputs($fp, "Host: $url_parsed[host]\r\n"); fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n"); fputs($fp, "Content-length: ".strlen($post_string)."\r\n"); fputs($fp, "Connection: close\r\n\r\n"); fputs($fp, $post_string . "\r\n\r\n");
// loop through the response from the server and append to variable while(!feof($fp)) { $this->ipn_response .= fgets($fp, 1024); }
fclose($fp); // close connection
} if (eregi("VERIFIED",$this->ipn_response)) { // Valid IPN transaction. $this->log_ipn_results(true); return true; } else { // Invalid IPN transaction. Check the log for details. $this->last_error = 'IPN Validation Failed.'; $this->log_ipn_results(false); return false; } } function log_ipn_results($success) { if (!$this->ipn_log) return; // is logging turned off? // Timestamp $text = '['.date('m/d/Y g:i A').'] - '; // Success or failure being logged? if ($success) $text .= "SUCCESS!\n"; else $text .= 'FAIL: '.$this->last_error."\n"; // Log the POST variables $text .= "IPN POST Vars from Paypal:\n"; foreach ($this->ipn_data as $key=>$value) { $text .= "$key=$value, "; } // Log the response from the paypal server $text .= "\nIPN Response from Paypal Server:\n ".$this->ipn_response; // Write to log $fp=fopen($this->ipn_log_file,'a'); fwrite($fp, $text . "\n\n");
fclose($fp); // close file }
function dump_fields() { echo "<h3>paypal_class->dump_fields() Output:</h3>"; echo "<table width=\"95%\" border=\"1\" cellpadding=\"2\" cellspacing=\"0\"> <tr> <td bgcolor=\"black\"><b><font color=\"white\">Field Name</font></b></td> <td bgcolor=\"black\"><b><font color=\"white\">Value</font></b></td> </tr>"; ksort($this->fields); foreach ($this->fields as $key => $value) { echo "<tr><td>$key</td><td>".urldecode($value)." </td></tr>"; } echo "</table><br>"; } }
I removed the coments so the files are shorter.
|
|
|
|