iT邦幫忙

2021 iThome 鐵人賽

DAY 12
0
永豐金融APIs

試著讀懂與串接永豐金融APIs系列 第 12

Day 0xC - Debug 地獄第三天,終於逃脫了 (建立訂單)

0x1 前言

從 Day 0xA 開始撞牆,撞到今天總算解出來了
幾個問題請讓我娓娓道來

0x2 好臭的蟲 Part 2

  • 官方有提供加解密 DEMO 頁:

  • 一步一步地對,然而發現錯的地方,就是昨天對到改的函數 calculateHashId, encryptMessage

    1. calculateHashId 昨天提到我這樣寫沒有對齊 4 位對吧,於是加了 str_pad 函數來補完,但沒想到的是,這個函數的第三個參數預設值為補右邊,自己誤會成字串靠右,左邊補字
    2. encryptMessage 昨天說要做key的排序對吧,請忘了吧,範例程式沒有寫要排序,自己以為需要跟 Sign 一樣要排序,然後就各種爆炸/images/emoticon/emoticon02.gif

程式如下:

// app/Http/Controllers/Sinopac.php
...
public function calcHashId(): string
{
    $a = $b = '';
    $length = strlen($this->key_a1);
    for ($i = 0; $i < $length; $i += 4) {
        $part_of_a = dechex(hexdec(substr($this->key_a1, $i, 4)) ^ hexdec(substr($this->key_a2, $i, 4)));
        $part_of_b = dechex(hexdec(substr($this->key_b1, $i, 4)) ^ hexdec(substr($this->key_b2, $i, 4)));
        $a .= str_pad($part_of_a, 4, "0", STR_PAD_LEFT);
        $b .= str_pad($part_of_b, 4, "0", STR_PAD_LEFT);
    }
    return strtoupper($a . $b);
}
...
public function encryptMessage($data, $key, $iv): string
{
    $data = json_encode(array_filter((array)($data)));

    $padding = 16 - (strlen($data) % 16);
    $data .= str_repeat(chr($padding), $padding);
    $encrypt = openssl_encrypt($data, 'AES-256-CBC', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv);

    return strtoupper(bin2hex($encrypt));
}
...

用 Postman測試出來的結果,終於不是 E3501 – 訊息內容錯誤
https://ithelp.ithome.com.tw/upload/images/20210922/20141805wu4JaSakJz.png

0x3 今日結語

今天在解不出來,真的會想放棄,錯到一個懷疑人生
明天來把回覆的訊息解密以及完成驗證吧


上一篇
Day 0xB - 建立訂單 & Debug 之 De 好 De 不完
下一篇
Day 0xD - 解開建立訂單回覆的訊息,建立訂單的 Amount 要注意
系列文
試著讀懂與串接永豐金融APIs30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言