verify.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package wx
  2. import (
  3. "crypto/md5"
  4. "encoding/hex"
  5. "encoding/xml"
  6. "errors"
  7. "fmt"
  8. "io"
  9. "net/url"
  10. "sort"
  11. "strings"
  12. )
  13. type XMLMap url.Values
  14. type xmlMapEntry struct {
  15. XMLName xml.Name
  16. Value string `xml:",chardata"`
  17. }
  18. func (m XMLMap) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
  19. for {
  20. var e xmlMapEntry
  21. err := d.Decode(&e)
  22. if err == io.EOF {
  23. break
  24. } else if err != nil {
  25. return err
  26. }
  27. (m)[e.XMLName.Local] = []string{e.Value}
  28. }
  29. return nil
  30. }
  31. func (v XMLMap) Get(key string) string {
  32. if v == nil {
  33. return ""
  34. }
  35. vs := v[key]
  36. if len(vs) == 0 {
  37. return ""
  38. }
  39. return vs[0]
  40. }
  41. func (v XMLMap) Set(key, value string) {
  42. v[key] = []string{value}
  43. }
  44. func (v XMLMap) Add(key, value string) {
  45. v[key] = append(v[key], value)
  46. }
  47. func (v XMLMap) Del(key string) {
  48. delete(v, key)
  49. }
  50. func VerifyResponseData(data []byte, key string) (ok bool, err error) {
  51. fmt.Println("------------------>1", string(data))
  52. var param = make(XMLMap)
  53. err = xml.Unmarshal(data, &param)
  54. if err != nil {
  55. fmt.Println("------------------>2")
  56. return false, err
  57. }
  58. return VerifyResponseValues(url.Values(param), key)
  59. }
  60. func VerifyResponseValues(param url.Values, key string) (bool, error) {
  61. fmt.Println("----------------------------------->2.0")
  62. // 验证签名
  63. var sign = param.Get("sign")
  64. delete(param, "sign")
  65. if sign == "" {
  66. return false, errors.New("签名验证失败")
  67. }
  68. fmt.Println("----------------------------------->2.1")
  69. var sign2 = SignMD5(param, key)
  70. if sign == sign2 {
  71. return true, nil
  72. }
  73. fmt.Println("------------------------------->2.3", sign, sign2)
  74. return false, errors.New("签名验证失败")
  75. }
  76. func SignMD5(param url.Values, key string) (sign string) {
  77. var pList = make([]string, 0, 0)
  78. for key := range param {
  79. var value = param.Get(key)
  80. if len(value) > 0 {
  81. pList = append(pList, key+"="+value)
  82. }
  83. }
  84. sort.Strings(pList)
  85. if key != "" {
  86. pList = append(pList, "key="+key)
  87. }
  88. var src = strings.Join(pList, "&")
  89. md5Ctx := md5.New()
  90. md5Ctx.Write([]byte(src))
  91. cipherStr := md5Ctx.Sum(nil)
  92. sign = strings.ToUpper(hex.EncodeToString(cipherStr))
  93. return sign
  94. }