当前位置: 首页 > 后端技术 > Python

python字典和json.dumps()遇到的坑分析

时间:2023-03-25 20:31:39 Python

最近一个项目,需要对接关一云erp。看了他的接口文档和php示例代码,我就用python复制过来了。传入的参数数据中前几个json数据是固定的,最后需要加签名。签名是将前面的json数据字符串化,首尾拼接screct字符串,然后做md5处理(32位大写),然后将签名添加到前面的json中,作为post参数传递。问题出在组装json串和签名上,因为python内置的字典是无序的,所以当我把组装好的json数据作为参数传递给我写的签名函数时,字典内部的顺序发生了变化,所以signature前后的md5值不一样,导致频繁报错。一开始没在意数据的顺序,因为连接金蝶erp的时候没有签名项,数据传输也很简单,导致排错的时候方向错了。想了想,顾氏开始着手解决。解决方案是使用集合库中的OrderedDict(有序字典)模块。组装后的数据不会乱序,md5签名一致。但是对json数据使用json.dumps()方法时,字符串化后的数据逗号后会有空格,导致md5值错误原理:解决方法是json.dumps(data,separators=(',',':'))最后把你写的函数留下来作为例子defgetShops():data=OrderedDict()data["appkey"]=appkeydata["sessionkey"]=sessionkeydata["method"]=methoddata["page_no"]="1"data["page_size"]="10"data["sign"]=sign(data,secret)response=requests.post(url=url,data=json.dumps(data))print(response.text)defsign(data,secret):str=json.dumps(data,separators=(',',':'))fullStr=secret+str+secretsignCode=hashlib.md5(fullStr.encode("utf-8")).hexdigest().upper()print(signCode)返回signCode