示例#1
0
def user_register():
    '''new user register process'''
    if request.method == "POST":
        post_data = request.get_json()
        # 登入才要給一個sessionId
        name = post_data["name"]
        email = post_data["email"]
        pwd = post_data["password"]
        rex_email = r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)" # email格式
        match = re.match(rex_email, email)
        if name == "":
            return jsonify({"error": True, "message": "不可為空值"}), 400 
        
        if email == "":
            return jsonify({"error": True, "message": "不可為空值"}), 400

        if not match:
            return jsonify({"error": True, "message": "請輸入正確email"}), 400 

        if pwd == "":
            return jsonify({"error": True, "message": "不可為空值"}), 400 
        try:
            db = DB_controller(
                host=DB_HOST,
                user=DB_USER,
                password=DB_PWD,
                db=DB_NAME
            )
            email_check = db.show_data("user", "email", email)
            name_check = db.show_data("user", "name", name)
            if not email_check:
                if not name_check:
                    hash_ = HASH
                    hash_pwd = pwd + hash_
                    hash_pwd = hashlib.sha256(
                        hash_pwd.encode("utf-8")).hexdigest()
                    db.insert_data("user", "name, email, password",
                                   f'"{name}","{email}","{hash_pwd}"')
                    db.close()
                    res = make_response(jsonify({"ok": True}))
                    return res
                else:
                    return jsonify({"error": True, "message": "此暱稱已被使用"}), 400
            else:
                return jsonify({"error": True, "message": "此email已註冊過"}), 400
        except Exception as e:
            return jsonify({"error": True, "message": str(e)}), 500
示例#2
0
def build_order():
    if request.method == "POST":
        post_data = request.get_json()
        if not session.get("email"):
            return jsonify({"error":True, "message": "未登入會員系統"}), 403
        user_name = post_data["contact"]["name"]
        email = post_data["contact"]["email"]
        phone = post_data["contact"]["phone"]
        attractionId = post_data["order"]["trip"]["attraction"]["id"]
        date = post_data["order"]["date"]
        time = post_data["order"]["time"]
        price = post_data["order"]["price"]
        rex_email = r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)" # email格式
        rex_phone = r"\d\d\d\d\d\d\d\d\d\d"
        match_email = re.match(rex_email, email)
        match_phone = re.match(rex_phone, phone)
        if user_name == "":
            return jsonify({"error": True, "message": "不可為空值"}), 400

        if email == "":
            return jsonify({"error": True, "message": "不可為空值"}), 400
        
        if not match_email:
            return jsonify({"error": True, "message": "email格式錯誤"}), 400

        if phone == "":
            return jsonify({"error": True, "message": "不可為空值"}), 400

        if not match_phone:
            return jsonify({"error": True, "message": "手機號碼格式錯誤"}), 400

        try:
            # 創建訂單編號
            now = dt.today()
            order_number = now.strftime("%Y%m%d%H%M%S")
            order_status = -1 # 記錄訂單付款狀態 初始值設-1 0付款成功, 1付款失敗
            try: 
                #訂單資訊存到db
                db = DB_controller(
                    host=DB_HOST,
                    user=DB_USER,
                    password=DB_PWD,
                    db=DB_NAME
                )

                
                user_data = db.show_data("user", "email", post_data["contact"]["email"])
                userId = user_data[0]
                prev_order_data = db.show_data("orders", "userId", userId)
                

                #還沒有付款成功 => 不用存bank_transaction
                if not prev_order_data: # 沒有過訂單
                    db.insert_data(table_name='orders', settingrow='order_number, attractionId, userId, phone, date, time, price, status', settingvalue=f'"{order_number}","{attractionId}", "{userId}", "{phone}","{date}", "{time}", "{price}", "{order_status}"')
                
                elif prev_order_data[9] == 0: #成功付款過,直接新增新的資料
                    db.insert_data(table_name='orders', settingrow='order_number, attractionId, userId, phone, date, time, price, status', settingvalue=f'"{order_number}","{attractionId}", "{userId}", "{phone}","{date}", "{time}", "{price}", "{order_status}"')
                
                elif prev_order_data[9] == 1: #付款失敗過(紀錄留存),可直接新增資料
                    db.insert_data(table_name='orders', settingrow='order_number, attractionId, userId, phone, date, time, price, status', settingvalue=f'"{order_number}","{attractionId}", "{userId}", "{phone}","{date}", "{time}", "{price}", "{order_status}"')
                
            except Exception as e:
                return jsonify({"error": True, "message": str(e)}), 500

            # 進行付款動作
            # tayppay.Client(is_sanbox, partner_key, merchant_id) 這裡都用官方提供測試用 => 沙盒 (要使用自己的key,id需要真的創建公司並且通過審核)
            client = tappay.Client(True, PARTNER_KEY, MERCHANT_ID)
            card_holder_data = tappay.Models.CardHolderData(post_data["contact"]["phone"], post_data["contact"]["name"], post_data["contact"]["email"])
            
            # client.pay_by_prime(prime, amount, details, card_holder_data)
            response_data_dict = client.pay_by_prime("test_3a2fb2b7e892b914a03c95dd4dd5dc7970c908df67a49527c0a648b2bc9", post_data["order"]["price"], post_data["order"]["trip"]["attraction"]["name"], card_holder_data)
            
            if response_data_dict["status"] == 0:
                order_status = 0
                try: 
                    #update bank_transaction & status
                    db.update(table_name='orders', set=f'bank_transaction="{response_data_dict["bank_transaction_id"]}", status={order_status}', search=f'order_number="{order_number}"')
                    order_data = db.show_data("orders", "order_number", order_number)
                    db.delete("booking", "userId", userId) # 付款成功 把booking的待預訂刪除
                    db.close()
                    data = {
                        "data": {
                            "number": order_data[1],
                            "payment": {
                                "status": order_data[9],
                                "message": "付款成功"
                            }
                        }
                    }
                    return jsonify(data)

                except Exception as e: #資料庫錯誤
                    return jsonify({"error": True, "message": str(e)}), 500

            else: # response_data_dict不是0,付款失敗
                order_status = 1
                db.update(table_name='orders', set=f'status={order_status}', search=f'order_number="{order_number}"')
                order_data = db.show_data("orders", "order_number", order_number)
                data = {
                    "error":True,
                    "number": order_number,
                    "payment": {
                        "status": order_data[9],
                        "message": "付款失敗"
                    }
                }
                return jsonify(data), 400

        except Exception as e:
            return jsonify({"error": True, "message": str(e)}), 400
def build_booking():
    '''build a trip if interested'''

    if request.method == "POST":
        post_data = request.get_json()
        attractionId = post_data["attractionId"]
        date = post_data["date"]
        time = post_data["time"]
        price = post_data["price"]
        user_email = session.get("email")
        rex_date = r"(^\d{4}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])$)"  #yyyy-mm-dd
        match_date = re.match(rex_date, date)
        date_today_check = datetime.now().strftime("%Y-%m-%d")

        if date == "":
            return jsonify({"error": True, "message": "請選擇日期"}), 400
        elif date < date_today_check:
            return jsonify({"error": True, "message": "不可預定今天以前的日期"}), 400

        if not match_date:
            return jsonify({"error": True, "message": "日期格式不正確"}), 400

        if time == "":
            return jsonify({"error": True, "message": "請選擇時間"}), 400

        if price == "":
            return jsonify({"error": True, "message": "請填入費用"}), 400

        if not user_email:
            return jsonify({"error": True, "message": "請先登入會員"}), 403
        else:
            try:
                db = DB_controller(host=DB_HOST,
                                   user=DB_USER,
                                   password=DB_PWD,
                                   db=DB_NAME)
                user_data = db.show_data("user", "email", user_email)
                userId = user_data[0]

                booking_data = db.show_data("booking", "userId", userId)
                # 先判斷booking table裡面是否已經有資料了,
                if booking_data:  # 如果有 => 刪除原本的 insert此筆
                    delete = db.delete("booking", "userId", userId)
                    insert = db.insert_data(
                        table_name="booking",
                        settingrow='attractionId, userId, date, time, price',
                        settingvalue=
                        f'"{attractionId}","{userId}","{date}", "{time}", "{price}"'
                    )
                    db.close()
                    res = make_response(jsonify({"ok": True}))
                    return res
                else:
                    # 沒找到的話直接insert
                    insert = db.insert_data(
                        table_name="booking",
                        settingrow='attractionId, userId, date, time, price',
                        settingvalue=
                        f'"{attractionId}","{userId}","{date}", "{time}", "{price}"'
                    )
                    db.close()
                    res = make_response(jsonify({"ok": True}))
                    return res
            except Exception as e:
                return jsonify({"error": True, "message": str(e)}), 500
    clean_img = []
    for i in range(len(data[j]["file"])):
        image_web = data[j]["file"][i]  # 在每個網址
        image_web = image_web.lower()
        if ".jpg" in image_web or ".png" in image_web:
            clean_img.append(image_web)

    name = data[j]["stitle"]
    category = data[j]["CAT2"]
    description = data[j]["xbody"]
    address = data[j]["address"]
    transport = data[j]["info"]
    mrt = data[j]["MRT"]
    latitude = data[j]["latitude"]
    longitude = data[j]["longitude"]
    test = db.insert_data(table_name="attractions", settingrow='name, category, description, address, transport, mrt, latitude, longitude, images', settingvalue=f'"{name}","{category}","{description}","{address}","{transport}","{mrt}","{latitude}","{longitude},"{clean_img}"')
    # name, category, description, address, transport, mrt, latitude, longitude, clean_img
    print(test)


# API => JSON
# name=> stitle
# category => CAT2
# description => xbody
# address => address
# transport => info
# mrt => MRT
# latitude => latitude
# longitude => longitude
# image => file