Day 0xB - 建立订单 & Debug 之 De 好 De 不完

0x1 前言

昨天把 Webhook api 准备好了,然後怎麽样呢
https://i.ytimg.com/vi/inplFq-D5aI/hqdefault.jpg
是的,一直回应 E3501 – 讯息内容错误,今天就是我的 debug 之日
https://c.tenor.com/uYqNrZVJAc4AAAAC/jojo-cry.gif

0x2 建立订单函数

  • 在 Controller.php 建立函数,并增加 Route
// app/Http/Controllers/Controller.php
public function create_order(Request $request)
{
    $sinopac = $this->initSinopac();
    $data = [
        'ShopNo'        => $sinopac->shop_no,
        'OrderNo'       => date('YmdHis'),
        'Amount'        => random_int(4000, 10000),
        'CurrencyID'    => 'TWD',
        'PrdtName'      => '大河',
        'ReturnURL'     => $request->getBaseUrl() . '/order_reply',
        'BackendURL'    => $request->getBaseUrl() . '/receive_msg',
        'PayType'       => 'A',
        'ATMParam'      => [
            'ExpireDate' => date('Ymd', time() + 604800),
        ],
    ];

    $data = $sinopac->requestDataset('OrderCreate', $data);
    $message = $sinopac->callApi('https://apisbx.sinopac.com/funBIZ/QPay.WebAPI/api/Order', $data);
    return $message;
}

// routes/api.php
Route::post('/create_order', [\App\Http\Controllers\Controller::class, 'create_order']);

0x3 好臭的虫 T_T

  1. 追踪了好一阵自发现 calculateHashId 那边有个问题,dechex 转换回来後没有补齐4位
    修改一下函数後长这样

    // 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");
            $b .= str_pad($part_of_b, 4, "0");
        }
        return strtoupper($a . $b);
    }
    
  2. 第二个虫是发生在 encryptMessage,没有做 key 的排序

    public function encryptMessage($data, $key, $iv): string
    {
        ksort($data);
        $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));
    }
    

0x4

  • 然後呢,还是一样 E3501 – 讯息内容错误,满天飞的虫阿RRRRRRRR,花了一堆时间抓虫...明天把范例程序搬过来测试好了,明天见

<<:  [Day06] Jekyll vs Hexo vs Hugo

>>:  Day6-网站阅读进度条(上)_到底哪里少算了

18.unity实例化(上)(Instantiate)

Instantiate实例化,用於将物件生成至场景中。(参考unity手册) 适合用在复制一样的物件...

Angular 深入浅出三十天:表单与测试 Day16 - Template Driven Forms vs Reactive Forms

这段期间,我们用 Template Driven Forms 与 Reactive Forms 各...

[day-11] 一切的基础! Python "运算式与算符"的运用(Part .1)

一、何谓运算式?   所谓的运算式是指『运算资料的式子』,其中代表着运算行为的符号称为 『算符』 ,...

[Day23] Rust 直接使用资料库语法操作资料库 (Part2)

那今天不说废话了直接开始 延续昨天的 我们已经建立出一个 main function 和 新增的 f...

Day 04 实现Linebot回复讯息功能

建立Chatbot程序 在专案资料夹内右键开启VS Code 左边工作区右键新增档案 将档案命名为a...