client.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. package jdlclient
  2. import (
  3. "bytes"
  4. "crypto/hmac"
  5. "crypto/md5"
  6. "crypto/sha1"
  7. "crypto/sha256"
  8. "crypto/sha512"
  9. "encoding/base64"
  10. "fmt"
  11. "io/ioutil"
  12. "net/http"
  13. "strings"
  14. "sync"
  15. "time"
  16. "xiaoniaokuaiyan.com/xiaoniao/config"
  17. )
  18. /**
  19. * @Author: qz
  20. * @Date: 2022/6/14 13:35
  21. * @Description:
  22. */
  23. type client struct {
  24. appSecret string
  25. accessToken string
  26. appKey string
  27. algorithm string
  28. baseUri string
  29. domain string
  30. CustomerCode string //月结号
  31. }
  32. var jinstance *client
  33. var jonce sync.Once
  34. func createJDL() {
  35. var (
  36. dsec = config.IniConf.Section("jdl")
  37. appkey = dsec.Key("app_key").Value()
  38. appsecret = dsec.Key("app_secret").Value()
  39. apptoken = dsec.Key("access_token").Value()
  40. baseuri = dsec.Key("base_uri").Value()
  41. code = dsec.Key("code").Value()
  42. )
  43. //var (
  44. // appkey = "4159281e504c405c8e463f3e25641ef1"
  45. // appsecret = "3f4088de32c8466889c63ab66f97f027"
  46. // apptoken = "6efe97697e0d46cd8f4522537ef2d10f"
  47. // baseuri = "https://api.jdl.com"
  48. //)
  49. jinstance = &client{
  50. appSecret: appsecret,
  51. accessToken: apptoken,
  52. appKey: appkey,
  53. algorithm: "md5-salt",
  54. baseUri: baseuri,
  55. domain: "express",
  56. CustomerCode: code,
  57. }
  58. }
  59. func GetJDLClient() *client {
  60. jonce.Do(func() {
  61. createJDL()
  62. config.RegistChangeCallback(createJDL)
  63. })
  64. return jinstance
  65. }
  66. func (c *client) DoRequest(req JdLRequest) ([]byte, error) {
  67. hc := http.Client{}
  68. timestamp := time.Now().Format("2006-01-02 15:04:05")
  69. content := strings.Join([]string{
  70. c.appSecret,
  71. "access_token", c.accessToken,
  72. "app_key", c.appKey,
  73. "method", req.GetPath(),
  74. "param_json", req.GetBody(),
  75. "timestamp", timestamp,
  76. "v", "2.0",
  77. c.appSecret,
  78. }, "")
  79. sign, err := Sign(c.algorithm, []byte(content), c.appSecret)
  80. if err != nil {
  81. panic(err)
  82. }
  83. uri := c.baseUri + req.GetPath()
  84. httpRequest, err := http.NewRequest("POST", uri, bytes.NewReader([]byte(req.GetBody())))
  85. if err != nil {
  86. panic(err)
  87. }
  88. query := httpRequest.URL.Query()
  89. query.Add("LOP-DN", c.domain)
  90. query.Add("app_key", c.appKey)
  91. query.Add("access_token", c.accessToken)
  92. query.Add("timestamp", timestamp)
  93. query.Add("v", "2.0")
  94. query.Add("sign", sign)
  95. query.Add("algorithm", c.algorithm)
  96. httpRequest.URL.RawQuery = query.Encode()
  97. _, offset := time.Now().Zone()
  98. httpRequest.Header.Add("lop-tz", fmt.Sprintf("%d", offset/3600))
  99. httpRequest.Header.Add("User-Agent", "lop-http/go")
  100. httpResponse, err := hc.Do(httpRequest)
  101. if err != nil {
  102. //panic(err)
  103. return nil, err
  104. }
  105. b, err := ioutil.ReadAll(httpResponse.Body)
  106. if err != nil {
  107. //panic(b)
  108. return nil, err
  109. }
  110. //println(httpResponse.Status)
  111. //for k, v := range httpResponse.Header {
  112. // fmt.Printf("%s: %s\n", k, strings.Join(v, ", "))
  113. //}
  114. println(string(b))
  115. return b, nil
  116. }
  117. func Sign(algorithm string, data []byte, secret string) (string, error) {
  118. if algorithm == "md5-salt" {
  119. h := md5.New()
  120. if _, err := h.Write(data); err != nil {
  121. return "", err
  122. }
  123. return fmt.Sprintf("%x", h.Sum(nil)), nil
  124. } else if algorithm == "HMacMD5" {
  125. h := hmac.New(md5.New, []byte(secret))
  126. if _, err := h.Write(data); err != nil {
  127. return "", err
  128. }
  129. return base64.StdEncoding.EncodeToString(h.Sum(nil)), nil
  130. } else if algorithm == "HMacSHA1" {
  131. h := hmac.New(sha1.New, []byte(secret))
  132. if _, err := h.Write(data); err != nil {
  133. return "", err
  134. }
  135. return base64.StdEncoding.EncodeToString(h.Sum(nil)), nil
  136. } else if algorithm == "HMacSHA256" {
  137. h := hmac.New(sha256.New, []byte(secret))
  138. if _, err := h.Write(data); err != nil {
  139. return "", err
  140. }
  141. return base64.StdEncoding.EncodeToString(h.Sum(nil)), nil
  142. } else if algorithm == "HMacSHA512" {
  143. h := hmac.New(sha512.New, []byte(secret))
  144. if _, err := h.Write(data); err != nil {
  145. return "", err
  146. }
  147. return base64.StdEncoding.EncodeToString(h.Sum(nil)), nil
  148. }
  149. return "", fmt.Errorf("algorithm %s not supported yet", algorithm)
  150. }