[PHP]Account Kit 使用教學

前言

Account Kit 是由 Facebook 所提供的服務

原意是可以讓開發者不需要去處理帳號與密碼的問題

也可以把此服務當作驗證手機或是Email來使用

剩下詳細的部分可以到 AccountKit 總覽去理解

此篇文章主要部分是紀錄如何申請使用該服務

Step 1

使用此服務必須先使用 Facebook 的開發者帳號

開啟 Facebook Developers 網址

點選右上方的開始使用,選擇一些選項

01
02

接下來點下 建立首款應用程式

03

輸入 應用程式名稱 及 電子信箱

04

建立成功後就會到該應用程式的頁面

上方應用程式編號之後會用到

Setp 2

接下來在新增產品下面找到 Account Kit 並點下設定

05

操作完成後注意左方的應用程式中加入了 Account Kit,一樣點下設定

06

直接按下開始使用,會進入 Account Kit 的設定頁面

07

因為此篇文章示範的環境是 手機號碼 + Web,所以除了右上角的選項開啟之外,其他的關閉

Account Kit 應用程式密鑰之後會使用到

08

之後往下滑動找到網頁登入設定,在伺服器網域中填上會使用到的網域名稱

若想找個小空間來試驗的話,可以參考 [PHP]免費虛擬空間申請教學 這篇文章,會提供免費的https網域

09

輸入完畢後,儲存

Step 3

接下來按照範例來寫程式吧

index.php

<!DOCTYPE html>
<html>
	<head>
		<title>Account Kit Test</title>
		<script src="https://sdk.accountkit.com/zh_TW/sdk.js"></script>
	</head>
	<body>
		<input value="+886" id="country_code" />
		<input placeholder="phone number" id="phone_number" value=""/>
		<button onclick="smsLogin();">Login via SMS</button>

		<form id="login_success" method="post" action="/bk.php">
			<input id="csrf" type="hidden" name="csrf" />
			<input id="code" type="hidden" name="code" />
		</form>
		
		<script>
			// initialize Account Kit with CSRF protection
			AccountKit_OnInteractive = function(){
				AccountKit.init({
					appId: "{應用程式編號}",
					state: "{CSRF 值}", // 若使用的後端需要這個值可以傳入
					version:"v1.1", // 版本號,與 Account Kit 設定頁相符
					fbAppEventsEnabled: true, // 是否紀錄 Log
					// debug: true, 顯示詳細的錯誤資訊
					// redirect: "https://" 電子郵件才會用到的跳轉地址,需要與 Account Kit 設定頁的網域相符
				});
			};

			// login callback
			function loginCallback(response) {
				if (response.status === "PARTIALLY_AUTHENTICATED") {
					document.getElementById("code").value = response.code;
					document.getElementById("csrf").value = response.state;
					document.getElementById("login_success").submit();
				} else if (response.status === "NOT_AUTHENTICATED") {
					// handle authentication failure
				} else if (response.status === "BAD_PARAMS") {
					// handle bad parameters
				}
			}

			// phone form submission handler
			function smsLogin() {
				var countryCode = document.getElementById("country_code").value;
				var phoneNumber = document.getElementById("phone_number").value;
				AccountKit.login(
					'PHONE', 
					{
						countryCode: countryCode, 
						phoneNumber: phoneNumber
					}, // will use default values if not specified
					loginCallback
				);
			}
		</script>
	</body>
</html>

bk.php

<?php
	// Initialize variables
	$app_id = '909797776085994';
	$secret = '89c084689ded7f740920b8b12d4a2138';
	$version = 'v1.1';

	// Method to send Get request to url
	function doCurl($url) {
		$ch = curl_init();

		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

		$data = json_decode(curl_exec($ch), true);

		curl_close($ch);

		return $data;
	}

	$token_exchange_url = "https://graph.accountkit.com/$version/access_token?grant_type=authorization_code&code=$_POST[code]&access_token=AA|$app_id|$secret";

	$data = doCurl($token_exchange_url);

	$user_id = $data['id'];
	$user_access_token = $data['access_token'];
	$refresh_interval = $data['token_refresh_interval_sec'];

	// Get Account Kit information
	$me_endpoint_url = "https://graph.accountkit.com/$version/me?access_token=$user_access_token";

	$data = doCurl($me_endpoint_url);
	$phone = isset($data['phone']) ? $data['phone']['number'] : '';
	$email = isset($data['email']) ? $data['email']['address'] : '';
?>
<!DOCTYPE html>
<html>
	<head>
		<title>Account Kit PHP</title>
	</head>
	<body>
		<div>User ID: <?php echo $user_id; ?></div>
		<div>Phone Number: <?php echo $phone; ?></div>
		<div>Email: <?php echo $email; ?></div>
		<div>Access Token: <?php echo $user_access_token; ?></div>
		<div>Refresh Interval: <?php echo $refresh_interval; ?></div>
	</body>
</html>

Step 4

首先首頁的樣子會有一個 國碼 及 電話號碼的輸入框

若只想要讓台灣的電話使用的話,就直接寫死 +886

10

點下 Login via SMS 後會跳出小視窗,可以選擇使用 簡訊 還是 WhatsApp

11

選擇簡訊後,會收到一封這樣子的內容

簡訊內容的部分不開放修改,只能選擇一些範本

13

回到小視窗輸入簡訊收到的驗證碼

12

就可以取得用戶的 電話號碼 及 User ID

14

結尾

利用這樣子的服務,不僅可以簡單快速的提供註冊功能

另一方面,在原有的註冊功能上驗證用戶的手機號碼也是蠻常使用的方式

使用者不需要有 Facebook 帳號也可以使用這樣的服務

而且目前 Account Kit 在沒超過 10萬 封之前都是免費的

真的是很方便很實用

若這邊教學有幫助到你的話~請多多分享轉發出去給更多的人知道

謝謝大家的觀看

Read more

[LeetCode] #12 Integer to Roman 解題

題目連結 題型解說 這是一題難度為普通的題目 需要設計一個方法,此方法會傳入一個整數 num 要求是把整數轉換成羅馬字母,轉換清單如下 I => 1 V => 5 X => 10 L => 50 C => 100 D => 500 M => 1000 但羅馬字母有一些特殊規則 4 並非 IIII 而是 IV,9 並非 VIIII 而是 IX 這規則同樣可以套用到 40 90 400 900 解題思路 既然知道特殊規則是一樣的,變得是使用的符號,那麼先從 num 取個位數開始 轉換完成後,把 num 除上 10,消除個位數,

By Michael

[LeetCode] #11 Container With Most Water 解題

題目連結 題型解說 這是一題難度為中等的題目 需要設計一個方法,此方法會傳入一個數字陣列 height 陣列中的元素代表每一個柱子的高度 現在需要計算出,該陣列中以某兩隻柱子為邊界,最多可以裝多少水 以範例來說 height = [1,8,6,2,5,4,8,3,7] 最多可以裝 7 * 7 = 49 單位的水 解題思路 計算面積就是底乘上高 底的計算方式為 「右邊柱子的 index」 減去 「左邊柱子的 index」 高就取最短的那一根柱子高度 拿題目給的例子來當範例 建立三個變數 result、left、right left、right 代表左右兩邊的 index result 代表目前最大容量,初始值 0 第一步,找出最短的柱子高度,

By Michael

[LeetCode] #941 Valid Mountain Array 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個數字陣列 arr 判斷陣列中的元素是不是由低到高再從高到低(山形)的排序,且不連續一個以上數字 比如說 [1,2,3,2] 就是一個山形陣列,但 [1,2,2,3,2] 不是,因為有兩個 2 [1,2,3,4,5] 和 [5,4,3,2,1] 也不算是山形陣列,前者只有往上沒有往下,後者相反 解題思路 準備一個數字變數(temp)和布林變數(asc),跑一次迴圈,有可能遇到如下狀況 1. 某個數字與前一個數字相同,這時候直接回傳 false

By Michael

[LeetCode] #944 Delete Columns to Make Sorted 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個字串陣列 strs 這個陣列中每個字串的長度都相同,字串內容都是小寫英文 需要檢查每個元素的第 N 個字元是不是由小至大排列,並回傳有幾個錯誤排列 比如傳入的陣列長這樣 ["cba","daf","ghi"] 取第一個字元 = cdg 取第二個字元 = bah 取第三個字元 = afi 其中第二組的結果(bah)並不是由小至大排列,故回傳 1 解題思路 這一題就用兩個迴圈各別把字元取出來,並比較是否比上一個字元大(Java 中的字元可以直接比較),如果不是就將結果+1 程式碼 Java class Solution { public int minDeletionSize(String[] strs) { int result = 0; for (int i = 0,

By Michael