Posts

Showing posts with the label side_project

shop_platform - 對電商業務流程不熟,而不確定該怎麼處理的地方

串接藍新金流 使用者用藍新金流刷信用卡付款。伺服器收到藍新金流回傳的 TradeInfo 與 TradeSha,TradeInfo 雜湊後的值與 TradeSha 不符。Status 是 Success 所以使用者應該已經付錢了,這個時候要怎麼處理?先退錢給使用者嗎? TradeInfo 雜湊後的值與 TradeSha 相符,但付款金額和訂單上的金額不一樣時,要怎麼辦?(若排除商業邏輯寫錯的可能,這種情況,可能是 HashKey 和 HashIV 外洩,導致使用者可以自己修改 post 給藍新金流的 TradeInfo 與 TradeSha)。需要考慮這種可能性嗎? 藍新金流回傳的 TradeInfo 裡包含許多付款資訊。我應該把哪些付款資訊存到資料庫裡?記錄這些付款資訊是為了處理什麼問題?

shop_platform - 串接藍新金流:TradeSha

Image
(本文使用的語言為 python 3) 文件:藍新金流 > API 文件下載 > 多功能收款 MPG。我下載時,版本是 1.6 TradeSha 是什麼 根據文件第 33 頁的第一個表格,需要傳送給藍新金流的參數共有四個,其中一個就是 TradeSha: 根據文件第 70 頁,得到 TradeSha 的方法,是把 TradeInfo 前面加上 HashKey,後面加上 HashIV,然後用 SHA256 做雜湊,接著把所有英文字母轉成大寫。這樣就是合格的 TradeSha。 test case 為: trade_info = 'ff91c8aa01379e4de621a44e5f11f72e4d25bdb1a18242db6cef9ef07d80b0165e476fd1d9acaa53170272c82d122961e1a0700a7427cfa1cf90db7f6d6593bbc93102a4d4b9b66d9974c13c31a7ab4bba1d4e0790f0cbbbd7ad64c6d3c8012a601ceaa808bff70f94a8efa5a4f984b9d41304ffd879612177c622f75f4214fa' key = '12345678901234567890123456789012' iv = '1234567890123456' expect_output = 'EA0A6CC37F40C1EA5692E7CBB8AE097653DF3E91365E6A9CD7E91312413C7BB8' TradeSha 的作用,我猜是藍新金流用來檢查他們收到的 TradeInfo 是否有被篡改。如果有被篡改,他們自己對 TradeInfo 雜湊後的結果,會跟我們傳過去的 TradeSha 值不同。 實作 from Crypto.Hash import SHA256 def get_trade_sha(trade_info: str, key: str = HashKey, iv: str = HashIV) -> str: # 串接 HashKey、TradeSha、HashKey msg = f'H...

shop_platform - 串接藍新金流:TradeInfo

Image
(本文使用的語言為 python 3) 文件:藍新金流 > API 文件下載 > 多功能收款 MPG。我下載時,版本是 1.6 TradeInfo 是什麼 根據文件第 33 頁的第一個表格,需要傳送給藍新金流的參數共有四個,其中一個就是 TradeInfo: 需要放進 TradeInfo 裡的參數欄位,如文件第 33~37 頁所列。準備好這些參數欄位後,要幫這些參數欄位加密,加密後的結果,才是要傳送給藍新金流的 TradeInfo。 加密 根據文件第 65~66 頁,可以看到,要先把參數欄位整理成 query string 的格式,才進行 AES 加密。AES 加密採用 CBC 模式,padding 的 blocksize 是 32。然後把加密後的結果轉成 16 進位。test case 為: data = { 'MerchantID': 3430112, 'RespondType': 'JSON', 'TimeStamp': 1485232229, 'Version': 1.4, 'MerchantOrderNo': 'S_1485232229', 'Amt': 40, 'ItemDesc': 'UnitTest' } Key = '12345678901234567890123456789012' IV = '1234567890123456' expect_output = 'ff91c8aa01379e4de621a44e5f11f72e4d25bdb1a18242db6cef9ef07d80b0165e476fd1d9acaa53170272c82d122961e1a0700a7427cfa1cf90db7f6d6593bbc93102a4d4b9b66d9974c13c31a7ab4bba1d4e0790f0cbbbd7ad64c6d3c8012a601ceaa808bff70f94a8efa5a4f984b9d41304ffd879612177c622f75f4214...

shop_platform - 路由規劃

商品相關路由 ✓ 瀏覽所有商品 GET /products ✓ 瀏覽單一商品 GET /products/<string:product_id> ✓ 瀏覽某位賣家所有商品 GET /products/seller/<string:seller_id> ✓ 新增一筆商品頁面 GET /products/new ✓ 新增一筆商品 POST /products/new ✓ 修改一筆商品頁面 GET /products/edit/<string:product_id> ✓ 修改一筆商品 POST /products/edit/<string:product_id> ✓ 刪除一筆商品 POST /products/delete/<string:product_id> 購物車相關路由 ✓ 瀏覽購物車中所有商品 GET /carts ✓ 在首頁,或單一商品頁新增一筆商品 POST /carts/<string:product_id> ✓ 在購物車頁面修改一筆商品 POST /cars/edit/<string:product_id> ✓ 在購物車頁面刪除一筆商品 POST /carts/delete/<string:product_id> 訂單相關路由 ✓ 瀏覽所有訂單 GET /orders ✓ 瀏覽一筆訂單 GET /orders/<string:order_id> ✓ 結帳購物車中某位賣家的商品 POST /orders/order_item/<string:seller_id> ✓ 瀏覽結帳明細 GET /orders/checkout/<string:order_id> ✓ 完成訂單結帳 POST /orders/checkout/<string:order_id> ✓ 確認付款明細 GET /orders/payment/<string:order_id> ✓ 藍新金流 return url POST /orders/newebpay/return ✓ 藍新金流 not...

shop_platform - 新增種子資料時報錯

想完成的事 建立 user 的種子資料 遇到的問題,和解決過程 直接在 MySQL workbench 新增資料沒有問題,但是用 flask_seeder 新增資料會報錯。縮小範圍後,發現使用 flask_sqlalchemy 新增資料就會報錯。 錯誤訊息如下: Traceback (most recent call last): File "/Users/flora/.local/share/virtualenvs/shop_platform-9-YKR-2e/lib/python3.9/site-packages/sqlalchemy/orm/relationships.py", line 2744, in _determine_joins self.primaryjoin = join_condition( File "<string>", line 2, in join_condition File "/Users/flora/.local/share/virtualenvs/shop_platform-9-YKR-2e/lib/python3.9/site-packages/sqlalchemy/sql/selectable.py", line 1184, in _join_condition cls._joincond_trim_constraints( File "/Users/flora/.local/share/virtualenvs/shop_platform-9-YKR-2e/lib/python3.9/site-packages/sqlalchemy/sql/selectable.py", line 1305, in _joincond_trim_constraints raise exc.AmbiguousForeignKeysError( sqlalchemy.exc.AmbiguousForeignKeysError: Can't determine join between 'user' and 'order'; tables have more tha...

shop_platform - Composite Foreign Keys

想要達到的效果: 現有 order_item 這張表。現在要建立 rating table ,並且建立 order_item 和 rating 之間的 one-one relationship。但 order_item 的 primary key 是 composite primary key,同時有兩個 column 都是 primary key。不知道要怎麼在 rating 建立外鍵。 order_item 的程式碼: from app import db from datetime import datetime class OrderItem(db.Model): __tablename__ = 'order_item' order_id = db.Column(db.Integer, db.ForeignKey('order.id'), primary_key=True) product_id = db.Column(db.Integer, db.ForeignKey('product.id'), primary_key=True) price = db.Column(db.Integer, nullable=False) quantity = db.Column(db.Integer, nullable=False) insert_time = db.Column(db.DateTime, nullable=False, default=datetime.now) update_time = db.Column(db.DateTime, onupdate=datetime.now, nullable=False, default=datetime.now) order = db.relationship('Order', back_populates='products') product = db.relationship('Product', back_populates='orders') 參考資料 用「sqlalchemy foreign...

shop_platform - flask db downgrade 遇到 TypeError

事發經過 發現建立 cart table 時,漏掉 user_id 這個 foreign key,所以幫 user 和 cart 兩張資料表補上 one-one relationship。 class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True) display_name = db.Column(db.String(50), unique=True, nullable=False) email = db.Column(db.String(50), unique=True, nullable=False) password = db.Column(db.String(140), nullable=False) cell_phone = db.Column(db.String(20)) address = db.Column(db.String(100)) store_introduction = db.Column(db.String(2000)) role = db.Column(db.String(10), nullable=False, default='user') insert_time = db.Column(db.DateTime, nullable=False, default=datetime.now) update_time = db.Column(db.DateTime, onupdate=datetime.now, nullable=False, default=datetime.now) cart = db.relationship('Cart', back_populates='user', uselist=False) delivery_orders = db.relationship('Order', back_populates='seller') purchase_order = db.relati...

shop_platform - 建立多對多關聯:Association Object

根據 SQLAlchemy 的 Basic Relationship Patterns ,建立多對多關聯有兩種方式: join table 上只有外鍵欄位:使用 association table join table 上除了外鍵,還有其他欄位:使用 association object association object 不同欄位間的關係: class Association (Base):     __tablename__ = 'association'     left_id = Column(ForeignKey(' left.id '), primary_key=True)     right_id = Column(ForeignKey(' right.id '), primary_key=True)     extra_data = Column(String(50))     child = relationship(" Child ", back_populates=" parents ")     parent = relationship(" Parent ", back_populates=" children ") class Parent (Base):     __tablename__ = ' left '     id = Column(Integer, primary_key=True)     children = relationship(" Association ", back_populates=" parent ") class Child (Base):     __tablename__ = ' right '     id = Column(Integer, primary_key=True)     parents = relationship(" Association ", back_populates...

shop_platform - flask db init fails: KeyError 'migrate'

試著使用 Flask-Migrate 做 MySQL 的 migration。但是在終端機使用 flask db init 指令時失敗了。 程式碼: common/database.py: from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate db = SQLAlchemy() migrate = Migrate() app.py: import os from flask import Flask from dotenv import load_dotenv from common.database import db, migrate if os.environ.get('FLASK_ENV', '') != 'production': load_dotenv() app = Flask(__name__) app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get('SQLALCHEMY_DATABASE_URI') @app.route('/') def home(): return 'Hello World!' if __name__ == '__main__': db.init_app(app) migrate.init_app(app, db) app.run() 錯誤訊息: File "/Users/flora/.local/share/virtualenvs/shop_platform-9-YKR-2e/bin/flask", line 8, in <module> sys.exit(main()) File "/Users/flora/.local/share/virtualenvs/shop_platform-9-YKR...

shop_platform - 資料庫實體關聯設計

Image
資料庫:MySQL Entities User [PK] id: INT display_name: CHAR(50) email: CHAR(50) password: CHAR(140) cell_phone: CHAR(20) address: CHAR(100) store_introduction: CHAR(2000) role: CHAR(5) insert_time: DATETIME update_time: DATETIME Category [PK] id: INT name: CHAR(50) insert_time: DATETIME update_time: DATETIME Product [PK] id: INT name: CHAR(60) price: INT image_url: CHAR(100) inventory: INT description: TEXT(2000) insert_time: DATETIME update_time: DATETIME [FK] seller_id [FK] category_id Cart [PK] id: INT insert_time: DATETIME update_time: DATETIME [FK] user id CartItem [PK][FK] cart_id [PK][FK] product_id quantity: INT insert_time: DATETIME update_time: DATETIME ShippingStatus [PK] id: INT status: CHAR(60) insert_time: DATETIME update_time: DATETIME PaymentStatus [PK] id: INT status: CHAR(60) insert_time: DATETIME update_time: DATETIME ...

shop_platform - 規格

因為有認識的朋友想在網路上賣東西,想請我幫他寫個網站,所以試著做做看。 user story 管理員 可以修改分類 可以刪除留言 已登入的使用者 身為賣家 ✓ 可以上架商品 ✓ 可以依分類瀏覽所有上架商品 可以回覆買家的提問 訂單成立時,可以收到通知信 ✓ 可以瀏覽所有售貨訂單 可以修改訂單出貨狀態 可以取消訂單 對每筆訂單,可以評價此次售貨體驗 身為買家 ✓ 可以使用訪客的所有功能 可以向賣家提問 ✓ 可以結帳 ✓ 結帳後,會收到通知信 ✓ 可以線上刷卡付款 ✓ 可以瀏覽所有購物訂單 ✓ 可以取消尚未付款且尚未出貨的訂單 對每筆訂單,可以評價此次購物體驗 訪客 ✓ 可以依分類瀏覽商品 ✓ 可以搜尋商品 可以瀏覽商品得到的評價 可以瀏覽賣家得到的評價 ✓ 可以將商品放入購物車 ✓ 可以瀏覽購物車 ✓ 可以調整購物車中的商品數量 GitHub 最後更新日期:2021 年 10 月 15 日