因為前幾天我們新增了 verification_code
這張表的欄位,調整了發送認證碼的流程,並且設定該認證碼在發送後只有10分鐘時效,這樣一來在原先處理檢驗認證碼的程式邏輯上也要作出修改。
因為我們在發送認證碼時,已經將10分鐘後的 timestamp 寫入了 verification_code
的 expire_at
,所以我們只要檢視這個欄位就能實現認證碼時效檢驗的功能。
有兩個修改的重點:
bind_at
是否為空expire_at
是否大於等於現在時間bind_at
押上現在時間,並且將 users sheet 對應的使用者欄位 is_verifed
設為 truefunction tagVerificationCode(target, userId) {
const sheet = ReadMailAndInsertToGoogleSheet.connectToSheet('verification_code');
const searchResult = ReadMailAndInsertToGoogleSheet.searchColumnValue(sheet, 'code', target);
if (searchResult !== -1) {
const targetRowIndex = searchResult+2;
const targetRowRange = sheet.getRange(targetRowIndex, 2, 1, 4);
var targetRowValue = targetRowRange.getValues()[0];
if ((targetRowValue[0] === userId) && (targetRowValue[1].length === 0) && checkExpireAtWithNow(targetRowValue[3])) {
// write back bind_at
targetRowValue[1] = new Date();
targetRowRange.setValues([targetRowValue]);
// create or update user
upsertUserInfo(userId, {'is_verifed': true});
return true;
}
}
return false;
}
function checkExpireAtWithNow(expireAt) {
const now = Math.floor(Date.now() / 1000);
return expireAt >= now;
}
因為使用者已經認證成功了,所以這時可以根據前一天的教學,將身分認證
的圖文選單切換為獲取驗證碼
的圖文選單
新增 changeRichMenuAfterBindSuccess 負責切換 userId 的圖文選單為獲取驗證碼
function changeRichMenuAfterBindSuccess(userId) {
// RICH_MENU_ID_AFTER_BIND_SUCCESS 是獲取驗證碼圖文選單的 rich menu id
UrlFetchApp.fetch(`https://api.line.me/v2/bot/user/${userId}/richmenu/${RICH_MENU_ID_AFTER_BIND_SUCCESS}`, {
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN
},
'method': 'post'
});
}
可以新增一個測試函式,並且在 GAS 專案執行此函式,測試是否有正常切換圖文選單
p.s. Line User Id 現在應該可以在 Line Bot - 驗證碼小幫手
按下 執行身份認證
後,從 Google Sheet 的 verification_code 找到
function testChangeRichMenuAfterBindSuccess(){
changeRichMenuAfterBindSuccess('YOUR_LINE_USER_ID');
}
這幾天實作的功能都是在整個認證流程中不可或缺的功能模組,最後只要組裝起來就可以完成整個身份認證流程囉~明天繼續努力!