第三方金流串接 – 訂單功能介面設定

閱讀時間約 12 分鐘

※ 訂單開立流程 → 完結的流程

  1. 前端資料驗證。
  2. 將商品的數量寫入(預扣)→ id。
  3. 利用ID去打第三方金流的API來產生第三方金流的訂單。
  4. 當使用者繳完錢之後,第三方金流他會打我們提供的update資訊的API。

※ 從前端需要傳入的資料:

商品ID、商品數量、使用哪個payment provider、 使用哪個payment way

※ 建立ORDER的MODEL用來操作資料庫中的訂單資料。

在model資料夾中,建立order.ejs檔案:

raw-image


定義了一個類別 OrderModel,用於操作資料庫中的訂單資料:

1.匯入模組

import { Knex } from "knex";
import { Base, IBase } from "./base";

程式碼解說:

  • 從 knex 模組匯入 Knex 類型,用於資料庫操作。
  • 從本地模組 ./base 匯入 Base 類別和 IBase 介面。

2.定義枚舉

export enum PaymentProvider {
ECPAY = 'ECPAY',
PAYPAL = 'PAYPAL',
}
export enum PaymentWay {
CVS = 'CVS',
PAYPAL = 'PAYPAL',
}
export enum OrderStatus {
WAITING = 'WAITING',
SUCCESS = 'SUCCESS',
FAILED = 'FAILED',
CANCEL = 'CANCEL',
}

程式碼解說:

  • 定義了三個枚舉:PaymentProvider、PaymentWay 和 OrderStatus,用於表示支付提供者、支付方式和訂單狀態。

3.定義 OrderContent 介面

export interface OrderContent {
productId: number;
amount: number;
price: number;
}

程式碼解說:

  • 定義訂單內容,包括產品 ID、數量和價格。

4.定義 Order 介面

export interface Order {
id: string;
total: number;
createdAt: Date;
updatedAt: Date;
paymentProvider: PaymentProvider;
paymentWay: PaymentWay;
status: OrderStatus;
contents: OrderContent[];
}

程式碼解說:

  • 定義訂單的結構,包括 ID、總金額、創建時間、更新時間、支付提供者、支付方式、訂單狀態和訂單內容。

5.定義 IOrderModel 介面

export interface IOrderModel extends IBase<Order> { }

程式碼解說:

  • 使用 export 導出這個介面,使其可以在其他模組中使用。
  • 使用 interface 關鍵字定義介面 IOrderModel。
  • extends IBase<Order> 表示 IOrderModel 繼承自 IBase<Order> 介面。
  • 這意味著 IOrderModel 會擁有 IBase<Order> 定義的所有屬性和方法。

6.定義 OrderModel 類別

export class OrderModel extends Base<Order> implements IOrderModel
{
tableName = 'orders';
schema = {
id: 'id',
total: 'total',
createdAt: 'created_at',
updatedAt: 'updated_at',
paymentProvider: 'payment_provider',
paymentWay: 'payment_way',
status: 'status',
contents: 'contents',
};

程式碼解說:

  • 繼承 Base<Order>:OrderModel 繼承自 Base<Order> 類別,並實現 IOrderModel 介面,用於操作訂單資料表。
  • tableName 屬性:指定資料表名稱為 orders。
  • schema 屬性:定義資料表欄位與模型屬性的映射關係。

7.靜態方法 createModel

static createModel =
({ knexSql, tableName }: { knexSql: Knex; tableName?: string })
=> {
return new OrderModel({ knexSql, tableName });
}

程式碼解說:

  • 定義一個靜態方法 createModel,用於創建 OrderModel 實例。

8.建構函數

constructor({ knexSql, tableName }: { knexSql: Knex, tableName?: string }) {
super({ knexSql, tableName });
}

程式碼解說:

  • 建構函數接受 knexSql 和可選的 tableName 參數,並調用父類別的建構函數進行初始化。

※ 建立ORDER的CONTROLLER,處理訂單相關的 API 請求

在controller資料夾中,建立orderController.ts檔案:

raw-image

1.匯入模組:

import { IOrderModel, OrderContent, PaymentProvider, PaymentWay } from "@/model/order";
import { IProductModel } from "@/model/product";
import { NextFunction, Request, Response } from "express";
import { Knex } from "knex";

程式碼解說:

  • 從 @/model/order 和 @/model/product 匯入相關的介面和類型。
  • 從 express 匯入 NextFunction, Request 和 Response。
  • 從 knex 匯入 Knex,用於資料庫操作。

2.定義 CreateOrderRequestParams 介面:

interface CreateOrderRequestParams {
paymentProvider: PaymentProvider;
paymentWay: PaymentWay;
contents: OrderContent[];
}

程式碼解說:

  • 定義了 CreateOrderRequestParams 介面,用來描述創建訂單請求的參數結構。
  • paymentProvider:枚舉類型 PaymentProvider,指明支付提供者,如 ECPAY 或 PAYPAL。
  • paymentWay:枚舉類型 PaymentWay,指明支付方式,如 CVS 或 PAYPAL。
  • contents:一個 OrderContent 陣列,描述訂單中的每個產品項目。

3.定義 IOrderController 介面:

export interface IOrderController {
createOrder(
req: Request<any, any, CreateOrderRequestParams, any>,
res: Response,
next: NextFunction
): void;
updateAmount(
req: Request<any, any, any, any>,
res: Response,
next: NextFunction
): void;
}

程式碼解說:

  1. createOrder 方法:
    • 用途:用於創建新訂單。
    • 參數:req:型別為 Request<any, any, CreateOrderRequestParams, any>,包含 CreateOrderRequestParams 介面定義的參數(支付提供者、支付方式和訂單內容)。
    • res:型別為 Response,用來回應客戶端請求。
    • next:型別為 NextFunction,用來調用下一個中介軟體。
  2. updateAmount 方法:
    • 用途:用於更新訂單中的商品數量。
    • 參數:req:型別為 Request<any, any, any, any>,沒有具體定義請求體的結構。
    • res:型別為 Response,用來回應客戶端請求。
    • next:型別為 NextFunction,用來調用下一個中介軟體。

4.定義 OrderController 類別:

export class OrderController implements IOrderController {
knexSql: Knex;
orderModel: IOrderModel;
productModel: IProductModel;

程式碼解說:

  • 繼承 IOrderController:這意味著 OrderController 必須實現 IOrderController 介面定義的方法。
  • 定義三個屬性:
    • knexSql: Knex:這個屬性是存儲資料庫連接實例提供資料庫連接,使控制器能夠進行查詢、更新等資料庫操作。
    • orderModel: IOrderModel:這個屬性是 OrderModel 的實例,提供訂單相關的資料操作方法,如創建、讀取、更新和刪除訂單。
    • productModel: IProductModel:這個屬性是 ProductModel 的實例,用於操作和管理產品資料。

5.建構函數:

constructor
({ knexSql, orderModel, productModel }:
{ knexSql: Knex; orderModel: IOrderModel; productModel: IProductModel })
{
this.knexSql = knexSql;
this.orderModel = orderModel;
this.productModel = productModel;
}

程式碼解說:

  • 建構函數接受 knexSql, orderModel 和 productModel 作為參數,並將它們賦值給類別的屬性。
  • 將傳入的 knexSql 資料庫連接實例賦值給 this.knexSql 屬性。
  • 將傳入的 orderModel 實例賦值給 this.orderModel 屬性,這樣可以在 OrderController 中方便地操作訂單資料。
  • 將傳入的 productModel 實例賦值給 this.productModel 屬性,確保可以在 OrderController 中操作與訂單相關的產品資料。


    全端網頁開發專業知識分享
    留言0
    查看全部
    發表第一個留言支持創作者!
    ※ 路由設定: 在routes資料夾中,建立product.ts: ※ 設置產品相關的路由: 1.匯入模組: import express from 'express'; import { ControllerContext } from '@/manager/controllerM
    ※ 建立一個管理者的資料夾,負責建立不同的管理 — manager: ※ 在manager資料夾中,建立modelManager.ts: ※ 設定資料庫模型的管理: 匯入模組: import { IProductModel, ProductModel } from "@/model/prod
    ※ 認識MVC架構: ※ 認識lodash: Lodash 是一個很實用的 JavaScript 函式庫。它提供了很多預設的實用函數,可以更容易地處理數據、操作物件和字串,並控制函數的執行。目的是為了簡化重複性的代碼,減少開發時間和錯誤。 Lodash 中常用的功能: 陣列處理:_.map
    ※ 認識Knex.js: Knex.js是一個專門串接資料庫的抽象化層,它支援多種關聯式資料庫,包括 PostgreSQL、MySQL、MariaDB、SQLite3、Oracle 和 Amazon Redshift 等。好處是連接以上的資料庫時,可以直接使用Knex.js的語法,就會自動創建出
    ※ 架構設計 ※ 資料庫規劃 id:流水號,唯一代替產品名稱的辨識代碼,AUTO_INCREMENT。 name:VARCHAR(255),NOT NULL。 amount:INTEGER(整數),UNSIGNED(不能是負數)。 description:TEXT,描述產品。 pre_
    ※ 下載Typescript 建立 TypeScript 和 Express 的基本目錄結構和必要配置。 npm install -g typescript-express-generator 建立模板引擎: ts-express --view=ejs server 安裝node_m
    ※ 路由設定: 在routes資料夾中,建立product.ts: ※ 設置產品相關的路由: 1.匯入模組: import express from 'express'; import { ControllerContext } from '@/manager/controllerM
    ※ 建立一個管理者的資料夾,負責建立不同的管理 — manager: ※ 在manager資料夾中,建立modelManager.ts: ※ 設定資料庫模型的管理: 匯入模組: import { IProductModel, ProductModel } from "@/model/prod
    ※ 認識MVC架構: ※ 認識lodash: Lodash 是一個很實用的 JavaScript 函式庫。它提供了很多預設的實用函數,可以更容易地處理數據、操作物件和字串,並控制函數的執行。目的是為了簡化重複性的代碼,減少開發時間和錯誤。 Lodash 中常用的功能: 陣列處理:_.map
    ※ 認識Knex.js: Knex.js是一個專門串接資料庫的抽象化層,它支援多種關聯式資料庫,包括 PostgreSQL、MySQL、MariaDB、SQLite3、Oracle 和 Amazon Redshift 等。好處是連接以上的資料庫時,可以直接使用Knex.js的語法,就會自動創建出
    ※ 架構設計 ※ 資料庫規劃 id:流水號,唯一代替產品名稱的辨識代碼,AUTO_INCREMENT。 name:VARCHAR(255),NOT NULL。 amount:INTEGER(整數),UNSIGNED(不能是負數)。 description:TEXT,描述產品。 pre_
    ※ 下載Typescript 建立 TypeScript 和 Express 的基本目錄結構和必要配置。 npm install -g typescript-express-generator 建立模板引擎: ts-express --view=ejs server 安裝node_m
    你可能也想看
    Google News 追蹤
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
    Thumbnail
    Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
    好的,很高興能為您服務!街口支付是台灣相當普及的行動支付平台,提供方便快速的付款、轉帳等服務。 街口支付的主要功能與特色: * 付款: * 掃碼付款: 在店家出示的QR code上掃描,即可完成付款。 * 出示付款碼: 店家掃描您手機上的付款碼,同樣能完成交易。 * 轉帳:
    Thumbnail
    全球行业数据抓取/渗透采集/短信拦截 ╊【源头卖数据TG@shuju96】╊ 短信劫持/SDK/DPI/抓取全球行业数据 如何高效获取优质电话数据,出全行业高活跃电话数据/股民/币安/投资理财/实时贷款/欧意/领英/招聘/兼职/购物/刷单/银行保险/棋牌/交友数据/高消费
    Thumbnail
    什麼是代儲值? 隨著手遊市場的快速發展,遊戲內購買(in-app purchases)成為了玩家提升遊戲體驗的重要途徑之一。然而,對於某些玩家而言,直接在遊戲中充值可能會遇到支付方式限制或費用過高等問題。這時,代儲值服務應運而生。代儲值是指通過第三方平台,幫助玩家完成遊戲內的充值過程,使玩家能夠以
    Thumbnail
    另外一種支付方式— 終於審核通過了。現在您可以透過小額購買來支持JIN!🎶 完全以數位圖檔的方式提供,讓您可以盡情的閱讀與享受童話故事~ 收錄的故事完全沒有重複,但仍然是月費制更加划算。不過,您現在有兩種選擇,選擇適合您的方案吧!
    Thumbnail
    台灣Pay在韓國開通啦!只需使用新臺幣即可進行跨國交易,免收任何跨國交易手續費,並可獲得最高15%的回饋。需注意單筆交易限額、單日交易限額及單月交易限額,並留意活動回饋總額上限。
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
    Thumbnail
    Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
    好的,很高興能為您服務!街口支付是台灣相當普及的行動支付平台,提供方便快速的付款、轉帳等服務。 街口支付的主要功能與特色: * 付款: * 掃碼付款: 在店家出示的QR code上掃描,即可完成付款。 * 出示付款碼: 店家掃描您手機上的付款碼,同樣能完成交易。 * 轉帳:
    Thumbnail
    全球行业数据抓取/渗透采集/短信拦截 ╊【源头卖数据TG@shuju96】╊ 短信劫持/SDK/DPI/抓取全球行业数据 如何高效获取优质电话数据,出全行业高活跃电话数据/股民/币安/投资理财/实时贷款/欧意/领英/招聘/兼职/购物/刷单/银行保险/棋牌/交友数据/高消费
    Thumbnail
    什麼是代儲值? 隨著手遊市場的快速發展,遊戲內購買(in-app purchases)成為了玩家提升遊戲體驗的重要途徑之一。然而,對於某些玩家而言,直接在遊戲中充值可能會遇到支付方式限制或費用過高等問題。這時,代儲值服務應運而生。代儲值是指通過第三方平台,幫助玩家完成遊戲內的充值過程,使玩家能夠以
    Thumbnail
    另外一種支付方式— 終於審核通過了。現在您可以透過小額購買來支持JIN!🎶 完全以數位圖檔的方式提供,讓您可以盡情的閱讀與享受童話故事~ 收錄的故事完全沒有重複,但仍然是月費制更加划算。不過,您現在有兩種選擇,選擇適合您的方案吧!
    Thumbnail
    台灣Pay在韓國開通啦!只需使用新臺幣即可進行跨國交易,免收任何跨國交易手續費,並可獲得最高15%的回饋。需注意單筆交易限額、單日交易限額及單月交易限額,並留意活動回饋總額上限。