# 安卓LUA实例讲解

本实例讲解安卓LUA代码请求实例

# 简单描述

讲解安卓不带加解密简单使用实例,方法为可以自行封装为工具类,支持POST,GET请求,原理简单,调用自带请求方法,验签加解密自行处理,

require "import"
import "android.app.*"
import "android.os.*"
import "android.widget.*"
import "android.view.*"
import "layout"
import "lay"
import "cjson"

activity.setContentView(loadlayout(lay))
---------------配置信息--------------------------

-- askKey,请在APP设置内复制粘贴

local askKey = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhcHBJZCI6NzQwOTM2MDAwMTgyMjQzMzI4LCJnZXRNYW5hZ2VtZW50SWQiOjcwMDI4NzczMjA1MDEyMDcwNCwiVElNRSI6MTY2NTc2NDUxODYxMH0.koz45poFPZ0HLIe1SgHA-6QzO7OoYxrsJYHrttMyoa0"

--------------接口信息----------------------------
local api = "https://api.potatocloud.cn/api" --请求地址
local verifyCard="/verifyCardV2" --验证卡密
local notice="/getNotice"  --获取公告
--------------接口信息------------------------------

-- 测试点击方法
function demo.onClick

  -- 卡密内容
  local text=userverify.Text
  -- 设备号自行配置,这里写死
  local request_body={"cardStr"=text,"mac"="123"}
  -- 获取返回结果
  request_body = cjson.encode(request_body)
  --调用post,请查看post方法
  post(verifyCard,request_body, returnData)

end

-- 测试调用get方法
function demo.onClick
  --调用get,请查看下方get方法
  get(notice,noticeCallback)
end


--返回结果处理方法
function returnData (code,content,cookie,header)
  --这个是返回结果处理
  local data=cjson.decode(content)
  -- 请求处理
  if data.code=='200' then
    --状态码200为成功
    --这里打印到期日
    if data.data.verify==true then
      print("验证成功,到期日:"..data.data.exTime)
     else
    end
    return
   elseif data.code=='500' then
    -- 500为错误,给用户展示错误信息
    print(data.message)
    return
   elseif data.cide=="403" then
    --没有权限或登录实现
    print("登录失效")
   else
    --其他错误直接提示失败
    print("请求失败");
    return
  end
end

function post(url,data,retrunFunction){
  --定义请求头
  local header={
    ["Accept"]= "*",
    -- 请求格式from表单   
    --["Content-Type"] = "application/x-www-form-urlencoded",
    --json
    ["Content-Type"] = "application/json",
    -- 替换你的askKey
    ["askKey"] = askKey,
    --sign
    ["sign"] = "sign",
    --时间戳
    ["time"] = "1681401600000",
  }
  -- 发送请求

  Http.post(api..url,data,nil,nil,header,retrunFunction)

}

function get(url,retrunFunction){
  --定义请求头
  header={
    ["Accept"]= "*",
    -- 请求格式from表单   
    -- ["Content-Type"] = "application/x-www-form-urlencoded",
    --json
    ["Content-Type"] = "application/json",
    -- 替换你的askKey
    ["askKey"] = askKey,
    --sign
    ["sign"] = "sign",
    --时间戳
    ["time"] = "1681401600000",
  }
  -- 发送请求
  Http.get(api..url,nil,nil,header,retrunFunction)
}

--返回结果处理方法
function noticeCallback(code,content,cookie,header){
  --这个是返回结果处理
  local data=cjson.decode(content)
  -- 请求处理
  if data.code=='200' then
    --状态码200为成功
    AlertDialog.Builder(this)
    .setTitle(data.data.head)
    .setMessage(data.data.str)
    .setPositiveButton("确定",{onClick=function(v) print"点击了确定按钮"end})
    .show()

    return
   elseif data.code=='500' then
    -- 500为错误,给用户展示错误信息
    print(data.message)
    return
   elseif data.cide=="403" then
    --没有权限或登录实现
    print("登录失效")
   else
    --其他错误直接提示失败
    print("请求失败");
    return
  end
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138

下方GET请求方法详细

function get(url,retrunFunction){
  --定义请求头
  header={
    ["Accept"]= "*",
    -- 请求格式from表单   
    -- ["Content-Type"] = "application/x-www-form-urlencoded",
    --json
    ["Content-Type"] = "application/json",
    -- 替换你的askKey
    ["askKey"] = askKey,
    --sign
    ["sign"] = "sign",
    --时间戳
    ["time"] = "1681401600000",
  }
  -- 发送请求,retrunFunction为回调方法,看最上面完整实例
  Http.get(api..url,nil,nil,header,retrunFunction)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

下方POST请求方法详细,回调函数请查看完整实例,开发者可自行封装工具类,请求支持json和表单信息,请求和返回报文数据请移步具体接口文档,

function post(url,data,retrunFunction){
  --定义请求头
  local header={
    ["Accept"]= "*",
    -- 请求格式from表单,请求支持表单和json格式
    -- ["Content-Type"] = "application/x-www-form-urlencoded",
    --json
    ["Content-Type"] = "application/json",
    -- 替换你的askKey
    ["askKey"] = askKey,
    --sign
    ["sign"] = "sign",
    --时间戳
    ["time"] = "1681401600000",
  }
  -- 调用发送请求,retrunFunction为回调方法,看最上面完整实例
  Http.post(api..url,data,nil,nil,header,retrunFunction)

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

####解密方法 数据加解密需要基本的引入,以下为基本的引入

import "android.app.*"
import "android.os.*"
import "android.widget.*"
import "android.view.*"
import "layout"
import "lay"
import "cjson"
import "java.security.MessageDigest"
import "android.text.TextUtils"
import "java.lang.StringBuffer"
import "android.util.Base64"
import "javax.crypto.*"
import "javax.crypto.spec.SecretKeySpec"
import "java.nio.charset.Charset"
import "java.nio.charset.StandardCharsets"
import"android.util.Base64"
import"javax.crypto.spec.SecretKeySpec"
import"javax.crypto.Cipher"
import"javax.crypto.spec.PBEKeySpec"
import"javax.crypto.SecretKeyFactory"

import "javax.crypto.spec.DESKeySpec";

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

DES/ECB/PKSC7 加密方法

-- 数据加密方法
-- 测试数据content:123,password:2c33853c07f7da3a
-- 加密后数据:L8KmLGznRfI=
function encryptDES(content,password)
    -- DES算法要求有一个可信任的随机数源
    random=SecureRandom;
    -- 创建一个DESKeySpec对象
    desKey=DESKeySpec((String(password).getBytes("utf-8")));
    -- 创建一个密匙工厂
    local keyFactory = SecretKeyFactory.getInstance("DES");
    -- 将DESKeySpec对象转换成SecretKey对象
    local securekey = keyFactory.generateSecret(desKey);
    -- Cipher对象实际完成解密操作
    local cipher=Cipher.getInstance("DES");
    -- 用密匙初始化Cipher对象
    cipher.init(Cipher.ENCRYPT_MODE, securekey, random);
    -- 真正开始加密操作
    local data=cipher.doFinal(String(content).getBytes())
    -- 返回数据进行base64编码
    return base64Encode(data)
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

DES/ECB/PKSC7 解密方法

-- 数据解密方法
-- 测试数据content:L8KmLGznRfI=,password:2c33853c07f7da3a
-- 解密后数据:123
function decryptDES(content,password)
    -- DES算法要求有一个可信任的随机数源
    random=SecureRandom;
    -- 创建一个DESKeySpec对象
    desKey=DESKeySpec((String(password).getBytes("utf-8")));
    -- 创建一个密匙工厂
    local keyFactory = SecretKeyFactory.getInstance("DES");
    -- 将DESKeySpec对象转换成SecretKey对象
    local securekey = keyFactory.generateSecret(desKey);
    -- Cipher对象实际完成解密操作
    local cipher=Cipher.getInstance("DES");
    -- 用密匙初始化Cipher对象
    cipher.init(Cipher.DECRYPT_MODE, securekey, random);
    -- 真正开始解密操作
    local data=cipher.doFinal(base64Decode(content))
    -- 返回数据
    return String(data)
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

Base64 加密方法

function base64Decode(data){
  return Base64.decode(data, Base64.NO_WRAP);
}
1
2
3

Base64 解密方法

function base64Encode(data){
  return Base64.encodeToString(data, Base64.NO_WRAP);
}
1
2
3

Md5 加密方法

function md5(data)
  import "java.security.MessageDigest"
  local md=MessageDigest.getInstance("MD5")
  local bytes=md.digest(String(data).getBytes())
  local result=""
  for i=0,#bytes-1 do
    local temp = string.format("%02x",(bytes[i]&0xff))
    result=result..temp
  end
  return result
end


1
2
3
4
5
6
7
8
9
10
11
12
13
lastUpdate: 7/25/2024, 4:20:09 PM