package sf import ( "crypto/md5" "encoding/base64" "encoding/json" "fmt" "github.com/go-resty/resty/v2" "github.com/google/uuid" "net/url" "time" ) func (c *Client) GetMsgDigest(msgData_ti string) string { // 将业务报文+时间戳+校验码组合成需加密的字符串 toVerifyText := msgData_ti + c.CheckWord // URL 编码处理 toVerifyText = url.QueryEscape(toVerifyText) // 进行 MD5 加密 hash := md5.Sum([]byte(toVerifyText)) // 通过 Base64 生成数字签名 msgDigest := base64.StdEncoding.EncodeToString(hash[:]) fmt.Println(msgDigest) return msgDigest } type Client struct { PartnerID string //合作伙伴编码(即顾客编码) CheckWord string //校验码 MonthlyCard string // 月结账号 IsBox bool // 是否为沙箱环境 } func NewClient(PartnerID, CheckWord, MonthlyCard string, IsBox bool) *Client { client := &Client{ PartnerID: PartnerID, CheckWord: CheckWord, MonthlyCard: MonthlyCard, IsBox: IsBox, } return client } // body可传map,结构体 func (c *Client) Send(serverid string, body interface{}) (bd string, err error) { myurl := "" myurl += "?partnerID=" + c.PartnerID myurl += "&requestID=" + uuid.New().String() myurl += "&serviceCode=" + serverid //获取时间戳并拼接 ti := fmt.Sprintf("%v", time.Now().Unix()*1000) myurl += "×tamp=" + ti //把结构体转成json字符串,再生成签名 by, _ := json.Marshal(body) msgdata := string(by) //fmt.Println(md5s) myurl += "&msgDigest=" + c.GetMsgDigest(msgdata+ti) myurl += "&msgData=" + msgdata //return a.发送(myurl, "") order_url := BASE_URL if c.IsBox { order_url = BASE_URL_SBOX } by, err = c.POST(order_url+myurl, "") if err != nil { return } res := new(Response) if err = json.Unmarshal(by, res); err != nil { return } bd = res.ApiResultData return } // application/x-www-form-urlencoded类型请求发送 func (c *Client) POST(url, body string) ([]byte, error) { client := resty.New() resp, err := client.R(). SetHeader("Content-Type", "application/x-www-form-urlencoded"). SetBody(body).Post(url) if err != nil { return nil, err } return resp.Body(), nil }