JAVA版java
// 計算簽名 private static final String ENCODING = "UTF-8"; private static final String ALGORITHM = "HmacSHA1"; Mac mac = Mac.getInstance(ALGORITHM); String text = "你須要計算的內容"; String acKey = "通常爲你的接口accesskey"; mac.init(new SecretKeySpec(acKey.getBytes(ENCODING), ALGORITHM)); byte[] signData = mac.doFinal(text.getBytes(ENCODING)); String signature = new String(Base64.encodeBase64(signData));
Python版python
# -*- coding: utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf8') import requests import json import traceback import urllib import hashlib import time import uuid import string import datetime from hashlib import sha1 import base64 import hmac from hmac import new as hmac #受權 def hash_hmac(ac_key, text): return str(hmac(ac_key, text, sha1).digest().encode('base64')[:-1])
關於API參數URL編碼須要注意的問題:
JAVA的URLEncoder.encode函數默認對」/」進行編碼,而python的URL編碼函數urllib.quote默認不會對」/」進行編碼,因此須要對該函數進行參數指定,以下實現。json
urllib.quote("/",safe='')
關於GMT時間獲取的實現:函數
Python版ui
time_format_str = datetime.datetime.utcnow().isoformat() time_format_str = time_format_str.split(".")[0]+"Z"
JAVA版編碼
private static final String ISO8601_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'"; private static String formatIso8601Date(Date date) { SimpleDateFormat df = new SimpleDateFormat(ISO8601_DATE_FORMAT); df.setTimeZone(TimeZone.getTimeZone("GMT")); return df.format(date); }