注册码系统一般都有以下这些功能:
1) 试用
2) 生成注册码
3) 解绑注册码
4) 冻结注册码
5) 解冻注册码
6) 删除注册码
7) 续费注册码
由于要在存储试用的一些数据,因此需要使用到数据库来存储,下面是数据库中试用表的内容。
试用表
字段 |
字段描述 |
id |
序号 整型数据,为主键,且为自增 |
pcid |
机器码 |
begintime |
试用开始时间 |
endtime |
试用结束时间 |
num |
试用次数 |
创建试用表的百宝云代码如下:
// 创建试用数据表
function sqlCreatTestDataBase()
var 返回数组,ret
ret = sqlitesqlarray("regtest.db","create table IF NOT EXISTS testManager(id integer primary key autoincrement,pcid,begintime,endtime,num);",返回数组)//创建表
if(!ret)
sendtextmsg("创建表失败:"& getlasterror(1))
return false
else
return true
end
end
试用的数据库创建完成之后,就需要完善试用的其他功能了,如:验证试用登录、获取使用时间。
验证试用登录主要是判断是否允许当前的机器试用软件,百宝云端代码如下:
// 判断试用者是否可以验证通过
功能 sqlCheckTesterLogin(pcID)
// 通过传入的机器码,在数据库里查询,看数据库里是否有记录,没有则加入
变量 sqlstr = 字符串格式化("select * from testManager where pcid='%s';",pcID)
变量 返回数组,ret,retmsg="登录失败:未知错误"
ret = sqlite数据库执行返回数组("regtest.db",sqlstr,返回数组)
如果(返回数组 != null)
发送文本消息("Select = "&返回数组)
// 判断当前机器码的试用次数是否达到设定的最大值
变量 num = 返回数组[0]["num"]
发送文本消息("试用次数="&num)
如果(num > 100 )
retmsg = "失败:试用次数达到最大值"
发送文本消息("失败:试用次数达到最大值")
返回 "false"
结束
num++
变量 begintime = 当前时间()
变量 endtime = 指定时间("n",20,begintime) // 试用时间20分钟
变量 update = 字符串格式化("update testManager set num='%s',begintime='%s',endtime='%s' where pcid='%s';",num,begintime,endtime,pcID)
发送文本消息("SQL: "&update)
ret = sqlite数据库执行返回数组("regtest.db",update,返回数组)
retmsg = "true"
否则
// 第一次试用软件
变量 begintime = 当前时间()
变量 endtime = 指定时间("n",20,begintime) // 试用时间20分钟
变量 insert = 字符串格式化("insert into testManager(pcid,begintime,endtime,num) values('%s','%s','%s','1')",pcID,begintime,endtime)
发送文本消息("SQL: "&insert)
ret = sqlite数据库执行返回数组("regtest.db",insert,返回数组)
retmsg = "true"
结束
返回 retmsg
结束
获取用户试用的剩余时间,方便在软件里限制运行的时间。百宝云端代码如下:
// 查询剩下的试用时间
功能 sql查询试用时间(pcid)
// 参数格式: 机器码
变量 sqlstr = 字符串格式化("select * from testManager where pcid='%s';",pcid)
变量 返回数组,ret,retMsg
ret = sqlite数据库执行返回数组("regtest.db",sqlstr,返回数组)
如果(返回数组 == null)
发送文本消息("Error:"&获取错误信息(1))
retMsg = "-1"
否则
变量 begintime = 返回数组[0]["begintime"]
变量 endtime = 返回数组[0]["endtime"]
变量 nowtime = 当前时间()
变量 min = 时间间隔("n",nowtime,endtime)
发送文本消息("leave Time: "&min)
retMsg = min // 返回剩余的时间:多少分钟
结束
返回 retMsg
结束
为了注册码系统可以适用多平台,这里就使用百宝云内置的事件_post,把试用的验证、查询试用剩余时间都通过post请求来完成。
post传入的第二个参数是一个json格式的数据,格式为{"flag":"表示验证试用还是查询时间","pcid":"机器码"}
百宝云端的代码如下:
// 执行客户端发来的post请求,并返回执行的结果,以网页源码的形式返回.
功能 _post(token,arg)
发送文本消息("_post: " & arg)
变量 paramArr = json转数组(arg)
如果(!是否数组(paramArr))
返回 "错误的参数列表"
结束
变量 flag = paramArr["flag"]
变量 pcID = paramArr["pcid"]
选择(flag)
条件 "试用"
返回 sqlCheckTesterLogin(pcID)
条件 "试用时间"
返回 sql查询试用时间(pcID)
结束
结束
这样,客户端只需要使用post请求访问百宝云就可以完成:试用的验证以及查询试用剩余时间。
注册码系统的试用功能就这样完成了。
TC语言使用此试用系统的代码如下:
// Post方法与百宝云应用通信
功能 runBbyFunctionPost(arg)
//post提交
变量 token = "aac5ddb832bbca6d2db00a7557152d5c"
变量 params = "token="& token &"&funparams="&arg
变量 url = "http://api.baibaoyun.com/cloudapi/CloudAppGetOrPostAPI"
变量 post_ret = http提交请求("POST",url,params,"utf-8")
返回 post_ret
结束
// 检测软件的试用时间是否结束
功能 检测试用脚本运行时间(ID)
变量 param = 字符串格式化("{ \"flag\":\"试用时间\", \"pcid\":\"%s\", \"key\":\"%s\"}",pcID,"0")
循环(真)
等待(1000*60)
变量 ret = runBbyFunctionPost(param)
如果(是否整型(ret))
如果( ret < 0)
线程关闭(线程ID) // 关闭正在运行的脚本,或者下面的消息框使用一个新的EXE程序来替代
消息框("试用时间到!")
退出()
结束
否则
变量 arr = json转数组(ret)
消息框("试用失败,原因:" & arr["errMsg"])
结束
结束
结束
注册码表
字段 |
字段描述 |
id |
序号 整型数据,为主键,且为自增 |
regcode |
注册码 |
begintime |
注册码第一次启动的时间 |
endtime |
注册码的结束时间 |
bindDevicesName |
绑定的机器码 |
isbind |
是否绑定 |
isFrozen |
是否冻结 |
type |
注册码类型(天卡、周卡、月卡) |
isactive |
注册码是否启动 |
创建注册码表的百宝云代码如下:
// 创建数据库
function sqlCreatDataBase()
var 返回数组,ret
// id 数据库的自增编号
// regcode 注册码
// begintime 开始时间
// endtime 结束时间
// bindDevicesName 绑定的机器码
// isbind 是否绑定
// isFrozen 是否冻结
// type 注册码类型
// isactive 注册码是否启动
ret = sqlitesqlarray("regtest.db","create table IF NOT EXISTS regManager(id integer primary key autoincrement,regcode,begintime,endtime,bindDevicesName,isbind,isFrozen,type,isactive);",返回数组)//创建表
if(!ret)
sendtextmsg("创建表失败:"& getlasterror(1))
return false
else
return true
end
end
以下将是注册码常规操作的功能代码。
5.4.1 生成注册码
根据传入的参数,生成相应类型的注册码。
5.4.2 解绑注册码
// 解绑注册码
功能 sql解绑注册码(regKey)
变量 返回数组,ret
变量 sqlstr = 字符串格式化("select * from regManager where regcode='%s';",regKey)
ret = sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)
如果(ret && 返回数组 != null)
sqlstr = 字符串格式化("update regManager set isbind='false' where regcode='%s';",regKey)
ret = sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)
发送文本消息("sql解绑注册码")
返回 真
否则
发送文本消息("sql解绑注册码")
返回 假
结束
结束
5.4.3 冻结注册码
// 冻结注册码
功能 sql冻结注册码(regKey)
变量 返回数组,ret
变量 sqlstr = 字符串格式化("select * from regManager where regcode='%s';",regKey)
ret = sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)
如果(ret && 返回数组 != null)
sqlstr = 字符串格式化("update regManager set isFrozen='true' where regcode='%s';",regKey)
ret = sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)
发送文本消息("sql冻结注册码")
返回 真
否则
发送文本消息("sql冻结注册码")
返回 假
结束
结束
5.4.4 解冻注册码
// 解冻注册码
功能 sql解冻注册码(regKey)
变量 返回数组,ret
变量 sqlstr = 字符串格式化("select * from regManager where regcode='%s';",regKey)
ret = sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)
如果(ret && 返回数组 != null)
sqlstr = 字符串格式化("update regManager set isFrozen='false' where regcode='%s';",regKey)
ret = sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)
发送文本消息("sql解冻注册码")
返回 真
否则
发送文本消息("sql解冻注册码")
返回 假
结束
结束
5.4.5 删除注册码
// 删除注册码
功能 sql删除注册码(regKey)
变量 返回数组,ret
变量 sqlstr = 字符串格式化("select * from regManager where regcode='%s';",regKey)
ret = sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)
如果(ret && 返回数组 != null)
sqlstr = 字符串格式化("delete from regManager where regcode='%s';",regKey)
ret = sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)
发送文本消息("sql删除注册码")
返回 真
否则
发送文本消息("sql删除注册码")
返回 假
结束
结束
5.4.6 续费注册码
// sql续费注册码
功能 sql续费注册码(regKey,type)
变量 返回数组,ret
变量 sqlstr = 字符串格式化("select * from regManager where regcode='%s';",regKey)
ret = sqlite数据库执行返回数组("regtest.db",sqlstr,返回数组)
如果(ret && 返回数组 != null)
变量 end1Time1 = 返回数组[0]["endtime"]
变量 endtime = 0
选择(type)
条件 "ji"
endtime = 指定时间("m",3,end1Time1)
条件 "mouth"
endtime = 指定时间("m",1,end1Time1)
条件 "week"
endtime = 指定时间("d",7,end1Time1)
条件 "day"
endtime = 指定时间("d",1,end1Time1)
结束
sqlstr = 字符串格式化("update regManager set endtime='%s' where regcode='%s';",endtime,regKey)
发送文本消息(sqlstr)
ret = sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)
发送文本消息("sql续费注册码成功")
返回 真
否则
发送文本消息("sql续费注册码成功")
返回 假
结束
结束
5.4.7 注册码登录的处理
// 判断登录者是否可以验证通过
功能 sqlCheckLoginInfo(pcID,regKey)
变量 sqlstr = 字符串格式化("select * from regManager where regcode='%s';",regKey)
变量 返回数组,ret,retmsg="登录失败:未知错误"
ret = sqlite数据库执行返回数组("regtest.db",sqlstr,返回数组)
发送文本消息("sqlCheckLoginInfo: " & 返回数组)
如果(返回数组 != null)
// 判断注册码是否冻结了
如果(返回数组[0]["isFrozen"] == "true")
retmsg = "登录失败:注册码已经冻结"
返回 retmsg
结束
// 判断注册码是否已经绑定了本机器
变量 bindDevicesName = 返回数组[0]["bindDevicesName"]
// 第一次登录
如果(bindDevicesName == "")
变量 begintime = 当前时间()
变量 endtime = 0
选择(返回数组[0]["type"])
条件 "ji"
endtime = 指定时间("m",3,begintime)
条件 "mouth"
endtime = 指定时间("m",1,begintime)
条件 "week"
endtime = 指定时间("d",7,begintime)
条件 "day"
endtime = 指定时间("d",1,begintime)
结束
变量 update = 字符串格式化("update regManager set bindDevicesName='%s',begintime='%s',endtime='%s',isbind='true',isactive='true' where regcode='%s';",pcID,begintime,endtime,regKey)
发送文本消息("SQL: "&update)
ret = sqlite数据库执行返回数组("regtest.db",update,返回数组)
变量 min = 时间间隔("n",begintime,endtime)
如果(min>0)
retmsg = "登录成功:剩余时间=" & min & "分钟"
结束
否则如果(bindDevicesName != "" && bindDevicesName == pcID) // 机器码相同的话,就直接返回剩余时间
变量 begintime = 返回数组[0]["begintime"]
变量 endtime = 返回数组[0]["endtime"]
变量 nowtime = 当前时间()
变量 min = 时间间隔("n",nowtime,endtime)
如果(min>0)
retmsg = "登录成功:剩余时间=" & min & "分钟"
否则
retmsg = "登录失败:注册码已经过期"
结束
否则如果(bindDevicesName != "" && bindDevicesName != pcID) // 机器码不同的就判断是否绑定了
变量 isBind = 返回数组[0]["isbind"]
如果(isBind == "true")
retmsg = "登录失败:注册码已经绑定其他机器"
否则
变量 update = 字符串格式化("update regManager set bindDevicesName='%s',isbind='true' where regcode='%s';",pcID,regKey)
发送文本消息("更换绑定机器码: "&update)
ret = sqlite数据库执行返回数组("regtest.db",update,返回数组)
变量 endtime = 返回数组[0]["endtime"]
变量 nowtime = 当前时间()
变量 min = 时间间隔("n",nowtime,endtime)
如果(min>0)
retmsg = "登录成功:剩余时间=" & min & "分钟"
否则
retmsg = "登录失败:注册码已经过期"
结束
结束
结束
否则
发送文本消息("查询失败:"&获取错误信息(1))
retmsg = "登录失败:注册码不存在"
结束
返回 retmsg
结束
5.4.8 查询注册码的使用时间
// 查询注册码使用时间
功能 sql查询注册码使用时间(pcID,regKey)
变量 sqlstr = 字符串格式化("select * from regManager where regcode='%s' and bindDevicesName='%s'",regKey,pcID)
变量 返回数组,ret,retMsg
ret = sqlite数据库执行返回数组("regtest.db",sqlstr,返回数组)
如果(返回数组 == null)
retMsg = "查询失败:查询失败."
否则如果(返回数组[0]["isFrozen"] == "true")
retMsg = "查询失败:注册码已经冻结."
否则
发送文本消息("isFrozen:"&返回数组[0]["isFrozen"])
变量 begintime = 返回数组[0]["begintime"]
变量 endtime = 返回数组[0]["endtime"]
变量 nowtime = 当前时间()
变量 min = 时间间隔("n",nowtime,endtime)
retMsg = min
结束
返回 retMsg
结束
注册码的登录验证与剩余时间查询也是通过post的方法来实现的,具体代码如下:
// {"flag":"表示验证试用还是查询时间","pcid":"机器码"}
// 执行客户端发来的post请求,并返回执行的结果,以网页源码的形式返回.
功能 _post(token,arg)
发送文本消息("_post: " & arg)
变量 paramArr = json转数组(arg)
如果(!是否数组(paramArr))
返回 "错误的参数列表"
结束
变量 flag = paramArr["flag"]
变量 pcID = paramArr["pcid"]
选择(flag)
条件 "注册码登录"
发送文本消息("注册码登录:"&arg)
变量 regValue = paramArr["key"]
返回 sqlCheckLoginInfo(pcID,regValue)
条件 "查询注册码时间"
发送文本消息("查询注册码时间,机器码:"&arg)
变量 regValue = paramArr["key"]
返回 sql查询注册码使用时间(pcID,regValue)
结束
结束
考虑到注册码管理端可以是任何语言编写的,因此对注册码的管理操作,就放到 _get事件里,对应的代码如下:
//arg参数格式: {"flag":"表示验证试用还是查询时间","pcid":"机器码","type":"注册码类型,续费用的"}
功能 _get(token,arg)
发送文本消息("_get: " & arg)
变量 paramArr = json转数组(arg)
如果(!是否数组(paramArr))
返回 "错误的参数列表"
结束
变量 flag = paramArr["flag"]
变量 pcid = paramArr["pcid"]
选择(flag)
条件 "查询所有注册码"
发送文本消息("查询所有注册码")
返回 sql获取注册码所有信息()
条件 "解绑注册码"
发送文本消息("解绑注册码:"&pcid)
返回 sql解绑注册码(pcid)
条件 "冻结注册码"
发送文本消息("冻结注册码:"&pcid)
返回 sql冻结注册码(pcid)
条件 "解冻注册码"
发送文本消息("解冻注册码:"&pcid)
返回 sql解冻注册码(pcid)
条件 "删除注册码"
发送文本消息("删除注册码:"&pcid)
返回 sql删除注册码(pcid)
条件 "新建注册码"
发送文本消息("新建注册码,类型为:"&pcid)
返回 sql创建新注册码(pcid)
条件 "续费注册码"
变量 type = paramArr["type"]
发送文本消息("续费注册码,类型为:"&type&" 注册码:"&pcid)
返回 sql续费注册码(pcid,type)
结束
结束
查询所有注册码的功能代码如下:
// 返回所有注册码信息
功能 sql获取注册码所有信息()
变量 sqlstr = "select * from regManager"
变量 返回数组,ret
ret = sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)
发送文本消息("获取所有注册码:"&返回数组)
返回 返回数组
结束
针对数据的安全性,可以对get与post的数据做加密处理,加密算法可以自己编写,也可以试用百宝云提供的加解密算法,之后定期更新加解密算法,这样可以提升数据的安全性。