util.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. package gopay
  2. import (
  3. "crypto/tls"
  4. "encoding/xml"
  5. "fmt"
  6. "github.com/parnurzeal/gorequest"
  7. "io"
  8. "math/rand"
  9. "reflect"
  10. "sort"
  11. "strconv"
  12. "strings"
  13. "time"
  14. )
  15. type BodyMap map[string]interface{}
  16. //设置参数
  17. // value:仅支持类型 string,int,int64,float32,float64,ptr,struct,slice,map 类型,其他类型一律设置空字符串
  18. func (bm BodyMap) Set(key string, value interface{}) {
  19. //验证参数类型
  20. vKind := reflect.ValueOf(value).Kind()
  21. //fmt.Println("vKind:", vKind)
  22. switch vKind {
  23. case reflect.String:
  24. bm[key] = value.(string)
  25. case reflect.Int:
  26. bm[key] = Int2String(value.(int))
  27. case reflect.Int64:
  28. bm[key] = Int642String(value.(int64))
  29. case reflect.Float32:
  30. bm[key] = Float32ToString(value.(float32))
  31. case reflect.Float64:
  32. bm[key] = Float64ToString(value.(float64))
  33. case reflect.Ptr:
  34. bm[key] = value
  35. case reflect.Struct:
  36. bm[key] = value
  37. case reflect.Map:
  38. bm[key] = value
  39. case reflect.Slice:
  40. bm[key] = value
  41. default:
  42. bm[key] = ""
  43. }
  44. }
  45. //获取参数
  46. func (bm BodyMap) Get(key string) string {
  47. if bm == nil {
  48. return null
  49. }
  50. value, ok := bm[key]
  51. if !ok {
  52. return null
  53. }
  54. _, ok2 := value.(string)
  55. if ok2 {
  56. return value.(string)
  57. }
  58. return jsonToString(value)
  59. }
  60. //删除参数
  61. func (bm BodyMap) Remove(key string) {
  62. delete(bm, key)
  63. }
  64. type xmlMapEntry struct {
  65. XMLName xml.Name
  66. Value string `xml:",chardata"`
  67. }
  68. func (bm BodyMap) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
  69. if len(bm) == 0 {
  70. return nil
  71. }
  72. err := e.EncodeToken(start)
  73. if err != nil {
  74. return err
  75. }
  76. var value string
  77. for k, v := range bm {
  78. //验证参数类型
  79. fmt.Println("k:", k)
  80. vKind := reflect.ValueOf(v).Kind()
  81. //fmt.Println("vKind:", vKind)
  82. switch vKind {
  83. case reflect.String:
  84. value = v.(string)
  85. case reflect.Int:
  86. value = Int2String(v.(int))
  87. case reflect.Int64:
  88. value = Int642String(v.(int64))
  89. case reflect.Float32:
  90. value = Float32ToString(v.(float32))
  91. case reflect.Float64:
  92. value = Float64ToString(v.(float64))
  93. default:
  94. value = ""
  95. }
  96. e.Encode(xmlMapEntry{XMLName: xml.Name{Local: k}, Value: value})
  97. }
  98. return e.EncodeToken(start.End())
  99. }
  100. func (bm *BodyMap) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
  101. for {
  102. var e xmlMapEntry
  103. err := d.Decode(&e)
  104. if err == io.EOF {
  105. break
  106. } else if err != nil {
  107. return err
  108. }
  109. bm.Set(e.XMLName.Local, e.Value)
  110. //(*bm)[e.XMLName.Local] = e.Value
  111. }
  112. return nil
  113. }
  114. // ("bar=baz&foo=quux") sorted by key.
  115. func (bm BodyMap) EncodeWeChatSignParams(apiKey string) string {
  116. var buf strings.Builder
  117. keyList := make([]string, 0, len(bm))
  118. for k := range bm {
  119. keyList = append(keyList, k)
  120. }
  121. sort.Strings(keyList)
  122. for _, k := range keyList {
  123. buf.WriteString(k)
  124. buf.WriteByte('=')
  125. buf.WriteString(bm.Get(k))
  126. buf.WriteByte('&')
  127. }
  128. buf.WriteString("key")
  129. buf.WriteByte('=')
  130. buf.WriteString(apiKey)
  131. return buf.String()
  132. }
  133. // ("bar=baz&foo=quux") sorted by key.
  134. func (bm BodyMap) EncodeAliPaySignParams() string {
  135. var buf strings.Builder
  136. keyList := make([]string, 0, len(bm))
  137. for k := range bm {
  138. keyList = append(keyList, k)
  139. }
  140. sort.Strings(keyList)
  141. for _, k := range keyList {
  142. buf.WriteString(k)
  143. buf.WriteByte('=')
  144. buf.WriteString(bm.Get(k))
  145. buf.WriteByte('&')
  146. }
  147. s := buf.String()
  148. i := buf.Len()
  149. return s[:i-1]
  150. }
  151. //HttpAgent
  152. func HttpAgent() (agent *gorequest.SuperAgent) {
  153. agent = gorequest.New()
  154. agent.TLSClientConfig(&tls.Config{InsecureSkipVerify: true})
  155. return
  156. }
  157. //获取随机字符串
  158. // length:字符串长度
  159. func GetRandomString(length int) string {
  160. str := "0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"
  161. b := []byte(str)
  162. var result []byte
  163. r := rand.New(rand.NewSource(time.Now().UnixNano()))
  164. for i := 0; i < length; i++ {
  165. result = append(result, b[r.Intn(len(b))])
  166. }
  167. return string(result)
  168. }
  169. //解析时间
  170. func ParseDateTime(timeStr string) (datetime time.Time) {
  171. datetime, _ = time.ParseInLocation(TimeLayout, timeStr, time.Local)
  172. return
  173. }
  174. //格式化Datetime
  175. func FormatDateTime(timeStr string) (formatTime string) {
  176. //2019-01-04T15:40:00Z
  177. //2019-01-18 20:51:30+08:00
  178. if timeStr == null {
  179. return null
  180. }
  181. replace := strings.Replace(timeStr, "T", " ", 1)
  182. formatTime = replace[:19]
  183. return
  184. }
  185. //格式化
  186. func FormatDate(dateStr string) (formatDate string) {
  187. //2020-12-30T00:00:00+08:00
  188. if dateStr == null {
  189. return null
  190. }
  191. split := strings.Split(dateStr, "T")
  192. formatDate = split[0]
  193. return
  194. }
  195. //字符串转Float
  196. func String2Float(floatStr string) (floatNum float64) {
  197. floatNum, _ = strconv.ParseFloat(floatStr, 64)
  198. return
  199. }
  200. //Float64转字符串
  201. // floatNum:float64数字
  202. // prec:精度位数(不传则默认float数字精度)
  203. func Float64ToString(floatNum float64, prec ...int) (floatStr string) {
  204. if len(prec) > 0 {
  205. floatStr = strconv.FormatFloat(floatNum, 'f', prec[0], 64)
  206. return
  207. }
  208. floatStr = strconv.FormatFloat(floatNum, 'f', -1, 64)
  209. return
  210. }
  211. //Float32转字符串
  212. // floatNum:float32数字
  213. // prec:精度位数(不传则默认float数字精度)
  214. func Float32ToString(floatNum float32, prec ...int) (floatStr string) {
  215. if len(prec) > 0 {
  216. floatStr = strconv.FormatFloat(float64(floatNum), 'f', prec[0], 32)
  217. return
  218. }
  219. floatStr = strconv.FormatFloat(float64(floatNum), 'f', -1, 32)
  220. return
  221. }
  222. //字符串转Int
  223. func String2Int(intStr string) (intNum int) {
  224. intNum, _ = strconv.Atoi(intStr)
  225. return
  226. }
  227. //字符串转Int64
  228. func String2Int64(intStr string) (int64Num int64) {
  229. intNum, _ := strconv.Atoi(intStr)
  230. int64Num = int64(intNum)
  231. return
  232. }
  233. //Int转字符串
  234. func Int2String(intNum int) (intStr string) {
  235. intStr = strconv.Itoa(intNum)
  236. return
  237. }
  238. //Int64转字符串
  239. func Int642String(intNum int64) (int64Str string) {
  240. //10, 代表10进制
  241. int64Str = strconv.FormatInt(intNum, 10)
  242. return
  243. }
  244. //解密填充模式(去除补全码) PKCS7UnPadding
  245. //解密时,需要在最后面去掉加密时添加的填充byte
  246. func PKCS7UnPadding(origData []byte) (bs []byte) {
  247. length := len(origData)
  248. unpaddingNumber := int(origData[length-1]) //找到Byte数组最后的填充byte 数字
  249. if unpaddingNumber <= 7 {
  250. bs = origData[:(length - unpaddingNumber)] //只截取返回有效数字内的byte数组
  251. } else {
  252. bs = origData
  253. }
  254. return
  255. }
  256. //解密填充模式(去除补全码) PKCS5UnPadding
  257. //解密时,需要在最后面去掉加密时添加的填充byte
  258. func PKCS5UnPadding(origData []byte) (bs []byte) {
  259. length := len(origData)
  260. unpaddingNumber := int(origData[length-1]) //找到Byte数组最后的填充byte
  261. if unpaddingNumber <= 5 {
  262. bs = origData[:(length - unpaddingNumber)] //只截取返回有效数字内的byte数组
  263. } else {
  264. bs = origData
  265. }
  266. return
  267. }