[英]How do you return a POST message exactly the way it was received in Flask (meaning no encoding changes)
我一直在使用 Paypals API,更具体地说,我一直在尝试在我的烧瓶应用程序中实现 IPN(即时付款通知)。 只要我不包含任何特殊字符,我就可以让它工作。 不幸的是,我的姓是 Engström...
它的工作方式是 paypal 向您发送一堆参数,然后您应该按照它们发送给您的方式将这些参数发送回,并添加一个指定cmd=_notify-validate
的参数
我当前的代码本质上是:
@app.route("/paypal_ipn", methods=['POST', 'GET'])
def paypal_ipn_listener():
# Returning message as-is with the notify-validate request
raw_data = "cmd=_notify-validate&" + request.get_data()
response = requests.post(VERIFY_URL, params=raw_data, verify=True)
response.raise_for_status()
# See if PayPal confirms the validity of the IPN received
if response.text == 'VERIFIED':
print(OKGREEN + "Verified IPN response received." + ENDC)
elif response.text == 'INVALID':
# Don't trust
print(FAIL + "Invalid IPN response." + ENDC)
else:
print("Some other response.")
print(response.text)
return ""
事实上,只要我的姓氏是 Engstrom 而不是 Engström 在付款时,这段代码就可以正常工作。
到目前为止我的故障排除:
显然,Paypal 默认使用 windows-1252 编码。 但是,我使用以下 SO 答案更改为使用 utf-8 编码: https ://stackoverflow.com/a/46303635/5331467,但是当我付款时没有做任何事情,我坚持现在的IPN 模拟器工具,它被 windows-1252 卡住了
如果我打印request.form
,我会得到ImmutableMultiDict([('last_name', u'Engstr\�m'')
,其中 ä 和 ö 看起来很明显,这至少告诉我它们之间没有区别
request.get_data() 中的内容是payment_type=instant&payment_date=15%3A08%3A30%20Jan%2028%2C%202022%20PST&payment_status=Completed&address_status=confirmed&payer_status=verified&first_name=John&last_name=Engstr%F6m&payer_email=buyer@paypalsandbox.com&payer_id=TESTBUYERID01&address_name=John%20Smith&address_country=United%20States&address_country_code=US&address_zip=95131&address_state=CA&address_city=San%20Jose&address_street=123%20any%20street&business=seller@paypalsandbox.com&receiver_email=seller@paypalsandbox.com&receiver_id=seller@paypalsandbox.com&residence_country=US&item_name1=something&item_number1=AK-1234&tax=2.02&mc_currency=USD&mc_fee=0.44&mc_gross=12.34&mc_gross_1=12.34&mc_handling=2.06&mc_handling1=1.67&mc_shipping=3.02&mc_shipping1=1.02&txn_type=cart&txn_id=474083376¬ify_version=2.1&custom=xyz123&invoice=abc1234&test_ipn=1&verify_sign=A8Vpc0Ws5acpR3s0gcM6u4Qtk1utA8eY7wJKy6n.AkPJ6RHIQeSSmBzL
那里说&姓氏= Engstr%F6m
现在我不知道我是否想要它在发送时实际上具有正确的编码,或者是否有某种方法可以确保它永远不会触及编码。
**TL;博士
接收传入的 POST 消息并将其直接发送回 Flask 仍然会以某种方式搞砸格式。**
您的第一个错误是将 IPN 用于任何事情,它已有 20 年历史,而且相当笨拙。 不要使用 IPN,如果您要抱怨一项已有 20 年历史的技术难以从头开始与当前的 Web 堆栈集成,那么,是的。
今天的 PayPal 集成使用 REST API 和 JS SDK。 对于一次性付款,捕获响应应该是您所需要的全部 - 但是在极少数情况下您需要稍后事件的异步通知,例如退款,请使用 Webhooks。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.