python cgi监听器获取空的paypal IPN
Posted
技术标签:
【中文标题】python cgi监听器获取空的paypal IPN【英文标题】:python cgi listener gets empty paypal IPN 【发布时间】:2014-01-15 22:39:04 【问题描述】:我正在尝试为 paypal IPN 设置一个 python cgi 侦听器,我尝试了不同的东西including this。但最终我看到了从 paypal 发送的通知,但它没有任何详细信息。
这是我正在使用的代码:
#! /usr/bin/env python
import cgi
import cgitb; cgitb.enable() # for troubleshooting
import os, sys
query_string=os.environ['QUERY_STRING']
user_ip=os.environ['REMOTE_ADDR']
form = cgi.FieldStorage()
query=form.getvalue("query")
paymentDetails = sys.stdin.read()
print "Content-type: text/html"
print
print """
<html>
<head>
<title>Test IPN</title>
</head>
<body>
Query String = %s <br>
User IP = %s <br>
</body>
</html>
"""%(query_string,user_ip)
fopen=open('output.txt','a')
fopen.write('Query: %s\n'%str(query))
fopen.write('Environment: %s\n'%str(os.environ))
fopen.write('Payment Details: %s\n'%str(paymentDetails))
fopen.close()
这是我得到的输出:
Query: None
Environment: 'TMP': '/tmp', 'CONTEXT_DOCUMENT_ROOT': '/005/html', 'SERVER_SOFTWARE': 'Apache', 'SCRIPT_NAME': '/p/ipn.py', 'SERVER_SIGNATURE': '<address>Apache Server at aaaaa.net Port 80</address>\n', 'REQUEST_METHOD': 'POST', 'SERVER_PROTOCOL': 'HTTP/1.0', 'QUERY_STRING': '', 'PATH': '/sbin:/usr/sbin:/bin:/usr/bin', 'CONTENT_LENGTH': '975', 'GD_php_HANDLER': 'x-httpd-php5', 'SERVER_NAME': 'aaaaa.net', 'REMOTE_ADDR': '173.0.81.1', 'SPI': 'TRUE', 'SERVER_PORT': '80', 'SERVER_ADDR': '00.000.0.0', 'DOCUMENT_ROOT': '/005/html', 'SCRIPT_FILENAME': '/005/html/p/ipn.py', 'SERVER_ADMIN': 'support@ssss.net', 'SCRIPT_URI': 'http://aaaaa.net/p/ipn.py', 'HTTP_HOST': 'aaaaa.net', 'SCRIPT_URL': '/p/ipn.py', 'REQUEST_URI': '/p/ipn.py', 'HTTP_ACCEPT': '*/*', 'SUBDOMAIN_DOCUMENT_ROOT': '/005/html', 'TEMP': '/005/tmp', 'GATEWAY_INTERFACE': 'CGI/1.1', 'PHPRC': '/005/html/', 'REMOTE_PORT': '53764', 'REQUEST_SCHEME': 'http', 'CONTENT_TYPE': 'application/x-www-form-urlencoded', 'UNIQUE_ID': 'Ur7jX63JxMsAADYmVf8AAACk'
Payment Details:
在上面的链接中,通知脚本向贝宝发送了一些信息以验证付款,但正如您所见,付款详细信息是一个空字符串。问题可能出在哪里?
【问题讨论】:
我面临同样的问题。我在 POST 中得到一个空的 QUERY_STRING。 (它在 GET 中工作)。见my question here 【参考方案1】:您不能在 POST 中使用 os.environ[QUERY_STRING
] - 它总是为空的。它适用于 GET。
你编码
form = cgi.FieldStorage()
query=form.getvalue("query")
paymentDetails = sys.stdin.read()
为paymentDetails
返回一个空字符串,因为cgi.FieldStorage()
已经已经从标准输入读取了该信息,因此没有任何内容可供paymentDetails 使用。
一种解决方案(参见my blog post here 和another SO answer here)是自己创建地图,也很容易。将上面的代码替换为
paymentDetails = sys.stdin.read()
multiform = urllib.parse.parse_qs(query_string)
您可以使用与cgi.FieldStorage()
非常相似的 multiform - 值是列表。有点尴尬。为简单起见,我将其转换为仅包含每个列表中第 0 个值的简单 dict,因为我的代码没有重复的查询值,而是 YMMV。
警告:这是 Python 3 代码,不确定 Python 2 是否需要任何更改
【讨论】:
以上是关于python cgi监听器获取空的paypal IPN的主要内容,如果未能解决你的问题,请参考以下文章