Получение недействительного ответа от IPN PayPal в песочнице - PullRequest
1 голос
/ 22 февраля 2010

Я пытаюсь внедрить простую систему онлайн-платежей с использованием PayPal, однако я перепробовал все, что знаю, и до сих пор получаю НЕВЕРНЫЙ ответ.

Я знаю, что ничего сложного, потому что я получаю ПРОВЕРЕННЫЙ ответ при использовании симулятора IPN. Я попытался сначала поместить элементы в диктовку, я попытался исправить кодировку, но все еще ничего. PayPal сообщает, что причина НЕВЕРНОГО ответа может быть:

  • Отправка неправильных предметов или в неправильном порядке (уверен, что это не так)
  • Отправка не по адресу (определенно не это)
  • Неправильное кодирование элементов (я не думаю, что это так, установите кодировку UTF-8 как на PayPal, так и на моем скрипте)

Ниже приведен фрагмент:

f = cgi.FieldStorage()
newparams = 'cmd=_notify-validate'
for key in f.keys():
    val = f[key].value
    newparams += '&' + urlencode({key: val.encode('utf-8')})

req = urllib2.Request(PP_URL, newparams)
req.add_header("Content-type", "application/x-www-form-urlencoded")
http = urllib2.urlopen(req)
ret = http.read()
fi.write(ret + '\n')
if ret == 'VERIFIED':
    #*do stuff*

Ответы [ 4 ]

2 голосов
/ 23 февраля 2010

Заказ критический . Вы должны подтвердить в том же порядке, который указан Paypal. Самый простой способ добиться этого - использовать точный порядок, в котором они были указаны:

def paypal_verify():
    """ Returns false if the current request cannot be verified by paypal """
    # Create verify param string from current query string
    verify_string = "cmd=_notify_validate&" + cherrypy.request.query_string
    req = urllib2.Request("http://www.paypal.com/cgi-bin/webscr", verify_string)
    response = urllib2.urlopen(req)
    result = response.read()
    if response == "VERIFIED":
        # All good
        return True
    # Fail
    return False

Если вы не используете cherrypy, аналогичным образом должен быть доступен какой-то другой механизм для получения строки запроса, предоставленной Paypal.

1 голос
/ 09 января 2012

в Джанго

import httplib2
import urllib

h = httplib2.Http()

params = urllib.urlencode(request.POST, True)

response, content = h.request("http://www.paypal.com/cgi-bin/webscr?cmd=_notify-validate&%s" % params)
0 голосов
/ 05 апреля 2010

Убедитесь, что вы публикуете в песочнице, а не в прямом эфире.

$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
0 голосов
/ 22 февраля 2010

Трудно судить по тому, что ты мне дал. Вот пара догадок / предложений:

  1. Возможно, вам потребуется закодировать в utf-8 ключ и значение val.
  2. Если порядок требователен к ключам, вы должны регистрировать ключи, когда вводите их в newparams. Поскольку вы используете dict для f, порядок может быть не таким, как вы ожидаете.
...