跳至主要內容
Mark Ku's Blog
.NET 10 · Apache 2.0 開源

dotnet-ecommerce-api

以 .NET 10 打造的電商後端 API 架構範本。分層架構、Autofac DI、SqlSugar ORM、Redis 快取與佇列、Hangfire 排程都接好了,金流再加一個 Provider 就能擴充。

★ 完全免費 · Apache 2.0▢ .NET 10 · MySQL / SQL Server · Redis · Docker
請求怎麼走過每一層
  1. Middlewares / Filters請求日誌、例外處理、驗證
  2. Controllers路由、模型驗證、ViewModel ⇄ DTO
  3. Services業務邏輯、交易、快取
  4. Payment Provider綠界、藍新,統一介面
  5. RepositoriesSqlSugar 資料存取
  6. MySQL / SQL Server · Redis資料、快取、佇列、排程
NordVPN
贊助

公共 Wi-Fi、出國連線,交給 NordVPN

一鍵加密全部流量,137 國節點隨你切換。1 帳號 10 台裝置,30 天退款保證。

含聯盟推廣連結

它幫你省下什麼

開一個新的電商後端,前兩週通常都花在這些事上。

🧱

從零搭分層

Controller、Service、Repository 各自一個專案,介面與實作分開(IServices / IRepository)。新功能照命名慣例放進對應的層就好,不必每次重新討論東西該放哪裡。

🔌

一個一個手動註冊 DI

Autofac 依命名慣例自動註冊 Service 與 Repository,新增類別不必回頭改註冊程式,也能用 Castle DynamicProxy 掛 AOP。

💳

每接一家金流就重寫一次

所有金流商實作同一個 IPaymentProvider,由 Factory 依付款方式建立。新增一家只要實作一個 Provider、加一段設定,呼叫端完全不用改。

⏱

背景工作與佇列另外拼

Hangfire 排程(Redis / MySQL storage)與 Redis Message Queue 已經接好,寄信、對帳這類非同步工作有固定的位置放。

🔐

金鑰散落在設定檔

appsettings.json 只是範本,機敏欄位都是佔位值。本機用 appsettings.Development.json(已被 .gitignore 排除),容器用環境變數以 __ 覆寫任何欄位。

🧪

金流不敢改

金流模組有獨立的 xUnit 測試專案,用綠界官方公開的測試商店參數與藍新假資料,不會連到正式環境。

裡面有什麼

電商後端常見的基礎建設都已經接好,直接在上面寫業務邏輯。

🏗

分層架構

Controller → Service → Repository → Database,介面與實作分離。

🧩

Autofac DI

依命名慣例自動註冊 Service / Repository,支援 AOP(Castle DynamicProxy)。

🗃

SqlSugar ORM

MySQL / MariaDB 與 SQL Server 用設定切換。

🔑

JWT 認證

JWT Bearer 加自訂 Policy 授權。

⚡

Redis 快取與佇列

Redis 快取、Redis Message Queue(InitQ)。

🗓

Hangfire 排程

背景工作與 Dashboard,Storage 可用 Redis 或 MySQL。

💳

金流 Provider

統一 IPaymentProvider 介面加 Factory,內建綠界與藍新。

🧰

其他工具

Swagger、NLog + Seq 結構化日誌、AutoMapper、MiniProfiler、Turnstile / reCAPTCHA、CRUD 程式碼產生器。

金流模組:加一家,只寫一個 Provider

EC226.Payment 用 Strategy 加 Factory 設計,每家金流商都實作同一個介面。

IPaymentProvider.cs
public interface IPaymentProvider
{
    PaymentProviderType ProviderType { get; }
    PaymentResponse CreatePayment(PaymentRequest request);
    PaymentCallbackResult ValidateCallback(IFormCollection form);
    PaymentCallbackResult ValidateCallback(string encryptedData);
    string GenerateCallbackResponse(bool success);
}

var provider = _providerFactory.Create(PaymentType.ECPAY);
var response = provider.CreatePayment(request);

新增一家金流商

  1. 1

    在 Providers/{Name}/ 實作 IPaymentConfig 與 IPaymentProvider。

  2. 2

    在 PaymentProviderFactory 加入對應的建立邏輯。

  3. 3

    在 appsettings.json 的 Payment:Providers 新增設定區段。

  4. 4

    在 EC226.MemberSite.Services 繼承 PaymentServiceBase 實作服務。

目前支援

  • 綠界 ECPay

    信用卡、ATM、超商代碼、超商取貨付款(CheckMacValue SHA256 簽章)

  • 藍新 Newebpay

    信用卡、WebATM、ATM 轉帳(AES-256-CBC 加密 + SHA256 TradeSha)

  • Stripe / PayPal / Amazon Pay

    透過 Payment:PaymentOptions 設定

專案結構

一個方案拆成多個專案,各自只做一件事。

EC226.MemberSite.Api

Web API 進入點:Controllers、Program.cs、設定檔、郵件範本

EC226.MemberSite.Services / IServices

業務邏輯實作與介面

EC226.MemberSite.Repository / IRepository

資料存取實作(SqlSugar)與介面

EC226.MemberSite.Model

Entities、ViewModels、DTOs、常數

EC226.Payment

金流模組:Abstractions / Factory / Providers

EC226.Auth

JWT 認證授權

EC226.Core

DI、SqlSugar、Redis、Swagger 註冊

EC226.Caching

快取抽象(Redis / Memory)

EC226.RedisMQ

Redis 訊息佇列消費者

EC226.Task

Hangfire 背景工作

EC226.Filter / Middlewares

Action / Exception Filters、請求日誌、IP 紀錄

EC226.CodeGenerator

CRUD 程式碼產生器範本

技術堆疊

都是 .NET 生態系裡成熟、好找資料的套件。

Framework.NET 10 / ASP.NET Core
ORMSqlSugar
DI ContainerAutofac
DatabaseMySQL / MariaDB / SQL Server
Cache / MQRedis(StackExchange.Redis、InitQ)
Background JobsHangfire
AuthJWT
API DocsSwagger / Swashbuckle
LoggingNLog + Seq
TestingxUnit + FluentAssertions

開始之前要知道的事

先講清楚,免得 clone 下來才發現跑不起來。

  1. 1

    這是架構開源,金鑰要自己填

    所有金鑰、密碼、連線字串、內部主機位址都已移除,appsettings.json 只留佔位值。資料庫、Redis、JWT、AES、SMTP、金流的 HashKey / HashIV 都要換成你自己的值才能跑。

  2. 2

    需要 .NET 10 SDK、資料庫與 Redis

    MySQL 5.7+ / MariaDB 10.4+(或 SQL Server)加上 Redis。repo 附了建置本機 Redis 的腳本與 MariaDB 的 Dockerfile,用 Docker 起最快。

  3. 3

    範例資料庫要另外匯入

    啟動資料庫後,匯入 EC226.MemberSite.Api/initMariadb/ 底下的 schema 與種子資料 SQL。init.sql 建立的帳號預設密碼是 change_me,記得改掉並同步更新連線字串。

從原始碼跑起來

  1. 1

    git clone https://github.com/markku636/dotnet-ecommerce-api 並進入專案目錄。

  2. 2

    用 build-local-redis-de.ps1 起 Redis,用 EC226.MemberSite.Api/initMariadb 的 Dockerfile 起 MariaDB,再匯入範例 schema。

  3. 3

    複製 EC226.MemberSite.Api/appsettings.json 成 appsettings.Development.json,填入連線字串與金鑰。

  4. 4

    dotnet restore、dotnet build,再 dotnet run --project EC226.MemberSite.Api。

  5. 5

    開 http://localhost:<port>/doc 看 Swagger。要部署就用 EC226.MemberSite.Api/Dockerfile 建映像檔,機敏設定用環境變數注入。

先確認能建置(不需要資料庫):

授權

Apache License 2.0。可以商用、修改、再散布,保留授權與著作權聲明即可。這是架構範本,不含任何正式環境的設定或資料;金流測試只用官方公開的測試商店參數。

看完整授權條款

下一個電商後端,從這裡開始

Fork 下來、換掉佔位值、把你的業務邏輯放進 Service 層。覺得有幫助的話,給個 Star 讓更多人看到。

贊助開源

這些工具都是免費且開源的

沒有付費牆、不用註冊帳號,程式碼全部公開在 GitHub。如果它幫你省下了時間,可以請我喝杯咖啡,讓後續的更新跟新工具繼續做下去。

請我喝杯咖啡

自訂金額·PayPal 安全結帳

NordVPN

站長優惠

寫程式的地方,網路常常不是你的

NordVPN 把你的連線整條加密:咖啡廳與飯店 Wi-Fi 不再是別人的監聽管道,出差時銀行 App、公司後台、台灣的影音服務照樣連得回去。開 App 按一顆鈕就好,NordLynx 協定跑起來日常上網幾乎無感,一個帳號可以同時保護 10 台裝置。30 天退款保證,不合用全額退。

  • 公共 Wi-Fi 全程加密,攔到也只是亂碼
  • 137 國節點,出國連得回台灣服務
  • 1 帳號 10 台裝置,30 天退款保證

含聯盟推廣連結