|
|
@@ -6,6 +6,10 @@ import (
|
|
|
"crypto/md5"
|
|
|
"crypto/sha256"
|
|
|
"encoding/hex"
|
|
|
+ "encoding/xml"
|
|
|
+ "errors"
|
|
|
+ "github.com/parnurzeal/gorequest"
|
|
|
+ "sort"
|
|
|
"strings"
|
|
|
)
|
|
|
|
|
|
@@ -64,6 +68,28 @@ func getLocalSign(secretKey string, signType string, body BodyMap) (sign string)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
+//获取根据Key排序后的请求参数字符串
|
|
|
+func sortSignParams(secretKey string, body BodyMap) string {
|
|
|
+ keyList := make([]string, 0)
|
|
|
+ for k := range body {
|
|
|
+ keyList = append(keyList, k)
|
|
|
+ }
|
|
|
+ sort.Strings(keyList)
|
|
|
+ buffer := new(bytes.Buffer)
|
|
|
+ for _, k := range keyList {
|
|
|
+ buffer.WriteString(k)
|
|
|
+ buffer.WriteString("=")
|
|
|
+
|
|
|
+ valueStr := convert2String(body[k])
|
|
|
+ buffer.WriteString(valueStr)
|
|
|
+
|
|
|
+ buffer.WriteString("&")
|
|
|
+ }
|
|
|
+ buffer.WriteString("key=")
|
|
|
+ buffer.WriteString(secretKey)
|
|
|
+ return buffer.String()
|
|
|
+}
|
|
|
+
|
|
|
//从微信提供的接口获取:SandboxSignKey
|
|
|
func getSanBoxSign(mchId, nonceStr, secretKey, signType string) (key string, err error) {
|
|
|
body := make(BodyMap)
|
|
|
@@ -80,6 +106,33 @@ func getSanBoxSign(mchId, nonceStr, secretKey, signType string) (key string, err
|
|
|
return
|
|
|
}
|
|
|
|
|
|
+//从微信提供的接口获取:SandboxSignkey
|
|
|
+func getSanBoxSignKey(mchId, nonceStr, sign string) (key string, err error) {
|
|
|
+ reqs := make(BodyMap)
|
|
|
+ reqs.Set("mch_id", mchId)
|
|
|
+ reqs.Set("nonce_str", nonceStr)
|
|
|
+ reqs.Set("sign", sign)
|
|
|
+
|
|
|
+ reqXml := generateXml(reqs)
|
|
|
+ //fmt.Println("req:::", reqXml)
|
|
|
+ _, byteList, errorList := gorequest.New().
|
|
|
+ Post(wxURL_SanBox_GetSignKey).
|
|
|
+ Type("xml").
|
|
|
+ SendString(reqXml).EndBytes()
|
|
|
+ if len(errorList) > 0 {
|
|
|
+ return "", errorList[0]
|
|
|
+ }
|
|
|
+ keyResponse := new(getSignKeyResponse)
|
|
|
+ err = xml.Unmarshal(byteList, keyResponse)
|
|
|
+ if err != nil {
|
|
|
+ return "", err
|
|
|
+ }
|
|
|
+ if keyResponse.ReturnCode == "FAIL" {
|
|
|
+ return "", errors.New(keyResponse.Retmsg)
|
|
|
+ }
|
|
|
+ return keyResponse.SandboxSignkey, nil
|
|
|
+}
|
|
|
+
|
|
|
//生成请求XML的Body体
|
|
|
func generateXml(bm BodyMap) (reqXml string) {
|
|
|
buffer := new(bytes.Buffer)
|