clent.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package sf
  2. import (
  3. "crypto/md5"
  4. "encoding/base64"
  5. "encoding/json"
  6. "fmt"
  7. "github.com/go-resty/resty/v2"
  8. "github.com/google/uuid"
  9. "net/url"
  10. "time"
  11. )
  12. func (c *Client) GetMsgDigest(msgData_ti string) string {
  13. // 将业务报文+时间戳+校验码组合成需加密的字符串
  14. toVerifyText := msgData_ti + c.CheckWord
  15. // URL 编码处理
  16. toVerifyText = url.QueryEscape(toVerifyText)
  17. // 进行 MD5 加密
  18. hash := md5.Sum([]byte(toVerifyText))
  19. // 通过 Base64 生成数字签名
  20. msgDigest := base64.StdEncoding.EncodeToString(hash[:])
  21. fmt.Println(msgDigest)
  22. return msgDigest
  23. }
  24. type Client struct {
  25. PartnerID string //合作伙伴编码(即顾客编码)
  26. CheckWord string //校验码
  27. MonthlyCard string // 月结账号
  28. IsBox bool // 是否为沙箱环境
  29. }
  30. func NewClient(PartnerID, CheckWord, MonthlyCard string, IsBox bool) *Client {
  31. client := &Client{
  32. PartnerID: PartnerID,
  33. CheckWord: CheckWord,
  34. MonthlyCard: MonthlyCard,
  35. IsBox: IsBox,
  36. }
  37. return client
  38. }
  39. // body可传map,结构体
  40. func (c *Client) Send(serverid string, body interface{}) (bd string, err error) {
  41. myurl := ""
  42. myurl += "?partnerID=" + c.PartnerID
  43. myurl += "&requestID=" + uuid.New().String()
  44. myurl += "&serviceCode=" + serverid
  45. //获取时间戳并拼接
  46. ti := fmt.Sprintf("%v", time.Now().Unix()*1000)
  47. myurl += "&timestamp=" + ti
  48. //把结构体转成json字符串,再生成签名
  49. by, _ := json.Marshal(body)
  50. msgdata := string(by)
  51. //fmt.Println(md5s)
  52. myurl += "&msgDigest=" + c.GetMsgDigest(msgdata+ti)
  53. myurl += "&msgData=" + msgdata
  54. //return a.发送(myurl, "")
  55. order_url := BASE_URL
  56. if c.IsBox {
  57. order_url = BASE_URL_SBOX
  58. }
  59. by, err = c.POST(order_url+myurl, "")
  60. if err != nil {
  61. return
  62. }
  63. res := new(Response)
  64. if err = json.Unmarshal(by, res); err != nil {
  65. return
  66. }
  67. bd = res.ApiResultData
  68. return
  69. }
  70. // application/x-www-form-urlencoded类型请求发送
  71. func (c *Client) POST(url, body string) ([]byte, error) {
  72. client := resty.New()
  73. resp, err := client.R().
  74. SetHeader("Content-Type", "application/x-www-form-urlencoded").
  75. SetBody(body).Post(url)
  76. if err != nil {
  77. return nil, err
  78. }
  79. return resp.Body(), nil
  80. }