這邊說明Day28的程式碼,
是如何讓抓到使用者輸入的身分證/生日,
並丟回Web Service做使用,
完整程式碼請自行回看Day.28
reply_token = params['events'][0]['replyToken']
last_received_text = Received.where(channel_id: channel_id).last&.text
if last_received_text == '掛號查詢'
這三行是抓取使用者說的上一句話是不是"掛號查詢"
若為true則進入if
a ,b = received_text[0..9],received_text[11..-1]
client = Savon.client(wsdl: 'http://210.242.237.231/HospInfo/AppReg.asmx?WSDL')
res = client.call(:get_query_info,message:{"IdentifyNo"=>a,"BirthDate"=>b})
d = res.to_array(:get_query_info_response,:get_query_info_result, :query_info)
使用者只要上一句說"掛號查詢"
那他說的下一句(會暫存在received_text)
就會被拆成a和b並讓我們丟回醫院的Web Service
仔細看看下圖
他要求若呼叫此方法則必須要給回傳值,
我們才拿得到裡面的資料
密碼可以不用,因此我們便在之前的關鍵字設計了,
若使用者說"掛號查詢"我們就給他一個輪播介面,
讓使用者直接就能明白接下來要照著格式輸入,
若使用者輸入錯誤,呼叫Web Service卻沒有給他符合的值,
他就會回傳一個錯誤訊息,我把它放在d[0][:err_msg]
因此就可以利用這個來判斷使用者是不是亂輸入,
程式碼有點長:
if d[0][:err_msg] == nil
message = {
"type": "template",
"altText": "this is a carousel template",
"template": {
"type": "carousel",
"actions": [],
"columns": [
{
"title": d[0][:clinic_date]+d[0][:clinic_apn_name]+"診間:"+d[0][:clinic_no],
"text": d[0][:div_name] ,
"actions": [
{
"type": "message",
"label": d[0][:doctor_name]+"醫師 ",
"text": " "
},
{
"type": "message",
"label": "您的號碼"+d[0][:view_no],
"text": " "
},
{
"type": "message",
"label": "大約看診時間"+d[0][:view_time],
"text": " "
}
]
}
]
}
}
end
if d[0][:err_msg] != nil
message = {
"type": "template",
"altText": "this is a carousel template",
"template": {
"type": "carousel",
"actions": [],
"columns": [
{
"text": d[0][:err_msg],
"actions": [
{
"type": "message",
"label": "重新輸入",
"text": "掛號查詢"
}
]
}
]
}
}
end
end
line.reply_message(reply_token, message)
取消掛號也是一樣的原理,只是他需要的回傳值更多。