package controllers import ( "crypto/aes" "crypto/cipher" "encoding/base64" "encoding/json" "errors" "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxstore/common" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" "github.com/astaxie/beego/server/web" "io/ioutil" "net/http" "strings" "time" ) type TiktokShopController struct { web.Controller } func AesDecrypt(msgSecret, appSecret string) (string, error) { var appSecretArr = []byte(strings.ReplaceAll(appSecret, "-", "")) bytesPass, err := base64.StdEncoding.DecodeString(msgSecret) if err != nil { return "", errors.New("解密失败!!!") } sourceMsg, err := DoAesDecrypt(bytesPass, appSecretArr) if err != nil { return "", errors.New("解密失败!!!") } return string(sourceMsg), nil } func DoAesDecrypt(encryptedMsg, key []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } //AES分组长度为128位,所以blockSize=16,单位字节 blockSize := block.BlockSize() blockMode := cipher.NewCBCDecrypter(block, key[:blockSize]) //初始向量的长度必须等于块block的长度16字节 origData := make([]byte, len(encryptedMsg)) blockMode.CryptBlocks(origData, encryptedMsg) origData = PKCS5UnPadding(origData) return origData, nil } func PKCS5UnPadding(origData []byte) []byte { length := len(origData) unfilledNum := int(origData[length-1]) return origData[:(length - unfilledNum)] } type Code struct { MsgType int64 `json:"msg_type"` msg struct { ActionType int64 `json:"action_type"` AppId int64 `json:"app_id"` ShopId int64 `json:"shop_id"` Code string `json:"code"` CodeGenerateTime string `json:"code_generate_time"` } } func (c *TiktokShopController) TokenMsg() { req := c.Ctx.Request var code []string switch req.Method { case http.MethodPost: data, err := ioutil.ReadAll(req.Body) if err != nil { c.Data["json"] = tiktok_api.CallbackResponse{Code: tiktok_api.CallbackFailCode, Msg: tiktok_api.CallbackFail} c.ServeJSON() return } codeToken, err := AesDecrypt(string(data), globals.TiktokShopAppSecret) if err != nil { c.Data["json"] = tiktok_api.CallbackResponse{Code: tiktok_api.CallbackFailCode, Msg: tiktok_api.CallbackFail} c.ServeJSON() } globals.SugarLogger.Debugf("codeToken============%s", utils.Format4Output(codeToken, false)) var codeResult Code if err := json.Unmarshal([]byte(codeToken), &codeResult); err != nil { globals.SugarLogger.Debugf("err============%s", utils.Format4Output(codeToken, false)) c.Data["json"] = tiktok_api.CallbackResponse{Code: tiktok_api.CallbackFailCode, Msg: tiktok_api.CallbackFail} c.ServeJSON() return } globals.SugarLogger.Debugf("codeResult============%s", utils.Format4Output(codeResult, false)) code = append(code, codeResult.msg.Code) case http.MethodGet: codeValues := req.URL.Query() codeList := codeValues.Get("code") if err := json.Unmarshal([]byte(string(codeList)), &code); err != nil { c.Data["json"] = tiktok_api.CallbackResponse{Code: tiktok_api.CallbackFailCode, Msg: tiktok_api.CallbackFail} c.ServeJSON() return } } globals.SugarLogger.Debugf("code ==================%s", utils.Format4Output(code, false)) if len(code) == 0 { c.Data["json"] = tiktok_api.CallbackResponse{Code: tiktok_api.CallbackFailCode, Msg: tiktok_api.CallbackFail} c.ServeJSON() return } for _, v := range code { result, err := api.TiktokStore.CreateToken(v) if err != nil { c.Data["json"] = tiktok_api.CallbackResponse{Code: tiktok_api.CallbackFailCode, Msg: tiktok_api.CallbackFail} c.ServeJSON() return } globals.SugarLogger.Debugf("result=====%s", utils.Format4Output(result, false)) result.ExpiresIn += time.Now().Unix() data, err := json.Marshal(result) if err != nil { c.Data["json"] = tiktok_api.CallbackResponse{Code: tiktok_api.CallbackFailCode, Msg: tiktok_api.CallbackFail} c.ServeJSON() return } param := &model.VendorOrgCode{ VendorID: model.VendorIDDD, VendorOrgCode: utils.Int64ToStr(result.ShopId), Comment: "抖音授权", VendorType: "platform", IsJxCat: 1, IsOpen: 1, EmpowerURL: "https://fuwu.jinritemai.com/detail?from=open_partner_svcList&service_id=24070", StoreBrandName: result.ShopName, Token: string(data), AppKey: "", // web.AppConfig.DefaultString("tiktokShopAppId", "7136048270014416392"), AppSecret: "", // web.AppConfig.DefaultString("tiktokShopAppSecret", "c397aa9f-3927-47c4-8cfe-4d84e02602e0") } if err := common.AddVendorOrgCode(nil, param); err != nil { c.Data["json"] = tiktok_api.CallbackResponse{Code: tiktok_api.CallbackFailCode, Msg: tiktok_api.CallbackFail} c.ServeJSON() return } } c.Data["json"] = tiktok_api.CallbackResponse{Code: tiktok_api.CallbackSuccessCode, Msg: tiktok_api.CallbackSuccess} c.ServeJSON() }