想要使用 API,當然就是準備符合他們要求的東西!(要求如下圖)
首先把 Python 用來發 HTTP Request 的 module 裝起來~
pip install requests
接著一樣使用昨天的例子,測試看看是否可以拿到 Nonce (第四項)
https://apisbx.sinopac.com/funBIZ/QPay.WebAPI/api/Nonce
這個是用來取得 Nonce 的網址
必要的參數只有 ShopNo
import requests
import json
def getNonce():
shop_no = '<your-shop-no>'
nonce_url = 'https://apisbx.sinopac.com/funBIZ/QPay.WebAPI/api/Nonce'
nonce_data = {
'ShopNo': shop_no
}
# 注意是 JSON format
r = requests.post(nonce_url, json=nonce_data)
return json.loads(r.content)['Nonce']
print(getNonce())
你應該會拿到一串類似下面的東西~
NjM3NjY5NjU5NjU3MDcuMjpiNGYzNGU1NGU2YWM2M2E0OTI4ZGIzOWVhMDA4NGYwOGEwMTUyYmQ2MTQzMjlkMzZlZjk2OTc2MzE2OTMyNmVk
永豐那邊會驗証 Nonce 的時效性(60 秒)以及來源 IP,確保每次要求來源是一致,所以任何有關 Nonce 的操作都是要 60 秒內完成!
但是今天我要說的沒有這麼簡單,如果要使用 API,還需要產出以下幾個東西
首先是算出 Hash ID
計算方式是
(a1 XOR a2) + (b1 XOR b2)
然後全部轉成大寫
def calcHashID():
# 這是 Spec 上面的例子,可以換成自己的 hash
a1 = 0x4D9709D699CA40EE
a2 = 0x5A4FEF83140C4E9E
b1 = 0xBC74301945134CB4
b2 = 0x961F67F8FCA44AB9
# [2:] 是把 0x 去掉用的
hash_id = hex(a1^a2)[2:]+hex(b1^b2)[2:]
return hash_id.upper()
接著是用 Nonce 算出 AES-CBC 使用的 IV
計算方式是將取得的 Nonce 值做 SHA256 加密(?)後,再將英文轉換成大寫取字串右邊 16 碼長度
小提醒:永豐 Spec 寫加密,但是 Hash 其實不是加密哦~
import hashlib
def calcIV(nonce):
s = hashlib.sha256()
s.update(nonce.encode('utf-8'))
h = s.hexdigest()
return h[-16:].upper()
今天就先這樣,先預告明後天會有更多程式碼
明天是關於 API JSON 以及 Sign
後天是關於 AES-CBC 的實作
明天見!