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的主要内容,如果未能解决你的问题,请参考以下文章

paypal /cgi-bin/webscr 表单数据

在 PayPal 付款中获取项目名称

从 PayPal 获取有关新订阅的通知

Paypal IPN:如何从此类中获取 POST?

Paypal API 获取付款确认

PayPal响应式结账?