Documentation
¶
Overview ¶
Package id 提供时序 ID 生成器(移植自 backend/framework/id)。
规格:
- 长度:16 字符(固定)
- 字符集:Crockford Base32 小写(去掉 i l o u,避免视觉混淆)
- 结构:[10 chars | 50-bit 毫秒时间戳] [6 chars | 30-bit 单调序列]
- 字典序 ≡ 时间序:可直接在数据库 ORDER BY id ASC/DESC 按创建时间排序
- 并发安全:全局 Mutex 保护,同一毫秒内序列单调递增
- 时钟回拨安全:lastMs 只增不减,NTP 调整后 ID 仍单调递增
Index ¶
- Constants
- func CallbackHandler(cfg Config, onEvent func(*CallbackPayload) error) http.HandlerFunc
- func IsInsufficientFunds(err error) bool
- func IsRateLimited(err error) bool
- func VerifySignature(secretKey string, payload *CallbackPayload, signature string) error
- type APIError
- type APIResponse
- type AppService
- type ApplymentQueryResp
- type ApplymentSubmitReq
- type ApplymentSubmitResp
- type AuditDetail
- type CallbackPayload
- type Client
- type Config
- type EventHandler
- type GatewayEvent
- type MerchantBrief
- type OrderCloseReq
- type OrderCloseResp
- type OrderCreateReq
- type OrderCreateResp
- type OrderQueryReq
- type OrderQueryResp
- type PartnerService
- type PaymentService
- func (p *PaymentService) Close(ctx context.Context, req OrderCloseReq) (*OrderCloseResp, error)
- func (p *PaymentService) Create(ctx context.Context, req OrderCreateReq) (*OrderCreateResp, error)
- func (p *PaymentService) Query(ctx context.Context, req OrderQueryReq) (*OrderQueryResp, error)
- func (p *PaymentService) Refund(ctx context.Context, req RefundCreateReq) (*RefundCreateResp, error)
- func (p *PaymentService) RefundQuery(ctx context.Context, req RefundQueryReq) (*RefundQueryResp, error)
- type ProfileResp
- type RefundCreateReq
- type RefundCreateResp
- type RefundQueryReq
- type RefundQueryResp
- type SmsBalanceResp
- type SmsPackageInfo
- type SmsSendReq
- type SmsSendResp
- type SmsService
- type SubscriptionInfo
- type WSClient
Examples ¶
Constants ¶
const ( ErrCodeSuccess = 0 ErrCodeBadRequest = 400 ErrCodeInsufficientFunds = 402 ErrCodeForbidden = 403 ErrCodeNotFound = 404 ErrCodeRateLimited = 429 ErrCodeInternalError = 500 )
预定义错误码。
Variables ¶
This section is empty.
Functions ¶
func CallbackHandler ¶
func CallbackHandler(cfg Config, onEvent func(*CallbackPayload) error) http.HandlerFunc
CallbackHandler 是合作伙伴实现回调接口的参考实现。
使用方式:
http.HandleFunc("/callback/payment", sioyun.CallbackHandler(sioyun.Config{
SecretKey: "sk_xxx",
}, func(payload *sioyun.CallbackPayload) error {
fmt.Printf("收到支付回调: %+v\n", payload)
// 更新本地订单状态...
return nil
}))
func VerifySignature ¶
func VerifySignature(secretKey string, payload *CallbackPayload, signature string) error
VerifySignature 验签(配合 VerifyAndParseCallback 使用)。 签名规则:HMAC-SHA256,HMAC key = SHA256(secretKey)。 签名字符串 = event + "\n" + gateway_trade_no + "\n" + event_time + "\n" + SHA256(JSON(data))
Types ¶
type APIResponse ¶
type APIResponse struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data interface{} `json:"data"`
}
APIResponse 网关统一响应。
type AppService ¶
type AppService struct {
// contains filtered or unexported fields
}
AppService 应用服务(查询已订阅应用与账户信息)。
func (*AppService) Profile ¶
func (a *AppService) Profile(ctx context.Context) (*ProfileResp, error)
Profile 查询当前账户信息。
func (*AppService) Subscriptions ¶
func (a *AppService) Subscriptions(ctx context.Context) ([]SubscriptionInfo, error)
Subscriptions 查询已订阅应用。
type ApplymentQueryResp ¶
type ApplymentQueryResp struct {
ApplyID string `json:"apply_id"`
ApplymentID int64 `json:"applyment_id"`
Channel string `json:"channel"`
Status string `json:"status"` // draft/submitted/signing/rejected/finished/canceled
ApplymentState string `json:"applyment_state"`
ApplymentStateMsg string `json:"applyment_state_msg"`
SubMchID string `json:"sub_mchid"` // 微信子商户号
SMID string `json:"smid"` // 支付宝 smid
SignURL string `json:"sign_url"`
AuditDetail []AuditDetail `json:"audit_detail"`
SubmittedAt int64 `json:"submitted_at"`
FinishedAt int64 `json:"finished_at"`
}
ApplymentQueryResp 进件查询响应。
type ApplymentSubmitReq ¶
type ApplymentSubmitReq struct {
Channel string `json:"channel"` // wechat | alipay
MerchantName string `json:"merchant_name"` // 商户简称
SubjectType string `json:"subject_type"` // 主体类型(微信: ENTERPRISE/INDIVIDUAL/...)
NotifyURL string `json:"notify_url,omitempty"`
FormData map[string]interface{} `json:"form_data"` // 进件表单(结构按 channel 不同)
}
ApplymentSubmitReq 进件提交请求。
type ApplymentSubmitResp ¶
type ApplymentSubmitResp struct {
ApplyID string `json:"apply_id"`
ApplymentID int64 `json:"applyment_id"`
Channel string `json:"channel"`
Status string `json:"status"` // submitted / signing / rejected / finished
SignURL string `json:"sign_url"`
SubmittedAt int64 `json:"submitted_at"`
}
ApplymentSubmitResp 进件提交响应。
type AuditDetail ¶
type AuditDetail struct {
Field string `json:"field"`
FieldName string `json:"field_name"`
RejectReason string `json:"reject_reason"`
}
AuditDetail 审核驳回详情。
type CallbackPayload ¶
type CallbackPayload struct {
Event string `json:"event"`
GatewayTradeNo string `json:"gateway_trade_no"`
OutTradeNo string `json:"out_trade_no"`
EventTime int64 `json:"event_time"`
Data interface{} `json:"data"`
}
CallbackPayload 网关回调通知的请求体。
func VerifyAndParseCallback ¶
func VerifyAndParseCallback(body []byte, secretKey string, expectedEvent string) (*CallbackPayload, error)
VerifyAndParseCallback 验证回调签名并解析回调数据。 用法:在合作伙伴的 HTTP handler 中调用,传入请求体和本地 SecretKey。
type Client ¶
type Client struct {
// contains filtered or unexported fields
}
Client 网关客户端。 通过 New() 创建,内部维护连接池,线程安全。
type Config ¶
type Config struct {
// BaseURL 网关根地址,如 https://api.sioyun.com/api/gateway/v1
BaseURL string
// AccessKey 访问标识符(ak_ 前缀)
AccessKey string
// SecretKey 签名密钥(sk_ 前缀)
SecretKey string
// Timeout HTTP 超时(秒),默认 30
Timeout int
// CallbackSecret 回调验签所用的 SecretKey(用于 HandleCallback)
// 默认等于 SecretKey,如果业务方有独立的回调密钥可单独设置
CallbackSecret string
// Transport 自定义 HTTP Transport(nil 则用禁用代理的默认 Transport)
Transport http.RoundTripper
// SkipConnectivityCheck 跳过 New() 时的连通性探测
SkipConnectivityCheck bool
}
Config SDK 配置。
type GatewayEvent ¶
type GatewayEvent struct {
Type string `json:"type"`
Event string `json:"event,omitempty"`
Data interface{} `json:"data,omitempty"`
Channel string `json:"channel,omitempty"`
Code int `json:"code,omitempty"`
Msg string `json:"msg,omitempty"`
}
GatewayEvent 网关推送的事件。
type MerchantBrief ¶
type MerchantBrief struct {
SubMchID string `json:"sub_mchid"`
SMID string `json:"smid"`
MerchantName string `json:"merchant_name"`
Status string `json:"status"`
}
MerchantBrief 商户简要信息。
type OrderCloseReq ¶
type OrderCloseReq struct {
OutTradeNo string `json:"out_trade_no"`
}
OrderCloseReq 关闭订单请求。
type OrderCloseResp ¶
type OrderCloseResp struct {
OutTradeNo string `json:"out_trade_no"`
Status string `json:"status"`
}
OrderCloseResp 关闭订单响应。
type OrderCreateReq ¶
type OrderCreateReq struct {
OutTradeNo string `json:"out_trade_no"` // 必填:商户订单号(唯一)
Amount int64 `json:"amount"` // 必填:金额(分)
PayMethod string `json:"pay_method"` // 必填:wechat_jsapi / wechat_h5 / wechat_native / alipay_qr / alipay_h5 / wechat_app / alipay_app
Description string `json:"description"` // 必填:商品描述
NotifyURL string `json:"notify_url"` // 必填:支付结果回调地址
OpenID string `json:"openid,omitempty"` // 条件:微信 jsapi 支付必填
SubMchID string `json:"sub_mchid,omitempty"` // 指定子商户号
Attach string `json:"attach,omitempty"` // 附加数据(回调原样返回)
ExpireMinutes int `json:"expire_minutes,omitempty"` // 过期分钟数
}
OrderCreateReq 支付下单请求。
type OrderCreateResp ¶
type OrderCreateResp struct {
OutTradeNo string `json:"out_trade_no"`
GatewayTradeNo string `json:"gateway_trade_no"`
PayMethod string `json:"pay_method"`
Amount int64 `json:"amount"`
PayInfo map[string]interface{} `json:"pay_info"`
}
OrderCreateResp 支付下单响应。
type OrderQueryReq ¶
type OrderQueryReq struct {
OutTradeNo string `json:"out_trade_no,omitempty"`
GatewayTradeNo string `json:"gateway_trade_no,omitempty"`
}
OrderQueryReq 订单查询请求。
type OrderQueryResp ¶
type OrderQueryResp struct {
OutTradeNo string `json:"out_trade_no"`
GatewayTradeNo string `json:"gateway_trade_no"`
Status string `json:"status"` // PENDING / SUCCESS / CLOSED / REFUND / REFUND_PART
PayMethod string `json:"pay_method"`
Amount int64 `json:"amount"`
PayAmount int64 `json:"pay_amount"`
TransactionID string `json:"transaction_id"`
PayTime int64 `json:"pay_time"`
Attach string `json:"attach"`
}
OrderQueryResp 订单查询响应。
type PartnerService ¶
type PartnerService struct {
// contains filtered or unexported fields
}
PartnerService 进件服务(微信/支付宝特约商户入驻)。
func (*PartnerService) Query ¶
func (p *PartnerService) Query(ctx context.Context, applyID string) (*ApplymentQueryResp, error)
Query 查询进件状态。
func (*PartnerService) Submit ¶
func (p *PartnerService) Submit(ctx context.Context, req ApplymentSubmitReq) (*ApplymentSubmitResp, error)
Submit 提交进件申请。
type PaymentService ¶
type PaymentService struct {
// contains filtered or unexported fields
}
PaymentService 支付服务。
func (*PaymentService) Close ¶
func (p *PaymentService) Close(ctx context.Context, req OrderCloseReq) (*OrderCloseResp, error)
Close 关闭未支付的订单。
func (*PaymentService) Create ¶
func (p *PaymentService) Create(ctx context.Context, req OrderCreateReq) (*OrderCreateResp, error)
Create 创建支付订单。
func (*PaymentService) Query ¶
func (p *PaymentService) Query(ctx context.Context, req OrderQueryReq) (*OrderQueryResp, error)
Query 查询订单状态。
func (*PaymentService) Refund ¶
func (p *PaymentService) Refund(ctx context.Context, req RefundCreateReq) (*RefundCreateResp, error)
Refund 申请退款。
func (*PaymentService) RefundQuery ¶
func (p *PaymentService) RefundQuery(ctx context.Context, req RefundQueryReq) (*RefundQueryResp, error)
RefundQuery 查询退款状态。
type ProfileResp ¶
type ProfileResp struct {
UserID string `json:"user_id"`
Username string `json:"username"`
Nickname string `json:"nickname"`
Email string `json:"email"`
WalletBalance int64 `json:"wallet_balance"`
SMSRemaining int64 `json:"sms_remaining"`
WechatMerchants []MerchantBrief `json:"wechat_merchants"`
AlipayMerchants []MerchantBrief `json:"alipay_merchants"`
}
ProfileResp 账户信息响应。
type RefundCreateReq ¶
type RefundCreateReq struct {
OutTradeNo string `json:"out_trade_no"` // 原订单号
OutRefundNo string `json:"out_refund_no"` // 退款单号
RefundAmount int64 `json:"refund_amount"` // 退款金额(分)
RefundReason string `json:"refund_reason,omitempty"`
}
RefundCreateReq 退款申请请求。
type RefundCreateResp ¶
type RefundCreateResp struct {
OutRefundNo string `json:"out_refund_no"`
RefundID string `json:"refund_id"`
RefundAmount int64 `json:"refund_amount"`
Status string `json:"status"` // PROCESSING
}
RefundCreateResp 退款申请响应。
type RefundQueryReq ¶
type RefundQueryReq struct {
OutRefundNo string `json:"out_refund_no"`
}
RefundQueryReq 退款查询请求。
type RefundQueryResp ¶
type RefundQueryResp struct {
OutRefundNo string `json:"out_refund_no"`
RefundID string `json:"refund_id"`
OutTradeNo string `json:"out_trade_no"`
RefundAmount int64 `json:"refund_amount"`
Status string `json:"status"` // PROCESSING / SUCCESS / FAIL
RefundTime int64 `json:"refund_time"`
}
RefundQueryResp 退款查询响应。
type SmsBalanceResp ¶
type SmsBalanceResp struct {
TotalRemaining int64 `json:"total_remaining"`
Packages []SmsPackageInfo `json:"packages"`
}
SmsBalanceResp 余额查询响应。
type SmsPackageInfo ¶
type SmsPackageInfo struct {
ID string `json:"id"`
PackageName string `json:"package_name"`
Total int64 `json:"total"`
Remaining int64 `json:"remaining"`
ExpiredAt int64 `json:"expired_at"`
}
SmsPackageInfo 套餐信息。
type SmsSendReq ¶
type SmsSendReq struct {
Phone string `json:"phone"` // 必填:目标手机号
TemplateCode string `json:"template_code"` // 必填:平台模板编码
Params map[string]string `json:"params,omitempty"` // 模板变量
SignatureName string `json:"signature_name,omitempty"` // 指定签名(不传用模板关联的)
}
SmsSendReq 短信发送请求。
type SmsSendResp ¶
type SmsSendResp struct {
SendID string `json:"send_id"`
Fee int `json:"fee"`
BalanceRemaining int64 `json:"balance_remaining"`
}
SmsSendResp 短信发送响应。
type SmsService ¶
type SmsService struct {
// contains filtered or unexported fields
}
SmsService 短信服务。
func (*SmsService) Balance ¶
func (s *SmsService) Balance(ctx context.Context) (*SmsBalanceResp, error)
Balance 查询短信余额。
func (*SmsService) Send ¶
func (s *SmsService) Send(ctx context.Context, req SmsSendReq) (*SmsSendResp, error)
Send 发送模板短信,消费套餐额度。
type SubscriptionInfo ¶
type SubscriptionInfo struct {
ID string `json:"id"`
ProductID string `json:"product_id"`
ProductName string `json:"product_name"`
ProductLogo string `json:"product_logo"`
Version string `json:"version"`
PriceType int8 `json:"price_type"`
Amount int64 `json:"amount"`
Status int8 `json:"status"` // 1-有效 0-已过期 2-已取消
StartAt int64 `json:"start_at"`
ExpireAt int64 `json:"expire_at"`
}
SubscriptionInfo 订阅信息。
type WSClient ¶
type WSClient struct {
// contains filtered or unexported fields
}
WSClient WebSocket 实时推送客户端。
Example ¶
package main
import (
"fmt"
"log"
"os"
"os/signal"
"time"
sioyun "github.com/zhoudm1743/sioyun-sdk"
)
func main() {
client, err := sioyun.New(sioyun.Config{
BaseURL: "https://api.sioyun.com/api/gateway/v1",
AccessKey: os.Getenv("SIOYUN_AK"),
SecretKey: os.Getenv("SIOYUN_SK"),
})
if err != nil {
log.Fatal(err)
}
_ = client // HTTP 客户端
// 创建独立的 WS 客户端
ws := sioyun.NewWSClient(sioyun.Config{
BaseURL: "https://api.sioyun.com/api/gateway/v1",
AccessKey: os.Getenv("SIOYUN_AK"),
SecretKey: os.Getenv("SIOYUN_SK"),
})
// 注册事件处理器
ws.On("payment.success", func(event sioyun.GatewayEvent) {
fmt.Printf("收到支付成功通知: %+v\n", event.Data)
})
ws.On("payment.refund", func(event sioyun.GatewayEvent) {
fmt.Printf("收到退款通知: %+v\n", event.Data)
})
ws.On("payment.*", func(event sioyun.GatewayEvent) {
fmt.Printf("收到支付相关事件: %s\n", event.Event)
})
// 建立连接
if err := ws.Connect(nil); err != nil {
log.Fatal(err)
}
// 订阅频道
ws.Subscribe("payment.*")
ws.Subscribe("sms.delivered")
// 优雅退出
sig := make(chan os.Signal, 1)
signal.Notify(sig, os.Interrupt)
<-sig
ws.Close()
time.Sleep(time.Second)
}
Output:
func (*WSClient) On ¶
func (w *WSClient) On(event string, handler EventHandler)
On 注册事件处理器。event 支持通配符("payment.*" 匹配 "payment.success")。
func (*WSClient) Unsubscribe ¶
Unsubscribe 取消订阅。