diff --git a/response.go b/response.go index 7af212ec08e89370bab2fc981d67957a7f774d73..992785505f96f5042902be1c8bc1a18189fbe8d4 100644 --- a/response.go +++ b/response.go @@ -38,3 +38,10 @@ type UserInfo struct { ErrCode int `json:"errcode"` // 错误码 ErrMsg string `json:"errmsg"` // 错误信息 } + +type JsapiTicket struct { + Ticket string `json:"ticket"` // 获取到的凭证 + ExpiresIn int64 `json:"expires_in"` // SessionKey超时时间(秒) + ErrCode int `json:"errcode"` // 错误码 + ErrMsg string `json:"errmsg"` // 错误信息 +} diff --git a/service_sign.go b/service_sign.go index a84c2d5115d71cdcd666866bfa53d0a19577209d..2c4f7711e562f64953c0586ab674b9d83f5c694b 100644 --- a/service_sign.go +++ b/service_sign.go @@ -4,9 +4,11 @@ import ( "bytes" "crypto/hmac" "crypto/md5" + "crypto/sha1" "crypto/sha256" "encoding/hex" "fmt" + "sort" "strings" ) @@ -78,3 +80,36 @@ func GetAppPaySign(appId, nonceStr, partnerId, prepayId, signType, timeStamp, ap paySign = strings.ToUpper(hex.EncodeToString(hashSign)) return } + +// 生成JS-SDK权限验证的签名 +func GetTicketSign(nonceStr, ticket, timeStamp, url string) (ticketSign string) { + // 生成参数排序并拼接 + signStr := sortSignParams(nonceStr, ticket, timeStamp, url) + + // 加密签名 + h := sha1.New() + h.Write([]byte(signStr)) + ticketSign = hex.EncodeToString(h.Sum([]byte(""))) + return +} + +// 获取根据Key排序后的请求参数字符串 +func sortSignParams(nonceStr, ticket, timeStamp, url string) string { + body := make(map[string]interface{}) + body["noncestr"] = nonceStr + body["jsapi_ticket"] = ticket + body["timestamp"] = timeStamp + body["url"] = url + + keyList := make([]string, 0) + for k := range body { + keyList = append(keyList, k) + } + sort.Strings(keyList) + buffer := new(bytes.Buffer) + for _, k := range keyList { + s := fmt.Sprintf("%s=%s&", k, fmt.Sprintf("%v", body[k])) + buffer.WriteString(s) + } + return buffer.String() +} diff --git a/service_ticket.go b/service_ticket.go new file mode 100644 index 0000000000000000000000000000000000000000..cb329b5a37aa7a44609a10f7a9fbdd5e53b1308e --- /dev/null +++ b/service_ticket.go @@ -0,0 +1,21 @@ +/* + 基础支持相关的接口。 +*/ + +package wechat + +import ( + "encoding/json" + "fmt" +) + +// 获取jsapi_ticket +func GetJSAPITicket(access_token string) (ticket JsapiTicket, err error) { + url := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi", access_token) + body, err := httpGet(url) + if err != nil { + return + } + err = json.Unmarshal(body, &ticket) + return +}