📅  最后修改于: 2023-12-03 15:13:07.873000             🧑  作者: Mango
如果你正在使用 2Checkout支付平台,那么有可能需要在你的网站上实现 IPN(Instant Payment Notification)功能,以便实时获取订单支付状态等信息。本文将介绍如何在 Python 中实现验证 2Checkout IPN 响应的方式。
回顾一下 IPN 的概念,它是一种服务,用于将支付网关的支付成功或失败通知推送给你的服务器。例如,当用户在你的网站上使用 2Checkout 支付时,2Checkout 将会发送一条 POST 请求到指定的 URL,包含支付订单的详细信息。
为了确保请求来自于 2Checkout 的服务器,你需要验证该请求的签名,从而避免遭受 CSRF(跨站请求伪造)攻击。
下面是一个基本的 Python 代码片段,演示了如何验证 2Checkout IPN 请求签名。
import hashlib
import hmac
import requests
# 认证密钥(充当你和 2Checkout 的共享密钥)
secret_key = 'your_secret_key'
# 定义待验证的 IPN 请求
ipn_params = {
'message': 'Payment processed',
'invoice_id': '12345',
'sale_id': '56789',
'price': '9.99',
'md5_hash': '2ED81C0B0AC91DE8F65B128420D73A03'
}
# 构建签名
sorted_params = ''.join('{}{}'.format(k, v) for k, v in sorted(ipn_params.items()))
signature = hmac.new(bytes(secret_key, 'utf-8'), sorted_params.encode('utf-8'), hashlib.md5).hexdigest()
if signature == ipn_params['md5_hash']:
# 签名验证成功,处理支付成功的逻辑
print('Payment successful')
else:
# 签名验证失败,处理支付失败或异常的逻辑
print('Payment failed')
代码中的 secret_key
是认证密钥,它是你和 2Checkout 共享的密钥。然后,定义一个包含 IPN 请求参数的字典,然后按照键值升序排列,并将它们连接在一起。接下来,使用 HMAC SHA-256 进行签名,然后将计算得到的签名与 IPN 请求参数中的 md5_hash
相比较。如果它们匹配,则表示签名验证成功。
如果签名验证成功,则可以处理支付成功的逻辑;否则,应该处理支付失败或异常的逻辑。
在实际应用中,你需要根据你的应用程序需求,编写更详细的程序逻辑,以确保安全和稳定性。
希望这篇文章能够帮助你理解如何在 Python 中验证 2Checkout IPN 响应。如果你有任何问题或意见,请随时在评论区留言。