1. 程式人生 > >Unity裝置唯一性驗證(二維碼掃描)

Unity裝置唯一性驗證(二維碼掃描)

是不是被標題騙進來了,客官,來了就別走了。
對!又是這種Low的不要不要的驗證方式,不知道有沒有哪個大神想出來比較好的裝置唯一性的驗證方式,沒有辦法,客戶是爸爸!!!!

  • 需求篇:
    先說一下客戶的需求吧,原話是:“我類個乖乖,我這東西要賣的好了,別人仿造我的產品那咱不就虧大了。你們也給我neng一個二維碼驗證,就是不讓別人用”。
    就是這個要求,我們的程式變成了擁有自己伺服器的一個軟體了。可以Low就是Low,不是你加上WWW就變成一個精靈寶可夢了~就更不別說GO了。。

聊技術!

咱們是技術!

Unity網路訪問Http的介面,WWW是一個不能不瞭解的類。
Unity中,WWW是一個簡單的訪問網頁的類,可以通過WWW(URL)去訪問網站介面並返回一個WWW的物件。後續操作就根據WWW給出方法,類,做相對應的操作、

如果你之前瞭解過HTTP的資料提交方式(其實常見有8種之多)GET[^footnote]./POST[^footnote].)兩種最經常使用的方式,而WWW訪問中,預設的形式就是GET方式,對應的如果你提供一個postData可以使用POST方式提交資料。

然後說一下比較常用的型別:
isDone:判斷下載是否已經完成(只讀)
Progress:下載進度,一般就是咱們在UI進度條中使用的值
url: 就是WWW這次訪問URL

這裡先給一個官方的例子,你們感受一下

using UnityEngine;
using System.Collections;

public class
ExampleClass : MonoBehaviour { public string url = "http://images.earthcam.com/ec_metros/ourcams/fridays.jpg"; IEnumerator Start() { WWW www = new WWW(url); yield return www; renderer.material.mainTexture = www.texture; } }

這個就是獲取到的一個圖片。

這次只是說WWW在網路上的應用,本地的就不說了,也很簡單。

-二維碼
這裡寫圖片描述

-裝置唯一性
關於裝置唯一性,因為IOS和Android的機制不一樣(也可能是我這段時間沒有去了解過的原因)。
Android的裝置機器碼在Unity3D中獲取是這樣的

SystemInfo.deviceUniqueIdentifier   (string

這個引數是string形式的,咱們要把這個提交的伺服器做唯一的驗證

IOS就比較麻煩了,因為這個函式在IOS中是會改變的,我就另闢蹊徑找到了一個IOS裝置的唯一碼的方法,就是UUID。

我的方法就是,在IOS端寫了一個原生獲取UUID的方法,然後在Unity中引用,在專案初始化的時候,對全域性一個值賦值、

  [DllImport("__Internal")]
    private static extern void GetClientUUID();

如果有需要我可以把.a ,.h檔案發給你。

就這樣,兩種裝置的唯一性就可以保證了。

資料驗證

首先博主是用了GET的方式,POST不方便我直接測試。
之後就是資料上的驗證了,這邊服務端的程式碼就不講了。稍微說一下規則好了:
1、一個二維碼只能啟用不同的機器六個。
2、二維碼的生成是按照本地的演算法加密生成的。
3、二維碼的解密是在本地(這裡是因為服務端比較懶,這個最好放在服務端來。)

下邊上程式碼:

public static IEnumerator Check1(string url, string productId, GameObject go)
    {

        string key = url.Replace("http://www.baidu.com(你們的驗證網址)/", "");
        int num = (getTen(key) - 123567) / 5000;
        string id = TempData.sInstantiate.divicesId;
        WWWForm form = new WWWForm();
        form.AddField("cdkey_id", num);
        form.AddField("product_id", productId);
        form.AddField("sequence", id);


        using (WWW www = new WWW("http://www.baidu.com/", form))
        {
            yield return www;
            if (www.error == null)
            {
                Debug.Log(www.text);
                //用了MiniJson解析返回值
                Hashtable htb = MiniJSON.jsonDecode(www.text) as Hashtable;
                  if (htb != null && htb.ContainsKey("success"))
                {
                Debug.Log("成功了!");
                }
                else
                {
                 Debug.Log("NONONONO!!");
                }
            }
            }
        }

還有另外一種方式,就要看你們習慣以用哪一種了,其實都一樣:

   public static IEnumerator Check2(string productId, GameObject go)
    {
        string id = TempData.sInstantiate.divicesId;

        using (WWW www = new WWW("http://www.baidu.com/?product_id=" + productId + "&sequence=" + id))
        {
            yield return www;

            if (www.error == null)
            {
                Debug.Log(www.text);
                Hashtable htb = MiniJSON.jsonDecode(www.text) as Hashtable;
                if (htb != null && htb.ContainsKey("success"))
                {
                    if (bool.Parse(htb["success"].ToString()) == true)
                    {
                    Debug.Log("成功了!");
                    }
                    else
                    {
                    Debug.Log("NONONONO");
                    }
            }

PS:求大神指導!!!!!!!!!!!!!!!!

腳註

  1. 明文資料提交。
  2. 資料打包提交。