我尝试使用cherrypy实现Paypal IPN侦听器。为了验证IPN,我必须将收到的确切发布数据(订单和所有)发回给PayPal并添加一个参数。由于Python dicts是无序的,我不能以正常的方式读取post参数,所以我试图用cherrypy.request.body.read()读取原始的post数据。它虽然返回了一个空的字节对象,但我无法弄清楚原因。
现在就是听众代码:
class Server(object):
@cherrypy.expose
def ipn_listener(self, **kwargs):
print(kwargs)
print("CONTENT LENGTH")
cl = cherrypy.request.headers['Content-Length']
print(cl)
print("BODY")
body = cherrypy.request.body.read(int(cl))
print(body.decode('utf-8'))
print("BODY LENGTH")
print(len(body))
这些印刷语句的输出是
{'residence_country': 'US', 'mc_handling': '2.06', 'mc_gross_1': '12.34', 'address_city': 'San Jose', 'verify_sign': 'AFcWxV21C7fd0v3bYYYRCpSSRl31AQCuZQmE68wbtffSmpqH2dQ4nr9n', 'txn_id': '993769469', 'mc_handling1': '1.67', 'tax': '2.02', 'first_name': 'John', 'address_street': '123 any street', 'address_country': 'United States', 'notify_version': '2.1', 'payer_status': 'verified', 'mc_fee': '0.44', 'mc_gross': '12.34', 'address_name': 'John Smith', 'payment_type': 'instant', 'item_number1': 'AK-1234', 'invoice': 'abc1234', 'payment_status': 'Completed', 'address_state': 'CA', 'business': 'seller@paypalsandbox.com', 'mc_shipping': '3.02', 'address_zip': '95131', 'payment_date': 'Sun Mar 26 2017 14:27:51 GMT-0400 (EDT)', 'item_name1': 'something', 'address_status': 'confirmed', 'address_country_code': 'US', 'mc_currency': 'USD', 'test_ipn': '1', 'custom': 'xyz123', 'txn_type': 'cart', 'payer_id': 'TESTBUYERID01', 'payer_email': 'buyer@paypalsandbox.com', 'last_name': 'Smith', 'receiver_email': 'seller@paypalsandbox.com', 'mc_shipping1': '1.02', 'receiver_id': 'seller@paypalsandbox.com'}
CONTENT LENGTH
904
BODY
BODY LENGTH
0
关键字参数不是空的,所以我知道帖子数据正在通过。我可以阅读预期的身体数据长度,但是当我真正去阅读它时,我什么也得不到。
任何想法都将不胜感激。谢谢!