util.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. package gopay
  2. import (
  3. "bytes"
  4. "encoding/xml"
  5. "errors"
  6. "github.com/parnurzeal/gorequest"
  7. "math/rand"
  8. "sort"
  9. "strconv"
  10. "strings"
  11. "time"
  12. )
  13. type BodyMap map[string]interface{}
  14. //设置参数
  15. func (bm BodyMap) Set(key string, value interface{}) {
  16. bm[key] = value
  17. }
  18. //获取参数
  19. func (bm BodyMap) Get(key string) string {
  20. if bm == nil {
  21. return ""
  22. }
  23. v := bm[key]
  24. value, ok := v.(int)
  25. if ok {
  26. value := strconv.Itoa(value)
  27. return value
  28. }
  29. return v.(string)
  30. }
  31. //删除参数
  32. func (bm BodyMap) Remove(key string) {
  33. delete(bm, key)
  34. }
  35. //获取随机字符串
  36. // length:字符串长度
  37. func GetRandomString(length int) string {
  38. str := "0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"
  39. b := []byte(str)
  40. var result []byte
  41. r := rand.New(rand.NewSource(time.Now().UnixNano()))
  42. for i := 0; i < length; i++ {
  43. result = append(result, b[r.Intn(len(b))])
  44. }
  45. return string(result)
  46. }
  47. //获取根据Key排序后的请求参数字符串
  48. func sortSignParams(secretKey string, body BodyMap) string {
  49. keyList := make([]string, 0)
  50. for k := range body {
  51. keyList = append(keyList, k)
  52. }
  53. sort.Strings(keyList)
  54. buffer := new(bytes.Buffer)
  55. for _, k := range keyList {
  56. buffer.WriteString(k)
  57. buffer.WriteString("=")
  58. valueStr := convert2String(body[k])
  59. buffer.WriteString(valueStr)
  60. buffer.WriteString("&")
  61. }
  62. buffer.WriteString("key=")
  63. buffer.WriteString(secretKey)
  64. return buffer.String()
  65. }
  66. func convert2String(value interface{}) (valueStr string) {
  67. switch v := value.(type) {
  68. case int:
  69. valueStr = Int2String(v)
  70. case int64:
  71. valueStr = Int642String(v)
  72. case float64:
  73. valueStr = Float64ToString(v)
  74. case float32:
  75. valueStr = Float32ToString(v)
  76. case string:
  77. valueStr = v
  78. default:
  79. valueStr = null
  80. }
  81. return
  82. }
  83. //从微信提供的接口获取:SandboxSignkey
  84. func getSanBoxSignKey(mchId, nonceStr, sign string) (key string, err error) {
  85. reqs := make(BodyMap)
  86. reqs.Set("mch_id", mchId)
  87. reqs.Set("nonce_str", nonceStr)
  88. reqs.Set("sign", sign)
  89. reqXml := generateXml(reqs)
  90. //fmt.Println("req:::", reqXml)
  91. _, byteList, errorList := gorequest.New().
  92. Post(wxURL_SanBox_GetSignKey).
  93. Type("xml").
  94. SendString(reqXml).EndBytes()
  95. if len(errorList) > 0 {
  96. return "", errorList[0]
  97. }
  98. keyResponse := new(getSignKeyResponse)
  99. err = xml.Unmarshal(byteList, keyResponse)
  100. if err != nil {
  101. return "", err
  102. }
  103. if keyResponse.ReturnCode == "FAIL" {
  104. return "", errors.New(keyResponse.Retmsg)
  105. }
  106. return keyResponse.SandboxSignkey, nil
  107. }
  108. //解析时间
  109. func ParseDateTime(timeStr string) (datetime time.Time) {
  110. datetime, _ = time.ParseInLocation(TimeLayout, timeStr, time.Local)
  111. return
  112. }
  113. //格式化Datetime
  114. func FormatDateTime(timeStr string) (formatTime string) {
  115. //2019-01-04T15:40:00Z
  116. //2019-01-18 20:51:30+08:00
  117. if timeStr == "" {
  118. return ""
  119. }
  120. replace := strings.Replace(timeStr, "T", " ", 1)
  121. formatTime = replace[:19]
  122. return
  123. }
  124. //格式化
  125. func FormatDate(dateStr string) (formatDate string) {
  126. //2020-12-30T00:00:00+08:00
  127. if dateStr == "" {
  128. return ""
  129. }
  130. split := strings.Split(dateStr, "T")
  131. formatDate = split[0]
  132. return
  133. }
  134. //字符串转Float
  135. func String2Float(floatStr string) (floatNum float64) {
  136. floatNum, _ = strconv.ParseFloat(floatStr, 64)
  137. return
  138. }
  139. //Float64转字符串
  140. // floatNum:float64数字
  141. // prec:精度位数(不传则默认float数字精度)
  142. func Float64ToString(floatNum float64, prec ...int) (floatStr string) {
  143. if len(prec) > 0 {
  144. floatStr = strconv.FormatFloat(floatNum, 'f', prec[0], 64)
  145. return
  146. }
  147. floatStr = strconv.FormatFloat(floatNum, 'f', -1, 64)
  148. return
  149. }
  150. //Float32转字符串
  151. // floatNum:float32数字
  152. // prec:精度位数(不传则默认float数字精度)
  153. func Float32ToString(floatNum float32, prec ...int) (floatStr string) {
  154. if len(prec) > 0 {
  155. floatStr = strconv.FormatFloat(float64(floatNum), 'f', prec[0], 32)
  156. return
  157. }
  158. floatStr = strconv.FormatFloat(float64(floatNum), 'f', -1, 32)
  159. return
  160. }
  161. //字符串转Int
  162. func String2Int(intStr string) (intNum int) {
  163. intNum, _ = strconv.Atoi(intStr)
  164. return
  165. }
  166. //字符串转Int64
  167. func String2Int64(intStr string) (int64Num int64) {
  168. intNum, _ := strconv.Atoi(intStr)
  169. int64Num = int64(intNum)
  170. return
  171. }
  172. //Int转字符串
  173. func Int2String(intNum int) (intStr string) {
  174. intStr = strconv.Itoa(intNum)
  175. return
  176. }
  177. //Int64转字符串
  178. func Int642String(intNum int64) (int64Str string) {
  179. //10, 代表10进制
  180. int64Str = strconv.FormatInt(intNum, 10)
  181. return
  182. }