基於 W3C Verifiable Credentials 標準的去中心化數位優惠券系統
信任券鏈 (TrustCoupon) 是一個基於台灣數位發展部 (MODA) 數位憑證皮夾沙盒環境開發的去中心化優惠券管理系統。本系統實現了 W3C Verifiable Credentials (VC) 和 Decentralized Identifiers (DID) 標準,提供安全、透明、可驗證的數位優惠券發行與驗證服務。
- 去中心化: 消費者完全掌控自己的優惠券資料。
- 離線驗證: 商家可在無網路環境下驗證憑證有效性。
- 安全可靠: 基於政府數位基礎設施,確保憑證真實性。
本專案參與「2025 數位發展部數位憑證場景創新賽」,展示數位憑證在商業場景的實際應用。
- 零售業: 商家發行折價券、會員優惠。
- 餐飲業: 餐廳折扣券、滿額優惠。
- 電商平台: 統一優惠券管理,跨商家使用。
- 企業福利: 員工優惠券、企業禮券。
- 互動式折扣金額決定機制。
- 100-900 元隨機抽選。
- 視覺化旋轉動畫效果。
- 增加發券過程趣味性。
- ES256 數位簽章。
- NIST P-256 橢圓曲線加密。
- SD-JWT 選擇性揭露。
- Status List 撤銷機制。
- Web 管理介面 (商家端)。
- 數位憑證皮夾 APP (消費者端)。
- 響應式設計,支援行動裝置。
- 直覺化操作介面。
- 即時 QR Code 產生。
- 三步驟驗證流程。
- 詳細交易記錄。
┌─────────────────────────────────────────────────────────┐
│ TrustCoupon 系統架構 │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ 商家前端 │ │ 驗證端前端 │ │
│ │ (React) │ │ (React) │ │
│ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ │ Frontend Layer │ │
│ ═══════╪═════════════════════════════╪════════ │
│ │ │ │
│ │ Backend Layer │ │
│ │ │ │
│ ┌──────▼─────────────────────────────▼───────┐ │
│ │ API Server (Golang/Gin) │ │
│ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Issue API │ │ Verify API │ │ │
│ │ └─────────────┘ └─────────────┘ │ │
│ └──────┬──────────────────────┬──────────────┘ │
│ │ │ │
│ ┌──────▼──────┐ ┌──────▼──────┐ │
│ │ SQLite │ │ MODA APIs │ │
│ │ Database │ │ │ │
│ └─────────────┘ │ - Issuer │ │
│ │ - Verifier │ │
│ └─────────────┘ │
└─────────────────────────────────────────────────────────┘
- 語言: Go 1.21+
- 框架: Gin Web Framework
- 資料庫: SQLite3
- HTTP 客戶端: net/http
- UUID 生成: google/uuid
- 框架: React 18.2+
- UI 組件: Ant Design 5.x
- HTTP 客戶端: Axios
- 日期處理: Day.js
- 圖示: Ant Design Icons
- MODA 發行端 API: https://issuer-sandbox.wallet.gov.tw
- MODA 驗證端 API: https://verifier-sandbox.wallet.gov.tw
必要資源:
- 發行端沙盒帳號
- 驗證端沙盒帳號
- Access Token (發行端)
- Access Token (驗證端)
- VC 模板 (已發布狀態)
- VP 模板 (已發布狀態)twdiw-demo-trustcoupon/
│
├── backend/ # 後端程式碼
│ ├── main.go # 主程式入口
│ ├── go.mod # Go 模組定義
│ ├── go.sum # 依賴版本鎖定
│ │
│ ├── config/ # 配置管理
│ │ └── config.go # 系統配置 (API Token, VC/VP 設定)
│ │
│ ├── models/ # 資料模型
│ │ ├── transaction.go # 交易記錄模型
│ │ ├── coupon.go # 優惠券模型
│ │ ├── verification.go # 驗證記錄模型
│ │ ├── request.go # API 請求結構
│ │ └── response.go # API 回應結構
│ │
│ ├── handlers/ # HTTP 處理器
│ │ ├── issue.go # 發行端處理器
│ │ └── verify.go # 驗證端處理器
│ │
│ ├── services/ # 業務邏輯服務
│ │ ├── moda_issuer.go # MODA 發行端 API 服務
│ │ └── moda_verifier.go # MODA 驗證端 API 服務
│ │
│ ├── database/ # 資料庫管理
│ │ └── db.go # SQLite 初始化與管理
│ │
│ └── trustcoupon.db # SQLite 資料庫檔案 (執行後生成)
│
├── frontend/ # 前端程式碼
│ ├── package.json # NPM 依賴定義
│ ├── package-lock.json # 依賴版本鎖定
│ │
│ ├── public/ # 靜態資源
│ │ ├── index.html # HTML 入口
│ │ ├── favicon.ico # 網站圖示
│ │ └── manifest.json # PWA 配置
│ │
│ └── src/ # 原始碼
│ ├── index.js # React 入口
│ ├── index.css # 全域樣式
│ ├── App.jsx # 主應用組件
│ ├── App.css # 應用樣式
│ │
│ ├── components/ # React 組件
│ │ ├── IssuePanel.jsx # 發行優惠券面板
│ │ ├── VerifyPanel.jsx # 驗證優惠券面板
│ │ ├── SpinWheel.jsx # 幸運輪盤組件
│ │ └── SpinWheel.css # 輪盤樣式
│ │
│ └── services/ # API 服務
│ └── api.js # 後端 API 封裝
│
├── LICENSE # 授權條款
└── README.md # 專案說明 (本文件)
git clone https://github.com/your-username/trustcoupon.git
cd trustcouponcd backend
go mod download編輯 config/config.go:
const (
// VC 模板資訊 (從 MODA 沙盒取得)
VCId = "666971" // 您的 VC 模板序號
VCUid = "00000000_00000000_trustcoupon_discount" // 您的 VC 模板代碼
// VP 驗證資訊 (從 MODA 沙盒取得)
VPRef = "00000000_00000000_trustcoupon_discount" // 您的 VP 參考代碼
)
// Access Tokens (從註冊郵件取得)
var IssuerAccessToken = "your_issuer_token_here"
var VerifierAccessToken = "your_verifier_token_here"go run main.gocd frontend
npm installnpm start瀏覽器會自動開啟 http://localhost:3000
-
進入發行面板
- 點擊「📤 發行優惠券」頁籤
-
填寫消費者資訊
- 姓名: 輸入消費者中文姓名
- 折扣金額: 手動輸入或使用幸運輪盤
- 到期日期: 選擇優惠券有效期限
-
使用幸運輪盤 (可選)
- 點擊「幸運輪盤」按鈕
- 等待旋轉結束
- 系統自動填入隨機金額
- 可手動調整金額
-
產生 QR Code
- 點擊「產生 QR Code」
- 系統顯示 QR Code 和 Deep Link
- 消費者掃描 QR Code 下載憑證
-
產生驗證 QR Code
- 切換到「✅ 驗證優惠券」頁籤
- 點擊「產生驗證 QR Code」
- 系統產生驗證用 QR Code
-
消費者掃描
- 出示 QR Code 給消費者
- 消費者使用數位憑證皮夾 APP 掃描
- 消費者選擇要提供的憑證並上傳
-
輸入消費金額
- 輸入本次消費金額 (預設 2000 元)
- 點擊「驗證並計算折扣」
-
查看結果
- 系統顯示:
- 消費者姓名
- 折扣金額
- 到期日期
- 原價
- 實付金額 (大字顯示)
- 系統顯示:
-
領取優惠券
- 開啟數位憑證皮夾 APP
- 掃描商家提供的發行 QR Code
- 確認優惠券資訊
- 下載到皮夾
-
使用優惠券
- 告知商家要使用優惠券
- 掃描商家提供的驗證 QR Code
- 選擇要使用的優惠券
- 確認提供資料
-
完成交易
- 商家顯示折扣後金額
- 支付實付金額
- 交易完成