util.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. package gopay
  2. import (
  3. "bytes"
  4. "math/rand"
  5. "strconv"
  6. "strings"
  7. "time"
  8. )
  9. type BodyMap map[string]interface{}
  10. //设置参数
  11. func (bm BodyMap) Set(key string, value interface{}) {
  12. bm[key] = value
  13. }
  14. //获取参数
  15. func (bm BodyMap) Get(key string) string {
  16. if bm == nil {
  17. return null
  18. }
  19. v := bm[key]
  20. value, ok := v.(int)
  21. if ok {
  22. value := strconv.Itoa(value)
  23. return value
  24. }
  25. return v.(string)
  26. }
  27. //删除参数
  28. func (bm BodyMap) Remove(key string) {
  29. delete(bm, key)
  30. }
  31. //获取随机字符串
  32. // length:字符串长度
  33. func GetRandomString(length int) string {
  34. str := "0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"
  35. b := []byte(str)
  36. var result []byte
  37. r := rand.New(rand.NewSource(time.Now().UnixNano()))
  38. for i := 0; i < length; i++ {
  39. result = append(result, b[r.Intn(len(b))])
  40. }
  41. return string(result)
  42. }
  43. func convert2String(value interface{}) (valueStr string) {
  44. switch v := value.(type) {
  45. case int:
  46. valueStr = Int2String(v)
  47. case int64:
  48. valueStr = Int642String(v)
  49. case float64:
  50. valueStr = Float64ToString(v)
  51. case float32:
  52. valueStr = Float32ToString(v)
  53. case string:
  54. valueStr = v
  55. default:
  56. valueStr = null
  57. }
  58. return
  59. }
  60. //解析时间
  61. func ParseDateTime(timeStr string) (datetime time.Time) {
  62. datetime, _ = time.ParseInLocation(TimeLayout, timeStr, time.Local)
  63. return
  64. }
  65. //格式化Datetime
  66. func FormatDateTime(timeStr string) (formatTime string) {
  67. //2019-01-04T15:40:00Z
  68. //2019-01-18 20:51:30+08:00
  69. if timeStr == null {
  70. return null
  71. }
  72. replace := strings.Replace(timeStr, "T", " ", 1)
  73. formatTime = replace[:19]
  74. return
  75. }
  76. //格式化
  77. func FormatDate(dateStr string) (formatDate string) {
  78. //2020-12-30T00:00:00+08:00
  79. if dateStr == null {
  80. return null
  81. }
  82. split := strings.Split(dateStr, "T")
  83. formatDate = split[0]
  84. return
  85. }
  86. //字符串转Float
  87. func String2Float(floatStr string) (floatNum float64) {
  88. floatNum, _ = strconv.ParseFloat(floatStr, 64)
  89. return
  90. }
  91. //Float64转字符串
  92. // floatNum:float64数字
  93. // prec:精度位数(不传则默认float数字精度)
  94. func Float64ToString(floatNum float64, prec ...int) (floatStr string) {
  95. if len(prec) > 0 {
  96. floatStr = strconv.FormatFloat(floatNum, 'f', prec[0], 64)
  97. return
  98. }
  99. floatStr = strconv.FormatFloat(floatNum, 'f', -1, 64)
  100. return
  101. }
  102. //Float32转字符串
  103. // floatNum:float32数字
  104. // prec:精度位数(不传则默认float数字精度)
  105. func Float32ToString(floatNum float32, prec ...int) (floatStr string) {
  106. if len(prec) > 0 {
  107. floatStr = strconv.FormatFloat(float64(floatNum), 'f', prec[0], 32)
  108. return
  109. }
  110. floatStr = strconv.FormatFloat(float64(floatNum), 'f', -1, 32)
  111. return
  112. }
  113. //字符串转Int
  114. func String2Int(intStr string) (intNum int) {
  115. intNum, _ = strconv.Atoi(intStr)
  116. return
  117. }
  118. //字符串转Int64
  119. func String2Int64(intStr string) (int64Num int64) {
  120. intNum, _ := strconv.Atoi(intStr)
  121. int64Num = int64(intNum)
  122. return
  123. }
  124. //Int转字符串
  125. func Int2String(intNum int) (intStr string) {
  126. intStr = strconv.Itoa(intNum)
  127. return
  128. }
  129. //Int64转字符串
  130. func Int642String(intNum int64) (int64Str string) {
  131. //10, 代表10进制
  132. int64Str = strconv.FormatInt(intNum, 10)
  133. return
  134. }
  135. //解密填充模式(去除补全码) PKCS7UnPadding
  136. //解密时,需要在最后面去掉加密时添加的填充byte
  137. func PKCS7UnPadding(plainText []byte) []byte {
  138. length := len(plainText)
  139. unpadding := int(plainText[length-1]) //找到Byte数组最后的填充byte
  140. return plainText[:(length - unpadding)] //只截取返回有效数字内的byte数组
  141. }
  142. //格式化秘钥
  143. func FormatPrivateKey(privateKey string) (pKey string) {
  144. buffer := new(bytes.Buffer)
  145. buffer.WriteString("-----BEGIN RSA PRIVATE KEY-----\n")
  146. rawLen := 64
  147. keyLen := len(privateKey)
  148. raws := keyLen / rawLen
  149. temp := keyLen % rawLen
  150. if temp > 0 {
  151. raws++
  152. }
  153. start := 0
  154. end := start + rawLen
  155. for i := 0; i < raws; i++ {
  156. if i == raws-1 {
  157. buffer.WriteString(privateKey[start:])
  158. } else {
  159. buffer.WriteString(privateKey[start:end])
  160. }
  161. buffer.WriteString("\n")
  162. start += rawLen
  163. end = start + rawLen
  164. }
  165. buffer.WriteString("-----END RSA PRIVATE KEY-----\n")
  166. pKey = buffer.String()
  167. return
  168. }
  169. //格式化秘钥
  170. func FormatPublickKey(publickKey string) (pKey string) {
  171. buffer := new(bytes.Buffer)
  172. buffer.WriteString("-----BEGIN PUBLIC KEY-----\n")
  173. rawLen := 64
  174. keyLen := len(publickKey)
  175. raws := keyLen / rawLen
  176. temp := keyLen % rawLen
  177. if temp > 0 {
  178. raws++
  179. }
  180. start := 0
  181. end := start + rawLen
  182. for i := 0; i < raws; i++ {
  183. if i == raws-1 {
  184. buffer.WriteString(publickKey[start:])
  185. } else {
  186. buffer.WriteString(publickKey[start:end])
  187. }
  188. buffer.WriteString("\n")
  189. start += rawLen
  190. end = start + rawLen
  191. }
  192. buffer.WriteString("-----END PUBLIC KEY-----\n")
  193. pKey = buffer.String()
  194. return
  195. }