[Day28] 第二十八章-查询订单api (express)

前言

前面完成建立订单的api後
我们今天要把查询订单做完

扣除今天剩下2天的时间
今天在把查询做完後
我希望可以把laravel串完

後续预告

我们要做的交换功能还没完成呢!
/images/emoticon/emoticon02.gif
希望可以剩下几天把它完成

新功能技能交换:

付款金额情境如下
我们在前几天完成了技能评分後0~5代表该会员技能等级
我们会把其他使用者对该使用者的评分做总和 假如 有2位评分roni 微积分为例,分别是3,1分。那roni微积分的等级就是(3+1)/2 = 2分

有了该技能等级後,我们可以跟其他使用者交换相同等级的技能!
假如有一位使用者叫做Kevin他会coding 技能点数总评分後等级为3分!!

这时後roni因为不足kevin等级1分
我们就会向roni索取
等级差乘上1000的费用作为给Kevin的教学费用!

那我们订单范例 就会开一个新订单 对roni计算

Roni与Kevin等级差(1) * 1000(补偿费) = API收取金费总额(1000*1)

也算是技能在交换中补足高分者的小补偿吧!

目标

  1. nodejs 把订单查询做完
  2. 确认信用卡是否有成功并导向付款画面

勘误

在我的creadeOrder APi中修正一些地方

app.post("/createOrder", async function (req, res) {
  // auto pay string
  const { OrderNo, Amount } = { ...req.body };
  let ddmsg = {
    ShopNo: "NA0249_001",
    OrderNo,
    Amount: Amount * 1,
    CurrencyID: "TWD",
    PayType: "C",
    PrdtName: "pp",
    ReturnURL: "http://10.11.22.113:8803/QPay.ApiClient-Sandbox/Store/Return",
    BackendURL:
      "https://sandbox.sinopac.com/funBIZ.ApiClient/AutoPush/PushSuccess",
  };
  let msg = {
    ShopNo: "NA0249_001",
    OrderNo,
    Amount: Amount * 1,
    CurrencyID: "TWD",
    PayType: "C",
    PrdtName: "pp",
    CardParam: { AutoBilling: "Y" },
    ReturnURL: "http://10.11.22.113:8803/QPay.ApiClient-Sandbox/Store/Return",
    BackendURL:
      "https://sandbox.sinopac.com/funBIZ.ApiClient/AutoPush/PushSuccess",
  };
  const Version = "1.0.0";
  const ShopNo = "NA0249_001";
  const APIService = "OrderCreate";
  const Nonce = await callnonce();
  const signData = getsign(Nonce, ddmsg);
  const Message = decmessage(Nonce, JSON.stringify(msg));
  // console.log(Nonce);
  // console.log(signData);
  // console.log(Message);
  return axios
    .post("https://apisbx.sinopac.com/funBIZ/QPay.WebAPI/api/Order", {
      Version,
      ShopNo,
      APIService,
      Sign: signData,
      Nonce,
      Message,
    })
    .then(({ data }) => {
      return res.send(data);
    })
    .catch((data) => {
      return res.send(data);
    });
});

我多了ddmsg跟msg
昨天建立订单很开心
但是发现解密後签章错误
原因是我没有把签章规则看清楚

在制作sign字的字串空物件跟有多余物件的字串都不采用
https://ithelp.ithome.com.tw/upload/images/20211013/20121052U2SJIqfCxg.png
上面就有三个参数不采用

"ATMParam": { "ExpireDate": "20180502" },
"CardParam": { },
"ConvStoreParam": { },

但是在送加密後的message又需要他
那麽我这边改过的程序是先以物件做预设
把前端需要的参数(钱啊,编号)挖空格给req.body填写
剩下的就塞固定值

然後再加密密文中使用的msg在以JSON.stringify处理
原因是我们要把物件变成json字串的形式在做hash才会正确喔!!!

前面有做错的的地方跟你们抱歉/images/emoticon/emoticon02.gif

如果成功後解密应该会看到付款url
跟成功讯息
基本上有拿到下面的付款url就是有成功瞜!
https://ithelp.ithome.com.tw/upload/images/20211013/20121052VSbh29y2Lg.png

实作

1. orderQuery API

这个是我的订单查询api
我把一些参数设定好分别是ddmsg跟msg
ddmsg是我做签章(sign)用的 因为我在前面签章函式忘了要先用物件形式把多余的字串filter掉

pp.post("/OrderQuery", async function (req, res) {
  // auto pay string
  const { OrderNo, Amount } = { ...req.body };
  let ddmsg = {
    ShopNo: "NA0249_001",
    OrderNo: "A2020010100000000",
  };
  let msg = {
    ShopNo: "NA0249_001",
    OrderNo: "A2020010100000000",
  };
  const Version = "1.0.0";
  const ShopNo = "NA0249_001";
  const APIService = "OrderQuery";
  const Nonce = await callnonce();
  const signData = getsign(Nonce, ddmsg);
  const Message = decmessage(Nonce, JSON.stringify(msg));
  // console.log(Nonce);
  // console.log(signData);
  // console.log(Message);
  return axios
    .post("https://apisbx.sinopac.com/funBIZ/QPay.WebAPI/api/Order", {
      Version,
      ShopNo,
      APIService,
      Sign: signData,
      Nonce,
      Message,
    })
    .then(({ data }) => {
      return res.send(data);
    })
    .catch((data) => {
      return res.send(data);
    });
});

接者我们来测试查询吧
第一次我没有设定筛选条件结果
https://ithelp.ithome.com.tw/upload/images/20211013/20121052ZB1pHQFoVO.png

想说我的订单怎这麽大包回传讯息
结果丢到解密API中发现
https://ithelp.ithome.com.tw/upload/images/20211013/20121052GOeMFOEEd8.png

这是什麽原因呢!?
/images/emoticon/emoticon04.gif
傻眼猫猫

2. Express limit

查了很久後发现
express 有request的限制
其他小夥伴可以看自己使用的程序框架有没有限制
如果跟我一样用express的
可以在上面加上

app.use(express.json({ limit: "100mb" }));

也就是我们前面的解析body的middleware增加限制参数
我把它改高一点就可以喽

那解析完结果发现
https://ithelp.ithome.com.tw/upload/images/20211013/20121052cCeay9abFO.png

因为没有多给条件
我们把其他前辈的交易纪录忆起抓来了/images/emoticon/emoticon04.gif

难怪这麽大包!!

後来我们改个条件也就是多订单编号的参数後
https://ithelp.ithome.com.tw/upload/images/20211013/20121052Zu1YRUi7KV.png

我们就拿到属於自己这笔的订单交易纪录拉!

总结

好啦!
前面发现前面零碎参数制作都没有问题
结果整套执行下来才发现问题一大堆~

不过到这边後我也对金流的付款机制有了一定程度的了解
感谢永丰爸爸 跟 IT邦的机会
我才有这个动力去练习~
接下来几天我们把它做完吧!!
/images/emoticon/emoticon12.gif

有兴趣参考我程序码的可以到我
github上看喔
IT铁人2021使用nodejs打造api串接


<<:  Day28 NodeJS实作 II

>>:  [第二十八只羊] 迷雾森林顶尖对决 登入介面套版

Day22 - Shioaji X Backtesting -双均线策略

Shioaji X Backtesting -双均线策略 好啦!经过这麽多堂课,相信大家对Backt...

【I Love Vue 】 Day 30 赛後心得与检讨

最後一天了,不免俗的来心得分享一下。 第一次写教学文,没做任何准备就提枪上阵来参加铁人。 老实说每天...

[Day15]汇总函数(分组函数)

汇总函数是以多笔资料列为基础,输入的资料列经过函数运算後,一组只会输出一个值,基本特性如下: 可将一...

作业系统 Critical section

记录学习内容。 以下内容大多引用大大们的文章,加上一些自己的笔记。 自己的笔记部分,内容可能有错误。...

Day 10 情报收集 - Information Gathering (Maltego)

Maltego在Kali里是一套收集资讯用的工具,可以去收集网域的一些公开资讯,也可以去收集像是电子...