|
@@ -5,6 +5,7 @@ import (
|
|
cryptoRand "crypto/rand"
|
|
cryptoRand "crypto/rand"
|
|
"encoding/hex"
|
|
"encoding/hex"
|
|
"encoding/json"
|
|
"encoding/json"
|
|
|
|
+ "encoding/xml"
|
|
"fmt"
|
|
"fmt"
|
|
"io"
|
|
"io"
|
|
"log"
|
|
"log"
|
|
@@ -12,8 +13,10 @@ import (
|
|
"math/big"
|
|
"math/big"
|
|
mathRand "math/rand"
|
|
mathRand "math/rand"
|
|
"net/url"
|
|
"net/url"
|
|
|
|
+ "reflect"
|
|
"regexp"
|
|
"regexp"
|
|
"runtime"
|
|
"runtime"
|
|
|
|
+ "sort"
|
|
"strconv"
|
|
"strconv"
|
|
"strings"
|
|
"strings"
|
|
"time"
|
|
"time"
|
|
@@ -608,3 +611,81 @@ func FloatFormat(tmp float64, n int) float64 {
|
|
f, _ := strconv.ParseFloat(fs, 64)
|
|
f, _ := strconv.ParseFloat(fs, 64)
|
|
return f
|
|
return f
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+//生成微信支付的签名
|
|
|
|
+func CreateWxSign(afterStr string, obj interface{}, filter ...string) string {
|
|
|
|
+ filter = append(filter, "sign", "xml")
|
|
|
|
+ keys := []string{}
|
|
|
|
+ m := make(map[string]string)
|
|
|
|
+ t := reflect.TypeOf(obj)
|
|
|
|
+ v := reflect.ValueOf(obj)
|
|
|
|
+ k := t.Kind()
|
|
|
|
+ if t.Kind() == reflect.Ptr {
|
|
|
|
+ t = t.Elem()
|
|
|
|
+ k = t.Kind()
|
|
|
|
+ v = v.Elem()
|
|
|
|
+ }
|
|
|
|
+ if k == reflect.Map {
|
|
|
|
+ for _, key := range v.MapKeys() {
|
|
|
|
+ keys = append(keys, key.String())
|
|
|
|
+ m[key.String()] = fmt.Sprint(v.MapIndex(key).Interface())
|
|
|
|
+ }
|
|
|
|
+ } else if k == reflect.Struct {
|
|
|
|
+ for n := 0; n < t.NumField(); n++ {
|
|
|
|
+ tagName := t.Field(n).Tag.Get("xml")
|
|
|
|
+ if tagName == "" {
|
|
|
|
+ tagName = t.Field(n).Tag.Get("json")
|
|
|
|
+ }
|
|
|
|
+ if tagName == "" {
|
|
|
|
+ tagName = t.Field(n).Name
|
|
|
|
+ }
|
|
|
|
+ keys = append(keys, tagName)
|
|
|
|
+ m[tagName] = fmt.Sprint(v.Field(n))
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ sort.Strings(keys)
|
|
|
|
+ vs := []string{}
|
|
|
|
+L:
|
|
|
|
+ for _, v := range keys {
|
|
|
|
+ for _, f := range filter {
|
|
|
|
+ if f == v {
|
|
|
|
+ continue L
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if strings.TrimSpace(m[v]) == "" {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ vs = append(vs, fmt.Sprintf("%s=%s", v, m[v]))
|
|
|
|
+ }
|
|
|
|
+ return WxSign(strings.Join(vs, "&") + afterStr)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+//简单的xml转map,只有一个层级,没有多层嵌套
|
|
|
|
+func XmlToMap(input string) map[string]string {
|
|
|
|
+ var t xml.Token
|
|
|
|
+ var err error
|
|
|
|
+ inputReader := strings.NewReader(input)
|
|
|
|
+ decoder := xml.NewDecoder(inputReader)
|
|
|
|
+ isStart := false
|
|
|
|
+ nodeName := ""
|
|
|
|
+ m := make(map[string]string)
|
|
|
|
+ for t, err = decoder.Token(); err == nil; t, err = decoder.Token() {
|
|
|
|
+ switch token := t.(type) {
|
|
|
|
+ // 处理元素开始(标签)
|
|
|
|
+ case xml.StartElement:
|
|
|
|
+ isStart = true
|
|
|
|
+ nodeName = token.Name.Local
|
|
|
|
+ // 处理元素结束(标签)
|
|
|
|
+ case xml.EndElement:
|
|
|
|
+ isStart = false
|
|
|
|
+ // 处理字符数据(这里就是元素的文本)
|
|
|
|
+ case xml.CharData:
|
|
|
|
+ if isStart {
|
|
|
|
+ m[nodeName] = string([]byte(token))
|
|
|
|
+ }
|
|
|
|
+ default:
|
|
|
|
+ // ...
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return m
|
|
|
|
+}
|