Go工程師體系課 008【學習筆記】

訂單及購物車

先從庫存服務中將 srv 的服務程式碼框架複製過來,查找替換對應的名稱(order_srv)

加密技術基礎

對稱加密(Symmetric Encryption)

原理:

  • 使用同一個金鑰進行加密和解密
  • 就像一把鑰匙,既能鎖門也能開門
  • 加密速度快,適合大量資料傳輸

使用情境:

  • 本機檔案加密
  • 資料庫內容加密
  • 大量資料傳輸時的內容加密
  • 內部系統間的快速通訊

優缺點:

  • ✅ 速度快,效率高
  • ❌ 金鑰分發困難,容易被截獲

非對稱加密(Asymmetric Encryption)

原理:

  • 使用一對金鑰:公開金鑰和私密金鑰
  • 公開金鑰加密的內容只能用私密金鑰解密
  • 私密金鑰簽名的內容可以用公開金鑰驗證
  • 就像電子郵件地址(公開金鑰)和密碼(私密金鑰)

使用情境:

  • 數位簽章驗證身份
  • 安全傳輸對稱加密的金鑰
  • HTTPS 憑證驗證
  • 區塊鏈交易簽章

優缺點:

  • ✅ 安全性高,金鑰分發安全
  • ❌ 速度慢,不適合大量資料

支付寶支付流程詳細解析

支付流程圖

graph TD
    A[用戶瀏覽器] -->|1. 下訂單| B[慕學生鮮商戶系統]
    B -->|2. 返回支付URL| A
    A -->|3. 跳轉支付寶支付| C[支付寶支付平台]
    B -->|發起支付請求| C

    subgraph "商戶端密鑰管理"
        D[商戶私鑰<br/>自己留著]
        E[商戶公鑰<br/>給支付寶]
    end

    subgraph "支付寶端密鑰管理"
        F[支付寶私鑰<br/>嚴格保密]
        G[支付寶公鑰<br/>給商戶]
    end

    subgraph "安全驗證機制"
        H[數字簽名驗證]
        I[請求可信度檢查]
        J[通知真實性驗證]
    end

    B -.->|使用私鑰簽名| D
    C -.->|使用公鑰驗證| E
    C -.->|使用私鑰簽名| F
    B -.->|使用公鑰驗證| G

    C -->|4. 支付結果通知| B

    style A fill:#e1f5fe
    style B fill:#f3e5f5
    style C fill:#e8f5e8
    style D fill:#ffebee
    style E fill:#fff3e0
    style F fill:#ffebee
    style G fill:#fff3e0
    style H fill:#f1f8e9
    style I fill:#f1f8e9
    style J fill:#f1f8e9

系統架構和參與者

三個核心角色:

  • 瀏覽器(Browser):使用者端,負責使用者互動
  • 慕學生鮮(商家系統):電商平台的後端服務
  • 支付寶(Alipay):第三方支付平台

金鑰管理體系(非對稱加密的核心)

商家端金鑰管理

  • 私密金鑰(密鑰 - 自己留著)
  • 商家嚴格保密,絕不外洩
  • 用於對發送給支付寶的請求進行數位簽章
  • 證明請求確實來自該商家
  • 公開金鑰(公開金鑰 - 給支付寶)
  • 提供給支付寶平台
  • 支付寶用它來驗證商家請求的簽章
  • 確保請求的真實性和完整性

支付寶端金鑰管理

  • 私密金鑰(密鑰)
  • 支付寶嚴格保密
  • 用於對支付通知進行數位簽章
  • 證明通知確實來自支付寶官方
  • 公開金鑰(公開金鑰 - 給自己的)
  • 提供給商家系統
  • 商家用它來驗證支付寶通知的簽章
  • 確保支付結果通知的真實性

詳細支付流程步驟

步驟 1:使用者下單

  • 使用者在瀏覽器中瀏覽商品
  • 選擇商品並提交訂單
  • 瀏覽器向商家系統發送訂單請求

步驟 2:產生支付請求(關鍵安全步驟)

商家系統處理:

  1. 接收使用者訂單資訊
  2. 建構支付參數(訂單號、金額、商品資訊等)
  3. 使用商家私密金鑰對支付請求進行數位簽章
  4. 將簽章後的請求發送給支付寶

支付寶驗證:

  1. 接收商家的支付請求
  2. 使用商家公開金鑰驗證請求簽章
  3. 檢查「這個請求是否可信任」
  4. 驗證通過後,產生支付 URL
  5. 將支付 URL 返回給商家系統

安全機制說明:

  • 數位簽章確保請求來自合法商家
  • 防止惡意第三方偽造支付請求
  • 保證請求資料在傳輸過程中未被竄改

步驟 3:使用者支付

  • 商家系統將支付 URL 返回給瀏覽器
  • 瀏覽器自動跳轉到支付寶支付頁面
  • 使用者在支付寶頁面完成支付操作(輸入密碼、選擇支付方式等)

步驟 4:支付結果通知(關鍵安全步驟)

支付寶處理:

  1. 處理使用者支付操作
  2. 產生支付結果通知
  3. 使用支付寶私密金鑰對通知進行數位簽章
  4. 將簽章後的通知發送給商家系統

商家系統驗證:

  1. 接收支付寶的支付通知
  2. 使用支付寶公開金鑰驗證通知簽章
  3. 確認通知來自支付寶官方
  4. 驗證支付結果和訂單資訊
  5. 更新訂單狀態,完成交易

安全機制說明:

  • 數位簽章確保通知來自支付寶官方
  • 防止惡意第三方偽造支付成功通知
  • 保證支付結果資料的真實性和完整性

數位簽章工作原理

數位簽章的本質:

  • 使用私密金鑰對資料進行加密,產生「簽章」
  • 使用對應的公開金鑰驗證簽章,確認資料來源和完整性
  • 就像現實中的手寫簽名,但更加安全和不可偽造

在支付流程中的應用:

  1. 商家簽章:商家用私密金鑰簽章 → 支付寶用商家公開金鑰驗證
  2. 支付寶簽章:支付寶用私密金鑰簽章 → 商家用支付寶公開金鑰驗證

安全防護機制

防偽造攻擊:

  • 沒有私密金鑰無法產生有效簽章
  • 公開金鑰只能驗證,不能偽造簽章

防竄改攻擊:

  • 資料被修改後,簽章驗證會失敗
  • 確保傳輸過程中的資料完整性

防重放攻擊:

  • 通常配合時間戳和亂數使用
  • 防止惡意重複提交相同的支付請求

加密技術應用

  • 對稱加密:用於大量支付資料的快速加密傳輸
  • 非對稱加密:用於數位簽章和身份驗證
  • 公開金鑰驗證:確保通訊雙方的真實性和資料完整性

支付寶開發平台

環境配置

沙箱環境(測試)

  • 使用支付寶沙箱環境進行測試
  • 配置沙箱應用 ID 和金鑰
  • 設定回呼通知地址

生產環境

  • 申請正式應用並審核通過
  • 配置正式環境金鑰
  • 設定 HTTPS 回呼地址

接入注意事項

  1. 金鑰管理
  2. 妥善保管應用私密金鑰,不能洩露
  3. 定期更換金鑰
  4. 使用環境變數儲存敏感資訊
  5. 通訊安全
  6. 所有介面呼叫必須使用 HTTPS
  7. 驗證支付寶公開金鑰的真實性
  8. 對敏感資料進行加密傳輸
  9. 資料驗證
  10. 驗證支付通知的簽章
  11. 檢查訂單金額和狀態
  12. 防止重複處理通知

沙箱環境的公開金鑰和私密金鑰

主題測試文章,只做測試使用。發佈者:Walker,轉轉請注明出處:https://walker-learn.xyz/archives/4781

(0)
Walker的頭像Walker
上一篇 2026年3月10日 00:00
下一篇 2026年3月8日 15:40

相關推薦

  • Go工程師體系課 010【學習筆記】

    安裝 Elasticsearch (可理解為資料庫) 和 Kibana (可理解為連接工具)。Elasticsearch 和 Kibana (5601) 的版本必須保持一致。MySQL 對照學習 Elasticsearch (ES) 術語對照:MySQL 的 database 對應 Elasticsearch 的 index (索引);MySQL 的 table 對應 Elasticsearch 的 type (從 7.x 版起固定為 _doc,8.x 版徹底移除多個類型…

    個人 2025年11月25日
    39800
  • 向世界揮手,擁抱無限可能 🌍✨

    站得更高,看得更遠 生活就像一座座高樓,我們不斷向上攀登,不是為了炫耀高度,而是為了看到更廣闊的風景。圖中的兩位女孩站在城市之巔,伸展雙手,徬彿在迎接世界的無限可能。這不僅是一次俯瞰城市的旅程,更是對自由和夢想的禮讚。 勇敢探索,突破邊界 每個人的生活都是一場冒險,我們生而自由,就該去探索未知的風景,去經歷更多的故事。或許路途中會有挑戰,但正是那些攀爬的瞬間…

    個人 2025年2月26日
    1.4K00
  • 從0到1落地微前端架構 001【學習筆記】

    微前端 js 隔離css 隔離元素隔離生命週期預載入資料通訊應用程式跳轉多層巢狀 說明 使用的是 Mermaid 的 flowchart 語法,Markdown 渲染器如 Typora、VitePress、一些 Git 平台都支援。 保留了: 基座應用 main-vue3 各子應用:child-nuxt2-home、child-vue2-job、child-vu…

    2025年4月20日
    1.6K00
  • 深入理解ES6 007【學習筆記】

    Set集合與Map集合 在js中有一個in運算子,其不需要讀取物件的值就能判斷屬性在物件中是否存在,如果存在就回傳true。但是in運算子也會檢查物件的原型,只有當物件原型為null時使用這個方法才比較穩妥。 Set集合 let set = new Set() set.add(5) set.add("5") console.log(s…

    個人 2025年3月8日
    1.3K00
  • 深入理解ES6 005【學習筆記】

    解構:使用資料存取更便捷 如果使用 var、let 或 const 解構宣告變數,則必須要提供初始化程式(也就是等號右側的值)如下會導致錯誤 // 語法錯誤 var {tyep,name} // 語法錯誤 let {type,name} // 語法錯誤 const {type,name} 使用解構給已經宣告的變數賦值,如下 let node = { type:&qu…

    個人 2025年3月8日
    1.3K00
簡體中文 繁體中文 English