跳到正文

Go SDK

查看 Markdown

raise-go 是 Raise 开放接口的 Go SDK。令牌、重试、幂等键和分页都由它处理。

  • 模块:github.com/21stware/raise-go(包名 raise)
  • 当前版本:0.7.7(2026-11-03)
  • 要求:Go 1.26 及以上

安装

终端
go get github.com/21stware/raise-go

raise-go 发布在公共的 Go 模块代理上。连不上公共代理时,平台在开发者门户上也提供一个只读的模块代理:

终端
export GOPROXY="https://dev.<你的域名>/dl/go,https://proxy.golang.org,direct"

平台的代理只有这个平台带的那个版本,通常是最新版。别的版本返回 404,go 命令会接着试 GOPROXY 里的下一个。只能用平台代理时,项目要用它提供的那个版本。

第一次调用

准备三样东西:客户端 ID、客户端密钥,以及开放接口的地址 https://api.<你的域名>/open/v1。商店应用还要写组织 ID。

main.go
package main

import (
	"context"
	"fmt"
	"log"
	"os"

	"github.com/21stware/raise-go"
)

func main() {
	c := raise.New(os.Getenv("RAISE_CLIENT_ID"), os.Getenv("RAISE_CLIENT_SECRET"),
		raise.WithBaseURL(os.Getenv("RAISE_BASE_URL")), // https://api.<你的域名>/open/v1
		raise.WithTenant(os.Getenv("RAISE_TENANT")),    // 商店应用必填
	)
	me, err := c.Platform.Whoami(context.Background())
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(me.Tenant, me.App, me.Scopes)
}

第一次调用时,SDK 去换访问令牌。令牌按组织缓存,到期前 60 秒自动换新。

分页

带 All 的列表方法会自动翻页:

it := c.Tables.ListRowsAll(ctx, "orders", "all", nil)
for it.Next(ctx) {
    fmt.Println(it.Item().ID)
}
if err := it.Err(); err != nil {
    log.Fatal(err)
}

错误

接口出错时返回 *raise.Error。按错误码分支,联系支持时带上请求 ID:

if err != nil {
    var e *raise.Error
    if errors.As(err, &e) && raise.IsCode(err, "scope_required") {
        log.Println("应用没有被授予这个范围", e.Message, e.RequestID)
    }
}

遇到 429、5xx 和网络错误时自动重试,默认 3 次,可以用 raise.WithMaxRetries(n) 改。

Webhook 验签

用原始请求体和 X-Kwork-Signature 请求头验签:

ev, err := raise.VerifyWebhook(body, r.Header.Get("X-Kwork-Signature"), secret, 5*time.Minute)
if err != nil {
    http.Error(w, "bad signature", 400)
    return
}
log.Println(ev.Type, ev.ID)

测试与正式

密钥前缀决定环境:kwo_test_ 只能调用测试企业,kwo_live_ 调用正式组织。SDK 不猜环境,打错一边时平台返回 wrong_environment。

升级

在用平台命令行工具 k3 生成的项目里,运行:

终端
k3 sdk update

它会依次运行 go get github.com/21stware/raise-go@latest 和 go mod tidy。其他项目直接用 go get 升级。

下一步

本页目录