' ============================================================================
' Soo 验证系统 · 开放 API 易语言对接示例
' ============================================================================
' 依赖:精易模块(网页_访问_对象 / 编码_HMAC_SHA256)
'      如果你的精易模块版本没有 编码_HMAC_SHA256,请升级精易模块,
'      或改用下方「WebApi 免签查询」流程(不依赖 HMAC,开箱即用)。
'
' 用法:把本文件内容粘贴进易语言 IDE 新建的空白程序即可运行。
' ============================================================================
.版本 2

.程序集 程序集1

.常量 服务器地址 "https://sooyz.com"
.常量 应用公钥 "你的app_key"
.常量 应用密钥 "你的app_secret"

.子程序 _启动子程序, 整数型
    ' ---- 流程1:免签查卡密状态(最简单,推荐脚本先用这个) ----
    免签查卡 ("测试卡密")

    ' ---- 流程2:卡密登录(带签名,需精易模块) ----
    卡密登录 ("测试卡密", "本机机器码")

    返回 (0)

.子程序 免签查卡, , 公开, 不登录也能查卡密到期/状态/绑机(WebApi type=8)
    .参数 卡密, 文本型
    .局部变量 网址, 文本型
    .局部变量 返回文本, 文本型
    .局部变量 结果, 文本型

    网址 = 服务器地址 ＋ "/api/client/webapi?appkey=" ＋ 应用公钥 ＋ "&type=8&card=" ＋ 卡密
    返回文本 = 网页_访问_对象 (网址, , , , , , , , , , , , , , , , , , )
    结果 = 编码_Utf8到Ansi (返回文本)
    调试输出 (结果)
    ' 返回示例:{"code":0,"type":8,"data":{"card_no":"xxx","status":"used","points":0,"expire_at":"2026-11-14 16:00:00","bound_machine":"..."}}

.子程序 卡密登录, , 公开, 标准 API 带签名登录
    .参数 卡密, 文本型
    .参数 机器码, 文本型
    .局部变量 时间戳, 文本型
    .局部变量 随机数, 文本型
    .局部变量 参数字典, 文本型
    .局部变量 签名, 文本型
    .局部变量 提交数据, 文本型
    .局部变量 返回文本, 文本型

    时间戳 = 到文本 (取时间戳 ())
    随机数 = 文本_取随机字符 (16, 2)   ' 字母+数字
    ' 构造待签名串:除 sign 外全部参数按 key 升序,格式 k=v&k=v...
    ' 本请求参数:card, machine, app_key, timestamp, nonce
    参数字典 = "app_key=" ＋ 应用公钥 ＋ "&card=" ＋ 卡密 ＋ "&machine=" ＋ 机器码 ＋ "&nonce=" ＋ 随机数 ＋ "&timestamp=" ＋ 时间戳
    签名 = 编码_HMAC_SHA256 (参数字典, 应用密钥, 真)   ' 精易模块命令,返回小写 hex
    提交数据 = "{""app_key"":""" ＋ 应用公钥 ＋ """,""card"":""" ＋ 卡密 ＋ """,""machine"":""" ＋ 机器码 ＋ """,""timestamp"":" ＋ 时间戳 ＋ ",""nonce"":""" ＋ 随机数 ＋ """,""sign"":""" ＋ 签名 ＋ """}"
    返回文本 = 网页_访问_对象 (服务器地址 ＋ "/api/client/login", 1, 提交数据, , , , , , , , , , , , , , , )
    调试输出 (编码_Utf8到Ansi (返回文本))
    ' 成功返回 data.token, 后续心跳/查卡用

.子程序 取时间戳, 长整数型
    ' 返回 Unix 秒级时间戳
    返回 (到长整数 (取现行时间 () 到文本))

' ============================================================================
' 说明:
' 1. 签名串排序必须与服务端一致(按 ASCII 码升序)。上面示例参数少,可直接手写顺序;
'    参数多时请用精易模块的「字典_排序」或自己排序后拼接。
' 2. timestamp 必须与请求体里的 timestamp 完全一致(秒,数字)。
' 3. 心跳:登录成功后循环调用 /api/client/heartbeat,参数 token+machine+sign,建议 30~60 秒一次。
' 4. 完整接口见上级目录《接口文档.md》。
' ============================================================================
