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

想要使用 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 的实作

明天见!


<<:  挑选命题的要件 | ML#Day4

>>:  [烧烤吃到饱-4] 烧肉众精致炭火烧肉-台中太平店 #中秋节烤肉精选店家

Day 21 「事有经重缓急」Clean Architecture 简易入门

古语有云:「岁有凶穰;故谷有贵贱;令有缓急;故物有轻重。」旨在告诉後人,做任何事情,一定要先搞清楚状...

工作的意义与价值

我今年 46 岁,属於在战後婴儿潮之後的所谓的 X 世代。在 ALPHA Camp,我每天需要跟不...

第四章

先前是我个人习惯用法,当然这篇主轴其实是入门CMS跟SEO的自我挑战经过分享,所以还是回归一下来说明...

<Day1> 前言

简短自我介绍 大家好!我是Marshal,目前还是一位在校大学生,就读资讯相关科系。 为什麽会想选这...

Day8:原来机器学习这个词跟我想的不太一样

  这几天研究下来,发现有三个词汇很让人搞不懂,也就是人工智慧(Artifical Intellig...