Razor Pay verify_payment支付验证时client无utility成员的问题咨询
RazorPay 支付签名验证的可落地实现
问题根源
运行官方示例时报client对象不存在utility成员,本质是示例代码适配的是0.x版本的旧版razorpay-python SDK,当前通用的1.x及以上正式版SDK调整了工具类的挂载路径,旧示例的调用方式已经无法匹配当前SDK结构。
两种可直接运行的实现方案
方案1:新版SDK标准调用
按照新版SDK暴露的方法路径编写验证逻辑即可正常运行:
import razorpay # 初始化客户端,替换为你自己的商户密钥对 client = razorpay.Client(auth=('<key_id>', '<key_secret>')) # 前端支付成功回调携带的三个核心参数 verify_params = { 'razorpay_order_id': '回调返回的RazorPay订单ID', 'razorpay_payment_id': '回调返回的RazorPay支付ID', 'razorpay_signature': '回调返回的签名串' } # 执行签名验证,验证不通过会直接抛出SignatureVerificationError异常 client.utility.verify_payment_signature(verify_params)
如果执行代码依然提示utility属性不存在,优先执行pip install --upgrade razorpay将SDK升级到最新正式版本即可,调用时注意捕获SignatureVerificationError异常做错误分支处理。
方案2:原生HMAC实现(无SDK版本依赖)
RazorPay的支付签名本质是基于HMAC-SHA256的标准加密校验,核心逻辑固定不会随SDK版本变动调整,不依赖SDK封装的实现方式稳定性更高,代码如下:
import hmac import hashlib def verify_payment_signature(order_id: str, payment_id: str, sign: str, key_secret: str) -> bool: # 按照官方规则拼接待校验明文 raw_payload = f"{order_id}|{payment_id}" # 计算与签名生成逻辑一致的HMAC摘要 calc_sign = hmac.new( key=key_secret.encode('utf-8'), msg=raw_payload.encode('utf-8'), digestmod=hashlib.sha256 ).hexdigest() # 使用常量时间比对方法校验,避免时序攻击风险 return hmac.compare_digest(calc_sign, sign)
强制校验的核心要求
- 签名验证必须在服务端完成,严禁把商户
key_secret暴露到前端代码环境 - 只有签名验证通过后,才能向用户返回支付成功的业务结果、同步订单状态
- 验证逻辑需要捕获校验失败的异常,对签名不匹配的回调做交易异常标记
内容的提问来源于stack exchange,提问作者Sudheer Kumar
相关产品推荐
相关产品推荐

