@@ -0,0 +1,261 @@ | |||||
package chain_transfer | |||||
import ( | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/db" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/haodanku" | |||||
"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/taobao" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/tik_tok" | |||||
zhios_third_party_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/utils" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/zhimeng" | |||||
"fmt" | |||||
"time" | |||||
"xorm.io/xorm" | |||||
) | |||||
/*** | |||||
master_id 站长id | |||||
provider 渠道 | |||||
gid 商品id | |||||
uid 用户id | |||||
*/ | |||||
func ChainTransfer(eg *xorm.Engine, args map[string]string) map[string]string { | |||||
var res = make(map[string]string) | |||||
res["url"] = "" | |||||
res["word"] = "" | |||||
userProfile, _ := db.UserProfileFindByID(eg, args["uid"]) | |||||
if userProfile != nil { | |||||
args["acc_taobao_share_id"] = zhios_third_party_utils.Int64ToStr(userProfile.AccTaobaoShareId) | |||||
args["acc_jd_share_id"] = userProfile.AccJdCloudId | |||||
args["acc_pdd_self_id"] = userProfile.AccPddSelfId | |||||
} | |||||
switch args["provider"] { | |||||
case md.PVD_TB, md.PVD_TM: | |||||
taobaoSdk, err := taobao.NewTaobaoSDK(eg, args["master_id"], args["platform"], zhios_third_party_utils.StrToInt(args["acc_taobao_share_id"])) | |||||
if err != nil { | |||||
return res | |||||
} | |||||
bizSceneId := "2" | |||||
tbItemInfo, err := taobaoSdk.ItemDetailById(args["gid"], bizSceneId) | |||||
if err != nil { | |||||
fmt.Println("=======商品1", err) | |||||
return res | |||||
} | |||||
if tbItemInfo != nil { | |||||
args["gid"] = zhios_third_party_utils.AnyToString(tbItemInfo.ItemID) | |||||
} | |||||
curls, err := ConvertUrl(eg, args) | |||||
if err != nil || curls == nil { | |||||
return res | |||||
} | |||||
//调用好单库 | |||||
itemInfo, _ := haodanku.HaodankuDetail(args["gid"]) | |||||
//如果优惠券高 | |||||
if zhios_third_party_utils.StrToFloat64(itemInfo.CouponAmount) > zhios_third_party_utils.StrToFloat64(tbItemInfo.CouponAmount) && zhios_third_party_utils.StrToFloat64(itemInfo.CouponAmount) > 0 { | |||||
curls.ShortenURL = "https://uland.taobao.com/coupon/edetail?activityId=" + itemInfo.ActivityId + "&itemId=" + args["gid"] + "&pid=" + taobaoSdk.SharePromoIdWeb + "&nowake=1" | |||||
} | |||||
//如果是小程序 并且没有渠道id 就用会员运营id 和推广位 | |||||
if zhios_third_party_utils.StrToInt(args["acc_taobao_share_id"]) == 0 { | |||||
if curls.NewPid != "" { | |||||
curls.ShortenURL = curls.ShortenURL + "&relationId=" + zhios_third_party_utils.Int64ToStr(curls.TbShareId) | |||||
} | |||||
} else { | |||||
curls.ShortenURL = curls.ShortenURL + "&relationId=" + args["acc_taobao_share_id"] | |||||
} | |||||
if curls.TaoBaoWord == "" { | |||||
// 生成淘口令 | |||||
taokou, err := taobaoSdk.WordCreate(curls.ShortenURL, "12345") | |||||
if err != nil { | |||||
taokou = new(md.TaobaoWord) | |||||
} | |||||
curls.TaoBaoWord = taokou.Text | |||||
} | |||||
res["url"] = curls.ShortenURL | |||||
res["word"] = curls.TaoBaoWord | |||||
case md.PVD_JD: | |||||
case md.PVD_TIKTOK, md.PVD_KUAISHOU: | |||||
// 分享 | |||||
if args["provider"] == md.PVD_TIKTOK { | |||||
args["coupon_url"] = "https://haohuo.jinritemai.com/views/product/item2?id=" + args["gid"] | |||||
} | |||||
case md.PVD_VIP: | |||||
} | |||||
if zhios_third_party_utils.InArr(args["provider"], []string{md.PVD_TB, md.PVD_TM}) == false { | |||||
curls, err := ConvertUrl(eg, args) | |||||
if err != nil || curls == nil { | |||||
return res | |||||
} | |||||
res["url"] = curls.ShortenURL | |||||
if curls.Content != "" && args["provider"] == md.PVD_TIKTOK { | |||||
res["word"] = curls.Content | |||||
} | |||||
} | |||||
return res | |||||
} | |||||
func ConvertUrl(eg *xorm.Engine, args map[string]string) (*md.ConvertedUrls, error) { | |||||
var ( | |||||
err error | |||||
) | |||||
var urls *md.ConvertedUrls | |||||
switch args["provider"] { | |||||
case md.PVD_TB, md.PVD_TM: | |||||
taobaoSdk, err := taobao.NewTaobaoSDK(eg, args["master_id"], args["platform"], zhios_third_party_utils.StrToInt(args["acc_taobao_share_id"])) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
tb := taobaoSdk | |||||
var promoId = tb.SharePromoIdWeb | |||||
var promoId1 string | |||||
var taobaoShareId1 string | |||||
var IsWxTaobaoAuth bool | |||||
fmt.Println(IsWxTaobaoAuth) | |||||
if zhios_third_party_utils.StrToInt(args["acc_taobao_share_id"]) == 0 { | |||||
if tb.AppletIsAuth == "1" { | |||||
IsWxTaobaoAuth, taobaoShareId1, promoId1 = taobao.TaobaoRelationPid(eg, args) | |||||
if IsWxTaobaoAuth == false { | |||||
return nil, err | |||||
} else { | |||||
promoId = promoId1 | |||||
} | |||||
} | |||||
} | |||||
thirdZmAppKeyData, err := db.SysCfgGetOne(eg, "third_zm_app_key") | |||||
if thirdZmAppKeyData == nil || err != nil { | |||||
return urls, err | |||||
} | |||||
thirdZmAppSecretData, err := db.SysCfgGetOne(eg, "third_zm_app_secret") | |||||
if thirdZmAppSecretData == nil || err != nil { | |||||
return urls, err | |||||
} | |||||
urls, err = zhimeng.TaobaoConvertUrl(thirdZmAppKeyData.Val, | |||||
thirdZmAppSecretData.Val, args["gid"], promoId, tb.UserSID, "", tb.Svc_AK) | |||||
if urls != nil { | |||||
if taobaoShareId1 != "" { | |||||
urls.TbShareId = zhios_third_party_utils.StrToInt64(taobaoShareId1) | |||||
} | |||||
if promoId1 != "" { | |||||
urls.NewPid = promoId1 | |||||
} | |||||
} | |||||
case md.PVD_JD: | |||||
thirdZmAppKeyData, err := db.SysCfgGetOne(eg, "third_zm_app_key") | |||||
if thirdZmAppKeyData == nil || err != nil { | |||||
return urls, err | |||||
} | |||||
thirdZmAppSecretData, err := db.SysCfgGetOne(eg, "third_zm_app_secret") | |||||
if thirdZmAppSecretData == nil || err != nil { | |||||
return urls, err | |||||
} | |||||
// 初始化京东配置 | |||||
pid := args["acc_jd_share_id"] | |||||
postData := make(map[string]interface{}) | |||||
postData["gid"] = args["gid"] | |||||
postData["appkey"] = thirdZmAppKeyData.Val | |||||
postData["secret_key"] = thirdZmAppSecretData.Val | |||||
jdData, err := zhimeng.NewZhiMengJingDongSDK(). | |||||
SelectFunction("getgoodsinfo"). | |||||
WithArgs(postData). | |||||
Result() | |||||
mdData := &md.MoreDetailResponse{} | |||||
// to struct | |||||
couponUrl := "" | |||||
couponPrice := "" | |||||
err = jdData.ToStruct(mdData) | |||||
if err == nil && mdData != nil && mdData.CouponURL != "" { | |||||
couponUrl = mdData.CouponURL | |||||
couponPrice = mdData.CouponPrice | |||||
} | |||||
urls, err = zhimeng.JDConvertUrl( | |||||
thirdZmAppKeyData.Val, | |||||
thirdZmAppSecretData.Val, | |||||
args["gid"], | |||||
pid, | |||||
couponUrl, | |||||
couponPrice, | |||||
"") | |||||
case md.PVD_TIKTOK, md.PVD_KUAISHOU: | |||||
pid := "cloud_" + args["uid"] | |||||
thirdZmAppKeyData, err := db.SysCfgGetOne(eg, "third_zm_app_key") | |||||
if thirdZmAppKeyData == nil || err != nil { | |||||
return urls, err | |||||
} | |||||
thirdZmAppSecretData, err := db.SysCfgGetOne(eg, "third_zm_app_secret") | |||||
if thirdZmAppSecretData == nil || err != nil { | |||||
return urls, err | |||||
} | |||||
tikTokArgs := map[string]interface{}{ | |||||
"appkey": thirdZmAppKeyData.Val, | |||||
"secret_key": thirdZmAppSecretData.Val, | |||||
"product_url": args["coupon_url"], | |||||
"external_info": pid, | |||||
} | |||||
if args["provider"] == md.PVD_TIKTOK { | |||||
tikTokArgs["need_qr_code"] = "0" | |||||
tikTokBase, _ := tik_tok.Base(eg, args["master_id"], "") | |||||
if zhios_third_party_utils.InArr(tikTokBase.AuthType, []string{"2", "3"}) { | |||||
if time.Now().Unix() > 1670055300 { | |||||
tikTokArgs["external_info"] = pid + "_" + args["master_id"] | |||||
} | |||||
urls, err = tik_tok.OwnTikTokUrl(tikTokBase, tikTokArgs) | |||||
} else { | |||||
tikTokArgs["external_info"] = pid + "_" + args["master_id"] | |||||
urls, err = zhimeng.TikTokUrl(tikTokArgs) | |||||
} | |||||
} else if args["provider"] == md.PVD_KUAISHOU { | |||||
tikTokArgs["gid"] = args["gid"] | |||||
tikTokArgs["linkType"] = "101" | |||||
tikTokArgs["genPoster"] = "0" | |||||
tikTokArgs["external_info"] = pid + "_" + args["master_id"] | |||||
urls, err = zhimeng.KuaiShouUrl(tikTokArgs) | |||||
} | |||||
case md.PVD_VIP: | |||||
thirdZmAppKeyData, err := db.SysCfgGetOne(eg, "third_zm_app_key") | |||||
if thirdZmAppKeyData == nil || err != nil { | |||||
return urls, err | |||||
} | |||||
thirdZmAppSecretData, err := db.SysCfgGetOne(eg, "third_zm_app_secret") | |||||
if thirdZmAppSecretData == nil || err != nil { | |||||
return urls, err | |||||
} | |||||
// 初始化vip配置 | |||||
pid := args["master_id"] + "_vip_cloud_" + args["uid"] | |||||
openId := args["master_id"] + "_vip_" + args["uid"] | |||||
urls, err = zhimeng.VipConvertUrl( | |||||
thirdZmAppKeyData.Val, | |||||
thirdZmAppSecretData.Val, | |||||
args["gid"], | |||||
pid, | |||||
"", "", openId, "1") | |||||
case md.PVD_PDD: | |||||
pid := args["acc_pdd_self_id"] | |||||
thirdZmAppKeyData, err := db.SysCfgGetOne(eg, "third_zm_app_key") | |||||
if thirdZmAppKeyData == nil || err != nil { | |||||
return urls, err | |||||
} | |||||
thirdZmAppSecretData, err := db.SysCfgGetOne(eg, "third_zm_app_secret") | |||||
if thirdZmAppSecretData == nil || err != nil { | |||||
return urls, err | |||||
} | |||||
miniApp := "0" | |||||
isShares := "2" | |||||
urls, err = zhimeng.PDDConvertUrl( | |||||
thirdZmAppKeyData.Val, | |||||
thirdZmAppSecretData.Val, | |||||
args["gid"], | |||||
pid, | |||||
"", | |||||
miniApp, | |||||
"1", isShares) | |||||
} | |||||
return urls, err | |||||
} |
@@ -0,0 +1,58 @@ | |||||
package db | |||||
import ( | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/db/model" | |||||
"xorm.io/xorm" | |||||
) | |||||
func IsExistRelationPid(eg *xorm.Engine, uid, union_id int) *model.TaobaoRelationPid { | |||||
var data model.TaobaoRelationPid | |||||
exist, err := eg.Where("uid=? and union_id=?", uid, union_id).Get(&data) | |||||
if exist == false || err != nil { | |||||
return nil | |||||
} | |||||
return &data | |||||
} | |||||
func GetRelation(eg *xorm.Engine, unionId, count int) (string, int64) { | |||||
var data model.TaobaoRelation | |||||
get, err := eg.Where("union_id=? and count<?", unionId, count).OrderBy("id asc").Get(&data) | |||||
if get == false || err != nil { | |||||
return "", 0 | |||||
} | |||||
return data.RelationId, data.Id | |||||
} | |||||
func GetRelationPid(eg *xorm.Engine, unionId int, pid []string, relationId string) *[]model.TaobaoRelationPid { | |||||
var data []model.TaobaoRelationPid | |||||
err := eg.In("pid", pid).Where("union_id=? and relation_id=?", unionId, relationId).OrderBy("id asc").Find(&data) | |||||
if err != nil { | |||||
return nil | |||||
} | |||||
return &data | |||||
} | |||||
// 批量订单id查找订单 | |||||
func TaobaoRelationListByTaobaoIds(Db *xorm.Engine, unionId int, ids []int64) (*[]model.TaobaoRelation, error) { | |||||
var o []model.TaobaoRelation | |||||
if err := Db.In("relation_id", ids).Where("union_id=?", unionId).Find(&o); err != nil { | |||||
return nil, logx.Error(err) | |||||
} | |||||
return &o, nil | |||||
} | |||||
func TaobaoRelationListInsert(Db *xorm.Engine, m *model.TaobaoRelation) bool { | |||||
_, err := Db.InsertOne(m) | |||||
if err != nil { | |||||
logx.Warn(err) | |||||
return false | |||||
} | |||||
return true | |||||
} | |||||
func TaobaoRelationOrderUserByTbPids(eg *xorm.Engine, relationId, pid string, unionId int) *model.TaobaoRelationPid { | |||||
var m model.TaobaoRelationPid | |||||
get, err := eg.Where("relation_id=? and short_pid=? and union_id=?", relationId, pid, unionId).Get(&m) | |||||
if get == false || err != nil { | |||||
return nil | |||||
} | |||||
return &m | |||||
} |
@@ -0,0 +1,23 @@ | |||||
package db | |||||
import ( | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/db/model" | |||||
"xorm.io/xorm" | |||||
) | |||||
func UserFindByID(Db *xorm.Engine, id interface{}) (*model.User, error) { | |||||
var m model.User | |||||
if has, err := Db.Where("uid = ?", id). | |||||
Get(&m); err != nil || has == false { | |||||
return nil, err | |||||
} | |||||
return &m, nil | |||||
} | |||||
func UserProfileFindByID(Db *xorm.Engine, id interface{}) (*model.UserProfile, error) { | |||||
var m model.UserProfile | |||||
if has, err := Db.Where("uid = ?", id).Get(&m); err != nil || has == false { | |||||
return nil, err | |||||
} | |||||
return &m, nil | |||||
} |
@@ -0,0 +1,13 @@ | |||||
package model | |||||
import "time" | |||||
type TaobaoRelationPid struct { | |||||
Id int64 `json:"id" xorm:"pk autoincr comment('主键') BIGINT(10)"` | |||||
Uid int `json:"uid" xorm:"not null default 0 comment('') INT(11)"` | |||||
RelationId string `json:"relation_id" xorm:"not null default '' unique(relation_id) VARCHAR(255)"` | |||||
Pid string `json:"pid" xorm:"not null default '' unique(relation_id) VARCHAR(255)"` | |||||
ShortPid string `json:"short_pid" xorm:"not null default '' VARCHAR(255)"` | |||||
Time time.Time `json:"time" xorm:"not null default 'CURRENT_TIMESTAMP' comment('') TIMESTAMP"` | |||||
UnionId int `json:"union_id" xorm:"not null default 0 comment('') INT(11)"` | |||||
} |
@@ -0,0 +1,32 @@ | |||||
package model | |||||
import ( | |||||
"time" | |||||
) | |||||
type User struct { | |||||
Uid int `json:"uid" xorm:"not null pk autoincr comment('主键ID') INT(10)"` | |||||
Username string `json:"username" xorm:"not null default '' comment('用户名') index VARCHAR(50)"` | |||||
Password string `json:"password" xorm:"not null default '' comment('密码') CHAR(32)"` | |||||
Passcode string `json:"passcode" xorm:"not null default '' comment('支付密码') CHAR(32)"` | |||||
Email string `json:"email" xorm:"not null default '' comment('邮箱') VARCHAR(128)"` | |||||
Phone string `json:"phone" xorm:"not null default '' comment('联系电话') index VARCHAR(20)"` | |||||
Nickname string `json:"nickname" xorm:"not null default '' comment('昵称') VARCHAR(20)"` | |||||
Level int `json:"level" xorm:"not null default 0 comment('用户等级id') INT(11)"` | |||||
IsStore int `json:"is_store" xorm:"not null default 0 comment('') INT(11)"` | |||||
InviteTotal int `json:"invite_total" xorm:"not null default 0 comment('直推邀请总人数') INT(11)"` | |||||
LevelArriveAt time.Time `json:"level_arrive_at" xorm:"not null default 'CURRENT_TIMESTAMP' comment('到达该等级的时间') TIMESTAMP"` | |||||
LevelExpireAt time.Time `json:"level_expire_at" xorm:"not null default '0000-00-00 00:00:00' comment('该等级过期时间') TIMESTAMP"` | |||||
CreateAt time.Time `json:"create_at" xorm:"not null default 'CURRENT_TIMESTAMP' comment('创建时间') TIMESTAMP"` | |||||
UpdateAt time.Time `json:"update_at" xorm:"default 'CURRENT_TIMESTAMP' comment('最后修改资料时间') TIMESTAMP"` | |||||
LastLoginAt time.Time `json:"last_login_at" xorm:"default 'CURRENT_TIMESTAMP' comment('最近登录时间') TIMESTAMP"` | |||||
DeleteAt int `json:"delete_at" xorm:"not null default 0 comment('是否删除;0未删除;1已删除') TINYINT(1)"` | |||||
State int `json:"state" xorm:"not null default 1 comment('0未激活,1正常,2冻结') TINYINT(1)"` | |||||
LastLoginIp string `json:"last_login_ip" xorm:"not null default '' comment('最后登录IP') VARCHAR(64)"` | |||||
RegisterIp string `json:"register_ip" xorm:"not null default '' comment('注册IP') VARCHAR(64)"` | |||||
IsFake int `json:"is_fake" xorm:"not null default 0 comment('0真实 1虚拟') TINYINT(1)"` | |||||
IsMarketer int `json:"is_marketer" xorm:"not null default 0 comment('是否市商 0否 1是') TINYINT(1)"` | |||||
Zone string `json:"zone" xorm:"not null default '86' comment('区号') VARCHAR(100)"` | |||||
SalePhone string `json:"sale_phone" xorm:"not null default '' comment('') VARCHAR(100)"` | |||||
Platform string `json:"platform" xorm:"not null default '' comment('') VARCHAR(100)"` | |||||
} |
@@ -0,0 +1,93 @@ | |||||
package model | |||||
import ( | |||||
"time" | |||||
) | |||||
type UserProfile struct { | |||||
Uid int `json:"uid" xorm:"not null pk comment('关联userID') INT(20)"` | |||||
ArkidUid int `json:"arkid_uid" xorm:"not null default 0 comment('Arkid 用户ID') INT(20)"` | |||||
ParentUid int `json:"parent_uid" xorm:"not null default 0 comment('上级ID') INT(20)"` | |||||
ArkidToken string `json:"arkid_token" xorm:"not null default '' comment('token') VARCHAR(2000)"` | |||||
AvatarUrl string `json:"avatar_url" xorm:"not null default '' comment('头像URL') VARCHAR(2000)"` | |||||
CustomInviteCode string `json:"custom_invite_code" xorm:"not null default '' comment('邀请码(自定义)') VARCHAR(16)"` | |||||
InviteCode string `json:"invite_code" xorm:"not null default '' comment('邀请码(系统)') VARCHAR(16)"` | |||||
Gender int `json:"gender" xorm:"not null default 2 comment('性别0女,1男,2未知') TINYINT(1)"` | |||||
Birthday int `json:"birthday" xorm:"not null default 0 comment('出生日期') INT(10)"` | |||||
AccWxId string `json:"acc_wx_id" xorm:"not null default '' comment('账户_微信id') VARCHAR(50)"` | |||||
AccWxOpenid string `json:"acc_wx_openid" xorm:"not null default '' comment('账户_微信openid') VARCHAR(80)"` | |||||
AccTaobaoNickname string `json:"acc_taobao_nickname" xorm:"not null default '' comment('淘宝昵称') VARCHAR(50)"` | |||||
AccTaobaoAuthTime int64 `json:"acc_taobao_auth_time" xorm:"not null default 0 comment('淘宝授权备案时间') BIGINT(11)"` | |||||
AccTaobaoShareId int64 `json:"acc_taobao_share_id" xorm:"not null default 0 comment('淘宝分享relationId,') index BIGINT(12)"` | |||||
AccTaobaoSelfId int64 `json:"acc_taobao_self_id" xorm:"not null default 0 comment('淘宝自购specialId') index BIGINT(12)"` | |||||
AccJdSelfId string `json:"acc_jd_self_id" xorm:"not null default '' comment('京东自购ID') index VARCHAR(50)"` | |||||
AccJdShareId string `json:"acc_jd_share_id" xorm:"not null default '' comment('京东分享ID') index VARCHAR(50)"` | |||||
AccJdCloudId string `json:"acc_jd_cloud_id" xorm:"not null default '' comment('京东分享ID') index VARCHAR(50)"` | |||||
AccJdFreeId string `json:"acc_jd_free_id" xorm:"not null default '' comment('京东新人免单ID') VARCHAR(50)"` | |||||
AccSuningSelfId string `json:"acc_suning_self_id" xorm:"not null default '' comment('苏宁自购ID') index VARCHAR(50)"` | |||||
AccSuningShareId string `json:"acc_suning_share_id" xorm:"not null default '' comment('苏宁分享ID') index VARCHAR(50)"` | |||||
AccSuningFreeId string `json:"acc_suning_free_id" xorm:"not null default '' comment('苏宁新人免单ID') VARCHAR(50)"` | |||||
AccPddSelfId string `json:"acc_pdd_self_id" xorm:"not null default '' comment('拼多多自购ID') index VARCHAR(50)"` | |||||
AccPddShareId string `json:"acc_pdd_share_id" xorm:"not null default '' comment('拼多多分享ID') index VARCHAR(50)"` | |||||
AccPddFreeId string `json:"acc_pdd_free_id" xorm:"not null default '' comment('拼多多新人免单ID') VARCHAR(50)"` | |||||
AccPddBind int `json:"acc_pdd_bind" xorm:"not null default 0 comment('拼多多是否授权绑定') TINYINT(1)"` | |||||
AccVipSelfId string `json:"acc_vip_self_id" xorm:"not null default '' comment('唯品会自购ID') index VARCHAR(50)"` | |||||
AccVipShareId string `json:"acc_vip_share_id" xorm:"not null default '' comment('唯品会分享ID') index VARCHAR(50)"` | |||||
AccVipFreeId string `json:"acc_vip_free_id" xorm:"not null default '' comment('唯品会新人免单ID') VARCHAR(50)"` | |||||
AccKaolaSelfId string `json:"acc_kaola_self_id" xorm:"not null default '' comment('考拉自购ID') index VARCHAR(50)"` | |||||
AccKaolaShareId string `json:"acc_kaola_share_id" xorm:"not null default '' comment('考拉分享ID') index VARCHAR(50)"` | |||||
AccKaolaFreeId string `json:"acc_kaola_free_id" xorm:"not null default '' comment('考拉新人免单ID') VARCHAR(50)"` | |||||
AccDuomaiShareId int64 `json:"acc_duomai_share_id" xorm:"not null pk default 0 comment('多麦联盟分享ID') BIGINT(12)"` | |||||
AccAlipay string `json:"acc_alipay" xorm:"not null default '' comment('支付宝账号') VARCHAR(50)"` | |||||
AccAlipayRealName string `json:"acc_alipay_real_name" xorm:"not null default '' comment('支付宝账号真实姓名') VARCHAR(50)"` | |||||
CertTime int `json:"cert_time" xorm:"not null default 0 comment('认证时间') INT(10)"` | |||||
CertName string `json:"cert_name" xorm:"not null default '' comment('证件上名字,也是真实姓名') VARCHAR(50)"` | |||||
CertNum string `json:"cert_num" xorm:"not null default '' comment('证件号码') VARCHAR(50)"` | |||||
CertState int `json:"cert_state" xorm:"not null default 0 comment('认证状态(0为未认证,1为认证中,2为已认证,3为认证失败)') TINYINT(1)"` | |||||
FinCommission string `json:"fin_commission" xorm:"not null default 0.0000 comment('累计佣金') DECIMAL(10,4)"` | |||||
FinValid string `json:"fin_valid" xorm:"not null default 0.0000 comment('可用余额,fin=>finance财务') DECIMAL(10,4)"` | |||||
FinInvalid string `json:"fin_invalid" xorm:"not null default 0.0000 comment('不可用余额,冻结余额') DECIMAL(10,4)"` | |||||
FinSelfOrderCount int `json:"fin_self_order_count" xorm:"not null default 0 comment('自购订单数,包括未完成') INT(11)"` | |||||
FinSelfOrderCountDone int `json:"fin_self_order_count_done" xorm:"not null default 0 comment('自购已完成订单') INT(11)"` | |||||
FinSelfRebate float32 `json:"fin_self_rebate" xorm:"not null default 0.000000 comment('累积自购获得返利金额') FLOAT(14,6)"` | |||||
FinTotal float32 `json:"fin_total" xorm:"not null default 0.000000 comment('累计总收益') FLOAT(14,6)"` | |||||
Lat float32 `json:"lat" xorm:"not null default 0.000000 comment('纬度') FLOAT(15,6)"` | |||||
Lng float32 `json:"lng" xorm:"not null default 0.000000 comment('经度') FLOAT(15,6)"` | |||||
Memo string `json:"memo" xorm:"not null default '' comment('用户简述备注') VARCHAR(2048)"` | |||||
Qq string `json:"qq" xorm:"not null default '' comment('') VARCHAR(255)"` | |||||
IsNew int `json:"is_new" xorm:"not null default 1 comment('是否是新用户') TINYINT(1)"` | |||||
IsVerify int `json:"is_verify" xorm:"not null default 0 comment('是否有效会员') TINYINT(1)"` | |||||
IsOrdered int `json:"is_ordered" xorm:"not null default 0 comment('是否已完成首单(0否,1是)') TINYINT(1)"` | |||||
FromWay string `json:"from_way" xorm:"not null default '' comment('注册来源: | |||||
no_captcha_phone:免验证码手机号注册; | |||||
manual_phone:手动手机验证码注册; | |||||
wx:微信授权; | |||||
wx_mp:小程序授权; | |||||
wx_pub:公众号授权; | |||||
wx_bind_phone:微信注册绑定手机号; | |||||
admin:管理员添加;taobao_bind_phone:淘宝注册绑定手机号,apple_bind_phone:苹果注册绑定手机号') VARCHAR(16)"` | |||||
HidOrder int `json:"hid_order" xorm:"not null default 0 comment('隐藏订单') TINYINT(3)"` | |||||
HidContact int `json:"hid_contact" xorm:"not null default 0 comment('隐藏联系方式') TINYINT(4)"` | |||||
NewMsgNotice int `json:"new_msg_notice" xorm:"not null default 1 comment('新消息通知') TINYINT(1)"` | |||||
WxAccount string `json:"wx_account" xorm:"not null default '' comment('微信号') VARCHAR(100)"` | |||||
WxQrcode string `json:"wx_qrcode" xorm:"not null default '' comment('微信二维码') VARCHAR(100)"` | |||||
ThirdPartyTaobaoOid string `json:"third_party_taobao_oid" xorm:"not null default '' comment('淘宝第三方登录openID') VARCHAR(100)"` | |||||
ThirdPartyTaobaoSid string `json:"third_party_taobao_sid" xorm:"not null default '' comment('淘宝第三方登录sID') VARCHAR(255)"` | |||||
ThirdPartyTaobaoAcctoken string `json:"third_party_taobao_acctoken" xorm:"not null default '' comment('淘宝第三方登录topaccesstoken') VARCHAR(100)"` | |||||
ThirdPartyTaobaoAuthcode string `json:"third_party_taobao_authcode" xorm:"not null default '' comment('淘宝第三方登录topAuthCode') VARCHAR(100)"` | |||||
ThirdPartyAppleToken string `json:"third_party_apple_token" xorm:"not null default '' comment('苹果第三方登录token') VARCHAR(1024)"` | |||||
ThirdPartyQqAccessToken string `json:"third_party_qq_access_token" xorm:"not null default '' comment('QQ第三方登录access_token') VARCHAR(255)"` | |||||
ThirdPartyQqExpiresIn string `json:"third_party_qq_expires_in" xorm:"not null default '' comment('QQ第三方登录expires_in(剩余时长)') VARCHAR(255)"` | |||||
ThirdPartyQqOpenid string `json:"third_party_qq_openid" xorm:"not null default '' comment('QQ第三方登陆openid(不变,用于认证)') VARCHAR(255)"` | |||||
ThirdPartyQqUnionid string `json:"third_party_qq_unionid" xorm:"not null default '' comment('QQ第三方登陆unionid') VARCHAR(255)"` | |||||
ThirdPartyWechatExpiresIn string `json:"third_party_wechat_expires_in" xorm:"not null default '' comment('微信第三方登录expires_in(剩余时长)') VARCHAR(255)"` | |||||
ThirdPartyWechatOpenid string `json:"third_party_wechat_openid" xorm:"not null default '' comment('微信第三方登陆openid(不变,用于认证)') VARCHAR(255)"` | |||||
ThirdPartyWechatUnionid string `json:"third_party_wechat_unionid" xorm:"not null default '' comment('微信第三方登陆unionid') VARCHAR(255)"` | |||||
ThirdPartyWechatMiniOpenid string `json:"third_party_wechat_mini_openid" xorm:"not null default '' comment('微信小程序登录open_id') VARCHAR(255)"` | |||||
ThirdPartyWechatH5Openid string `json:"third_party_wechat_h5_openid" xorm:"not null default '' comment('微信H5登录open_id') VARCHAR(255)"` | |||||
FreeRemainTime int `json:"free_remain_time" xorm:"not null default 0 comment('免单剩余次数') INT(11)"` | |||||
FreeCumulativeTime int `json:"free_cumulative_time" xorm:"not null default 0 comment('免单累计次数') INT(11)"` | |||||
IsDelete int `json:"is_delete" xorm:"not null default 0 comment('是否已删除') TINYINT(1)"` | |||||
UpdateAt time.Time `json:"update_at" xorm:"updated not null default CURRENT_TIMESTAMP comment('更新时间') TIMESTAMP"` | |||||
IsSet int `json:"is_set" xorm:"not null default 0 comment('用于一个客户生成关系链匹配的') INT(1)"` | |||||
} |
@@ -2,8 +2,10 @@ package haodanku | |||||
import ( | import ( | ||||
"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" | ||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/taobao" | |||||
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" | |||||
"github.com/tidwall/gjson" | "github.com/tidwall/gjson" | ||||
"strings" | "strings" | ||||
) | ) | ||||
@@ -137,3 +139,54 @@ func HaodankuTaobaoRankList(params map[string]string) []map[string]string { | |||||
} | } | ||||
return goods | return goods | ||||
} | } | ||||
// 好单库详情接口 | |||||
func HaodankuDetail(Id string) (res *taobao.Material, err error) { | |||||
params := map[string]string{ | |||||
"version": "v2.0.0", | |||||
"itemid": Id, | |||||
} | |||||
resp, err := SendReq("http://v2.api.haodanku.com/item_detail", params) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
var featuredList struct { | |||||
Data md.HDKDetailStruct `json:"data"` | |||||
} | |||||
zhios_third_party_utils.Unserialize(resp, &featuredList) | |||||
var imgs = strings.Split(featuredList.Data.TaobaoImage, ",") | |||||
var Shoptype int | |||||
if featuredList.Data.Shoptype == "B" { | |||||
Shoptype = 1 | |||||
} else { | |||||
Shoptype = 0 | |||||
} | |||||
if strings.Contains(featuredList.Data.Itempic, "http") == false { | |||||
featuredList.Data.Itempic = fmt.Sprintf("https:%s", featuredList.Data.Itempic) | |||||
} | |||||
var data = taobao.Material{ | |||||
CommissionRate: zhios_third_party_utils.Float64ToStr(zhios_third_party_utils.StrToFloat64(featuredList.Data.Tkrates) * 100), | |||||
ItemDescription: featuredList.Data.Itemdesc, | |||||
ItemID: featuredList.Data.Itemid, | |||||
Nick: featuredList.Data.Shopname, | |||||
PictURL: featuredList.Data.Itempic, | |||||
SellerID: featuredList.Data.UserId, | |||||
ShopTitle: featuredList.Data.Sellernick, | |||||
Title: featuredList.Data.Itemtitle, | |||||
TkTotalSales: featuredList.Data.Itemsale, | |||||
Volume: zhios_third_party_utils.StrToInt(featuredList.Data.Itemsale), | |||||
ZkFinalPrice: zhios_third_party_utils.Float64ToStr(zhios_third_party_utils.StrToFloat64(featuredList.Data.Itemendprice) + utils.StrToFloat64(featuredList.Data.Couponmoney)), | |||||
ReservePrice: featuredList.Data.Itemprice, | |||||
CouponAmount: featuredList.Data.Couponmoney, | |||||
CouponEndTime: featuredList.Data.Couponendtime, | |||||
CouponStartTime: featuredList.Data.Couponstarttime, | |||||
ActivityId: featuredList.Data.Activityid, | |||||
UserType: Shoptype, | |||||
} | |||||
data.SmallImages = struct { | |||||
String []string `json:"string"` | |||||
}(struct{ String []string }{String: imgs}) | |||||
res = &data | |||||
return res, nil | |||||
} |
@@ -138,3 +138,32 @@ type HDKGoodsTaobaoRankList struct { | |||||
PresaleTailEndTime int `json:"presale_tail_end_time"` | PresaleTailEndTime int `json:"presale_tail_end_time"` | ||||
PresaleDiscountFeeText string `json:"presale_discount_fee_text"` | PresaleDiscountFeeText string `json:"presale_discount_fee_text"` | ||||
} | } | ||||
type HDKDetailStruct struct { | |||||
ID string `json:"id"` | |||||
Itemid string `json:"itemid"` | |||||
Itemtitle string `json:"itemtitle"` | |||||
Itemshorttitle string `json:"itemshorttitle"` | |||||
Itemdesc string `json:"itemdesc"` | |||||
Itemprice string `json:"itemprice"` | |||||
Itemendprice string `json:"itemendprice"` | |||||
Itemsale string `json:"itemsale"` | |||||
Todaysale string `json:"todaysale"` | |||||
Tkrates string `json:"tkrates"` | |||||
Tkmoney string `json:"tkmoney"` | |||||
Itempic string `json:"itempic"` | |||||
Shoptype string `json:"shoptype"` | |||||
Sellernick string `json:"sellernick"` | |||||
Shopname string `json:"shopname"` | |||||
Couponstarttime string `json:"couponstarttime"` | |||||
Couponendtime string `json:"couponendtime"` | |||||
Couponmoney string `json:"couponmoney"` | |||||
Couponexplain string `json:"couponexplain"` | |||||
Activityid string `json:"activityid"` | |||||
Couponurl string `json:"couponurl"` | |||||
TaobaoImage string `json:"taobao_image"` | |||||
ReturnRatio string `json:"return_ratio"` | |||||
RedpacketPrice string `json:"redpacket_price"` | |||||
EstimatePrice string `json:"estimate_price"` | |||||
UserId int `json:"userid"` | |||||
} |
@@ -0,0 +1,233 @@ | |||||
package md | |||||
// DetailRequest is get the uri args to struct | |||||
type DetailRequest struct { | |||||
Provider string `uri:"provider" binding:"required"` | |||||
Gid string `uri:"gid" binding:"required"` | |||||
} | |||||
// DetailResponse is Detail response | |||||
type DetailResponse struct { | |||||
Provider string `json:"provider"` | |||||
Title string `json:"title"` | |||||
TitleColor string `json:"title_color"` | |||||
DownloadAPPIcon string `json:"download_app_icon"` | |||||
DownloadAPPBackgroundColor string `json:"download_app_background_color"` | |||||
DownloadAPPMain string `json:"download_app_main"` | |||||
DownloadAPPMainColor string `json:"download_app_main_color"` | |||||
DownloadAPPJump string `json:"download_app_jump"` | |||||
DownloadAPPJumpColor string `json:"download_app_jump_color"` | |||||
DownloadAPPJumpURL string `json:"download_app_jump_url"` | |||||
CurrentPrice string `json:"current_price"` | |||||
CurrentPriceColor string `json:"current_price_color"` | |||||
AfterCouponPrice string `json:"after_coupon_price"` | |||||
AfterCouponPriceColor string `json:"after_coupon_price_color"` | |||||
Point string `json:"point"` | |||||
PointColor string `json:"point_color"` | |||||
PointBackgroundColor string `json:"point_background_color"` | |||||
SoldCount string `json:"sold_count"` | |||||
SoldCountColor string `json:"sold_count_color"` | |||||
ProviderName string `json:"provider_name"` | |||||
ProviderNameColor string `json:"provider_name_color"` | |||||
ProviderNameBackgroundColor string `json:"provider_name_background_color"` | |||||
ProductName string `json:"product_name"` | |||||
ProductNameColor string `json:"product_name_color"` | |||||
ProductDiscountDescription string `json:"product_discount_description"` | |||||
ProductDiscountDescriptionColor string `json:"product_discount_description_color"` | |||||
ProductDiscountDescriptionBackgroundColor string `json:"product_discount_description_background_color"` | |||||
CommissionDescription string `json:"commission_description"` | |||||
CommissionDescriptionColor string `json:"commission_description_color"` | |||||
CommissionDescriptionBackgroundColor string `json:"commission_description_background_color"` | |||||
CouponAmount string `json:"coupon_amount"` | |||||
CouponTypeText string `json:"coupon_type_text"` | |||||
CouponURL string `json:"coupon_url"` | |||||
CouponEndTime string `json:"coupon_endtime"` | |||||
CouponColor string `json:"coupon_color"` | |||||
CouponBackground string `json:"coupon_background"` | |||||
ShopName string `json:"shop_name"` | |||||
ShopIcon string `json:"shop_icon"` | |||||
ImageList []string `json:"image_list"` | |||||
ImageDetailList []string `json:"image_detail_list"` | |||||
ButtonIndexIcon string `json:"button_index_icon"` | |||||
ButtonIndexColor string `json:"button_index_color"` | |||||
ButtonFavoriteIcon string `json:"button_favorite_icon"` | |||||
ButtonFavoriteColor string `json:"button_favorite_color"` | |||||
ButtonShare string `json:"button_share"` | |||||
ButtonShareColor string `json:"button_share_color"` | |||||
ButtonShareBackgroundColor string `json:"button_share_background_color"` | |||||
ButtonShareBackgroundColor2 string `json:"button_share_background_color2"` | |||||
ButtonSelfBuy string `json:"button_self_buy"` | |||||
ButtonSelfBuyColor string `json:"button_self_buy_color"` | |||||
ButtonSelfBuyBackgroundColor string `json:"button_self_buy_background_color"` | |||||
ButtonSelfBuyBackgroundColor2 string `json:"button_self_buy_background_color2"` | |||||
MoreDetail MoreDetailResponse `json:"more_detail"` | |||||
} | |||||
// MoreDetailResponse is for response detail | |||||
type MoreDetailResponse struct { | |||||
GID string `json:"gid"` | |||||
GoodsImg string `json:"goods_img"` | |||||
GoodsTitle string `json:"goods_title"` | |||||
GoodsCostPrice string `json:"goods_cost_price"` //原价 | |||||
GoodsDesc string `json:"goods_desc"` | |||||
GoodsPrice string `json:"goods_price"` | |||||
GoodsMinImg string `json:"goods_min_img"` | |||||
GoodsImgList []string `json:"goods_img_list"` | |||||
GoodsSales string `json:"goods_sales"` | |||||
GoodURL string `json:"good_url"` | |||||
GoodMobileURL string `json:"good_mobile_url"` | |||||
CID string `json:"cid"` | |||||
CID1 string `json:"cid1"` | |||||
CID1Name string `json:"cid1_name"` | |||||
CID2 string `json:"cid2"` | |||||
CID2Name string `json:"cid2_name"` | |||||
CID3 string `json:"cid3"` | |||||
CID3Name string `json:"cid3_name"` | |||||
Commission string `json:"commission"` | |||||
CommissionRate string `json:"commission_rate"` | |||||
PublicCommissionRate string `json:"public_commission_rate"` | |||||
CouponURL string `json:"coupon_url"` | |||||
CouponRemain string `json:"conpon_remain"` | |||||
CouponTotal string `json:"coupon_total"` | |||||
CouponPrice string `json:"coupon_price"` | |||||
CouponStartTime string `json:"coupon_start_time"` | |||||
CouponEndTime string `json:"coupon_end_time"` | |||||
Discount string `json:"discount"` | |||||
DescPct string `json:"desc_pct"` | |||||
EvalCount string `json:"eval_count"` | |||||
StartTime string `json:"start_time"` | |||||
EndTime string `json:"end_time"` | |||||
ImageList []string `json:"img_list"` | |||||
DetailImgList []string `json:"detail_img_list"` | |||||
InOrderCount string `json:"inOrderCount"` | |||||
IsFreeFreightRisk string `json:"isFreeFreightRisk"` | |||||
IsSelfSale string `json:"isSelfSale"` | |||||
LowerPrice string `json:"lower_price"` | |||||
LowerPriceType string `json:"lower_price_type"` | |||||
LowestCouponPrice string `json:"lowestCouponPrice"` | |||||
LgstPct string `json:"lgst_pct"` | |||||
MallID string `json:"mall_id"` | |||||
MinGroupPrice string `json:"min_group_price"` | |||||
MinNormalPrice string `json:"min_normal_price"` | |||||
PCGoodsPrice string `json:"pc_goods_price"` | |||||
ShopID string `json:"shopId"` | |||||
ShopName string `json:"shop_name"` | |||||
StoreID string `json:"store_id"` | |||||
SourceType string `json:"sourceType"` | |||||
Score string `json:"score"` | |||||
ServPct string `json:"serv_pct"` | |||||
WlGoodsPrice string `json:"wl_goods_price"` //卷后价 | |||||
AvgDesc string `json:"avg_desc"` | |||||
AvgLgst string `json:"avg_lgst"` | |||||
AvgServ string `json:"avg_serv"` | |||||
CateName string `json:"cate_name"` | |||||
ItemURL string `json:"item_url"` | |||||
GoodsSign string `json:"goods_sign"` | |||||
ShopLogo string `json:"shop_logo"` | |||||
UserType int `json:"user_type"` | |||||
Video []interface{} `json:"video"` | |||||
ShopTotalScore struct { | |||||
LogisticsScore struct { | |||||
Level string `json:"level"` | |||||
Score string `json:"score"` | |||||
Text string `json:"text"` | |||||
} `json:"logistics_score"` | |||||
ProductScore struct { | |||||
Level string `json:"level"` | |||||
Score string `json:"score"` | |||||
Text string `json:"text"` | |||||
} `json:"product_score"` | |||||
ServiceScore struct { | |||||
Level string `json:"level"` | |||||
Score string `json:"score"` | |||||
Text string `json:"text"` | |||||
} `json:"service_score"` | |||||
ShopScore struct { | |||||
Level string `json:"level"` | |||||
Score string `json:"score"` | |||||
Text string `json:"text"` | |||||
} `json:"shop_score"` | |||||
} `json:"shop_total_score"` | |||||
NextCommissionList struct { | |||||
SelfCommission float64 `json:"self_commission"` | |||||
SelfBuy float64 `json:"self_buy"` | |||||
ShareCommission float64 `json:"share_commission"` | |||||
} `json:"next_commission_list"` | |||||
} | |||||
type PlatformCss struct { | |||||
Name string `json:"name"` | |||||
Type string `json:"type"` | |||||
Icon string `json:"icon"` | |||||
} | |||||
// ProductDetailResponse productdetail | |||||
type ProductDetailResponse struct { | |||||
IsCanBuy string `json:"is_can_buy"` //是否能购买 | |||||
IsShowCouponList string `json:"is_show_coupon_list"` //是否展示优惠券弹出 | |||||
UserCouponAmount string `json:"user_coupon_amount"` //优惠券额度 | |||||
GoodID string `json:"good_id"` | |||||
Provider string `json:"provider"` | |||||
OldProvider string `json:"old_provider"` | |||||
ProviderName string `json:"provider_name"` | |||||
Commission string `json:"commission"` | |||||
OldCommission string `json:"old_commission"` | |||||
ShareCommission string `json:"share_commission"` | |||||
SelfBuy string `json:"self_buy"` //自购省 | |||||
CouponPrice string `json:"coupon_price"` //优惠卷价 | |||||
ShopAvatar string `json:"shop_avatar"` | |||||
NewGoodsContent string `json:"new_goods_content"` //站内商品的文案 | |||||
NewGoodsImgList string `json:"new_goods_img_list"` //站内商品的图片组 | |||||
GoodsTitle string `json:"goods_title"` //商品标题 | |||||
CommissionRate string `json:"commission_rate"` | |||||
WlGoodsPrice string `json:"wl_goods_price"` //卷后价 | |||||
ModList []map[string]interface{} `json:"mod_list"` | |||||
ModGoodsDetailBgColor string `json:"mod_goods_detail_bg_color"` | |||||
SkuParam map[string]string `json:"sku_param"` | |||||
CopyUrlParam map[string]string `json:"copy_url_param"` | |||||
BackReq string `json:"back_req"` | |||||
SaveNow string `json:"save_now"` | |||||
} | |||||
// PddPopCss PddPopCss | |||||
type PddPopCss struct { | |||||
IsPop string `json:"is_pop"` | |||||
H5Url string `json:"no_open_app_url"` | |||||
MiniAPPID string `json:"mini_appid"` | |||||
MiniUrl string `json:"mini_url"` | |||||
OpenAppUrl string `json:"open_app_url"` | |||||
SchemaUrl string `json:"schema_url"` | |||||
Ico string `json:"ico"` | |||||
BtnIco string `json:"btn_ico"` | |||||
Title string `json:"title"` | |||||
Info string `json:"info"` | |||||
BtnStr string `json:"btn_str"` | |||||
} | |||||
// | |||||
type ProductDetailVoucher struct { | |||||
BgColor string `json:"bg_color"` | |||||
CateTag string `json:"cate_tag"` | |||||
Color string `json:"color"` | |||||
Data struct { | |||||
BrandID string `json:"brand_id"` | |||||
} `json:"data"` | |||||
FinalPrice string `json:"final_price"` | |||||
Info string `json:"info"` | |||||
IsJump string `json:"is_jump"` | |||||
Name string `json:"name"` | |||||
OfficialPrice string `json:"official_price"` | |||||
RequiredLogin string `json:"required_login"` | |||||
RequiredTaobaoAuth string `json:"required_taobao_auth"` | |||||
SaleStr string `json:"sale_str"` | |||||
SkipIdentifier string `json:"skip_identifier"` | |||||
SkipName string `json:"skip_name"` | |||||
SubBgColor string `json:"sub_bg_color"` | |||||
Tag string `json:"tag"` | |||||
Title string `json:"title"` | |||||
} | |||||
type GoodsProfit struct { | |||||
Commission float64 `json:"commission"` | |||||
Integral float64 `json:"integral"` | |||||
BlockIcons float64 `json:"block_icons"` | |||||
} |
@@ -32,9 +32,14 @@ const ( | |||||
PVD_DIDI_ONLINE_CAR = "didi_online_car" //滴滴 | PVD_DIDI_ONLINE_CAR = "didi_online_car" //滴滴 | ||||
PVD_DIDI_FREIGHT = "didi_freight" //滴滴 | PVD_DIDI_FREIGHT = "didi_freight" //滴滴 | ||||
PVD_DIDI_CHAUFFEUR = "didi_chauffeur" //滴滴 | PVD_DIDI_CHAUFFEUR = "didi_chauffeur" //滴滴 | ||||
KEY_CFG_ZM_AK = "third_zm_app_key" | |||||
KEY_CFG_ZM_SK = "third_zm_app_secret" | |||||
KEY_CFG_ZM_WEB_ID = "third_zm_web_id" // 智盟网站ID | |||||
) | ) | ||||
var ZHIMENG_CFG_LIST = []string{KEY_CFG_ZM_AK, KEY_CFG_ZM_SK, KEY_CFG_ZM_WEB_ID} | |||||
var PVD_LIST = map[string]string{ | var PVD_LIST = map[string]string{ | ||||
PVD_TB: "淘宝", | PVD_TB: "淘宝", | ||||
PVD_JD: "京东", | PVD_JD: "京东", | ||||
@@ -0,0 +1,11 @@ | |||||
package md | |||||
// 会员备案信息 | |||||
type PublisherInfo struct { | |||||
RelationId string // 渠道id | |||||
SpecialId string // 会员运营id | |||||
ExternalId string // 自定义参数 | |||||
Rtag string // 备注 | |||||
} |
@@ -69,3 +69,10 @@ type TBSearchFeatureStruct struct { | |||||
WhiteImage string `json:"white_image"` | WhiteImage string `json:"white_image"` | ||||
ZkFinalPrice string `json:"zk_final_price"` | ZkFinalPrice string `json:"zk_final_price"` | ||||
} | } | ||||
type TaobaoWord struct { | |||||
Text string // 文本 | |||||
Code string // 短码 | |||||
} | |||||
type TaobaoWordGid struct { | |||||
Gid string // 商品id | |||||
} |
@@ -0,0 +1,34 @@ | |||||
package md | |||||
type ExtraData struct { | |||||
UnionId string `json:"unionId"` | |||||
Tc1 string `json:"tc1"` | |||||
Tc2 string `json:"tc2"` | |||||
} | |||||
// 转链后链接 | |||||
type ConvertedUrls struct { | |||||
ItemId string `json:"item_id"` | |||||
NumGoodsId string `json:"num_goods_id"` | |||||
URL string `json:"url"` // 短链接 | |||||
ShortenURL string `json:"open_app_url"` // 会打开app的长链接 | |||||
NoOpenAppURL string `json:"no_open_app_url"` // 不会打开app的长链接 | |||||
AppURL string `json:"app_url"` // app 链接 pinduoduo:// | |||||
HasCoupon bool `json:"has_coupon"` // 是否有优惠券 | |||||
CommissionRate string `json:"commission_rate"` // 利润比例 | |||||
ShareURL string `json:"share_url"` // 分享的URL | |||||
WeChatTaobaoURL string `json:"wechat_taobao_url"` // 淘宝分享到微信用的url | |||||
WeChatMiniURL string `json:"wechat_mini_url"` // 微信小程序转链地址 | |||||
WeChatMiniAPPID string `json:"wechat_mini_appid"` // 微信appid | |||||
PID string `json:"pid"` // 推广位 | |||||
PvdId string `json:"pvd_id"` // 供应商联盟ID | |||||
TaoBaoWord string `json:"taobao_word"` // 淘口令TaoBaoWord string `json:"taobao_word"` // 淘口令 | |||||
ExtraData ExtraData `json:"extraData"` //考拉用来跟踪用户的 | |||||
TbShareId int64 `json:"tb_share_id"` //淘宝活动时的渠道id 组合方式 | |||||
IsHasCouponAmount int `json:"is_has_coupon_amount"` //是否有优惠券额度 | |||||
ClickUrl string `json:"click_url"` | |||||
QrcodeUrl string `json:"qrcode_url"` | |||||
Content string `json:"content"` | |||||
PvdName string `json:"pvd_name"` | |||||
NewPid string `json:"new_pid"` | |||||
} |
@@ -3,6 +3,11 @@ package taobao | |||||
import ( | import ( | ||||
"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" | |||||
"errors" | |||||
"fmt" | |||||
"github.com/syyongx/php2go" | |||||
"strings" | |||||
"xorm.io/xorm" | "xorm.io/xorm" | ||||
) | ) | ||||
@@ -96,3 +101,121 @@ func (t *TB) TaoBaoSearchList(args map[string]string) (*[]Material, error) { | |||||
} | } | ||||
return list, nil | return list, nil | ||||
} | } | ||||
// 商品详情 | |||||
func (t *TB) ItemDetailById(id, bizSceneId string) (*Material, error) { | |||||
if php2go.IsNumeric(id) { | |||||
return t.ItemDetailByLink("https://item.taobao.com/item.htm?id="+id, "2") | |||||
} | |||||
return t.ItemDetailByLink("https://uland.taobao.com/item/edetail?id="+id, "") | |||||
} | |||||
func (t *TB) ItemDetailByLink(l, bizSceneId string) (*Material, error) { | |||||
args := map[string]string{ | |||||
"q": l, | |||||
"adzone_id": AdZoneId(t.SelfPromoIdWeb), // 默认使用安卓, 转链时候才要针对不同的渠道 | |||||
"session": t.SID, | |||||
"page_size": "1", | |||||
"page_no": "1", | |||||
} | |||||
if bizSceneId == "2" { | |||||
args["biz_scene_id"] = "2" | |||||
} | |||||
method := TBK_DG_MTL_OPT | |||||
//判断是否跟随官方 需要换接口 | |||||
if t.AuthType == 1 { | |||||
method = TBK_SC_MTL_OPT | |||||
Sid := t.UserSID | |||||
args["session"] = Sid | |||||
_, args["site_id"], args["adzone_id"] = SplitPid(t.SelfPromoIdWeb) | |||||
} | |||||
resp, err := send(args, method, t.Web_AK, t.Web_SK) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
fmt.Println("淘宝", args) | |||||
fmt.Println("淘宝", string(resp)) | |||||
// todo 可能还需返回的说明, 里面包含详细介绍的图片 | |||||
// "https://mdetail.tmall.com/templates/pages/desc?id=" + id | |||||
// "https://h5.m.taobao.com/app/detail/desc.html?type=1&f=&sellerType=B&_isH5Des=true#!id=" + id | |||||
// 如果是跟随官方 结构不一样 | |||||
if t.AuthType == 1 { | |||||
var tmp scMaterialOptionalStruct | |||||
if err = json.Unmarshal(resp, &tmp); err != nil { | |||||
return nil, err | |||||
} | |||||
if len(tmp.TbkScMaterialOptionalResponse.ResultList.MapData) == 0 { | |||||
return nil, errors.New("没有数据") | |||||
} | |||||
data := tmp.TbkScMaterialOptionalResponse.ResultList.MapData[0] | |||||
itemID, ok := data.ItemID.(float64) | |||||
if ok { | |||||
data.ItemID = int64(itemID) | |||||
} | |||||
return &data, nil | |||||
} else { | |||||
var tmp wrapperStruct | |||||
if err = json.Unmarshal(resp, &tmp); err != nil { | |||||
return nil, err | |||||
} | |||||
if len(tmp.TbkDgMaterialOptionalResponse.ResultList.MapData) == 0 { | |||||
return nil, err | |||||
} | |||||
data := tmp.TbkDgMaterialOptionalResponse.ResultList.MapData[0] | |||||
itemID, ok := data.ItemID.(float64) | |||||
if ok { | |||||
data.ItemID = int64(itemID) | |||||
} | |||||
return &data, nil | |||||
} | |||||
} | |||||
func (t *TB) ItemDetailByIdKey(l, bizSceneId string) (*Material, error) { | |||||
l += "&" | |||||
l = strings.ReplaceAll(l, "?", "&") | |||||
ex := php2go.Explode("&id=", l) | |||||
id := "" | |||||
if len(ex) > 1 { | |||||
ex1 := php2go.Explode("&", ex[1]) | |||||
if len(ex1) > 0 { | |||||
id = ex1[0] | |||||
} | |||||
} | |||||
if id == "" || id == "622130940777" { | |||||
return nil, errors.New("找不到商品") | |||||
} | |||||
args := map[string]string{ | |||||
"num_iids": id, | |||||
"session": t.SID, | |||||
"platform": "2", | |||||
} | |||||
if bizSceneId == "2" { | |||||
//args["biz_scene_id"] = "2" | |||||
} | |||||
method := "taobao.tbk.item.info.get" | |||||
//判断是否跟随官方 需要换接口 | |||||
if t.AuthType == 1 { | |||||
Sid := t.UserSID | |||||
args["session"] = Sid | |||||
} | |||||
resp, err := send(args, method, t.Web_AK, t.Web_SK) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
var tmp tbDetailStruct | |||||
if err = json.Unmarshal(resp, &tmp); err != nil { | |||||
return nil, err | |||||
} | |||||
if len(tmp.TbkItemInfoGetResponse.Results.NBbkItem) == 0 { | |||||
return nil, err | |||||
} | |||||
data := tmp.TbkItemInfoGetResponse.Results.NBbkItem[0] | |||||
data.ItemID = data.InputNumIid | |||||
itemID, ok := data.ItemID.(float64) | |||||
if ok { | |||||
data.ItemID = int64(itemID) | |||||
} | |||||
return &data, nil | |||||
} |
@@ -0,0 +1,60 @@ | |||||
package taobao | |||||
import ( | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/db" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/db/model" | |||||
zhios_third_party_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/utils" | |||||
"encoding/json" | |||||
"time" | |||||
"xorm.io/xorm" | |||||
) | |||||
func TaobaoRelationPid(eg *xorm.Engine, args map[string]string) (bool, string, string) { | |||||
mid := args["mid"] | |||||
uid := zhios_third_party_utils.StrToInt(args["uid"]) | |||||
//查询方案 有多少个推广位 | |||||
taobaoCfg, err := db.SysUnionByTaobaoByUseByAuth(eg, mid) | |||||
if err != nil || taobaoCfg == nil { | |||||
return false, "", "" | |||||
} | |||||
if taobaoCfg.AppletPid == "" { | |||||
return false, "", "" | |||||
} | |||||
relationList := db.IsExistRelationPid(eg, uid, taobaoCfg.Id) | |||||
if relationList != nil { | |||||
return true, relationList.RelationId, relationList.Pid | |||||
} | |||||
var r = make([]string, 0) | |||||
err = json.Unmarshal([]byte(taobaoCfg.AppletPid), &r) | |||||
if err != nil { | |||||
return false, "", "" | |||||
} | |||||
//查下还有没有渠道id绑定 | |||||
relationId, lid := db.GetRelation(eg, taobaoCfg.Id, len(r)) | |||||
if relationId == "" { | |||||
return false, "", "" | |||||
} | |||||
//查下哪个推广位没绑定的 | |||||
pidList := db.GetRelationPid(eg, taobaoCfg.Id, r, relationId) | |||||
var pidMap = make([]string, 0) | |||||
for _, v := range *pidList { | |||||
pidMap = append(pidMap, v.Pid) | |||||
} | |||||
pid := "" | |||||
for _, v := range r { | |||||
if zhios_third_party_utils.InArr(v, pidMap) == false && pid == "" { | |||||
pid = v | |||||
} | |||||
} | |||||
if pid == "" { | |||||
return false, "", "" | |||||
} | |||||
var tmp = &model.TaobaoRelationPid{RelationId: relationId, Uid: uid, UnionId: taobaoCfg.Id, Pid: pid, ShortPid: AdZoneId(pid), Time: time.Now()} | |||||
_, err = eg.Insert(tmp) | |||||
if err != nil { | |||||
return false, "", "" | |||||
} | |||||
sql := `UPDATE taobao_relation set count=count+1 where id=? ` | |||||
db.QueryNativeString(eg, sql, lid) | |||||
return true, relationId, pid | |||||
} |
@@ -0,0 +1,35 @@ | |||||
package taobao | |||||
import ( | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/md" | |||||
"encoding/json" | |||||
) | |||||
// TODO 淘口令解析, 因为目前没有可用账号, 暂时搁置, 请查看智盟的接口 | |||||
func (t *TB) WordCreate(url, text string) (*md.TaobaoWord, error) { | |||||
method := "taobao.tbk.tpwd.create" | |||||
args := map[string]string{ | |||||
"text": text, // 长度大于5个字符 | |||||
"url": url, // 口令跳转目标页, 如:https://uland.taobao.com/, 后面需要添加对应的relationId或者specialId | |||||
} | |||||
resp, err := send(args, method, t.Web_AK, t.Web_SK) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
var tmp struct { | |||||
TbkTpwdCreateResponse struct { | |||||
Data struct { | |||||
Model string `json:"model"` | |||||
PasswordSimple string `json:"password_simple"` | |||||
} `json:"data"` | |||||
} `json:"tbk_tpwd_create_response"` | |||||
} | |||||
if err = json.Unmarshal(resp, &tmp); err != nil { | |||||
return nil, err | |||||
} | |||||
return &md.TaobaoWord{ | |||||
Text: tmp.TbkTpwdCreateResponse.Data.Model, | |||||
Code: tmp.TbkTpwdCreateResponse.Data.PasswordSimple, | |||||
}, nil | |||||
} |
@@ -1,7 +1,9 @@ | |||||
package tik_tok | package tik_tok | ||||
import ( | import ( | ||||
"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" | ||||
"errors" | |||||
"fmt" | "fmt" | ||||
"github.com/syyongx/php2go" | "github.com/syyongx/php2go" | ||||
"github.com/tidwall/gjson" | "github.com/tidwall/gjson" | ||||
@@ -150,3 +152,29 @@ func RegimentalConvertUrl(args map[string]string) (map[string]string, string) { | |||||
return data, "" | return data, "" | ||||
} | } | ||||
func OwnTikTokUrl(tikTokBase *md.TikTokBase, tikTokArgs map[string]interface{}) (*md.ConvertedUrls, error) { | |||||
args := map[string]string{ | |||||
"appkey": tikTokBase.ApiGoodsAppKey, | |||||
"appSecret": tikTokBase.ApiGoodsAppSecret, | |||||
"product_url": zhios_third_party_utils.AnyToString(tikTokArgs["product_url"]), | |||||
"external_info": zhios_third_party_utils.AnyToString(tikTokArgs["external_info"]), | |||||
"need_qr_code": zhios_third_party_utils.AnyToString(tikTokArgs["need_qr_code"]), | |||||
"pid": tikTokBase.GoodsPid, | |||||
"acctoken": tikTokBase.GoodsAccessToken, | |||||
} | |||||
fmt.Println("抖音", args) | |||||
url, err := GoodsConvertUrl(args) | |||||
if err != "" { | |||||
return nil, errors.New(err) | |||||
} | |||||
content, _ := php2go.Base64Decode(url["content"]) | |||||
return &md.ConvertedUrls{ | |||||
URL: url["deeplink"], | |||||
ShortenURL: url["deeplink"], | |||||
NoOpenAppURL: url["deeplink"], | |||||
AppURL: url["deeplink"], | |||||
ClickUrl: url["deeplink"], | |||||
QrcodeUrl: url["qr_code"], | |||||
Content: content, | |||||
}, nil | |||||
} |
@@ -36,3 +36,10 @@ func JdGoods(param map[string]interface{}) []map[string]string { | |||||
} | } | ||||
return goods | return goods | ||||
} | } | ||||
// NewZhiMengJingDongSDK is constructor | |||||
func NewZhiMengJingDongSDK() *SDK { | |||||
jd := &SDK{} | |||||
jd.Init(md.PVD_JD) | |||||
return jd | |||||
} |
@@ -0,0 +1,47 @@ | |||||
package zhimeng | |||||
import ( | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/md" | |||||
"encoding/json" | |||||
"fmt" | |||||
) | |||||
// promoId一般使用自购ID拼装起来 | |||||
func JDConvertUrl(appkey, appsecret, itemId, promoId, couponUrl, couponPrice, activityUrl string) (*md.ConvertedUrls, error) { | |||||
args := map[string]interface{}{ | |||||
"appkey": appkey, | |||||
"secret_key": appsecret, | |||||
"gid": itemId, | |||||
"pid": promoId, | |||||
"coupon_url": couponUrl, | |||||
"activity_url": activityUrl, | |||||
} | |||||
fmt.Println("==========", args) | |||||
resp, err := Send("jd", "get_buy_url", args) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
var tmp struct { | |||||
Data struct { | |||||
URL string `json:"url"` | |||||
ClickUrl string `json:"click_url"` | |||||
} `json:"data"` | |||||
} | |||||
if err = json.Unmarshal(resp, &tmp); err != nil { | |||||
return nil, err | |||||
} | |||||
hasCoupon := false | |||||
if couponUrl != "" { | |||||
hasCoupon = true | |||||
} | |||||
return &md.ConvertedUrls{ | |||||
ItemId: itemId, | |||||
URL: tmp.Data.URL, | |||||
ShortenURL: tmp.Data.URL, | |||||
NoOpenAppURL: tmp.Data.URL, | |||||
AppURL: tmp.Data.URL, | |||||
HasCoupon: hasCoupon, | |||||
CommissionRate: couponPrice, | |||||
ClickUrl: tmp.Data.ClickUrl, | |||||
}, nil | |||||
} |
@@ -0,0 +1,40 @@ | |||||
package zhimeng | |||||
import ( | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/md" | |||||
"encoding/json" | |||||
"github.com/syyongx/php2go" | |||||
) | |||||
func KuaiShouUrl(tikTokArgs map[string]interface{}) (*md.ConvertedUrls, error) { | |||||
args := map[string]interface{}{ | |||||
"appkey": tikTokArgs["appkey"], | |||||
"secret_key": tikTokArgs["secret_key"], | |||||
"linkCarrierId": tikTokArgs["gid"], | |||||
"comments": tikTokArgs["external_info"], | |||||
"linkType": tikTokArgs["linkType"], | |||||
"genPoster": tikTokArgs["genPoster"], | |||||
} | |||||
resp, err := Send("kuaishou", "getUrls", args) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
var tmp struct { | |||||
Data TikTokUrlData `json:"data"` | |||||
} | |||||
if err = json.Unmarshal(resp, &tmp); err != nil { | |||||
return nil, err | |||||
} | |||||
content, _ := php2go.Base64Decode(tmp.Data.Content) | |||||
return &md.ConvertedUrls{ | |||||
URL: tmp.Data.Deeplink, | |||||
ShortenURL: tmp.Data.Deeplink, | |||||
NoOpenAppURL: tmp.Data.Link, | |||||
AppURL: tmp.Data.Deeplink, | |||||
ClickUrl: tmp.Data.Deeplink, | |||||
QrcodeUrl: tmp.Data.QrCode, | |||||
Content: content, | |||||
WeChatMiniURL: tmp.Data.PageUrl, | |||||
WeChatMiniAPPID: tmp.Data.AppId, | |||||
}, nil | |||||
} |
@@ -0,0 +1,50 @@ | |||||
package zhimeng | |||||
import ( | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/md" | |||||
"encoding/json" | |||||
"fmt" | |||||
) | |||||
func PDDConvertUrl(ak, sk, itemId, promoId, couponPrice, isWxMini, isBindUrl, isShare string) (*md.ConvertedUrls, error) { | |||||
args := map[string]interface{}{ | |||||
"appkey": ak, | |||||
"secret_key": sk, | |||||
"gid": itemId, | |||||
"goods_sign": itemId, | |||||
"pid": promoId, | |||||
"open_app": "", // 具体规则请看智盟 | |||||
"link_type": "", // todo 这几项按理来说做成配置项 | |||||
"generate_we_app": isWxMini, // 生成微信小程序链接 | |||||
"generate_authority_url_onoff": isBindUrl, | |||||
"custom_parameters": promoId, | |||||
"is_share": isShare, | |||||
} | |||||
//generate_authority_url_onoff 0不会调授权链接 1会先跳授权链接 | |||||
fmt.Println("拼多多:", args) | |||||
resp, err := Send("pdd", "get_buy_url", args) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
var tmp struct { | |||||
Data struct { | |||||
URL string `json:"url"` | |||||
OpenAppURL string `json:"open_app_url"` | |||||
NoOpenAppURL string `json:"no_open_app_url"` | |||||
SchemaURL string `json:"schema_url"` | |||||
PagePath string `json:"page_path"` | |||||
} `json:"data"` | |||||
} | |||||
if err = json.Unmarshal(resp, &tmp); err != nil { | |||||
return nil, err | |||||
} | |||||
return &md.ConvertedUrls{ | |||||
ItemId: itemId, | |||||
URL: tmp.Data.URL, | |||||
ShortenURL: tmp.Data.NoOpenAppURL, | |||||
NoOpenAppURL: tmp.Data.OpenAppURL, | |||||
AppURL: tmp.Data.SchemaURL, | |||||
HasCoupon: false, | |||||
CommissionRate: couponPrice, | |||||
}, nil | |||||
} |
@@ -0,0 +1,8 @@ | |||||
package zhimeng | |||||
// NewZhiMengJingDongSDK is constructor | |||||
func NewZhiMengPDDSDK() *SDK { | |||||
pdd := &SDK{} | |||||
pdd.Init("pdd") | |||||
return pdd | |||||
} |
@@ -0,0 +1,285 @@ | |||||
package zhimeng | |||||
import ( | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/md" | |||||
"encoding/json" | |||||
"errors" | |||||
"fmt" | |||||
"github.com/shopspring/decimal" | |||||
"github.com/tidwall/gjson" | |||||
"strings" | |||||
) | |||||
// SDK is zhimeng sdk | |||||
type SDK struct { | |||||
Action string | |||||
operation string | |||||
response []byte | |||||
SmsKey string | |||||
SmsSecret string | |||||
data interface{} | |||||
err error | |||||
} | |||||
// Init is init action | |||||
// In some condition, such as send Sms, need pass sms key and secret after 'action' | |||||
func (sdk *SDK) Init(action string, keys ...string) { | |||||
sdk.Action = action | |||||
//if keys[0] == "" || keys[1] == "" { | |||||
// sdk.err = errors.New("智盟短信未配置") | |||||
//} | |||||
if len(keys) > 1 { | |||||
sdk.SmsKey = keys[0] | |||||
sdk.SmsSecret = keys[1] | |||||
} | |||||
} | |||||
// SelectFunction is select api with operation | |||||
func (sdk *SDK) SelectFunction(operation string) *SDK { | |||||
sdk.operation = operation | |||||
return sdk | |||||
} | |||||
// WithSMSArgs is SMS | |||||
func (sdk *SDK) WithSMSArgs(args map[string]interface{}) *SDK { | |||||
res, err := SMSend(sdk.Action, sdk.operation, sdk.SmsKey, sdk.SmsSecret, args) | |||||
if err != nil { | |||||
} | |||||
sdk.response = res | |||||
return sdk | |||||
} | |||||
// WithArgs is post data to api | |||||
func (sdk *SDK) WithArgs(args map[string]interface{}) *SDK { | |||||
// args["appkey"] = svc.SysCfgGet(c, md.KEY_CFG_ZM_AK) | |||||
// args["secret_key"] = svc.SysCfgGet(c, md.KEY_CFG_ZM_SK) | |||||
res, err := Send(sdk.Action, sdk.operation, args) | |||||
if err != nil { | |||||
} | |||||
// for k, v := range args { | |||||
// fmt.Printf("%s:%v \n", k, v) | |||||
// } | |||||
fmt.Println("唯品会请求", args, string(res)) | |||||
sdk.response = res | |||||
return sdk | |||||
} | |||||
// Result is response data from api , return interface{} | |||||
func (sdk *SDK) Result() (*SDK, error) { | |||||
if sdk.err != nil { | |||||
return nil, sdk.err | |||||
} | |||||
tmp := struct { | |||||
Msg string `json:"msg"` | |||||
Success int `json:"success"` | |||||
Data interface{} `json:"data"` | |||||
}{} | |||||
if err := json.Unmarshal(sdk.response, &tmp); err != nil { | |||||
return nil, err | |||||
} | |||||
if tmp.Success != StatusSuc { | |||||
return nil, errors.New("没有商品") | |||||
} | |||||
if gjson.GetBytes(sdk.response, "data").String() == "[]" { | |||||
return nil, errors.New("no result") | |||||
} | |||||
sdk.data = tmp.Data | |||||
return sdk, nil | |||||
} | |||||
// WithJDDetailImageList is insert jd detail image list when api response | |||||
func (sdk *SDK) WithJDDetailImageList(gid string) { | |||||
if len(sdk.response) == 0 || sdk.response == nil { | |||||
return | |||||
} | |||||
fmt.Println(gjson.GetBytes(sdk.response, "data").String()) | |||||
if gjson.GetBytes(sdk.response, "data").String() == "[]" { | |||||
return | |||||
} | |||||
fmt.Println("debug", sdk.response) | |||||
data, ok := sdk.data.(map[string]interface{}) | |||||
if !ok { | |||||
} | |||||
// debug | |||||
sdk.data = data | |||||
} | |||||
// ToObject is the interface is Slice and get the first item | |||||
func (sdk *SDK) ToObject() *SDK { | |||||
s, ok := sdk.ToInterface().([]interface{}) | |||||
if !ok { | |||||
return sdk | |||||
} | |||||
sdk.data = s[len(s)-len(s)] | |||||
return sdk | |||||
} | |||||
// ToInterface is data to Interface | |||||
func (sdk *SDK) ToInterface() interface{} { | |||||
return sdk.data | |||||
} | |||||
// ToMapStringInterface is data to map[string]string | |||||
func (sdk *SDK) ToMapStringInterface(item interface{}) map[string]interface{} { | |||||
data, err := json.Marshal(item) | |||||
if err != nil { | |||||
} | |||||
m := make(map[string]interface{}) | |||||
if err = json.Unmarshal(data, &m); err != nil { | |||||
} | |||||
for key, v := range m { | |||||
switch v.(type) { | |||||
case int: | |||||
t, ok := v.(string) | |||||
if !ok { | |||||
} | |||||
m[key] = t | |||||
case int32: | |||||
t, ok := v.(string) | |||||
if !ok { | |||||
} | |||||
m[key] = t | |||||
case int64: | |||||
t, ok := v.(string) | |||||
if !ok { | |||||
} | |||||
m[key] = t | |||||
case float64: | |||||
vstr := fmt.Sprintf("%v", v) | |||||
if strings.Contains(vstr, "e+") { | |||||
decimalNum, err := decimal.NewFromString(vstr) | |||||
if err != nil { | |||||
} | |||||
vstr = decimalNum.String() | |||||
} | |||||
m[key] = vstr | |||||
case nil: | |||||
m[key] = v | |||||
default: | |||||
m[key] = v | |||||
} | |||||
} | |||||
return m | |||||
} | |||||
// ToStruct is struct return | |||||
func (sdk *SDK) ToStruct(r *md.MoreDetailResponse) error { | |||||
// debug | |||||
data, err := json.Marshal(sdk.ToMapStringInterface(sdk.data)) | |||||
if err != nil { | |||||
} | |||||
if err = json.Unmarshal(data, r); err != nil { | |||||
return err | |||||
} | |||||
return nil | |||||
} | |||||
// PddToMapStringInterface is data to map[string]string | |||||
func (sdk *SDK) PddToMapStringInterface(item interface{}) []map[string]interface{} { | |||||
data, err := json.Marshal(item) | |||||
if err != nil { | |||||
} | |||||
m1 := make([]map[string]interface{}, 10, 10) | |||||
if err = json.Unmarshal(data, &m1); err != nil { | |||||
} | |||||
for _, m := range m1 { | |||||
for key, v := range m { | |||||
switch v.(type) { | |||||
case int: | |||||
t, ok := v.(string) | |||||
if !ok { | |||||
} | |||||
m[key] = t | |||||
case int32: | |||||
t, ok := v.(string) | |||||
if !ok { | |||||
} | |||||
m[key] = t | |||||
case int64: | |||||
t, ok := v.(string) | |||||
if !ok { | |||||
} | |||||
m[key] = t | |||||
case float64: | |||||
vstr := fmt.Sprintf("%v", v) | |||||
if strings.Contains(vstr, "e+") { | |||||
decimalNum, err := decimal.NewFromString(vstr) | |||||
if err != nil { | |||||
} | |||||
vstr = decimalNum.String() | |||||
} | |||||
m[key] = vstr | |||||
case nil: | |||||
m[key] = v | |||||
default: | |||||
m[key] = v | |||||
} | |||||
} | |||||
} | |||||
return m1 | |||||
} | |||||
// PddToStruct is struct return for Pdd data is list by one | |||||
func (sdk *SDK) PddToStruct(r *md.MoreDetailResponse) error { | |||||
// debug | |||||
data, err := json.Marshal(sdk.PddToMapStringInterface(sdk.data)[0]) | |||||
if err != nil { | |||||
} | |||||
if err = json.Unmarshal(data, r); err != nil { | |||||
return err | |||||
} | |||||
return nil | |||||
} | |||||
// VipToMapStringInterface is data to map[string]string | |||||
func (sdk *SDK) VipToMapStringInterface() map[string]interface{} { | |||||
data, err := json.Marshal(sdk.data) | |||||
if err != nil { | |||||
} | |||||
m := make(map[string]interface{}) | |||||
if err = json.Unmarshal(data, &m); err != nil { | |||||
} | |||||
for key, v := range m { | |||||
switch v.(type) { | |||||
case int: | |||||
t, ok := v.(string) | |||||
if !ok { | |||||
} | |||||
m[key] = t | |||||
case int32: | |||||
t, ok := v.(string) | |||||
if !ok { | |||||
} | |||||
m[key] = t | |||||
case int64: | |||||
t, ok := v.(string) | |||||
if !ok { | |||||
} | |||||
m[key] = t | |||||
case float64: | |||||
vstr := fmt.Sprintf("%v", v) | |||||
if strings.Contains(vstr, "e+") { | |||||
decimalNum, err := decimal.NewFromString(vstr) | |||||
if err != nil { | |||||
} | |||||
vstr = decimalNum.String() | |||||
} | |||||
m[key] = vstr | |||||
case nil: | |||||
m[key] = v | |||||
default: | |||||
m[key] = v | |||||
} | |||||
} | |||||
return m | |||||
} |
@@ -0,0 +1,53 @@ | |||||
package zhimeng | |||||
import ( | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/md" | |||||
"encoding/json" | |||||
"fmt" | |||||
"github.com/syyongx/php2go" | |||||
) | |||||
// 转链后, 可以通过链接拼装&relationId(int)或者&externalId(string)(二选一)进行订单获取 | |||||
func TaobaoConvertUrl(appkey, appsecret, itemId, tbPid, tbSid string, tbExternalId, tbAppKey string) (*md.ConvertedUrls, error) { | |||||
args := map[string]interface{}{ | |||||
"appkey": appkey, | |||||
"secret_key": appsecret, | |||||
"gid": itemId, | |||||
"new_external_id": tbExternalId, //自定义参数 只有要生成备案链接用 | |||||
"pid": tbPid, | |||||
"tb_app_key": tbAppKey, | |||||
"session": tbSid, //tbSid | |||||
} | |||||
fmt.Println(args) | |||||
if php2go.IsNumeric(itemId) { | |||||
args["biz_scene_id"] = "2" | |||||
} | |||||
resp, err := Send("agent_tb", "url", args) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
var tmp struct { | |||||
Success int `json:"success"` | |||||
Data struct { | |||||
HaveCoupon string `json:"have_coupon"` | |||||
URL string `json:"url"` | |||||
MaxCommissionRate string `json:"max_commission_rate"` | |||||
} `json:"data"` | |||||
} | |||||
if err = json.Unmarshal(resp, &tmp); err != nil { | |||||
return nil, err | |||||
} | |||||
var hasCoupon bool | |||||
if tmp.Data.HaveCoupon == "1" { | |||||
hasCoupon = true | |||||
} | |||||
return &md.ConvertedUrls{ | |||||
ItemId: itemId, | |||||
URL: tmp.Data.URL, | |||||
ShortenURL: tmp.Data.URL, | |||||
NoOpenAppURL: tmp.Data.URL, | |||||
AppURL: tmp.Data.URL, | |||||
HasCoupon: hasCoupon, | |||||
CommissionRate: tmp.Data.MaxCommissionRate, | |||||
}, nil | |||||
} |
@@ -0,0 +1,50 @@ | |||||
package zhimeng | |||||
import ( | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/md" | |||||
"encoding/json" | |||||
"errors" | |||||
) | |||||
//会员id | |||||
func TaobaoPublisherRelationInfoList(appkey, appsecret, tbSid, p, tbAppKey string) (*[]md.PublisherInfo, error) { | |||||
args := map[string]interface{}{ | |||||
"appkey": appkey, | |||||
"secret_key": appsecret, | |||||
"session": tbSid, | |||||
"p": p, | |||||
"tb_app_key": tbAppKey, | |||||
} | |||||
resp, err := Send("agent_tb", "publisher_info_relation_list", args) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
var tmp struct { | |||||
Data []struct { | |||||
RelationId string `json:"relation_id"` | |||||
SpecialId string `json:"special_id"` | |||||
ExternalId string `json:"external_id"` | |||||
Rtag string `json:"rtag"` | |||||
} `json:"data"` | |||||
} | |||||
if err = json.Unmarshal(resp, &tmp); err != nil { | |||||
return nil, err | |||||
} | |||||
if len(tmp.Data) == 0 { | |||||
return nil, errors.New("没有商品") | |||||
} | |||||
var ( | |||||
res []md.PublisherInfo | |||||
) | |||||
for _, v := range tmp.Data { | |||||
res = append(res, md.PublisherInfo{ | |||||
RelationId: v.RelationId, | |||||
SpecialId: v.SpecialId, | |||||
ExternalId: v.ExternalId, | |||||
Rtag: v.Rtag, | |||||
}) | |||||
} | |||||
return &res, nil | |||||
} |
@@ -0,0 +1,77 @@ | |||||
package zhimeng | |||||
import ( | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/md" | |||||
"encoding/json" | |||||
"github.com/syyongx/php2go" | |||||
) | |||||
type TikTokUrlData struct { | |||||
Deeplink string `json:"deeplink"` | |||||
Content string `json:"content"` | |||||
QrCode string `json:"qr_code"` | |||||
Link string `json:"link"` | |||||
AppId string `json:"app_id"` | |||||
PageUrl string `json:"page_url"` | |||||
} | |||||
func TikTokUrl(tikTokArgs map[string]interface{}) (*md.ConvertedUrls, error) { | |||||
args := map[string]interface{}{ | |||||
"appkey": tikTokArgs["appkey"], | |||||
"secret_key": tikTokArgs["secret_key"], | |||||
"product_url": tikTokArgs["product_url"], | |||||
"external_info": tikTokArgs["external_info"], | |||||
"need_qr_code": tikTokArgs["need_qr_code"], | |||||
} | |||||
resp, err := Send("tik_tok", "getUrls", args) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
var tmp struct { | |||||
Data TikTokUrlData `json:"data"` | |||||
} | |||||
if err = json.Unmarshal(resp, &tmp); err != nil { | |||||
return nil, err | |||||
} | |||||
content, _ := php2go.Base64Decode(tmp.Data.Content) | |||||
return &md.ConvertedUrls{ | |||||
URL: tmp.Data.Deeplink, | |||||
ShortenURL: tmp.Data.Deeplink, | |||||
NoOpenAppURL: tmp.Data.Deeplink, | |||||
AppURL: tmp.Data.Deeplink, | |||||
ClickUrl: tmp.Data.Deeplink, | |||||
QrcodeUrl: tmp.Data.QrCode, | |||||
Content: content, | |||||
}, nil | |||||
} | |||||
func TikTokActUrl(tikTokArgs map[string]interface{}) (*md.ConvertedUrls, error) { | |||||
args := map[string]interface{}{ | |||||
"appkey": tikTokArgs["appkey"], | |||||
"secret_key": tikTokArgs["secret_key"], | |||||
"activity_id": tikTokArgs["material_id"], | |||||
"mix_activity_id": tikTokArgs["material_id"], | |||||
"need_qr_code": tikTokArgs["need_qr_code"], | |||||
"external_info": tikTokArgs["external_info"], | |||||
} | |||||
resp, err := Send("tik_tok", "getActUrls", args) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
var tmp struct { | |||||
Data TikTokUrlData `json:"data"` | |||||
} | |||||
if err = json.Unmarshal(resp, &tmp); err != nil { | |||||
return nil, err | |||||
} | |||||
content, _ := php2go.Base64Decode(tmp.Data.Content) | |||||
return &md.ConvertedUrls{ | |||||
URL: tmp.Data.Deeplink, | |||||
ShortenURL: tmp.Data.Deeplink, | |||||
NoOpenAppURL: tmp.Data.Deeplink, | |||||
AppURL: tmp.Data.Deeplink, | |||||
ClickUrl: tmp.Data.Deeplink, | |||||
QrcodeUrl: tmp.Data.QrCode, | |||||
Content: content, | |||||
}, nil | |||||
} |
@@ -0,0 +1,42 @@ | |||||
package zhimeng | |||||
import ( | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/md" | |||||
"encoding/json" | |||||
) | |||||
// todo | |||||
func VipConvertUrl(ak, sk, itemId, pid, couponPrice, adCode, openId, realCall string) (*md.ConvertedUrls, error) { | |||||
args := map[string]interface{}{ | |||||
"appkey": ak, | |||||
"secret_key": sk, | |||||
"gid": itemId, | |||||
"pid": pid, | |||||
"adCode": adCode, | |||||
"openId": openId, | |||||
"realCall": realCall, | |||||
} | |||||
resp, err := Send("wph_new", "url", args) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
var tmp struct { | |||||
Data struct { | |||||
URL string `json:"url"` | |||||
DeepUrl string `json:"deep_url"` | |||||
VipWxUrl string `json:"vipWxUrl"` | |||||
} `json:"data"` | |||||
} | |||||
if err = json.Unmarshal(resp, &tmp); err != nil { | |||||
return nil, err | |||||
} | |||||
return &md.ConvertedUrls{ | |||||
ItemId: itemId, | |||||
URL: tmp.Data.URL, | |||||
ShortenURL: tmp.Data.URL, | |||||
NoOpenAppURL: tmp.Data.URL, | |||||
AppURL: tmp.Data.DeepUrl, | |||||
HasCoupon: false, | |||||
CommissionRate: couponPrice, | |||||
}, nil | |||||
} |