Проверка транзакции Paypal с помощью информации POST - PullRequest
0 голосов
/ 02 февраля 2012

Я в полной растерянности. Я думаю, что я могу быть «неправильно информирован», но я постараюсь объяснить свою ситуацию как можно лучше.

Идея

  • У нас есть форма для пользователей для покупки кредитов. Введите номер кредита, нажмите кнопку pp.
  • При нажатии кнопки создается сообщение, чтобы установить Сведения журнала транзакций и установите его как ожидающий (работает нормально).
  • После возврата по почте он продолжает отправлять форму PayPal (работает также).
  • Пользователь перенаправляется на страницу PayPal и совершает платеж (пока все хорошо).
  • после оплаты они нажимают кнопку возврата и направляются на страницу «Успех» (все еще работает).
  • при достижении этой страницы я беру данные постов из pp (э-э, вот где это становится липким)
  • убедитесь, что данные являются "истинными" данными PP и обновите журнал транзакций (КАК!?)

Что мне говорят и что я пробовал

Первоначально я собирался использовать IPN для отправки сообщения в PayPal для проверки полученных данных (убедитесь, что они не были подделаны), однако мне говорят, что это связано с затратами и необходимостью настройки сервера ipn. "мы не можем использовать IPN ....

Хорошо, так что я собирался использовать PDT, за исключением того, что я пропустил важный шаг в моей попытке или он НЕ работает правильно, потому что я что-то не так делаю правильно. Здесь я заблудился, я пробовал дюжину разных вещей, в том числе прямую ссылку, использование искр (для CI), чтобы установить данные и ссылку на PayPal, и т.д. ...

Я просмотрел все вопросы о PayPal здесь и с полдюжины других форумов и, похоже, ничего не получилось.

Может ли кто-нибудь «ясно» сказать мне, как я могу проверить данные POST успешной транзакции PayPal, и, возможно, даже сказать мне, если меня дезинформируют о IPN, потому что я просмотрел документы и не могу найти, что Мне сказали, и я не могу найти свое решение.

Я чувствую себя глупо, пожалуйста, помогите.

Ответы [ 2 ]

2 голосов
/ 02 февраля 2012

Когда ваш пользователь нажимает кнопку PayPal и переходит к PayPal, после завершения транзакции выполняется отправка IPN POST по URL-адресу по вашему выбору.Таким образом, вам не нужно иметь другой веб-сервер.

Когда приходит запрос IPN, PayPal требует, чтобы вы повторно отправили ему весь POST, который они сделали вам, включая все поля, вточный порядок, в котором они вернут слово «ПРОВЕРЕНО» или «НЕДОПУСТИМО».Если проверено, то сделайте все, что вам нужно, чтобы переключить журнал txn с ожидающего на подтвержденный.Кроме того, любая информация, которую вы включаете в свою кнопку (ваша кнопка на самом деле form, поэтому вы можете включить свои собственные поля), включается в POST.Полезно для хранения «идентификатора транзакции» или некоторого другого идентификатора для сопоставления с вашей транзакцией.

Если IPN завершится неудачно, он будет отправлен с шагом n + 4 минуты (где n - это время ожидания в последний раз -4 минуты, следующие через 8 минут, следующие через 12 минут и т. Д.) В течение нескольких дней.

0 голосов
/ 03 февраля 2012

Наконец-то сделал все правильно, благодаря обновлению информации в IPN.Мое решение добавило следующую строку в мою форму:

<input type="hidden" name="notify_url" value="<?= site_url('payment/notifyTest'); ?>">

Затем в функции notifyTest я запустил это:

    $pDat = $this->input->post(NULL, TRUE);
    $isSandBox = array_key_exists('test_ipn', $pDat) && 1 === (int)$pDat['test_ipn'] ? TRUE : FALSE;
    $verifyURL = $isSandBox ? 'https://www.sandbox.paypal.com/cgi-bin/webscr' : 'https://www.paypal.com/cgi-bin/webscr';
    $token = random_string('unique');

    $request = curl_init();
    curl_setopt_array($request, array
    (
        CURLOPT_URL => $verifyURL,
        CURLOPT_POST => 0,
        CURLOPT_POSTFIELDS => http_build_query(array('cmd' => '_notify-validate') + $pDat),
        CURLOPT_RETURNTRANSFER => 0,
        CURLOPT_HEADER => 0,
        CURLOPT_SSL_VERIFYHOST => 0,
        CURLOPT_SSL_VERIFYPEER => 0,
        CURLOPT_CAINFO => 'cacert.pem',
    ));

    $response = curl_exec($request);
    $status   = curl_getinfo($request, CURLINFO_HTTP_CODE);

    curl_close($request);

    if($status == 200 && $response == 'VERIFIED') {
        //  SUCCESS
        $data = array (
            ... => ...
        );
        $this->db->insert('transactions', $data);
    }
    else {
        //  FAILED
        $data = array (
            ... => ...
        );
        $this->db->insert('transactions', $data);
    };

ВАЖНАЯ РАЗНИЦА, КАК МЫ НАШЛИ -> НЕУСТАНОВИТЕ ВАШИ ВИЛЫ CURL НА ИСТИНА ИЛИ ЛОЖЬ ИСПОЛЬЗУЙТЕ 0 ДЛЯ ИСТИНЫ и 1 ДЛЯ ЛОЖИ, ЭТО МОЖЕТ БЫТЬ ГЛУПЫМ, НО ЭТО БЫЛО !!!

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