ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

记一个python字典和json.dumps()的坑

2021-12-23 22:02:42  阅读:191  来源: 互联网

标签:python dumps json 签名 字典 data md5


记一个python字典和json.dumps()的坑

最近项目中需要与管易云erp做对接,看了他的接口文档,php的示例代码,于是用python仿写。

其中传的参数data中前面几个json数据是固定的,最后需要加一个签名,该签名是对前面的json数据字符串化后,首尾拼接上screct字符串,再做md5处理(32位大写),再将该签名添加到之前的json中作为post参数传递过去。

问题就出在组装json字符串和签名中,因为python内置的字典是无序的,导致我组装好的json数据作为参数传递给自己编写的签名函数时,字典内部的顺序是变化的,所以签名前后的md5值不一样,导致频频报错,自己起初没在意数据顺序的事,因为对接金蝶erp时没有签名这一项,数据传递的很简单,导致排错时方向出现错误。后来想到这了顾开始解决。

解决方法是使用collections库中的OrderedDict(有序字典)模块,组装好的数据就不会乱序,做的md5签名也就前后一致了

但,在对json数据使用json.dumps()方法时,字符串化后的数据在逗号后会有一个空格,导致md5值出错

原理:

 

根据json.dumps()官方文档,为了美观默认会加上逗号空格和冒号空格,如果想消除空格,指定参数separators=(',',':')

json.dumps(data,separators=(',',':'))

最后,将自己写的函数留下来做个例子

复制代码
def getShops():
    data = OrderedDict()
    data["appkey"] = appkey
    data["sessionkey"] = sessionkey
    data["method"] = method
    data["page_no"] = "1"
    data["page_size"] = "10"
    data["sign"] = sign(data,secret)
    
    response = requests.post(url=url, data=json.dumps(data))
    print(response.text)


def sign(data,secret):
    str = json.dumps(data,separators=(',',':'))
    fullStr = secret+str+secret
    signCode = hashlib.md5(fullStr.encode("utf-8")).hexdigest().upper()
    #print(signCode)
    return signCode
复制代码

 

 

再访问新增订单接口时,又报签名出错,按着之前的逻辑去查,发现json.dumps()含中文数据时,会将中文默认转为ascii码,从而导致MD5不一致,需转成中文才行

原理:

def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
        allow_nan=True, cls=None, indent=None, separators=None,
        default=None, sort_keys=False, **kw):

解决:将上述代码红色参数改为False即可。

 

转自:https://www.cnblogs.com/miaoweiye/p/12461499.html

标签:python,dumps,json,签名,字典,data,md5
来源: https://www.cnblogs.com/tjp40922/p/15725438.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有