要調PHP那邊的接口,php那邊一直都校驗不過,很是郁悶。沒辦法,只能讓人把發送成功的代碼拿過來看,不過是php寫的,步驟都是一樣:
php端:
1. json對象轉json字符串.
2. 對json字符串base64.
3. 加入一些其他變量與2得到的base64進行md5
php運行成功,但python一直都不過,把php的變量都打印了出來,前后對比了很多次,發現,有兩個不同的地方:
1. python里json轉字符串,默認的是有indent,即多一個空格的。這點跟php里的json_encode()方法不同,php里沒有空格。
2. python如果用dict,轉成字符串無法保證字符串順序,這點導致得到的base64跟php的不同。
就是這兩點,才導致python調用接口一直驗證不過。
解決:
對於1. 查看json模塊的dumps方法源碼,發現有個separators參數,設置為 (',', ':') 即可。
對於2. 使用collection模塊里的OrderedDict類,可以保證字符串順序
代碼片段:
from collections import OrderedDict # 這里要保護json轉字符串順序,不然php那邊校驗不過 inner = OrderedDict( [("tab", OrderedDict([("type", "exp"), ("value", 1)]))] ) code = OrderedDict( [("user", 23445), ("api", 2364), ("guid", '3f60614f-315d-11e7-b690-f8bc127f78d8'), ("cmds",inner)] ) # 這里就是順序的字符串 json.dumps(code, encoding="UTF-8", separators=(',', ':'))