PHP / CodeIgniter PayPal IPN Неверная проверка - PullRequest
2 голосов
/ 17 февраля 2012

У меня сайт построен на CodeIgniter 2, и я использую CodeIgniter PayPal Lib. Я сделал все необходимое и теперь могу совершать платежи. Я получаю данные IPN и отправляю их на мою электронную почту. Я прочитал Руководство по IPP PayPal, но не смог найти там решения.

Все хорошо до сих пор, и я доволен результатом, но я обеспокоен, потому что проверка PayPal IPN не удалась, и я не могу понять , в чем проблема.

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

Я регистрирую все данные, и в обоих случаях (действительный или недействительный) платеж прошел успешно, и у меня "УСПЕХ!" сообщение от PayPal.

Вещи, которые я пробовал

  1. Включить / выключить защиту CSRF
  2. Изменить кодировку (utf-8 | windows-1252)
  3. Добавление | Удаление полей из моего запроса PayPal

код, который я использую

поля, которые я использую

$this->paypal_lib->add_field('business', 'name_1321715512_biz@gmail.com');
$this->paypal_lib->add_field('return', site_url('paypal/success'));
$this->paypal_lib->add_field('cancel_return', site_url('paypal/cancel'));
$this->paypal_lib->add_field('notify_url', site_url('contest/receive_ipn'));
$this->paypal_lib->add_field('item_name', 'Contest Subscribtion Payment (Test)');
$this->paypal_lib->add_field('amount', '30');
$this->paypal_lib->add_field('item_number', Y11-1329469079-12); // Reference number
$this->paypal_lib->add_field('quantity', '1');
$this->paypal_lib->add_field('charset', 'utf8');
$this->paypal_lib->add_field('custom', 1723); //This is an id that I need.  

Сообщение в PayPal для проверки

$post_string.="cmd=_notify-validate";

if (isset($_POST)){
    foreach ($_POST as $field=>$value){
         $value = str_replace("\n", "\r\n", $value);
         $value = urlencode(stripslashes($value));
         $post_string .= "&$field=$value";

         $this->ipn_data[$field] = $value; //this is part of the library
    }
}

$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($post_string) . "\r\n\r\n";

$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);

Код для проверки IPN

fputs ($fp, $header . $post_string);
while (!feof($fp)) {
    $res = fgets ($fp, 1024);
    if (strcmp ($res, "VERIFIED") == 0) {
        // Send me e-mail - Verified
    } else if (strcmp ($res, "INVALID") == 0) {
        // Send me e-mail - Invalid
    }
}
fclose($fp);

Также я публикую получаемый ответ

Это НЕПРАВИЛЬНО (затем отправьте с моего сайта)

cmd=_notify-validate&mc_gross=30.00&protection_eligibility=Ineligible&address_status=unconfirmed&payer_id=LD9UMUWHD44GY&tax=0.00&address_street=Via+Unit+d%27Italia%2C+5783296&payment_date=02%3A19%3A29+Feb+17%2C+2012+PST&payment_status=Completed&charset=windows-1252&address_zip=80127&first_name=Alexander&mc_fee=1.37&address_country_code=IT&address_name=Alexander+Videnov&notify_version=3.4&custom=1721&payer_status=verified&business=aviden_1321715512_biz%40gmail.com&address_country=Italy&address_city=Napoli&quantity=1&verify_sign=AF1YwvTycK97c-VCwQnfsdzArWAcAqZjskElh-FsmZ0s9HqL9BjFUKVH&payer_email=aviden_1329133801_per%40gmail.com&txn_id=32Y96385XJ0686735&payment_type=instant&last_name=Videnov&address_state=Napoli&receiver_email=aviden_1321715512_biz%40gmail.com&payment_fee=&receiver_id=TQVQ3ASRDBW28&txn_type=web_accept&item_name=Yicca+Contest+Subscribtion+Payment+%28Test%29&mc_currency=EUR&item_number=Y11-1329473936-12&residence_country=IT&test_ipn=1&handling_amount=0.00&transaction_subject=1721&payment_gross=&shipping=0.00&ipn_track_id=35382e1887f00

И это ПРОВЕРЕНО (при отправке с тестового сайта PayPal)

cmd=_notify-validate&test_ipn=1&payment_type=echeck&payment_date=02%3A28%3A24+Feb+17%2C+2012+PST&payment_status=Completed&address_status=confirmed&payer_status=verified&first_name=John&last_name=Smith&payer_email=buyer%40paypalsandbox.com&payer_id=TESTBUYERID01&address_name=John+Smith&address_country=United+States&address_country_code=US&address_zip=95131&address_state=CA&address_city=San+Jose&address_street=123%2C+any+street&business=seller%40paypalsandbox.com&receiver_email=seller%40paypalsandbox.com&receiver_id=TESTSELLERID1&residence_country=US&item_name=something&item_number=AK-1234&quantity=1&shipping=3.04&tax=2.02&mc_currency=USD&mc_fee=0.44&mc_gross=12.34&txn_type=web_accept&txn_id=242171028&notify_version=2.1&custom=xyz123&invoice=abc1234&charset=windows-1252&verify_sign=An5ns1Kso7MWUdW4ErQKJJJ4qi4-Arge8MWjXZSo7fPSQf3xaqAOjrSH

Две вещи, которые я заметил

  1. Порядок полей (запрос) отличается между запросом IPN, отправленным моим веб-сайтом, и запросом, отправленным с тестового сайта песочницы.
  2. Существует разница в поле notify_version. С моего сайта (3.4) | Из PayPal (2.1)

Кто-нибудь испытал такую ​​же проблему с проверкой. Я что-то упускаю или могу еще отладить?

Ответы [ 3 ]

3 голосов
/ 13 марта 2013

Я получил ответ от Paypal, который также может иметь отношение к вам:

Теперь мы знаем из опыта, что со специальными символами может быть сложно иметь дело во время проверки IPN. Обычно кодировка символов, которую мы используем для отправки сообщения IPN на ваш сервер, должна соответствовать вашему обработчику IPN, когда он отправляет сообщение обратно в системы PayPal для проверки.

Мы достигли большого успеха в решении этих проблем, изменив языковые параметры учетной записи на UTF-8.

Вот как вы это делаете: 1. Войдите в свою учетную запись PayPal.

  1. Затем перейдите по этой ссылке, которая приведет вас непосредственно к параметрам кодировки языка: https://www.paypal.com/cgi-bin/webscr?cmd=_profile-language-encoding

  2. Нажмите кнопку «Дополнительные параметры».

  3. Измените оба раскрывающихся меню на UTF-8 и нажмите "Сохранить".

Если вы указали в коде другую кодировку символов, переключите ее также на UTF-8.

1 голос
/ 17 февраля 2012

CodeIgniter PayPal Lib устарел и постоянно прослушивается. По крайней мере, по моему опыту.

Что я делаю, и я бы порекомендовал использовать официальные SDK PayPal и «конвертировать» их в CI. Это довольно просто.

Вы можете найти их здесь: https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/library_download_sdks

Также проверьте документы: https://www.x.com/developers/paypal/development-integration-guides#ec Вы не можете жить без них!

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

Не уверен, используете ли вы адаптивные платежи или нет, но я использовал эту библиотеку: http://www.binpress.com/app/paypal-adaptive-payments-pro-codeigniter-library/140, и она работает потрясающе, и автор очень полезен.

См. Мой вопрос здесь: Paypal IPN Проблема с параллельным платежом . Я отправил свой IPN-код PayPal в ответ.

...