更新於 2024/10/24閱讀時間約 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檔案:

    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 中操作與訂單相關的產品資料。


    分享至
    成為作者繼續創作的動力吧!
    © 2024 vocus All rights reserved.