huangjiajun 2 months ago
parent
commit
0217acf694
5 changed files with 180 additions and 25 deletions
  1. +2
    -0
      jd_union/api.go
  2. +14
    -11
      kuaishou/kuaishou.go
  3. +4
    -4
      sms/agent_api.go
  4. +46
    -10
      taobao/search_list.go
  5. +114
    -0
      utils/crypto.go

+ 2
- 0
jd_union/api.go View File

@@ -2,6 +2,7 @@ package jd_union


import ( import (
zhios_third_party_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/utils" zhios_third_party_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/utils"
"fmt"
"github.com/syyongx/php2go" "github.com/syyongx/php2go"
"sort" "sort"
"strings" "strings"
@@ -77,5 +78,6 @@ func SendGet(keyArr map[string]string, method, paramJson, version string) (strin
} }
} }
post, err := zhios_third_party_utils.CurlGet(url, nil) post, err := zhios_third_party_utils.CurlGet(url, nil)
fmt.Println(string(post))
return string(post), err return string(post), err
} }

+ 14
- 11
kuaishou/kuaishou.go View File

@@ -32,7 +32,6 @@ func GetKuaishouToken(args map[string]string) (string, error) {
} }


/* /*

*/ */
func GetKuaishouRefreshToken(args map[string]string) (string, error) { func GetKuaishouRefreshToken(args map[string]string) (string, error) {
url := "https://openapi.kwaixiaodian.com/oauth2/refresh_token" url := "https://openapi.kwaixiaodian.com/oauth2/refresh_token"
@@ -43,49 +42,53 @@ func GetKuaishouRefreshToken(args map[string]string) (string, error) {
return string(get), err return string(get), err
} }


//https://open.kwaixiaodian.com/zone/docs/api?name=open.distribution.investment.activity.open.list&version=1
// https://open.kwaixiaodian.com/zone/new/docs/api?name=open.distribution.selection.offline&version=1
func GetKuishouSelectionPickOffline(signSecret string, param map[string]string) (string, error) {
return SendPost("open.distribution.selection.offline", signSecret, param)
}

// https://open.kwaixiaodian.com/zone/docs/api?name=open.distribution.investment.activity.open.list&version=1
func GetKuishouActivity(signSecret string, param map[string]string) (string, error) { func GetKuishouActivity(signSecret string, param map[string]string) (string, error) {


return SendGet("open.distribution.investment.activity.open.list", signSecret, param) return SendGet("open.distribution.investment.activity.open.list", signSecret, param)
} }


//https://open.kwaixiaodian.com/zone/new/docs/api?name=open.distribution.investment.activity.item.detail&version=1
// https://open.kwaixiaodian.com/zone/new/docs/api?name=open.distribution.investment.activity.item.detail&version=1
func GetKuishouGoodsDetail(signSecret string, param map[string]string) (string, error) { func GetKuishouGoodsDetail(signSecret string, param map[string]string) (string, error) {


return SendGet("open.distribution.investment.activity.item.detail", signSecret, param) return SendGet("open.distribution.investment.activity.item.detail", signSecret, param)
} }


//https://open.kwaixiaodian.com/zone/docs/api?name=open.distribution.investment.activity.open.list&version=1
// https://open.kwaixiaodian.com/zone/docs/api?name=open.distribution.investment.activity.open.list&version=1
func GetKuishouGoods(signSecret string, param map[string]string) (string, error) { func GetKuishouGoods(signSecret string, param map[string]string) (string, error) {


return SendGet("open.distribution.investment.activity.open.item.list", signSecret, param) return SendGet("open.distribution.investment.activity.open.item.list", signSecret, param)
} }


////https://open.kwaixiaodian.com/zone/docs/api?name=open.distribution.second.apply.investment.activity.list&version=1
// //https://open.kwaixiaodian.com/zone/docs/api?name=open.distribution.second.apply.investment.activity.list&version=1
func GetKuishouMyActivity(signSecret string, param map[string]string) (string, error) { func GetKuishouMyActivity(signSecret string, param map[string]string) (string, error) {


return SendGet("open.distribution.second.apply.investment.activity.list", signSecret, param) return SendGet("open.distribution.second.apply.investment.activity.list", signSecret, param)
} }


//
////https://open.kwaixiaodian.com/zone/docs/api?name=open.distribution.second.apply.investment.activity.item.list&version=1
// //https://open.kwaixiaodian.com/zone/docs/api?name=open.distribution.second.apply.investment.activity.item.list&version=1
func GetKuishouMyGoods(signSecret string, param map[string]string) (string, error) { func GetKuishouMyGoods(signSecret string, param map[string]string) (string, error) {
return SendGet("open.distribution.second.apply.investment.activity.item.list", signSecret, param) return SendGet("open.distribution.second.apply.investment.activity.item.list", signSecret, param)
} }


//https://open.kwaixiaodian.com/zone/docs/api?name=open.distribution.cps.leader.order.cursor.list&version=1
// https://open.kwaixiaodian.com/zone/docs/api?name=open.distribution.cps.leader.order.cursor.list&version=1
func GetKuishouOrder(signSecret string, param map[string]string) (string, error) { func GetKuishouOrder(signSecret string, param map[string]string) (string, error) {
return SendGet("open.distribution.cps.leader.order.cursor.list", signSecret, param) return SendGet("open.distribution.cps.leader.order.cursor.list", signSecret, param)
} }


//https://open.kwaixiaodian.com/zone/docs/api?name=open.distribution.cps.leader.order.detail&version=1 //https://open.kwaixiaodian.com/zone/docs/api?name=open.distribution.cps.leader.order.detail&version=1


//https://open.kwaixiaodian.com/zone/docs/api?name=open.distribution.selection.pick&version=1 橱窗
// https://open.kwaixiaodian.com/zone/docs/api?name=open.distribution.selection.pick&version=1 橱窗
func GetKuishouSelectionPick(signSecret string, param map[string]string) (string, error) { func GetKuishouSelectionPick(signSecret string, param map[string]string) (string, error) {
return SendPost("open.distribution.selection.pick", signSecret, param) return SendPost("open.distribution.selection.pick", signSecret, param)
} }


//https://open.kwaixiaodian.com/zone/docs/api?name=open.user.info.get&version=1 用户信息
// https://open.kwaixiaodian.com/zone/docs/api?name=open.user.info.get&version=1 用户信息
func GetKuishouUser(signSecret string, param map[string]string) (string, error) { func GetKuishouUser(signSecret string, param map[string]string) (string, error) {
return SendGet("open.user.info.get", signSecret, param) return SendGet("open.user.info.get", signSecret, param)
} }
@@ -93,7 +96,7 @@ func GetKuishouOrderDetail(signSecret string, param map[string]string) (string,
return SendGet("open.distribution.cps.leader.order.detail", signSecret, param) return SendGet("open.distribution.cps.leader.order.detail", signSecret, param)
} }


//https://open.kwaixiaodian.com/zone/docs/api?name=open.distribution.cps.kwaimoney.selection.item.list&version=1
// https://open.kwaixiaodian.com/zone/docs/api?name=open.distribution.cps.kwaimoney.selection.item.list&version=1
func GetKuishouCpsGoods(signSecret string, param map[string]string) (string, error) { func GetKuishouCpsGoods(signSecret string, param map[string]string) (string, error) {
return SendGet("open.distribution.cps.kwaimoney.selection.item.list", signSecret, param) return SendGet("open.distribution.cps.kwaimoney.selection.item.list", signSecret, param)
} }


+ 4
- 4
sms/agent_api.go View File

@@ -14,7 +14,7 @@ import (
"xorm.io/xorm" "xorm.io/xorm"
) )


//短信数量
// 短信数量
func AgentSmsNumGetSmsNum(engine *xorm.Engine, smsType, uid interface{}) int { func AgentSmsNumGetSmsNum(engine *xorm.Engine, smsType, uid interface{}) int {
numData := offical.GetAgentSmsNum(engine, smsType, uid) numData := offical.GetAgentSmsNum(engine, smsType, uid)
num := 0 num := 0
@@ -27,7 +27,7 @@ func AgentSmsNumGetSmsNum(engine *xorm.Engine, smsType, uid interface{}) int {
return num return num
} }


//发送短信
// 发送短信
func AgentSmsSend(engine *xorm.Engine, args map[string]interface{}) error { func AgentSmsSend(engine *xorm.Engine, args map[string]interface{}) error {
num := AgentSmsNumGetSmsNum(engine, args["sms_type"], args["uid"]) num := AgentSmsNumGetSmsNum(engine, args["sms_type"], args["uid"])
ex := strings.Split(args["mobile"].(string), ",") ex := strings.Split(args["mobile"].(string), ",")
@@ -43,7 +43,7 @@ func AgentSmsSend(engine *xorm.Engine, args map[string]interface{}) error {
return errors.New("短信不足") return errors.New("短信不足")
} }
if args["type"] != "mob" { //联江短信数量 if args["type"] != "mob" { //联江短信数量
send, err := SmsApiSend(engine, "api.v1.accountNum", map[string]interface{}{})
send, err := SmsApiSend(engine, "v1.accountNum", map[string]interface{}{})
if err != nil { if err != nil {
return err return err
} }
@@ -92,7 +92,7 @@ func AgentSmsSend(engine *xorm.Engine, args map[string]interface{}) error {
return errors.New(msg) return errors.New(msg)
} }
} else { } else {
send, err = SmsApiSend(engine, "api.v1.sms", where)
send, err = SmsApiSend(engine, "v1.sms", where)
if err != nil { if err != nil {
return err return err
} }


+ 46
- 10
taobao/search_list.go View File

@@ -1,11 +1,14 @@
package taobao package taobao


import ( import (
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/e"
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/md" "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/md"
zhios_third_party_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/utils" zhios_third_party_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/utils"
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/jinzhu/copier" "github.com/jinzhu/copier"
"strings"
"time"
) )


// 淘宝物料 // 淘宝物料
@@ -80,7 +83,7 @@ type NewMarterial struct {
SubTitle string `json:"sub_title"` SubTitle string `json:"sub_title"`
Title string `json:"title"` Title string `json:"title"`
UserType int `json:"user_type"` UserType int `json:"user_type"`
Volume int `json:"volume"`
Volume string `json:"annual_vol"`
TkTotalSales string `json:"tk_total_sales"` TkTotalSales string `json:"tk_total_sales"`
WhiteImage string `json:"white_image"` WhiteImage string `json:"white_image"`
SmallImages struct { SmallImages struct {
@@ -256,21 +259,54 @@ func (t *TB) SearchList(args map[string]string) (*[]Material, error) {
resp, err := t.GetList(args, "") resp, err := t.GetList(args, "")
//如果是跟随官方 结构不一样 //如果是跟随官方 结构不一样
if t.AuthType == 1 { if t.AuthType == 1 {
var tmp scMaterialOptionalStruct
var tmp scTbkScMaterialOptionalUpgradeResponse
if err = json.Unmarshal(resp, &tmp); err != nil { if err = json.Unmarshal(resp, &tmp); err != nil {
return nil, err return nil, err
} }
if len(tmp.TbkScMaterialOptionalResponse.ResultList.MapData) == 0 {
return nil, err
if len(tmp.TbkScMaterialOptionalUpgradeResponse.ResultList.MapData) == 0 {
return nil, e.NewErr(400, "获取失败")
} }
data := tmp.TbkScMaterialOptionalResponse.ResultList.MapData
for k, v := range data {
itemID, ok := v.ItemID.(float64)
if ok {
data[k].ItemID = int64(itemID)
data := tmp.TbkScMaterialOptionalUpgradeResponse.ResultList.MapData
list := make([]Material, 0)
for _, v := range data {
if strings.Contains(v.ItemBasicInfo.Volume, "万+") {
v.ItemBasicInfo.Volume = zhios_third_party_utils.IntToStr(zhios_third_party_utils.StrToInt(strings.ReplaceAll(v.ItemBasicInfo.Volume, "万+", "")) * 10000)
}
v.ItemBasicInfo.Volume = strings.ReplaceAll(v.ItemBasicInfo.Volume, "+", "")

tmp1 := Material{
CategoryID: v.ItemBasicInfo.CategoryId,
CategoryName: v.ItemBasicInfo.CategoryName,
CommissionRate: zhios_third_party_utils.Float64ToStr(zhios_third_party_utils.StrToFloat64(v.PublishInfo.IncomeRate) * 100),
ItemID: v.ItemId,
Nick: v.ItemBasicInfo.ShopTitle,
PictURL: v.ItemBasicInfo.PictUrl,
SellerID: int(v.ItemBasicInfo.SellerId),
ShopTitle: v.ItemBasicInfo.ShopTitle,
ShortTitle: v.ItemBasicInfo.ShortTitle,
Title: v.ItemBasicInfo.Title,
ZkFinalPrice: v.PricePromotionInfo.ZkFinalPrice,
ReservePrice: v.PricePromotionInfo.ReservePrice,
Volume: zhios_third_party_utils.StrToInt(v.ItemBasicInfo.Volume),
} }
tmp1.SmallImages.String = []string{tmp1.PictURL}

if zhios_third_party_utils.StrToFloat64(v.PricePromotionInfo.FinalPromotionPrice) > 0 {
for _, v1 := range v.PricePromotionInfo.FinalPromotionPathList.FinalPromotionPathMapData {
tmp1.CouponAmount = zhios_third_party_utils.Float64ToStrByPrec(zhios_third_party_utils.StrToFloat64(v1.PromotionFee)+zhios_third_party_utils.StrToFloat64(tmp1.CouponAmount), 2)
tmp1.CouponStartTime = zhios_third_party_utils.IntToStr(zhios_third_party_utils.StrToInt(v1.PromotionStartTime) / 1000)
tmp1.CouponEndTime = zhios_third_party_utils.IntToStr(zhios_third_party_utils.StrToInt(v1.PromotionEndTime) / 1000)
tmp1.CouponID = v1.PromotionId
if v1.PromotionTitle == "商品券" || v1.PromotionTitle == "店铺券" {
if zhios_third_party_utils.StrToInt64(v1.PromotionEndTime)/1000 > time.Now().Unix() {
tmp1.GoodsCoupon = "1"
}
}
}
}
list = append(list, tmp1)
} }
return &data, nil
return &list, nil
} else { } else {
var tmp wrapperStruct var tmp wrapperStruct
if err = json.Unmarshal(resp, &tmp); err != nil { if err = json.Unmarshal(resp, &tmp); err != nil {


+ 114
- 0
utils/crypto.go View File

@@ -0,0 +1,114 @@
package zhios_third_party_utils

import (
"bytes"
"crypto/aes"
"crypto/cipher"
"crypto/rand"
"crypto/sha1"
"encoding/hex"
"errors"
"io"
"sort"
"strings"
)

const pkcs7blocksize = 32

// pkcs7encode 对需要加密的明文进行填充补位
// plaintext 需要进行填充补位操作的明文
// 返回补齐明文字符串
func pkcs7encode(plaintext []byte) []byte {
//计算需要填充的位数
pad := pkcs7blocksize - len(plaintext)%pkcs7blocksize
if pad == 0 {
pad = pkcs7blocksize
}

//获得补位所用的字符
text := bytes.Repeat([]byte{byte(pad)}, pad)

return append(plaintext, text...)
}

// pkcs7decode 对解密后的明文进行补位删除
// plaintext 解密后的明文
// 返回删除填充补位后的明文和
func pkcs7decode(plaintext []byte) []byte {
ln := len(plaintext)

// 获取最后一个字符的 ASCII
pad := int(plaintext[ln-1])
if pad < 1 || pad > pkcs7blocksize {
pad = 0
}

return plaintext[:(ln - pad)]
}

// 对加密数据包进行签名校验,确保数据的完整性。
func validateSignature(signature string, parts ...string) bool {
return signature == createSignature(parts...)
}

// 校验用户数据数据
func validateUserInfo(signature, rawData, ssk string) bool {
raw := sha1.Sum([]byte(rawData + ssk))
return signature == hex.EncodeToString(raw[:])
}

// 拼凑签名
func createSignature(parts ...string) string {
sort.Strings(parts)
raw := sha1.Sum([]byte(strings.Join(parts, "")))

return hex.EncodeToString(raw[:])
}

// cbcEncrypt CBC 加密数据
func cbcEncrypt(key, plaintext, iv []byte) ([]byte, error) {
if len(plaintext)%aes.BlockSize != 0 {
return nil, errors.New("plaintext is not a multiple of the block size")
}

block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}

ciphertext := make([]byte, aes.BlockSize+len(plaintext))
iv = iv[:aes.BlockSize]
if _, err := io.ReadFull(rand.Reader, iv); err != nil {
return nil, err
}

mode := cipher.NewCBCEncrypter(block, iv)
mode.CryptBlocks(ciphertext[aes.BlockSize:], plaintext)

return ciphertext, nil
}

// CBC解密数据
func CbcDecrypt(key, ciphertext, iv []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}

size := aes.BlockSize
iv = iv[:size]
// ciphertext = ciphertext[size:] TODO: really useless?

if len(ciphertext) < size {
return nil, errors.New("ciphertext too short")
}

if len(ciphertext)%size != 0 {
return nil, errors.New("ciphertext is not a multiple of the block size")
}

mode := cipher.NewCBCDecrypter(block, iv)
mode.CryptBlocks(ciphertext, ciphertext)

return pkcs7decode(ciphertext), nil
}

Loading…
Cancel
Save