util.go 5.9 KB

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