Unity设备唯一性验证(二维码扫描)

来源:互联网 发布:淘宝达人贴怎么写 编辑:程序博客网 时间:2024/06/11 08:11

是不是被标题骗进来了,客官,来了就别走了。
对!又是这种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. 数据打包提交。
0 0
原创粉丝点击