iT邦幫忙

2021 iThome 鐵人賽

DAY 2
1
永豐金融APIs

永豐Vue一下-從生活尋找靈感系列 第 4

[day4]API串接-安全簽章Sign(一) 發現昨天上傳失敗,殘念

噩耗~早上起床發現昨天上傳沒成功,鐵人中斷了!!不過還是繼續寫下去吧!
中秋節連假第二天,今天開始串接實測囉~

環境

python使用的環境如下,不過測試時有在不同版本中跑過,都能夠運行

>python -V
Python 3.8.5

那就直接開始測試囉,以下測試都使用規格書中的參數

串接前需要準備的參數

需要特別加工的部份為Nonce、Sign以及Message。

項次 參數 說明
1 Version 目前請固定傳值 1.0.0
2 ShopNo 按照取得的商店名稱
3 APIService 填入永豐API功能名稱
4 Nonce 向永豐API POST取得之60秒內有效的時間戳記。
5 Sign 交易訊息內文排序雜湊後加Nonce值加HashID再做Sha256運算轉大寫產生Sign字串。
6 Message 可還原的原始交易訊息內文 +HashID(32位元值 )+IV(16位元值三要素進行AES CBC 加密產生。

產生安全簽章Sign的方法

建置需產出以下項目:
項目|說明 如何取得

項目 說明
APIService API 服務的名稱。
Hash 產出運算值 (Hash ID) 以計算出安全簽章及訊息加密用。
Nonce 由商戶固定 IP 發動,使用 API 向 funBiz 取得60 秒內有效的時間戳記 。
HashID

hashID產出

規格書說明:
Hash ID 是透過位元運算(XOR)將四組 Hash 計算產出的,將 A1/A2 以 XOR 運算
所得的字串,再與 B1/B2 以 XOR 運算出來的字串,二個相加後將英文轉換為大寫,為
長度為 32 的字串。
https://ithelp.ithome.com.tw/upload/images/20210918/201409248QOgH9915c.png
程式如下:

A1 = "4D9709D699CA40EE"
A2 = "5A4FEF83140C4E9E"
B1 = "BC74301945134CB4"
B2 = "961F67F8FCA44AB9"
# XOR
OR1 = int(A1,base=16) ^ int(A2,base=16)
OR2 = int(B1,base=16) ^ int(B2,base=16)

hashID = ( format(OR1, 'X')  +format(OR2, 'X')  )
print("hashID => ",hashID)

結果

NjM3Njc0OTAxMDI1NzQuOTo3NzI1MDBlMWEyMzc3YTk2YWIxNjI0MGE3ZTJjN2VmMDIxYTkxZjlkZDhhMDE1NmVhZDY4MDcyYzUyODQ0ODA1

其中值得注意的是若下hex(OR1),產出的字串頭尾會有0x 70,而format(OR1, 'X') 則不需要處理
hex(OR1) 頭尾多出來的 0x & 70。

Nonce取得

商戶透過POST 永豐提供的Nonce API,永豐會驗証該Nonce值的時效性(60秒及取得來源(IP),以確保每次要求來源是一致。

  • 使用POSTMAN軟體測試
    查詢方式參考以下圖片,如之前所提,在POSTMAN測試API,只要填入相對應的參數及設定,一鍵搞定測試。
    https://ithelp.ithome.com.tw/upload/images/20210918/20140924Z3v3c1vkUA.png

  • python串接測試

    • 安裝 python套件 requests
    pip install requests
    
    • 執行
    Shop_No = {'ShopNo':"BA0026_001"}
    def getNonce(Shop_No):
        #print(Shop_No["ShopNo"])
        URL ="https://apisbx.sinopac.com/funBIZ/QPay.WebAPI/api/Nonce"
        res = requests.post(url = URL, json = Shop_No )
        print('status_code => ',res.status_code)
        # print('status_code',res.json())
        Nonce=res.json()["Nonce"]
        res.close()
        return Nonce
    print(getNonce(Shop_No))
    
    • 結果
      因為Nonce值具有時效性,所以POSTMAN和python產出的Nonce值不會一樣!
    status_code =>  200 NjM3Njc0OTAxMDI1NzQuOTo3NzI1MDBlMWEyMzc3YTk2YWIxNjI0MGE3ZTJjN2VmMDIxYTkxZjlkZDhhMDE1NmVhZDY4MDcyYzUyODQ0ODA1
    

明天接著做Sign後半段的產製囉


上一篇
[day3]進入程式開發階段-測試前準備
下一篇
[day5]API串接-安全簽章Sign(二)
系列文
永豐Vue一下-從生活尋找靈感30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
arguskao
iT邦新手 4 級 ‧ 2022-07-02 23:23:31

請問我照著程式做
hash ID是17D8E6558DC60E702A6B57E1B9B7060D
怎麼短這麼多?

我要留言

立即登入留言