package dingdingapi import ( "crypto/sha1" "encoding/base64" "fmt" "sort" "strings" "time" "git.rosy.net.cn/baseapi/utils" ) const ( CBTagUserAddOrg = "user_add_org" CBTagUserModifyOrg = "user_modify_org" CBTagUserLeaveOrg = "user_leave_org" ) const ( KeyMsgSignature = "msg_signature" ) func (a *API) PackCallbackResult(result string) (resultMap map[string]interface{}) { encryptedResult, err := a.Encrypt(result) if err == nil { resultMap = map[string]interface{}{ "encrypt": encryptedResult, "timeStamp": utils.Int64ToStr(time.Now().Unix()), "nonce": utils.GetUUID(), } resultMap["msg_signature"] = a.calculateCallbackSign(resultMap) } return resultMap } func (a *API) calculateCallbackSign(data map[string]interface{}) (sign string) { strList := []string{ a.callbackToken, } for k, v := range data { if k != KeyMsgSignature { strList = append(strList, v.(string)) } } sort.Sort(sort.StringSlice(strList)) return fmt.Sprintf("%x", sha1.Sum([]byte(strings.Join(strList, "")))) } func (a *API) Encrypt(msg string) (encryptedMsg string, err error) { binResult, err := utils.AESCBCEncpryt([]byte(msg), a.callbackAesKey, a.callbackAesKey[:16]) encryptedMsg = base64.StdEncoding.EncodeToString(binResult) return encryptedMsg, err } func (a *API) Decrypt(msg string) (decryptedMsg string, err error) { binMsg, err := base64.StdEncoding.DecodeString(msg) if err == nil { binResult, err2 := utils.AESCBCDecpryt(binMsg, a.callbackAesKey, a.callbackAesKey[:16]) if err = err2; err == nil { decryptedMsg = string(binResult) } } return decryptedMsg, err } func (a *API) RegisterCallback(callbackTagList []string, token, aesKey, urlStr string) (err error) { if len(callbackTagList) > 0 { // 为0做测试用 _, err = a.AccessAPI("call_back/register_call_back", nil, map[string]interface{}{ "call_back_tag": callbackTagList, "token": token, "aes_key": aesKey, "url": urlStr, }) } if err == nil { a.callbackToken = token a.callbackAesKey, _ = base64.StdEncoding.DecodeString(aesKey + "=") } return err }