1

PayPal を使用して簡単なオンライン決済システムを実装しようとしていますが、知っていることはすべて試しましたが、まだ INVALID 応答が返されます。

IPN シミュレーターを使用すると VERIFIED 応答が得られるため、単純すぎることはありません。最初にアイテムをdictに入れようとしましたが、エンコーディングを修正しようとしましたが、まだ何もしていません。PayPal によると、INVALID 応答の理由として次のことが考えられます。

  • 間違ったアイテムまたは間違った順序で送信する (これではないことは確かです)
  • 間違ったアドレスに送信する (間違いなくこれではありません)
  • アイテムのエンコーディングが間違っています (これだとは思いません。ペイパルと私のスクリプトの両方でエンコーディングを UTF-8 に設定してください)

以下は、関連するスニペットです。

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

4 に答える 4

2

順序は重要です。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 が提供するクエリ文字列を取得するために、他のメカニズムも同様に利用できるはずです。

于 2010-02-23T09:15:18.050 に答える
1

ジャンゴで

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)
于 2012-01-09T16:30:51.020 に答える
0

あなたが私に与えたものから判断するのは難しい. ここにいくつかの推測/提案があります:

  1. キーと val を utf-8 でエンコードする必要がある場合があります。
  2. キーの順序にこだわりがある場合は、キーを newparams に入れるときにログに記録する必要があります。f に dict を使用しているため、期待どおりの順序ではない可能性があります。
于 2010-02-22T20:45:07.677 に答える
-1

ライブではなく、サンドボックスに投稿していることを確認してください。

$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
于 2010-04-05T02:35:51.883 に答える