iT邦幫忙

2021 iThome 鐵人賽

DAY 1
4
永豐金融APIs

串接生活與金融 API系列 第 1

利用python取得永豐銀行API的Nonce

在報名後,收到了永豐銀行寄來的"數位金流API技術規格文件",夾檔還附加了 PHP 與 C# 的範例程式。

太好了,因為我準備用 Python 呼叫 API,如果寄來的夾檔是 python 程式碼;
那我第一天就沒法子混過去了。

金融業的API串接,比我想像中還要麻煩些;至少比起我之前串接交通部或是 GCP 服務的API,還要更多程序;
這是法令所規定的,抄錄其中一小段文字如下:

本規格交易安控設計依據「電子銀行業務安全控管作業基準」之規範訂定如下:
➢安全簽章(Sign):為確保交易不可否認生,發動交易請求時需完成訊息內文規則性雜湊及其他參數,在將雜湊後字串用SHA256 Hash產生出來。

➢內文加密機制(Message):本規格採用AES 演算CBC 模式將訊息內文加密,來確保傳送內文之機敏資料不外洩,反之於接收交易回應時,將收到的加密內文以相同規則作解密。

好吧,總之第一個要取得的是 "Nonce" 參數。這還不簡單,用個 Post 方法來取就可以啦;
所以我很開心的用下列的程式碼:

import requests

# ShopNo 由主辦單位提供,此處示例以 xxx 取代
data = {'ShopNo':"xxx"}

URL ="https://apisbx.sinopac.com/funBIZ/QPay.WebAPI/api/Nonce"
r = requests.post(url = URL, data = data)

r.status_code
# 401 !!!

r.text
# "<html><head><title>Request Rejected</title></head><body>The requested URL was rejected. Please consult with your administrator.<br><br>Your support ID is: 7822324514163083814<br><br><a href='javascript:history.back();'>[Go Back]</a></body></html>"

咦! 回應的卻是 "The requested URL was rejected."

到底是發生了什麼事情吧 ?

好吧,趕快偷看一下,PHP的範例程式碼,其中一段是這樣寫的

//取得 Nonce 方法
	function getNonce($shopno, $targeturl){
		$url = $targeturl . "/Nonce";
	
		$post_data = json_encode(array('ShopNo' => $shopno));
		$result = WebAPI($url, $post_data);
		$result = json_decode($result);
		
		return $result->Nonce;
	}

看到幾個關鍵字 json 、 encode 然後才是送出 POST。
因為平常使用 requests.post 時,都是利過 data 參數進行資料的傳送;
趕快查一下 requests.post 還支援了什麼參數。果然真的有支援 json 的參數,因為平常沒有使用,所以真的不知道有什麼用法。所以將上面的程式改成如下

import requests

# ShopNo 由主辦單位提供,此處示例以 xxx 取代
json = {'ShopNo':"xxx"}

URL ="https://apisbx.sinopac.com/funBIZ/QPay.WebAPI/api/Nonce"
r = requests.post(url = URL, json = json )

r.status_code
# 200 
r.text
# 成功!  '{"Nonce":"yyyyy"}' 
r.json()
# 成功!'{"Nonce":"yyyyy"}' 


所以還好有 PHP 的範例程式碼,我可以大致推斷自己錯誤的狀況…

總之,第一天就先這樣吧 :)


下一篇
計算API所需要的參數: Hash ID
系列文
串接生活與金融 API6

尚未有邦友留言

立即登入留言