[day25] 建立订单 & 付款处理

终於走完完整的订单处理了,0rz

一样Review一下流程

  1. 建立购物车
  2. 加入购物车项目
  3. 发起建立订单
  4. 检查库存与订单品项
  5. 锁定购物车
  6. 建立交易请求
  7. 取得付款资讯提供给使用者
  8. 使用者完成付款
  9. 回传PayToken
  10. 验证PayToken&解密
  11. 确认付款状态

会用到的资料库资料表:

Table Name 功能
shopping_cart 购物车
cart_items 购物车内品项
product_category 产品类型
products 产品资讯
payment_log 付款资讯
orders 订单纪录

实作完整订单流程

tester.py 建立订单

def init_orders(dbpm:DBPm, id=os.environ['Me'], yes=False):
    if(not yes):yes = askyes()
    if(not yes):return False

    scid = dbpm.INS_QUY_SC(id)
    print(f"检查购物车:{scid}")

    o_flag = True
    prodlist = []
    tot_price = 0

    shopping_list = dbpm.QUY_Shopping_Cart_by_scid(scid)
    if(not shopping_list):
        return False
    for prod in shopping_list:
        # print(f"商品:{prod[0]}, 数量:{prod[1]}")
        current_quantity = dbpm.QUY_Prod_Quantity_by_pid(prod[0])
        if(current_quantity - prod[1] < 0):
            dbpm.UPD_Cart_items(scid, prod[0], current_quantity)
            o_flag = False
        else:
            new_quantity = current_quantity - prod[1]
            dbpm.UPD_Prod_Quantity(prod[0], new_quantity)
            product_name, product_price = dbpm.QUY_Prod_Name_and_Price_by_pid(prod[0])
            prodlist.append(f"{product_name} * {prod[1]}")
            tot_price = tot_price + product_price * prod[1]
    if(not o_flag):
        return False

    # 锁定购物车 
    dbpm.UPD_Shopping_Cart_lock_bY_scid(True, scid)

    # 建立订单
    oid = dbpm.INS_Order(os.environ['Me'], scid, ostatus="初始化订单")

    # 建立信用卡付款交易编号
    paid = dbpm.INS_payment_req('C-1', tot_price)
    neworder = APIModel.ReqOrderCreate(ShopNo=os.environ['ShopNo'], OrderNo=oid, Amount=tot_price*100, \
        PrdtName='IT铁人赛虚拟商店', ReturnURL=os.environ['ReturnURL'], BackendURL=os.environ['BackendURL'], PayType="C")
    msg = GenApi.OrderCreate(neworder)
    # print(msg)

    print(f"建立订单: 编号:{msg.OrderNo}:{prodlist}, 请款金额 = {tot_price}, 付款ID:{paid}, {msg.Description}", {msg.CardParam.CardPayURL})

    if(msg):
        if(msg.Status == 'S'):
            dbpm.UPD_payment_bypaid(paid=paid, tsno=msg.TSNo, ts_decp=msg.Description, ts_status=True, cardpayurl=msg.CardParam.CardPayURL)
            dbpm.UPD_Order_by_oid(paid=paid, ostatus="已产生付款请求", oid=oid)
            return True
        else:
            dbpm.UPD_payment_bypaid(paid=paid, tsno=msg.TSNo, ts_decp=msg.Description, ts_status=False, cardpayurl=msg.CardParam.CardPayURL)
            dbpm.UPD_Order_by_oid(paid=paid, ostatus="产生付款请求失败", oid=oid)
    return False

此时发生如下变动:

  1. 已减少商品库存
  2. 已锁定购物车
  3. 已建立订单
  4. 已建立付款请求

接下来将取出付款资讯给使用者,假设使用者已完成付款,会从两个方式接收到PayToken

@app.route('/funBIZ_backend', methods=['POST'])
def funBIZ_route():
    # app.logger.debug(f"headers:{dict(request.headers)}")
    content = request.json
    # app.logger.debug(f"content:{content}")
    if(content['ShopNo'] == os.environ['ShopNo']):
        resp = FunBizApi.OrderPayQuery(PayToken=content['PayToken'])
        Handler.OrderPayQueryHandler(resp)
        return jsonify({'Status':'S'})
    else:
        return jsonify({'Status':'F'})

@app.route('/order-summary', methods=['POST'])
def order_summary_route():
    # app.logger.debug(f"headers:{dict(request.headers)}")
    content = request.form
    # app.logger.debug(f"content:{content}")
    if(content.get('ShopNo') == os.environ['ShopNo']):
        resp = FunBizApi.OrderPayQuery(PayToken=content.get('PayToken'))
        Handler.OrderPayQueryHandler(resp)
    return jsonify({'order-summary':'S'})

进行验证

util/OrderHandler.py

def OrderPayQueryHandler(resp:APIModel.ResOrderPayQuery):
    app.logger.debug(f"ResOrderPayQuery:{resp}")

    payinfo = resp.TSResultContent
    
    if(payinfo.Status != 'S'):
        dbpm.UPD_payment_bytsno(ispaid=False, paytoken=resp.PayToken, tsno=payinfo.TSNo, aptype=payinfo.APType)
        app.logger.info(f"订单付款失败, 订单编号:{payinfo.OrderNo} - {resp.Description}")
        dbpm.UPD_Order_status_by_oid(ostatus=f"付款失败-{resp.Description}", oid = payinfo.OrderNo)
    else:
        dbpm.UPD_payment_bytsno(ispaid=True, paytoken=resp.PayToken, tsno=payinfo.TSNo, aptype=payinfo.APType)
        app.logger.info(f"订单付款成功, 订单编号:{payinfo.OrderNo} - {resp.Description}")
        dbpm.UPD_Order_status_by_oid(ostatus=f"付款成功-{resp.Description}", oid = payinfo.OrderNo)

资料库的控制,可以从这里找到,就不贴出来占版面了

今天总结

产生订单有一些逻辑问题,也没有rollback机制,有空必须要改改,看剩下还有几天吧,今天大致跑完了主要功能,还有商品展示跟接上Line要做


<<:  JavaScript学习日记 : Day25 - Set

>>:  Day 25 阿里云上运行Kubernetes 1 - ACK

Day 11 我知道我甚麽都不知道

苏格拉底的名言:"我知道我甚麽都不知道!" 但是,如果没有人把这句话记录下来,大...

D24-(9/24)-统一(1216)-刚开始学习买股票时就一直持有的股票

注:发文日和截图的日期不一定是同一天,所以价格计算上和当日不同,是很正常的。 声明:这一系列文章并无...

[Day 29] 从零开始学Python - 打包安装PyInstaller:谁把谁的灵魂,装进谁的身体

注:本文同步刊载在Medium,若习惯Medium的话亦可去那边看呦! 因为按照惯例,第三十天主要会...

Day 03 HTML/CSS 使用 tailwindcss 遇到的小问题

tailwindcss 是新世代的框架,常常拿来跟 Bootstrap 比较 套句老师上课说的话,单...

Day16 Gin's Routing Structure And Context

Gin's Item Structure |-app |-common 公共方法 |-display...