util.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. package gopay
  2. import (
  3. "crypto/tls"
  4. "encoding/xml"
  5. "io"
  6. "math/rand"
  7. "reflect"
  8. "sort"
  9. "strconv"
  10. "strings"
  11. "time"
  12. "github.com/parnurzeal/gorequest"
  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. vKind := reflect.ValueOf(value).Kind()
  19. switch vKind {
  20. case reflect.String:
  21. bm[key] = value.(string)
  22. case reflect.Int:
  23. bm[key] = Int2String(value.(int))
  24. case reflect.Int64:
  25. bm[key] = Int642String(value.(int64))
  26. case reflect.Float32:
  27. bm[key] = Float32ToString(value.(float32))
  28. case reflect.Float64:
  29. bm[key] = Float64ToString(value.(float64))
  30. case reflect.Ptr:
  31. bm[key] = value
  32. case reflect.Struct:
  33. bm[key] = value
  34. case reflect.Map:
  35. bm[key] = value
  36. case reflect.Slice:
  37. bm[key] = value
  38. default:
  39. bm[key] = ""
  40. }
  41. }
  42. //获取参数
  43. func (bm BodyMap) Get(key string) string {
  44. if bm == nil {
  45. return null
  46. }
  47. var (
  48. value interface{}
  49. ok bool
  50. v string
  51. )
  52. if value, ok = bm[key]; !ok {
  53. return null
  54. }
  55. if v, ok = value.(string); ok {
  56. return v
  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) (err error) {
  69. if len(bm) == 0 {
  70. return nil
  71. }
  72. var (
  73. value string
  74. vKind reflect.Kind
  75. )
  76. if err = e.EncodeToken(start); err != nil {
  77. return
  78. }
  79. for k, v := range bm {
  80. vKind = reflect.ValueOf(v).Kind()
  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) (err 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
  107. }
  108. bm.Set(e.XMLName.Local, e.Value)
  109. }
  110. return
  111. }
  112. // ("bar=baz&foo=quux") sorted by key.
  113. func (bm BodyMap) EncodeWeChatSignParams(apiKey string) string {
  114. var (
  115. buf strings.Builder
  116. keyList []string
  117. )
  118. keyList = make([]string, 0, len(bm))
  119. for k := range bm {
  120. keyList = append(keyList, k)
  121. }
  122. sort.Strings(keyList)
  123. for _, k := range keyList {
  124. buf.WriteString(k)
  125. buf.WriteByte('=')
  126. buf.WriteString(bm.Get(k))
  127. buf.WriteByte('&')
  128. }
  129. buf.WriteString("key")
  130. buf.WriteByte('=')
  131. buf.WriteString(apiKey)
  132. return buf.String()
  133. }
  134. // ("bar=baz&foo=quux") sorted by key.
  135. func (bm BodyMap) EncodeAliPaySignParams() string {
  136. var (
  137. buf strings.Builder
  138. keyList []string
  139. )
  140. keyList = make([]string, 0, len(bm))
  141. for k := range bm {
  142. keyList = append(keyList, k)
  143. }
  144. sort.Strings(keyList)
  145. for _, k := range keyList {
  146. buf.WriteString(k)
  147. buf.WriteByte('=')
  148. buf.WriteString(bm.Get(k))
  149. buf.WriteByte('&')
  150. }
  151. return buf.String()[:buf.Len()]
  152. }
  153. //HttpAgent
  154. func HttpAgent() (agent *gorequest.SuperAgent) {
  155. return gorequest.New().TLSClientConfig(&tls.Config{InsecureSkipVerify: true})
  156. }
  157. //获取随机字符串
  158. // length:字符串长度
  159. func GetRandomString(length int) string {
  160. str := "0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"
  161. var (
  162. result []byte
  163. b []byte
  164. r *rand.Rand
  165. )
  166. b = []byte(str)
  167. r = rand.New(rand.NewSource(time.Now().UnixNano()))
  168. for i := 0; i < length; i++ {
  169. result = append(result, b[r.Intn(len(b))])
  170. }
  171. return string(result)
  172. }
  173. //解析时间
  174. func ParseDateTime(timeStr string) (datetime time.Time) {
  175. datetime, _ = time.ParseInLocation(TimeLayout, timeStr, time.Local)
  176. return
  177. }
  178. //字符串转Float64
  179. func String2Float64(floatStr string) (floatNum float64) {
  180. floatNum, _ = strconv.ParseFloat(floatStr, 64)
  181. return
  182. }
  183. //字符串转Float32
  184. func String2Float32(floatStr string) (floatNum float32) {
  185. float, _ := strconv.ParseFloat(floatStr, 32)
  186. floatNum = float32(float)
  187. return
  188. }
  189. //Float64转字符串
  190. // floatNum:float64数字
  191. // prec:精度位数(不传则默认float数字精度)
  192. func Float64ToString(floatNum float64, prec ...int) (floatStr string) {
  193. if len(prec) > 0 {
  194. floatStr = strconv.FormatFloat(floatNum, 'f', prec[0], 64)
  195. return
  196. }
  197. floatStr = strconv.FormatFloat(floatNum, 'f', -1, 64)
  198. return
  199. }
  200. //Float32转字符串
  201. // floatNum:float32数字
  202. // prec:精度位数(不传则默认float数字精度)
  203. func Float32ToString(floatNum float32, prec ...int) (floatStr string) {
  204. if len(prec) > 0 {
  205. floatStr = strconv.FormatFloat(float64(floatNum), 'f', prec[0], 32)
  206. return
  207. }
  208. floatStr = strconv.FormatFloat(float64(floatNum), 'f', -1, 32)
  209. return
  210. }
  211. //字符串转Int
  212. func String2Int(intStr string) (intNum int) {
  213. intNum, _ = strconv.Atoi(intStr)
  214. return
  215. }
  216. //字符串转Int32
  217. func String2Int32(intStr string) (int32Num int32) {
  218. intNum, _ := strconv.Atoi(intStr)
  219. int32Num = int32(intNum)
  220. return
  221. }
  222. //字符串转Int64
  223. func String2Int64(intStr string) (int64Num int64) {
  224. intNum, _ := strconv.Atoi(intStr)
  225. int64Num = int64(intNum)
  226. return
  227. }
  228. //Int转字符串
  229. func Int2String(intNum int) (intStr string) {
  230. intStr = strconv.Itoa(intNum)
  231. return
  232. }
  233. //Int32转字符串
  234. func Int322String(intNum int32) (int32Str string) {
  235. //10, 代表10进制
  236. int32Str = strconv.FormatInt(int64(intNum), 10)
  237. return
  238. }
  239. //Int64转字符串
  240. func Int642String(intNum int64) (int64Str string) {
  241. //10, 代表10进制
  242. int64Str = strconv.FormatInt(intNum, 10)
  243. return
  244. }
  245. //解密填充模式(去除补全码) PKCS7UnPadding
  246. //解密时,需要在最后面去掉加密时添加的填充byte
  247. func PKCS7UnPadding(origData []byte) (bs []byte) {
  248. length := len(origData)
  249. unPaddingNumber := int(origData[length-1]) //找到Byte数组最后的填充byte 数字
  250. if unPaddingNumber <= 16 {
  251. bs = origData[:(length - unPaddingNumber)] //只截取返回有效数字内的byte数组
  252. } else {
  253. bs = origData
  254. }
  255. return
  256. }
  257. //解密填充模式(去除补全码) PKCS5UnPadding
  258. //解密时,需要在最后面去掉加密时添加的填充byte
  259. func PKCS5UnPadding(origData []byte) (bs []byte) {
  260. length := len(origData)
  261. unPaddingNumber := int(origData[length-1]) //找到Byte数组最后的填充byte
  262. if unPaddingNumber <= 16 {
  263. bs = origData[:(length - unPaddingNumber)] //只截取返回有效数字内的byte数组
  264. } else {
  265. bs = origData
  266. }
  267. return
  268. }