From fb8d905fb0a77e98c27765f925305ede00af3d11 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Thu, 9 Jul 2026 20:32:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=9B=B4=E6=96=B0=20BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jituan/services/alipay_pay.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/jituan/services/alipay_pay.py b/jituan/services/alipay_pay.py index a26be75..1c0dc3f 100644 --- a/jituan/services/alipay_pay.py +++ b/jituan/services/alipay_pay.py @@ -169,6 +169,11 @@ def verify_notify_params(params, club_id=None): """ 验证支付宝异步回调签名。 params 为已解析的字典(来自 POST form 数据)。 + + 注意:回调验签与请求签名规则不同! + - 请求签名:sign_type 参与签名(只排除 sign) + - 回调验签:sign_type 不参与签名(排除 sign 和 sign_type) + 支付宝官方文档:通知返回参数中除去 sign、sign_type 两个参数外,皆是待验签参数。 """ cfg = get_alipay_config(club_id) sign = params.get('sign', '') @@ -177,7 +182,9 @@ def verify_notify_params(params, club_id=None): sign_type = params.get('sign_type', '') if sign_type and sign_type.upper() != 'RSA2': return False - sign_content = _build_sign_content(params) + # 回调验签:排除 sign 和 sign_type(支付宝官方规则) + sorted_keys = sorted(k for k in params if k not in ('sign', 'sign_type')) + sign_content = '&'.join(f'{k}={params[k]}' for k in sorted_keys if params[k] != '') return verify_rsa2(sign_content, sign, cfg['ALIPAY_PUBLIC_KEY'])