| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- package wx
- import (
- "crypto/md5"
- "encoding/hex"
- "encoding/xml"
- "errors"
- "fmt"
- "io"
- "net/url"
- "sort"
- "strings"
- )
- type XMLMap url.Values
- type xmlMapEntry struct {
- XMLName xml.Name
- Value string `xml:",chardata"`
- }
- func (m XMLMap) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
- for {
- var e xmlMapEntry
- err := d.Decode(&e)
- if err == io.EOF {
- break
- } else if err != nil {
- return err
- }
- (m)[e.XMLName.Local] = []string{e.Value}
- }
- return nil
- }
- func (v XMLMap) Get(key string) string {
- if v == nil {
- return ""
- }
- vs := v[key]
- if len(vs) == 0 {
- return ""
- }
- return vs[0]
- }
- func (v XMLMap) Set(key, value string) {
- v[key] = []string{value}
- }
- func (v XMLMap) Add(key, value string) {
- v[key] = append(v[key], value)
- }
- func (v XMLMap) Del(key string) {
- delete(v, key)
- }
- func VerifyResponseData(data []byte, key string) (ok bool, err error) {
- fmt.Println("------------------>1", string(data))
- var param = make(XMLMap)
- err = xml.Unmarshal(data, ¶m)
- if err != nil {
- fmt.Println("------------------>2")
- return false, err
- }
- return VerifyResponseValues(url.Values(param), key)
- }
- func VerifyResponseValues(param url.Values, key string) (bool, error) {
- fmt.Println("----------------------------------->2.0")
- // 验证签名
- var sign = param.Get("sign")
- delete(param, "sign")
- if sign == "" {
- return false, errors.New("签名验证失败")
- }
- fmt.Println("----------------------------------->2.1")
- var sign2 = SignMD5(param, key)
- if sign == sign2 {
- return true, nil
- }
- fmt.Println("------------------------------->2.3", sign, sign2)
- return false, errors.New("签名验证失败")
- }
- func SignMD5(param url.Values, key string) (sign string) {
- var pList = make([]string, 0, 0)
- for key := range param {
- var value = param.Get(key)
- if len(value) > 0 {
- pList = append(pList, key+"="+value)
- }
- }
- sort.Strings(pList)
- if key != "" {
- pList = append(pList, "key="+key)
- }
- var src = strings.Join(pList, "&")
- md5Ctx := md5.New()
- md5Ctx.Write([]byte(src))
- cipherStr := md5Ctx.Sum(nil)
- sign = strings.ToUpper(hex.EncodeToString(cipherStr))
- return sign
- }
|