см. Ниже несколько комментариев, которые, я считаю, помогут вам решить эту проблему:
1 - notify_url должен быть URL-адресом, к которому можно получить доступ из PayPal.Это должно быть что-то вроде http://www.example.com/path/to/your/script. Это URL, по которому PayPal будет публиковать результаты своей транзакции.
2 - вам потребуется способ идентифицировать транзакцию, когда она возвращается из PayPal.Я делаю это путем включения поля
<input type="hidden" name="invoice" value=$uniquevaluecreatedbyyourapplication>
. Paypal отправит это поле обратно в ответе.
В моем случае я добавляю транзакцию в таблицу MySQL и передаюуникальный идентификатор записи в качестве номера счета.Когда PayPal отправляет ответ, я проверяю номер счета в моей базе данных, чтобы идентифицировать транзакцию.
Надеюсь, это поможет.Если нет, пожалуйста, напишите снова.
Обновление, чтобы включить более подробную информацию о сообщении IPN
В основном, когда транзакция завершится, PayPal отправит сообщение наскрипт, который вы передали в поле notify_url.
Paypal добавит токен (tx) к этому сообщению.Ваш сценарий будет вызываться примерно так:
http://www.example.com/path/to/your/listener?tx=1234567890099r48&... (PayPal adds also other transaction fields here).
Однако вы не должны полагаться на поля транзакций, которые PayPal добавляет к первому сообщению, поскольку вы на самом деле не знаете, что оно пришло от PayPal.
Таким образом, чтобы подтвердить, что сообщение пришло от PayPal, вам необходимо отправить обратно сообщение в PayPal, включая отправленное вам tx_token PayPal;только знакомый вам auth_token (вы получаете его из своего аккаунта продавца PayPal);и переменная cmd, которая сообщает PayPal, что вы проверяете транзакцию.
Как только PayPal получит это сообщение от вашего скрипта слушателя, он ответит сообщением, подтверждающим, что транзакция была завершена, и всеми деталями.Вы можете положиться на это второе сообщение, поскольку оно пришло в результате вашего запроса к Paypal с использованием вашего уникального auth_token.
PayPal отправит вам несколько полей с информацией о транзакции, включая одно, подтверждающее, был ли платеж успешным илинаходится в состоянии ожидания.В зависимости от метода, используемого клиентом для оплаты, платеж может оставаться в состоянии ожидания некоторое время, пока не будет очищен.PayPal отправит вам другое сообщение автоматически после подтверждения оплаты.Таким образом, вы должны настроить ваш слушатель для обработки этого второго сообщения также.PayPal рекомендует не отправлять продукт до тех пор, пока платеж не будет очищен.
И для начала ознакомьтесь с кодом, который я использую для сценария прослушивателя, который обрабатывает ответ PayPal.Вам нужно будет настроить его под свои нужды, но он работает для меня.
$req = 'cmd=_notify-synch';
$tx_token = $_GET['tx'];
$auth_token = "enter your own authorization token";
$req .= "&tx=$tx_token&at=$auth_token";
// post back to PayPal system to validate
$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
//$fp = fsockopen ('http://www.sandbox.paypal.com', 80, $errno, $errstr, 30);
// If possible, securely post back to paypal using HTTPS
// Your PHP server will need to be SSL enabled
// replace www.sandbox.paypal.com with www.paypal.com when you go live
$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
if (!$fp)
{
// HTTP ERROR
}
else
{
fputs ($fp, $header . $req);
// read the body data
$res = '';
$headerdone = false;
while (!feof($fp))
{
$line = fgets ($fp, 1024);
if (strcmp($line, "\r\n") == 0)
{
// read the header
$headerdone = true;
}
else if ($headerdone)
{
// header has been read. now read the contents
$res .= $line;
}
}
// parse the data
$lines = explode("\n", $res);
$keyarray = array();
if (strcmp ($lines[0], "SUCCESS") == 0)
{
for ($i=1; $i<count($lines);$i++)
{
list($key,$val) = explode("=", $lines[$i]);
$keyarray[urldecode($key)] = urldecode($val);
}
$firstname = $keyarray['first_name'];
$lastname = $keyarray['last_name'];
$itemname = $keyarray['item_name'];
$amount = $keyarray['payment_gross'];
$invoiceid = $keyarray['invoice'];
$profileid = $keyarray['subscr_id'];
// check the payment_status is Completed
// check that txn_id has not been previously processed
// check that receiver_email is your Primary PayPal email
// check that payment_amount/payment_currency are correct
// process payment
// show receipt to client
}
}
Надеюсь, это поможет.