iT邦幫忙

2021 iThome 鐵人賽

DAY 2
0
永豐金融APIs

永豐 API 隨意玩系列 第 2

Day02 - 隨意玩之工欲善其事,必先利其器

  • 分享至 

  • xImage
  •  

想要使用 API,當然就是準備符合他們要求的東西!(要求如下圖)
https://ithelp.ithome.com.tw/upload/images/20210913/20141787JA8Lt56P67.png

首先把 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,還需要產出以下幾個東西

  1. 四組 Hash 算出的 Hash ID (AES-CBC 加密用的 Key)
  2. 用 Nonce 算出的 IV (AES-CBC 加密用的 IV)
  3. API 的 JSON 內容 (AES-CBC 加密用的 明文)
  4. 把內容加上 Nonce 以及密鑰 然後做 SHA256 (讓永豐驗證你的加解密是否正常,如果被竄改過 Hash 會不同)
  5. 把 JSON 用 AES-CBC 加密 (圖片的第六項)

首先是算出 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 的實作

明天見!


上一篇
Day01 - 隨意玩之 Spec 相關測試
下一篇
Day03 - 隨意玩之 API 訊息內文以及 Sign
系列文
永豐 API 隨意玩6
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言