调起支付时提示签名错误,后端说参数已经按文档拼好了。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

raw = '&'.join(f'{k}={v}' for k, v in sorted(p.items()) if v and k != 'sign')
sign = md5(raw + '&key=' + key).upper()

参与签名的字段名大小写与文档不一致,或空值参数也被拼进了待签串。这一点先确认清楚,后面就不用反复试。

「小程序支付签名」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。别只看报错的最后一行,往上看几行,真正的起因通常在上面。

具体做法是,严格按文档字段名与顺序拼接;排除空值与签名字段;用同一份参数在两端核对。

改完照着核一遍,支付可以正常调起并完成。

作者 9823189