• 记一个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(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即可。

  • 相关阅读:
    简明git教程(单人版本) 阿星小栈
    Laravel SQL 查询语句集锦 阿星小栈
    PHP生成唯一订单号 阿星小栈
    php根据ID生成员工编号 阿星小栈
    laravel框架获取当前url 的方法 阿星小栈
    Laravel 通过Url确定返回错误信息格式 阿星小栈
    电脑用js调用QQ 聊天 阿星小栈
    js 设置cookie和获取cookie 阿星小栈
    php + ajax异步上传文件 阿星小栈
    MISCONF Redis is configured to save RDB snapshots, but it is currently not able to... 阿星小栈
  • 原文地址:https://www.cnblogs.com/miaoweiye/p/12461499.html
Copyright © 2020-2023  润新知