1. 程式人生 > >Unity利用Mob實現簡訊驗證

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上了,有興趣的可以下載下來看看。