package weixinapi

import (
	"crypto/sha1"
	"fmt"
	"sort"
	"strings"
)

func (a *API) SetMsgTokenAndKey(msgToken, msgKey string) {
	a.locker.Lock()
	defer a.locker.Unlock()

	a.msgToken = msgToken
	a.msgKey = msgKey
}

func (a *API) GetMsgTokenAndKey() (msgToken, msgKey string) {
	a.locker.RLock()
	defer a.locker.RUnlock()

	return a.msgToken, a.msgKey
}

func (a *API) ValidateWXCallbackURL(signature, timestamp, nonce string) (isValid bool) {
	msgToken, _ := a.GetMsgTokenAndKey()
	if msgToken == "" {
		panic("you must call SetMsgTokenAndKey first")
	}
	strList := []string{
		msgToken,
		timestamp,
		nonce,
	}
	sort.Sort(sort.StringSlice(strList))
	sha1Str := fmt.Sprintf("%x", sha1.Sum([]byte(strings.Join(strList, ""))))
	return sha1Str == signature
}
