PayPal IPP Миха Михайловский класс - PullRequest
1 голос
/ 14 декабря 2011

я знаю, что есть много вопросов по этому вопросу, я играю с 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-запроса» в журнале ошибок.

Кто-нибудь может помочь мне определить проблему или я делаю это неправильно? Спасибо, хорошего дня.

Ответы [ 3 ]

2 голосов
/ 14 декабря 2011

попробуйте этот ipn listner

 <?php
   //Build the data to post back to Paypal
    $postback = 'cmd=_notify-validate'; 

     // go through each of the posted vars and add them to the postback variable
     foreach ($_POST as $key => $value) {
          $value = urlencode(stripslashes($value));
          $postback .= "&$key=$value";
      }


     // Send to paypal or the sandbox depending on whether you're live or developing
     //$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);//open the connection
       $fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30);

if (!$fp) 
{
    // HTTP ERROR Failed to connect
    //error handling or email here
}
else // if we've connected OK
{
    fputs ($fp, $header . $postback);//post the data back
    while (!feof($fp)) 
    {
        $response = fgets ($fp, 1024);

        if (strcmp ($response, "VERIFIED") == 0) //It's verified
        {
           //if verified do something 
        }
        else if (strcmp ($response, "INVALID") == 0) 
        { 
            //the Paypal response is INVALID, not VERIFIED
            // This implies something is wrong 
        }
    } //end of while
    fclose ($fp);
}
?>
0 голосов
/ 19 октября 2012

Я думаю, это потому, что и URL-адрес уведомления, и URL-адрес возврата не указывают на реальный веб-сайт. Хотя я пришел сюда, поскольку обнаружил ту же проблему (я тестирую в среде песочницы с адресом локального компьютера, поэтому мне нужно найти способ исправить это)

http://mysite.com/ <- у меня здесь 192 IP-адреса: (</p>

0 голосов
/ 14 декабря 2011

Вот PHP-PayPal-IPN ! это, безусловно, поможет вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...