栓Q验证系统官网:http://shuanq.cn
自栓Q验证系统V5.1版本起新增了TCP/UDP协议客户端对接,支持http/https、tcp、udp同时使用,但为了能够兼容所有的接口,都需要主动向tcp、udp服务器发送数据包才能接收到来自服务器处理后的响应数据包,服务器并不会主动向客户端进行数据发送(后续的版本可能会更新),tcp和udp协议客户端数据发送格式为JSON,服务端响应数据默认也是JSON(除非自定义设置),http协议请求接口无非就是post、get请求传递参数,而tcp和udp则不同还是有一点差异的不过差异不太大,但接口地址和接口参数是相同的,下面我将用Python语言来实现tcp、udp的通讯对接
cd 你搭建部署好的栓Q验证站点绝对根目录
php think ShuanQTcpService --daemonize=true
php think ShuanQUdpService --daemonize=true
栓Q验证系统的http与tcp、udp协议请求方法和传递的参数数据是不同的,http协议请求地址就是接口的地址,传递的参数格式就是get、post请求的key=value格式;而tcp、udp则没有请求地址这一说,是发送json格式的数据包,JSON结构里面有个成员字段是接口地址,有个成员字段是接口参数列表对象来实现接口请求,请求之后服务器会向客户端发送数据包,这个数据包就是和http请求的响应返回值是一样的;当然了,你如果开启了参数加密、自定义接口地址路由、返回值加密、自定义接口的参数名,那么在tcp、udp协议也是生效的,具体可详细查看下面的说明
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
mode | string | 是 | 请求模式,mode=client代表客户端请求接口 |
api | string | 是 | 请求接口地址,可在系统后台的应用管理的接口管理查看对应的接口地址(如果你设置过自定义接口路由地址,那么写自定义的地址后缀即可) |
params | object | 是 | 请求接口传 递的参数,如:{"appid":"1","card":"shuanq"},如果你开启了参数kv加密功能,那么这里传递的数据同样也需要进行加密 |
{"mode":"client","api":"app/get_app_info","params":{"appid":1}}
{"mode":"client","api":"card_app/check","params":{"appid":1,"card":"a3b61b1c046e1fc145dd2477ae072aa7","machine_code":"shuanq"}}
tcp、udp协议服务端口开启运行之后,就可以进行连接发送数据包了,这里将以Python语言为例进行客户端开发对接,并且我这边是新建的应用,接口地址都是默认的,也没有设置过自定义参数名,也没有开启什么签名验证、参数加密、返回值加密的功能(这些功能开启后实际和http请求一样的,该加密加密改验签验签)
import socket # 导入socket模块
host = '192.168.32.130' # 服务器IP
port = 9501 # 协议端口
# tcp 测试
s = socket.socket() # 创建套接字
s.connect((host, port)) # 主动初始化TCP服务器连接
while True:
send_data = input("\n请输入要发送的数据:\n") # 提示用户输入数据
s.send(send_data.encode()) # 发送TCP数据
# 接受对方发送过来的数据,最大接受10240字节
recvData = s.recv(10240).decode()
print('接收到的数据为:', recvData)
s.close() # 关闭套接字
{
"code":1,
"message":"获取成功",
"timestamp":1675923373,
"nonceStr":"0c171699ba4a3cd879a16bfae6babf3c",
"apiInfo":"{"id":1,"name":"\u83b7\u53d6\u5e94\u7528\u4fe1\u606f","controller":"App","method":"get_app_info","api":"app\/get_app_info"}",
"data":"{"info":{"name":"单码应用","avatar":"http:\/\/192.168.32.130\/index\/system\/get_custom_image\/name\/dXBsb2Fkcy9pbWFnZXMvc3lzdGVtX2ltYWdlLzIwMjMwMjA5LzYwYzY1MjhmYTJlNWUwNzJiZGRhZTEyZTA1ZWU0Y2Q2LnBuZw==","type":0,"addtime":1675915178,"param_extend_config":{}},"user_safe_config":{},"moreOtherData":{"api_extra_data":"","request_safe_code":""}}",
"signature":"0264fe5e7d47002119f13be5baa66437"
}
import socket # 导入socket模块
host = '192.168.32.130' # 服务器IP
port = 9502 # 协议端口
# udp 测试
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 创建套接字
while True:
send_data = input("\n请输入要发送的数据:\n") # 提示用户输入数据
s.sendto(send_data.encode(), (host, port)) # 发送UDP数据
# 接受对方发送过来的数据,最大接受10240字节
response, addr = s.recvfrom(10240)
print('接收到的数据为:', response.decode())
参数名 | 类型 | 说明 | 必填 |
---|---|---|---|
code | integer | 业务码(1为成功,其他为失败) | 是 |
message | string | 返回业务信息 | 是 |
timestamp | integer | 当前时间戳(10位) | 是 |
nonceStr | string | 随机字串 | 是 |
apiInfo | string | 请求的接口信息,是一个转JSON字符串的object | 是 |
data | string | 数据信息(通常为接口的业务数据,是一个转JSON字符串的object,若开启响应返回值加密则是加密后的密文) | 是 |
signature | string | 本次响应签名 | 是 |
参数名 | 类型 | 说明 | 必填 |
---|---|---|---|
api_extra_data | string | 接口设置的自定义额外返回数据 | 是 |
request_safe_code | string | 请求防劫持安全验证码 | 是 |
参数名 | 类型 | 说明 | 必填 |
---|---|---|---|
id | integer | 接口ID | 是 |
name | string | 接口名称 | 是 |
controller | string | 接口控制器名称 | 是 |
method | string | 接口方法名称 | 是 |
api | string | 接口地址 | 是 |