# Go 快速接入
泡椒云网络验证官方提供的 Go SDK,方便 Go 开发者接入。
# 接入须知
# 获取方式
- 直接使用
go get获取:
go get -u github.com/paojiaoyun/sdk-go
1
# 使用示例
package main
import (
"fmt"
"os"
"time"
pjy "github.com/paojiaoyun/sdk-go"
)
func main() {
// 初始化sdk, appKey 和 appSecret 在泡椒云开发者后台获取
pjysdk := pjy.NewPJYSDK("AppKey", "AppSecret")
pjysdk.SetDebug(true)
// 心跳失败回调
pjysdk.OnHeartbeatFail(func(r *pjy.Resp[pjy.HeartbeatResult]) {
fmt.Println(r.Message)
if r.Code == 10214 {
os.Exit(1)
}
fmt.Println("心跳失败,尝试重登...")
loginRet, err := pjysdk.CardLogin()
if err != nil {
fmt.Println("重登失败:", err)
os.Exit(1)
}
if loginRet.Code != 0 {
fmt.Println(loginRet.Message)
os.Exit(1)
}
fmt.Println("重登成功")
})
pjysdk.SetDeviceID("123") // 设置设备唯一ID
pjysdk.SetCard("Card") // 设置卡密
// 卡密登录
loginRet, err := pjysdk.CardLogin()
if err != nil {
fmt.Println("登录请求异常:", err)
os.Exit(1)
}
if loginRet.Code != 0 {
fmt.Println(loginRet.Message)
os.Exit(1)
}
// 登录成功后测试用,hold住主线程不要退出,记得删除,后面应该是你的逻辑代码了
for {
remaining := pjysdk.GetTimeRemaining()
fmt.Println("剩余时间(秒):", remaining)
time.Sleep(5 * time.Second)
}
}
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
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
# 可更改变量
pjysdk.SetDebug(debug bool): 默认为true,开启后会在控制台输出每次请求的详细信息pjysdk.SetDeviceID(deviceID string): 需自行获取设备码并设置,且不能为空pjysdk.SetAutoHeartbeat(enable bool): 是否自动开启心跳,默认true,不建议修改pjysdk.SetRetryCount(cnt int): 请求失败重试次数,默认为9次,调大重试次数有助于提升稳定性
# 可获取变量
以下变量在登录成功后才有有效值,可通过 pjysdk.GetLoginResult() 获取:
pjysdk.GetLoginResult().CardType: 卡密类型,如"年卡"pjysdk.GetLoginResult().Expires: 过期时间字符串,如"2020-10-16 00:47:58"pjysdk.GetLoginResult().ExpiresTS: 过期时间戳(秒)pjysdk.GetLoginResult().Config: 卡密或用户的自定义配置pjysdk.GetIsTrial(): 是否为试用登录
# 初始化
# 初始化 SDK
pjysdk := pjy.NewPJYSDK(appKey, appSecret string)
1
| 参数 | 必传 | 类型 | 说明 |
|---|---|---|---|
| appKey | 是 | string | 软件的 app_key,开发者后台获取 |
| appSecret | 是 | string | 软件的 app_secret,开发者后台获取 |
# 设置设备唯一 ID
pjysdk.SetDeviceID(deviceID string) // 不能为空
1
| 参数 | 必传 | 类型 | 说明 |
|---|---|---|---|
| deviceID | 是 | string | 用户设备唯一标识(长度不超过45位) |
# 设置卡密
pjysdk.SetCard(card string)
1
| 参数 | 必传 | 类型 | 说明 |
|---|---|---|---|
| card | 是 | string | 用户填写的卡密(长度不超过45位) |
# 设置用户账号
pjysdk.SetUser(username, password string)
1
| 参数 | 必传 | 类型 | 说明 |
|---|---|---|---|
| username | 是 | string | 用户名(长度不超过20位) |
| password | 是 | string | 用户密码(长度 6-30 位) |
# 获取心跳结果
ret := pjysdk.GetHeartbeatResult() // *pjy.Resp[pjy.HeartbeatResult]
1
ret.Code == 0 表示心跳正常,否则 ret.Message 包含错误信息。
# 获取剩余时长
remaining := pjysdk.GetTimeRemaining() // int
1
返回剩余有效秒数。
# 卡密登录
调用前需先调用 SetCard 和 SetDeviceID。
登录成功后会自动启动心跳协程,无需手动管理心跳,可通过 GetHeartbeatResult() 获取心跳状态。
ret, err := pjysdk.CardLogin() // (*pjy.Resp[pjy.CardLoginResult], error)
1
返回值:
*pjy.Resp[pjy.CardLoginResult]:
ret.Code == 0表示成功,此时Result字段包含详细信息(CardType、Expires等);否则ret.Message为错误信息。error:仅在网络异常或签名校验失败时非空。
示例:
ret, err := pjysdk.CardLogin()
if err != nil {
// 网络或系统错误
log.Fatal(err)
}
if ret.Code != 0 {
log.Fatal(ret.Message)
}
fmt.Println("登录成功,卡密类型:", ret.Data.CardType)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 卡密退出登录
ret, err := pjysdk.CardLogout() // (*pjy.Resp[struct{}], error)
1
退出登录会停止心跳协程。
# 卡密解绑设备
需在开发者后台配置软件允许解绑,且需在卡密登录后调用。
ret, err := pjysdk.CardUnbindDevice() // (*pjy.Resp[struct{}], error)
1
# 卡密设置解绑密码
需在开发者后台配置软件允许解绑。该密码用于设备丢失等情况解绑。
ret, err := pjysdk.SetCardUnbindPassword(password string) // (*pjy.Resp[struct{}], error)
1
| 参数 | 必传 | 类型 | 说明 |
|---|---|---|---|
| password | 是 | string | 解绑密码,6-10位 |
# 卡密通过密码解绑设备
ret, err := pjysdk.CardUnbindDeviceByPassword(password string) // (*pjy.Resp[struct{}], error)
1
| 参数 | 必传 | 类型 | 说明 |
|---|---|---|---|
| password | 是 | string | 解绑密码,6-10位 |
# 卡密充值(以卡充卡)
ret, err := pjysdk.CardRecharge(card, useCard string) // (*pjy.Resp[struct{}], error)
1
| 参数 | 必传 | 类型 | 说明 |
|---|---|---|---|
| card | 是 | string | 被充值的卡密 |
| useCard | 是 | string | 用于充值的卡密 |
# 用户注册(通过卡密)
ret, err := pjysdk.UserRegister(username, password, card string) // (*pjy.Resp[struct{}], error)
1
| 参数 | 必传 | 类型 | 说明 |
|---|---|---|---|
| username | 是 | string | 用户名(不超过20位) |
| password | 是 | string | 密码(6-30位) |
| card | 是 | string | 注册使用的卡密 |
# 用户登录
调用前需先调用 SetUser 和 SetDeviceID。登录成功自动心跳。
ret, err := pjysdk.UserLogin() // (*pjy.Resp[pjy.UserLoginResult], error)
1
# 用户退出登录
ret, err := pjysdk.UserLogout() // (*pjy.Resp[struct{}], error)
1
# 用户修改密码
ret, err := pjysdk.UserChangePassword(username, password, newPassword string) // (*pjy.Resp[struct{}], error)
1
| 参数 | 必传 | 类型 | 说明 |
|---|---|---|---|
| username | 是 | string | 用户名 |
| password | 是 | string | 当前密码 |
| newPassword | 是 | string | 新密码(6-30位) |
# 用户充值(通过卡密)
ret, err := pjysdk.UserRecharge(username, card string) // (*pjy.Resp[struct{}], error)
1
| 参数 | 必传 | 类型 | 说明 |
|---|---|---|---|
| username | 是 | string | 用户名 |
| card | 是 | string | 充值卡密 |
# 用户解绑设备
需在用户登录后调用。
ret, err := pjysdk.UserUnbindDevice() // (*pjy.Resp[struct{}], error)
1
# 试用登录
ret, err := pjysdk.TrialLogin() // (*pjy.Resp[pjy.TrialLoginResult], error)
1
登录成功自动心跳。
# 试用退出登录
ret, err := pjysdk.TrialLogout() // (*pjy.Resp[struct{}], error)
1
仅清除本地状态,无网络请求。
# 获取卡密配置
ret, err := pjysdk.GetCardConfig() // (*pjy.Resp[pjy.CardConfigResult], error)
1
成功时 ret.Result.Config 为配置内容。
# 更改卡密配置
ret, err := pjysdk.UpdateCardConfig(config string) // (*pjy.Resp[struct{}], error)
1
| 参数 | 必传 | 类型 | 说明 |
|---|---|---|---|
| config | 是 | string | 自定义配置(不超过512位) |
# 获取用户配置
ret, err := pjysdk.GetUserConfig() // (*pjy.Resp[pjy.UserConfigResult], error)
1
# 更改用户配置
ret, err := pjysdk.UpdateUserConfig(config string) // (*pjy.Resp[struct{}], error)
1
| 参数 | 必传 | 类型 | 说明 |
|---|---|---|---|
| config | 是 | string | 自定义配置(不超过512位) |
# 获取软件配置
ret, err := pjysdk.GetSoftwareConfig() // (*pjy.Resp[pjy.SoftwareConfigResult], error)
1
# 获取软件公告
ret, err := pjysdk.GetSoftwareNotice() // (*pjy.Resp[pjy.SoftwareNoticeResult], error)
1
# 获取软件最新版本
ret, err := pjysdk.GetSoftwareLatestVersion(currentVer string) // (*pjy.Resp[pjy.SoftwareVersionResult], error)
1
| 参数 | 必传 | 类型 | 说明 |
|---|---|---|---|
| currentVer | 是 | string | 当前本地版本(不超过30位) |
成功时 ret.Result 包含 Version、Url、Notice。
# 获取远程变量
ret, err := pjysdk.GetRemoteVar(key string) // (*pjy.Resp[pjy.RemoteVarResult], error)
1
| 参数 | 必传 | 类型 | 说明 |
|---|---|---|---|
| key | 是 | string | 远程变量名(不超过64位) |
# 获取远程数据
ret, err := pjysdk.GetRemoteData(key string) // (*pjy.Resp[pjy.RemoteDataResult], error)
1
| 参数 | 必传 | 类型 | 说明 |
|---|---|---|---|
| key | 是 | string | 数据 key(不超过64位) |
# 操作远程数据
# 新增远程数据
ret, err := pjysdk.CreateRemoteData(key, value string) // (*pjy.Resp[struct{}], error)
1
| 参数 | 必传 | 类型 | 说明 |
|---|---|---|---|
| key | 是 | string | 数据 key(不超过64位) |
| value | 是 | string | 数据值(不超过256位) |
# 修改远程数据
ret, err := pjysdk.UpdateRemoteData(key, value string) // (*pjy.Resp[struct{}], error)
1
| 参数 | 必传 | 类型 | 说明 |
|---|---|---|---|
| key | 是 | string | 数据 key(不超过64位) |
| value | 是 | string | 数据值(不超过256位) |
# 删除远程数据
ret, err := pjysdk.DeleteRemoteData(key string) // (*pjy.Resp[struct{}], error)
1
| 参数 | 必传 | 类型 | 说明 |
|---|---|---|---|
| key | 是 | string | 数据 key(不超过64位) |
# 调用远程函数
ret, err := pjysdk.CallRemoteFunc(funcName string, params interface{}) // (*pjy.Resp[pjy.RemoteFuncResult], error)
1
示例
远程函数定义(JavaScript):
function add(a, b) {
return a + b;
}
1
2
3
2
3
Go 调用:
ret, err := pjysdk.CallRemoteFunc("add", 1, 2)
if err != nil {
log.Fatal(err)
}
if ret.Code != 0 {
log.Fatal(ret.Message)
}
fmt.Println("计算结果:", ret.Result.Return)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
| 参数 | 必传 | 类型 | 说明 |
|---|---|---|---|
| funcName | 是 | string | 远程函数名(不超过64位) |
| params | 是 | ...any | 参数列表,如 1,2 |
提示:所有 API 方法都返回
(*pjy.Resp[T], error)。
- 若
error不为nil,表示网络请求或签名校验失败;- 若
error为nil,通过ret.Code判断业务状态:0成功,非0失败,详细信息见ret.Message。