util.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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. "time"
  11. )
  12. type BodyMap map[string]interface{}
  13. //设置参数
  14. func (bm BodyMap) Set(key string, value interface{}) {
  15. bm[key] = value
  16. }
  17. //获取参数
  18. func (bm BodyMap) Get(key string) string {
  19. if bm == nil {
  20. return ""
  21. }
  22. v := bm[key]
  23. value, ok := v.(int)
  24. if ok {
  25. value := strconv.Itoa(value)
  26. return value
  27. }
  28. return v.(string)
  29. }
  30. //删除参数
  31. func (bm BodyMap) Remove(key string) {
  32. delete(bm, key)
  33. }
  34. //获取随机字符串
  35. // length:字符串长度
  36. func GetRandomString(length int) string {
  37. str := "0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"
  38. b := []byte(str)
  39. var result []byte
  40. r := rand.New(rand.NewSource(time.Now().UnixNano()))
  41. for i := 0; i < length; i++ {
  42. result = append(result, b[r.Intn(len(b))])
  43. }
  44. return string(result)
  45. }
  46. //获取根据Key排序后的请求参数字符串
  47. func sortSignParams(secretKey string, body BodyMap) string {
  48. keyList := make([]string, 0)
  49. for k := range body {
  50. keyList = append(keyList, k)
  51. }
  52. sort.Strings(keyList)
  53. buffer := new(bytes.Buffer)
  54. for _, k := range keyList {
  55. buffer.WriteString(k)
  56. buffer.WriteString("=")
  57. value, ok := body[k].(int)
  58. if ok {
  59. value := strconv.Itoa(value)
  60. buffer.WriteString(value)
  61. } else {
  62. buffer.WriteString(body[k].(string))
  63. }
  64. buffer.WriteString("&")
  65. }
  66. buffer.WriteString("key=")
  67. buffer.WriteString(secretKey)
  68. return buffer.String()
  69. }
  70. //从微信提供的接口获取:SandboxSignkey
  71. func getSanBoxSignKey(mchId, nonceStr, sign string) (key string, err error) {
  72. reqs := make(BodyMap)
  73. reqs.Set("mch_id", mchId)
  74. reqs.Set("nonce_str", nonceStr)
  75. reqs.Set("sign", sign)
  76. reqXml := generateXml(reqs)
  77. //fmt.Println("req:::", reqXml)
  78. _, byteList, errorList := gorequest.New().
  79. Post(wxURL_SanBox_GetSignKey).
  80. Type("xml").
  81. SendString(reqXml).EndBytes()
  82. if len(errorList) > 0 {
  83. return "", errorList[0]
  84. }
  85. keyResponse := new(getSignKeyResponse)
  86. err = xml.Unmarshal(byteList, keyResponse)
  87. if err != nil {
  88. return "", err
  89. }
  90. if keyResponse.ReturnCode == "FAIL" {
  91. return "", errors.New(keyResponse.Retmsg)
  92. }
  93. return keyResponse.SandboxSignkey, nil
  94. }