я знаю, что есть много вопросов по этому вопросу, я играю с PayPal IPN в течение почти 3 часов, но безуспешно. Это длинный вопрос, я действительно ценю, если кто-то может прочитать его.
Я пытаюсь создать простой онлайн-сервис, при котором пользователь заходит на мой сайт, нажимает кнопку оплаты PayPal и будет доставлен в PayPal, чтобы он мог произвести оплату. После оплаты они будут возвращены на страницу, которая проверяет, заплатили они или нет. Если он оплачен, он отображает страницу регистрации, которая находится там же (файл php), если нет, пользователь будет перенаправлен обратно на домашнюю страницу.
Я следовал этому уроку здесь:
http://www.micahcarrick.com/paypal-ipn-with-php.html
Я помещаю все в один каталог (ipnlistener.php, ipn.php, ipn-errors.log) и index.html, в котором хранится кнопка BUY NOW код:
<html>
<title>Test IPN</title>
<form name="_xclick" action="https://www.sandbox.paypal.com/cgi-bin/webscr"
method="post">
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="business" value="testmailsandbox@domain.com">
<input type="hidden" name="currency_code" value="USD">
<input type="hidden" name="item_name" value="Item">
<input type="hidden" name="amount" value="50">
<input type="hidden" name="return" value="http://mysite.com/ipn/">
<input type="hidden" name="notify_url" value="http://mysite.com/ipn/ipn.php">
<input type="image" src="http://www.paypal.com/en_US/i/btn/btn_buynow_LG.gif"
border="0" name="submit" alt="Make payments with PayPal - it's fast, free and secure!">
</form>
</html>
Я не трогал файл ipnlistener.php
, так как это класс, используемый ipn.php
Мой файл ipn.php:
/**
* @package PHP-PayPal-IPN
* @author Micah Carrick
* @copyright (c) 2011 - Micah Carrick
* @license http://opensource.org/licenses/gpl-3.0.html
*/
ini_set('log_errors', true);
ini_set('error_log','ipn_errors.log');
// instantiate the IpnListener class
include('ipnlistener.php');
$listener = new IpnListener();
/*
When you are testing your IPN script you should be using a PayPal "Sandbox"
account: https://developer.paypal.com
When you are ready to go live change use_sandbox to false.
*/
$listener->use_sandbox = true;
try {
$listener->requirePostMethod();
$verified = $listener->processIpn();
} catch (Exception $e) {
error_log($e->getMessage());
exit(0);
}
/*
The processIpn() method returned true if the IPN was "VERIFIED" and false if it
was "INVALID".
*/
if ($verified) {
// 1. Make sure the payment status is "Completed"
if ($_POST['payment_status'] != 'Completed') {
// simply ignore any IPN that is not completed
exit(0);
}
// 2. Make sure seller email matches your primary account email.
if ($_POST['receiver_email'] != 'testmailsandbox@domain.com') {
$errmsg .= "'receiver_email' does not match: ";
$errmsg .= $_POST['receiver_email']."\n";
}
// 3. Make sure the amount(s) paid match
if ($_POST['mc_gross'] != '50') {
$errmsg .= "'mc_gross' does not match: ";
$errmsg .= $_POST['mc_gross']."\n";
}
// 4. Make sure the currency code matches
if ($_POST['mc_currency'] != 'USD') {
$errmsg .= "'mc_currency' does not match: ";
$errmsg .= $_POST['mc_currency']."\n";
}
// TODO: Check for duplicate txn_id
if (!empty($errmsg)) {
// manually investigate errors from the fraud checking
$body = "IPN failed fraud checks: \n$errmsg\n\n";
$body .= $listener->getTextReport();
mail('myemail@domain.com', 'IPN Fraud Warning', $body);
} else {
//verified
include 'connect.php';
$sql = "INSERT INTO order VALUES
('$txn_id', '$payer_email', '$mc_gross')";
if (!mysql_query($sql)) {
error_log(mysql_error());
exit(0);
}
}
} else {
/*
An Invalid IPN *may* be caused by a fraudulent transaction attempt. It's
a good idea to have a developer or sys admin manually investigate any
invalid IPN.
*/
mail('myemail@domain.com', 'Invalid IPN', $listener->getTextReport());
}
?>
Я настроил свой IPN продавца для прослушивания файла 'ipn.php'.
Как вы можете видеть, подтвержден ли платеж, я делаю запрос к базе данных, чтобы вставить новую строку в таблицу ORDER.
Я захожу на index.html и нажимаю кнопку «Купить сейчас», оплачиваемую по моему идентификатору покупателя.
Тем не менее,
Я получаю сообщение об ошибке «Недопустимый метод HTTP-запроса» в журнале ошибок.
Кто-нибудь может помочь мне определить проблему или я делаю это неправильно?
Спасибо, хорошего дня.