1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- 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
- }
|