' ============================================================================
' Soo 验证系统 · 开放 API 火山编程语言对接示例(火山PC)
' ============================================================================
' 说明:
'  - 火山PC 网络请求用「网络访问」类(火山自带),返回文本注意 UTF-8 解码。
'  - HMAC-SHA256 签名:若你的火山版本/模块提供「哈希算法」类含 HMAC-SHA256,
'    按下方「卡密登录(带签名)」流程实现;否则用「免签查询(WebApi)」流程即可。
' ============================================================================

<火山程序 类型="通常" 版本="1">

方法 免签查卡 <公开 静态>
    参数 卡密 <类型 = 文本型>
{
    变量 网址 <类型 = 文本型>
    变量 返回文本 <类型 = 文本型>
    变量 结果 <类型 = 文本型>

    网址 = "https://sooyz.com/api/client/webapi?appkey=你的app_key&type=8&card=" + 卡密
    返回文本 = 网络访问.请求文本(网址, 请求方式.GET, , , 10)   // 返回 JSON
    结果 = 编码转换.UTF8到文本(返回文本)                      // 若乱码请做编码转换
    调试输出(结果)
    // {"code":0,"type":8,"data":{"card_no":"xxx","status":"used","expire_at":"...","bound_machine":"..."}}
}

方法 卡密登录 <公开 静态>   // 带签名,需火山环境提供 HMAC-SHA256
    参数 卡密 <类型 = 文本型>
    参数 机器码 <类型 = 文本型>
{
    变量 时间戳 <类型 = 长整数>
    变量 随机串 <类型 = 文本型>
    变量 待签串 <类型 = 文本型>
    变量 签名 <类型 = 文本型>
    变量 提交JSON <类型 = 文本型>
    变量 返回文本 <类型 = 文本型>

    时间戳 = 时间类.取Unix时间戳()
    随机串 = 文本操作.取随机文本(16)                       // 字母+数字
    // 待签串:除 sign 外全部参数按 key 升序拼接(与文档一致)
    待签串 = "app_key=你的app_key&card=" + 卡密 + "&machine=" + 机器码 + "&nonce=" + 随机串 + "&timestamp=" + 到文本(时间戳)
    签名 = 哈希算法.取HMACSHA256(待签串, "你的app_secret")  // 小写 hex;命令名以你的支持库为准
    提交JSON = "{\"app_key\":\"你的app_key\",\"card\":\"" + 卡密 + "\",\"machine\":\"" + 机器码 + "\",\"timestamp\":" + 到文本(时间戳) + ",\"nonce\":\"" + 随机串 + "\",\"sign\":\"" + 签名 + "\"}"
    返回文本 = 网络访问.请求文本("https://sooyz.com/api/client/login", 请求方式.POST, 提交JSON, "application/json", 10)
    调试输出(编码转换.UTF8到文本(返回文本))
    // 成功返回 data.token,后续心跳 /api/client/heartbeat(token+machine+sign) 保活
}

</火山程序>

' ============================================================================
' 说明:
' 1. 「网络访问」「哈希算法」「编码转换」「文本操作」「时间类」等类名以你的
'    火山PC 支持库实际名称为准,这里给出的是主流火山模块的常见写法。
' 2. 免签查询(WebApi type=1~10)不依赖签名,任何环境都能直接用,推荐先跑通。
' 3. 完整接口清单与错误码见上级目录《接口文档.md》。
' ============================================================================
