Python 微信支付回调验证签名

在接入微信支付时,处理回调信息并验证签名是一个重要的步骤。本文将带你一步步实现“Python 微信支付回调验证签名”的流程,让你理解每一步的实现。

流程概述

执行签名验证的流程如下表所示:

步骤 描述
1 接收回调的 JSON 数据
2 将回调数据转换为字典
3 根据微信支付的签名规则生成待签名字符串
4 计算签名并与回调数据中的签名进行比较
5 根据比较结果确认回调是否有效

接下来,我们逐步实现这些步骤。

实现步骤

步骤 1: 接收回调的 JSON 数据

我们通常会在 Flask 或 Django 等框架的视图函数中接收回调数据。

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/wxpay/callback', methods=['POST'])
def wxpay_callback():
    # 获取请求体中的 JSON 数据
    json_data = request.get_json()
    return json_data

步骤 2: 将回调数据转换为字典

数据已经是 JSON 格式,这里我们直接使用 Flask 的 get_json() 方法。

步骤 3: 生成待签名字符串

根据微信支付的签名规则,我们需要将回调数据进行排序并拼接成字符串。

import hashlib
import urllib.parse

def create_sign(data, key):
    # 排序
    sorted_data = sorted(data.items())
    # 拼接字符串
    params = '&'.join(f"{k}={v}" for k, v in sorted_data if v)  # 排除值为空的参数
    params += f"&key={key}"  # 添加密钥
    # 进行 MD5 签名,并转为大写
    sign = hashlib.md5(params.encode('utf-8')).hexdigest().upper()
    return sign

步骤 4: 计算签名并与回调数据比较

我们在回调数据中提取微信返回的 sign 并与我们计算的进行比较。

@app.route('/wxpay/callback', methods=['POST'])
def wxpay_callback():
    json_data = request.get_json()
    key = "your_api_key"  # 替换为你的微信商户 API key
    sign = json_data.pop('sign')  # 移除原签名
    calculated_sign = create_sign(json_data, key)  # 计算签名

    # 验证签名
    if sign == calculated_sign:
        return jsonify({'status': 'success'})
    else:
        return jsonify({'status': 'fail', 'message': 'Invalid sign'}), 400

步骤 5: 返回结果

如果签名有效,则执行后续业务逻辑。如果无效,则返回错误信息。

# 已在上面的逻辑中实现

步骤示意图

sequenceDiagram
    participant User
    participant Server
    User->>Server: 发送回调请求
    Server->>Server: 获取请求数据
    Server->>Server: 计算签名
    Server->>User: 返回处理结果

流程图

journey
    title 微信支付回调处理流程
    section 接收回调
      User->>Server: 发送微信支付回调
    section 检验签名
      Server->>Server: 解析JSON数据
      Server->>Server: 生成待签名字符串
      Server->>Server: 计算签名
      Server->>Server: 验证签名
    section 结果处理
      Server->>User: 返回成功或失败

结尾

通过以上步骤的细致解析,我们实现了 Python 对微信支付回调签名的验证。总结起来,尽量保持代码清晰且符合标准,能够帮助我们更好地维护和理解代码。在真实应用中,不要忘记保持你的 API key 安全和私密!希望这篇文章能够帮助你理解和实现微信支付回调的签名验证,如果你有任何问题,欢迎随时咨询!