Unity利用Mob實現簡訊驗證
最近一直在研究如何給app更多實用性的功能,在app進行登入或者註冊時,為了方便使用者更加快捷的完成登入功能,所以就決定採用簡訊驗證碼的方式進行驗證登入。在學習的過程中,先使用了Mob的簡訊服務進行簡訊驗證,因為他是免費的,而且不需要提交什麼材料(單純為了測試),後期加入到專案中的話,還是需要去建立自己的簽名和簡訊模板,先拿Mob練練手,後期在專案中還是會使用阿里雲的簡訊服務,到時候實現了之後也會分享出來。
因為我這裡只是做了一個簡單的Demo,所以就沒有必要去申請這些許可權,其實申請的話很容易過的,只要上傳一下公司的營業執照就好。好了,廢話不多說了,實現功能吧!
需要先在Mob上有一個自己的賬號,用自己的常用郵箱註冊就好,然後進入到後臺,建立一個自己的應用,隨便取個名字就可以建立成功,建立成功後就可以拿到Appkey及Appsecret,這兩個資料後面是需要用到的,有了這個就可以非常方便的看到後臺的統計資訊,然後再Mob官網上下載SMSSDK,因為都是開源專案,所以Mob的程式碼都是託管在git上的,然後將裡面的Unity包匯入到專案中。我新建了一個工程來實現該功能,利用UGUI搭建了一個簡易的收發驗證碼的介面。接下來就是開始碼程式碼了,新建一個測試指令碼,並且繼承且實現SMSSDKHandler介面,為了方便接收驗證碼傳送的回撥結果。先申明SMSSDK變數,然後在Start中初始化,將先前建立的Appkey及App secret填入,第三個引數為是否warn,根據官網建議設定為false。
ssdk.init("292449f735890", "f1bee8045aac2e6cbb7c535a5277aa1c", false);
ssdk.setHandler(this);
接下來是實現簡訊驗證碼功能,特別需要注意的是第四個引數,它表示的簡訊模板,因為我們一開始是沒有申請到簡訊模板的,因為Mob需要我們的應用中先利用他們sdk實現了簡訊驗證碼功能,提交的app才能通過稽核。所以此時我們是沒有簡訊模板的,所以這裡在測試的時候傳null就好了。
ssdk.getCode(CodeType.TextCode, phone, "86", null);
然後點擊發送按鈕後,就可以接收到簡訊了,接下來就是驗證驗證碼是否正確了。phoneNumber表示的是手機號,codeNumer表示的是輸入的驗證碼,點選驗證後,就會自動驗證了。
ssdk.commitCode("phoneNumber", "86", "codeNumber");
前面因為我們實現了SMSSDKHandler介面,所以在onComplete方法中返回驗證成功,在onError方法中返回驗證失敗。
public void onComplete(int action, object resp)
{
ActionType act = (ActionType)action;
if (resp != null)
{
//result = resp.ToString();
text.text += "\n" + resp.ToString();
Debug.Log(resp.ToString());
}
if (act == ActionType.GetCode)
{
text.text += "\n 驗證成功!!!";
string responseString = (string)resp;
Debug.Log("isSmart :" + responseString);
}
}
public void onError(int action, object resp)
{
Debug.Log("Error :" + resp);
text.text += "\n 驗證失敗!!!";
text.text += "\n Error : " + resp;
print("OnError ******resp" + resp);
}
以下是我的完整程式碼。
public class Test : MonoBehaviour, SMSSDKHandler
{
public SMSSDK ssdk;
private InputField code;
private InputField phoneNum;
private Button enter;
private Button send;
private string codeNum;
private string phone;
private Text timer;
private bool isSend;
private int time;
private float t;
public Text text;
private void Start()
{
ssdk.init("292449f735890", "f1bee8045aac2e6cbb7c535a5277aa1c", false);
ssdk.setHandler(this);
timer = transform.Find("Timer").GetComponent<Text>();
code = transform.Find("code").GetComponent<InputField>();
phoneNum = transform.Find("num").GetComponent<InputField>();
enter = transform.Find("enter").GetComponent<Button>();
send = transform.Find("send").GetComponent<Button>();
timer.gameObject.SetActive(false);
enter.onClick.AddListener(EnterCodeHandler);
send.onClick.AddListener(SendCodeHandler);
}
private void Update()
{
if (isSend)
{
//倒計時
timer.text = time.ToString();
t += Time.deltaTime;
if (t >= 1)
{
time--;
t = 0;
}
if (time < 0)
{
isSend = false;
send.gameObject.SetActive(true);
timer.gameObject.SetActive(false);
}
}
}
/// <summary>
/// 傳送驗證碼
/// </summary>
private void SendCodeHandler()
{
phone = phoneNum.text;
isSend = true;
time = 60;
send.gameObject.SetActive(false);
timer.gameObject.SetActive(true);
ssdk.getCode(CodeType.TextCode, phone, "86", null);
}
/// <summary>
/// 點選確定,對比驗證碼
/// </summary>
private void EnterCodeHandler()
{
ssdk.commitCode(phone, "86", code.text);
}
public void onComplete(int action, object resp)
{
ActionType act = (ActionType)action;
if (resp != null)
{
//result = resp.ToString();
text.text += "\n" + resp.ToString();
Debug.Log(resp.ToString());
}
if (act == ActionType.GetCode)
{
text.text += "\n 驗證成功!!!";
string responseString = (string)resp;
Debug.Log("isSmart :" + responseString);
}
}
public void onError(int action, object resp)
{
Debug.Log("Error :" + resp);
text.text += "\n 驗證失敗!!!";
text.text += "\n Error : " + resp;
print("OnError ******resp" + resp);
}
}
通過上面的實現,我們現在就基本實現了簡訊驗證功能,但是因為Mob是免費的,所以對每個手機號都有限制,好像是對每一個手機號都只能驗證一次,所以很不方便。接下來我打算利用阿里雲的簡訊服務實現一個,到時候也會分享出來,這個專案的原始碼及我釋出的一個測試版本都放在了我的git上了,有興趣的可以下載下來看看。