def handler_postback(event): # 把postback裡面的資料轉成字典 data = dict(parse_qsl(event.postback.data)) # 再取出action裡面的值 action = data.get('action') # 從event裡面取得用戶id user_id = event.source.user_id # 從event裡面取得reply_token reply_token = event.reply_token # 建立一個購物車物件 cart = Cart(user_id=user_id) # 從資料庫取得送出postback的用戶資料 query = User.query.filter_by(id=user_id).first() print(event.postback.data) # 點擊加入會員 if event.postback.data in ['join_us', '加入會員']: # 資料庫該使用者狀態改為註冊中 # Updata data print('註冊中') query.is_signup = True db_session.commit() line_bot_api.link_rich_menu_to_user(user_id, richmenu_list.RichMenu_ID.richmenu_02) line_bot_api.push_message(user_id, AllMessage.sign_cellphone()) # 點擊取消輸入之類的 elif event.postback.data in ['exit']: query.is_signup = False query.edit_user_name = False query.edit_home_address = False query.edit_company_address = False db_session.commit() if not query.is_member: line_bot_api.link_rich_menu_to_user(user_id, richmenu_list.RichMenu_ID.richmenu_01) line_bot_api.push_message(user_id, TextSendMessage(text='好的,歡迎您再來找我聊聊天喔!')) # 點擊會員中心 elif event.postback.data in ['會員中心']: line_bot_api.reply_message(reply_token, TextSendMessage(text='這是專屬於你的會員中心', sender=Sender( name='會員中心管理員結衣', icon_url='https://i.imgur.com/S7SHmup.png' ))) line_bot_api.push_message(user_id, AllMessage.member_center(query)) # 觸發點餐相關事件 elif event.postback.data in ['當日外帶', 'add', '點餐']: # 先跳出選擇內用外帶 line_bot_api.reply_message(reply_token, TemplateSendMessage(alt_text="請問您要內用還是外帶呢?", sender=Sender( name='服務員結衣', icon_url='https://i.imgur.com/S7SHmup.png' ), template=ConfirmTemplate( text="請問您要內用還是外帶呢?", actions=[ PostbackAction( label="內用", text="內用", data="here" ), PostbackAction( label="外帶", text="外帶", data="out" ) ] ))) # 外帶事件 elif event.postback.data in ['out']: line_bot_api.reply_message(reply_token, Products.list_all()) # 內用事件 elif event.postback.data in ['here']: line_bot_api.reply_message(reply_token, TemplateSendMessage(alt_text="請掃描桌上的QRCODE", sender=Sender( name='服務員結衣', icon_url='https://i.imgur.com/S7SHmup.png' ), template=ButtonsTemplate( text='請掃描桌上的QRCode點餐', actions=[ URIAction( type='uri', label='點我掃描', uri="https://liff.line.me/1654280234-Wabazm3B" ) ] ))) # 觸發確認訂單事件 elif event.postback.data in ['待補', '確認訂單']: if cart.bucket(): line_bot_api.reply_message(reply_token, cart.display()) else: line_bot_api.reply_message(reply_token, TextSendMessage(text='你的購物車目前沒東西喔')) # 觸發清空購物車事件 elif event.postback.data in ['Empty Cart']: cart.reset() line_bot_api.reply_message(reply_token, TextSendMessage(text="你的購物車已經被清空了")) # 如果action為check則執行結帳動作 elif action == 'checkout': if not cart.bucket(): line_bot_api.reply_message(reply_token, TextSendMessage(text='你的購物車是空的')) return 'OK' # 透過uuid來建立訂單id,它可以幫我們建立一個獨一無二的值 order_id = uuid.uuid4().hex # 訂單總金額 total = 0 # 訂單內容物的陣列 items = [] for product_name, num in cart.bucket().items(): product = db_session.query(Products).filter(Products.name.ilike(product_name)).first() print(product.id) item = Items(product_id=product.id, product_name=product.name, product_price=product.price, order_id=order_id, quantity=num) items.append(item) total += product.price * int(num) cart.reset() line_pay = LinePay() # 傳送這些資訊過去他會回我們一個json # 自己試試看把info印出來或是用postman看看裡面的結構 info = line_pay.pay(product_name='OrderBot 點吧', amount=total, order_id=order_id, product_image_url=Config.STORE_IMAGE_URL) # 從info裡面擷取付款連結跟transactionid pay_web_url = info['paymentUrl']['web'] transaction_id = info['transactionId'] # 產生訂單 order = Orders(id=order_id, transaction_id=transaction_id, is_pay=False, amount=total, user_id=user_id) db_session.add(order) for item in items: db_session.add(item) db_session.commit() message = TemplateSendMessage( alt_text='差一點點就完成訂購囉~', template=ButtonsTemplate( text='差一點點就完成訂購囉~', actions=[ URIAction(label='Pay NT${}'.format(order.amount), uri='{liff_url}?redirect_url={url}'.format( liff_url=Config.LIFF_URL, url=pay_web_url)) ])) line_bot_api.reply_message(reply_token, message) # 訂單管理 elif event.postback.data in ['訂單管理']: line_bot_api.reply_message(reply_token, Booking.list_all_user(user_id)) # 取消訂單 elif '取消訂位' in event.postback.data: line_bot_api.reply_message(reply_token, TextSendMessage(text="您的訂單已取消", sender=Sender( name='會員中心管理員結衣', icon_url='https://i.imgur.com/S7SHmup.png' ))) book_id = str(event.postback.data)[4:] db_session.query(Booking).filter_by(id=book_id).first().is_confirm = -2 db_session.commit() return 'OK'
def handle_message(event): get_or_create_user(event.source.user_id) message_text = str(event.message.text).lower() cart = Cart(user_id=event.source.user_id) message = None if message_text in ["what is your story?", "story"]: message = [ ImageSendMessage( original_content_url='https://i.imgur.com/DKzbk3l.jpg', preview_image_url='https://i.imgur.com/DKzbk3l.jpg'), StickerSendMessage(package_id='11537', sticker_id='52002734') ] elif message_text in ['i am ready to order.', 'add']: message = Products.list_all() elif "i'd like to have" in message_text: product_name = message_text.split(',')[0] num_item = message_text.rsplit(':')[1] product = db_session.query(Products).filter( Products.name.ilike(product_name)).first() if product: cart.add(product=product_name, num=num_item) confirm_template = ConfirmTemplate( text='Sure, {} {}, anything else?'.format( num_item, product_name), actions=[ MessageAction(label='Add', text='add'), MessageAction(label="That's it", text="That's it") ]) message = TemplateSendMessage(alt_text='anything else?', template=confirm_template) else: message = TextSendMessage( text="Sorry, We don't have {}.".format(product_name)) print(cart.bucket()) elif message_text in ['my cart', 'cart', "that's it"]: if cart.bucket(): message = cart.display() else: message = TextSendMessage(text='Your cart is empty now.') elif message_text == 'empty cart': cart.reset() message = TextSendMessage(text='Your cart is empty now.') if message: line_bot_api.reply_message(event.reply_token, message)