要調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 importOrderedDict#這裡要保護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=(',', ':'))