From b77d14b664b730f3dc6acf976aa24ce00e580190 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=85=89=E6=98=A5?= Date: Sat, 9 Apr 2022 17:06:47 +0800 Subject: [PATCH] update --- go.sum | 0 service/dingdanxia/app.go | 29 +- service/dingdanxia/go.mod | 31 - service/dingdanxia/jd.jy_order_details.go | 12 +- service/dingdanxia/jd.order_details2.go | 6 +- service/dingdanxia/mongodb.go | 47 ++ service/dingdanxia/waimai.meituan_orderid.go | 63 ++ service/dingdanxia/waimai.meituan_orders.go | 12 +- .../dingdanxia/waimai.meituan_privilege.go | 53 ++ .../dingdanxia/waimai.meituan_sg_privilege.go | 52 ++ service/dingtalk/app.go | 21 +- service/dingtalk/go.mod | 31 - service/dingtalk/mongodb.go | 47 ++ .../eastiot/Iot_api.query_ordered_pkgInfo.go | 2 +- ...ype.go => api.Iot_api.get_all_sim_type.go} | 0 service/eastiot/app.go | 21 +- service/eastiot/go.mod | 32 - service/eastiot/mongodb.go | 47 ++ service/eastiot/sign.go | 2 +- service/ejiaofei/app.go | 22 +- service/ejiaofei/go.mod | 32 - service/ejiaofei/mongodb.go | 44 + ...query_tx_product.go => query_txproduct.go} | 0 .../{tx_chongzhi.go => txchongzhi.go} | 0 service/feishu/app.go | 23 + service/feishu/mongodb.go | 47 ++ service/feishu/params.go | 27 + service/feishu/webhook.go | 36 + service/go.mod | 3 - service/ip/app.go | 23 +- service/ip/go.mod | 8 - service/ip/ip2region/ip2region.go | 2 +- service/ip/log.go | 108 +++ service/ip/v4/ipv4.go | 2 +- service/ip/v6/ipv6.go | 2 +- service/jd/app.go | 23 +- service/jd/go.mod | 31 - service/jd/jd.union.open.activity.query.go | 71 ++ .../jd/jd.union.open.category.goods.get.go | 48 ++ service/jd/jd.union.open.coupon.gift.get.go | 1 + service/jd/jd.union.open.coupon.gift.stop.go | 1 + .../jd/jd.union.open.goods.bigfield.query.go | 68 ++ ...o => jd.union.open.goods.jingfen.query.go} | 5 +- .../jd/jd.union.open.goods.material.query.go | 129 +++ ...on.open.goods.promotiongoodsinfo.query.go} | 3 +- service/jd/jd.union.open.order.query.go | 92 ++ service/jd/jd.union.open.order.row.query.go | 101 +++ ...d.union.open.promotion.bysubunionid.get.go | 46 + ... => jd.union.open.promotion.common.get.go} | 3 +- .../jd/jd.union.open.selling.goods.query.go | 1 + .../jd.union.open.selling.order.row.query.go | 1 + .../jd/jd.union.open.selling.promotion.get.go | 1 + ....union.open.statistics.giftcoupon.query.go | 1 + ...d.union.open.statistics.redpacket.query.go | 1 + service/jd/mongodb.go | 47 ++ service/jd/params.go | 8 + service/jobs/check.go | 19 + service/jobs/ip.go | 144 ++++ service/jobs/jobs.go | 379 +++++++++ service/jobs/lock.go | 35 + service/jobs/model.go | 169 ++++ service/jobs/params.go | 168 ++++ service/jobs/type.go | 161 ++++ service/kashangwl/{buy.go => api.buy.go} | 24 +- service/kashangwl/api.customer.go | 34 + service/kashangwl/{order.go => api.order.go} | 28 +- service/kashangwl/api.outer-order.go | 64 ++ .../kashangwl/{product.go => api.product.go} | 30 +- .../kashangwl/api.product.recharge-params.go | 40 + service/kashangwl/app.go | 22 +- service/kashangwl/go.mod | 33 - service/kashangwl/mongodb.go | 47 ++ service/kashangwl/product.recharge-params.go | 40 - service/kashangwl/sign.go | 2 +- .../apiv2.merchant.updateAuthority.go | 32 + service/leshuazf/app.go | 51 ++ service/leshuazf/data.area.go | 40 + service/leshuazf/data.bankbranch2.go | 53 ++ service/leshuazf/data.mcc.go | 39 + service/leshuazf/mongodb.go | 47 ++ service/leshuazf/params.go | 27 + service/leshuazf/picture.upload.go | 1 + service/leshuazf/sign.go | 21 + service/meituan/api.generate_link.go | 43 + ...rebysid.go => api.getqualityscorebysid.go} | 24 +- .../{mini_code.go => api.mini_code.go} | 22 +- service/meituan/{order.go => api.order.go} | 26 +- .../{order_list.go => api.order_list.go} | 24 +- service/meituan/app.go | 25 +- service/meituan/generate_link.go | 43 - service/meituan/go.mod | 32 - service/meituan/mongodb.go | 47 ++ service/oauth/gitee/access_token.go | 36 + service/oauth/gitee/api_user.go | 53 ++ service/oauth/gitee/app.go | 42 + service/oauth/gitee/authorize.go | 8 + service/oauth/gitee/config.go | 6 + service/oauth/workwechat/access_token.go | 29 + service/oauth/workwechat/app.go | 41 + service/oauth/workwechat/authorize.go | 8 + service/oauth/workwechat/get_user_info.go | 35 + service/oauth/workwechat/qr_connect.go | 8 + service/pinduoduo/app.go | 26 +- service/pinduoduo/go.mod | 32 - service/pinduoduo/mongodb.go | 47 ++ service/pinduoduo/params.go | 5 + .../pdd.ddk.cms.prom.url.generate.go | 73 ++ service/pinduoduo/pdd.ddk.goods.detail.go | 1 + .../pdd.ddk.goods.promotion.url.generate.go | 1 + .../pinduoduo/pdd.ddk.goods.recommend.get.go | 3 +- service/pinduoduo/pdd.ddk.goods.search.go | 6 +- .../pdd.ddk.member.authority.query.go | 34 + service/pinduoduo/pdd.ddk.order.detail.get.go | 76 ++ .../pdd.ddk.order.list.increment.get.go | 4 +- .../pinduoduo/pdd.ddk.order.list.range.get.go | 79 ++ service/pinduoduo/pdd.ddk.resource.url.gen.go | 20 +- .../pinduoduo/pdd.ddk.rp.prom.url.generate.go | 17 +- .../pinduoduo/pdd.ddk.top.goods.list.query.go | 68 ++ ...rder.go => api.order.create-soon-order.go} | 0 service/pintoto/api.order.create.go | 31 + ...{api_order_query.go => api.order.query.go} | 42 +- .../{api_user_info.go => api.user.info.go} | 0 service/pintoto/api_order_create.go | 40 - service/pintoto/app.go | 64 +- service/pintoto/go.mod | 30 - service/pintoto/mongodb.go | 47 ++ service/pintoto/movie_info_get_cinema_list.go | 20 +- service/pintoto/movie_info_get_city_area.go | 44 +- service/pintoto/movie_info_get_city_list.go | 39 +- service/pintoto/movie_info_get_hot_list.go | 20 +- .../pintoto/movie_info_get_schedule_list.go | 20 +- service/pintoto/movie_info_get_sea.go | 16 +- service/pintoto/movie_info_get_show_date.go | 17 +- service/pintoto/movie_info_get_soon_list.go | 20 +- ....go => movieapi.movie-info.get-version.go} | 0 service/pintoto/params.go | 27 + service/sendcloud/apiv2.userinfo.get.go | 66 ++ service/sendcloud/app.go | 35 + service/sendcloud/mongodb.go | 47 ++ service/sendcloud/params.go | 27 + service/service.go | 22 - service/taobao/app.go | 25 +- service/taobao/go.mod | 32 - service/taobao/help.md | 2 + service/taobao/mongodb.go | 47 ++ .../taobao/taobao.tbk.dg.newuser.order.get.go | 36 + .../taobao/taobao.tbk.order.details.get.go | 90 ++ service/taobao/tbk.activity.info.get.go | 1 + service/taobao/tbk.coupon.get.go | 66 ++ service/taobao/tbk.dg.material.optional.go | 3 +- service/taobao/tbk.dg.optimus.material.go | 1 + service/taobao/tbk.shop.get.go | 43 + service/taobao/tbk.shop.recommend.get.go | 41 + service/tianyancha/app.go | 2 +- service/tianyancha/go.mod | 10 - service/topsdk/ability1826/Ability1826.go | 98 +++ .../domain/TaobaoTbkDgVegasTljCreateResult.go | 36 + ...egasTljCreateRightsInstanceCreateResult.go | 44 + ...TaobaoTbkDgVegasTljInstanceReportResult.go | 36 + ...asTljInstanceReportTljInstanceReportDto.go | 100 +++ .../domain/TaobaoTbkDgVegasTljReportExtra.go | 116 +++ .../TaobaoTbkDgVegasTljReportInstanceDTO.go | 12 + ...obaoTbkDgVegasTljStopUpdateStatusResult.go | 12 + .../TaobaoTbkDgVegasTljCreateRequest.go | 159 ++++ ...aobaoTbkDgVegasTljInstanceReportRequest.go | 25 + .../TaobaoTbkDgVegasTljReportRequest.go | 35 + .../request/TaobaoTbkDgVegasTljStopRequest.go | 35 + .../TaobaoTbkDgVegasTljCreateResponse.go | 23 + ...obaoTbkDgVegasTljInstanceReportResponse.go | 23 + .../TaobaoTbkDgVegasTljReportResponse.go | 35 + .../TaobaoTbkDgVegasTljStopResponse.go | 35 + service/topsdk/ability2138/Ability2138.go | 38 + .../domain/TaobaoTbkDgNewuserOrderGetData.go | 36 + .../TaobaoTbkDgNewuserOrderGetMapData.go | 224 +++++ .../TaobaoTbkDgNewuserOrderGetOrderData.go | 36 + .../TaobaoTbkDgNewuserOrderGetResults.go | 12 + .../TaobaoTbkDgNewuserOrderGetRequest.go | 79 ++ .../TaobaoTbkDgNewuserOrderGetResponse.go | 23 + service/topsdk/ability2474/Ability2474.go | 38 + .../TaobaoTbkDgVegasSendReportResult.go | 36 + ...VegasSendReportRightsSendRelationRptDto.go | 28 + ...baoTbkDgVegasSendReportRightsSendRptDTO.go | 12 + .../TaobaoTbkDgVegasSendReportRequest.go | 65 ++ .../TaobaoTbkDgVegasSendReportResponse.go | 23 + service/topsdk/ability304/Ability304.go | 158 ++++ .../TaobaoFilesGetTopDownloadRecordDo.go | 32 + .../request/TaobaoFilesGetRequest.go | 49 ++ .../TaobaoOpenuidGetBymixnickRequest.go | 25 + .../request/TaobaoOpenuidGetBytradeRequest.go | 25 + .../request/TaobaoOpenuidGetRequest.go | 14 + .../TaobaoTopAuthTokenRefreshRequest.go | 25 + .../TaobaoTopSdkFeedbackUploadRequest.go | 35 + .../request/TaobaoTopSecretGetRequest.go | 45 + .../response/TaobaoFilesGetResponse.go | 23 + .../TaobaoOpenuidGetBymixnickResponse.go | 19 + .../TaobaoOpenuidGetBytradeResponse.go | 19 + .../response/TaobaoOpenuidGetResponse.go | 19 + .../TaobaoTopAuthTokenRefreshResponse.go | 19 + .../TaobaoTopSdkFeedbackUploadResponse.go | 19 + .../response/TaobaoTopSecretGetResponse.go | 35 + service/topsdk/ability3261/Ability3261.go | 58 ++ .../TaobaoTbkDgCpaActivityDetailPageResult.go | 76 ++ .../TaobaoTbkDgCpaActivityDetailResult.go | 60 ++ .../TaobaoTbkDgCpaActivityDetailResults.go | 20 + .../TaobaoTbkDgCpaActivityReportPageResult.go | 12 + .../TaobaoTbkDgCpaActivityReportRpcResult.go | 12 + ...TbkDgCpaActivityReportVegasCpaReportDTO.go | 52 ++ .../TaobaoTbkDgCpaActivityDetailRequest.go | 65 ++ .../TaobaoTbkDgCpaActivityReportRequest.go | 85 ++ .../TaobaoTbkDgCpaActivityDetailResponse.go | 23 + .../TaobaoTbkDgCpaActivityReportResponse.go | 23 + service/topsdk/ability3280/Ability3280.go | 38 + .../domain/TaobaoTbkDgTpwdReportGetMapData.go | 36 + .../TaobaoTbkDgTpwdReportGetRequest.go | 35 + .../TaobaoTbkDgTpwdReportGetResponse.go | 23 + service/topsdk/ability369/Ability369.go | 58 ++ .../TaobaoTbkDgOptimusMaterialBybtInfoDTO.go | 68 ++ ...obaoTbkDgOptimusMaterialFavoritesDetail.go | 20 + ...TaobaoTbkDgOptimusMaterialFavoritesInfo.go | 20 + ...oTbkDgOptimusMaterialMaifanPromotionDTO.go | 36 + .../TaobaoTbkDgOptimusMaterialMapData.go | 788 ++++++++++++++++++ .../TaobaoTbkDgOptimusMaterialTopNInfoDTO.go | 44 + .../TaobaoTbkDgOptimusMaterialWordMapData.go | 20 + .../TaobaoTbkDgOptimusPromotionMapData.go | 108 +++ ...baoTbkDgOptimusPromotionPromotionExtend.go | 28 + ...aobaoTbkDgOptimusPromotionPromotionList.go | 36 + ...oTbkDgOptimusPromotionRecommendItemList.go | 20 + ...aoTbkDgOptimusPromotionYoujiacouponinfo.go | 20 + .../TaobaoTbkDgOptimusMaterialRequest.go | 125 +++ .../TaobaoTbkDgOptimusPromotionRequest.go | 55 ++ .../TaobaoTbkDgOptimusMaterialResponse.go | 31 + .../TaobaoTbkDgOptimusPromotionResponse.go | 23 + service/topsdk/ability370/Ability370.go | 38 + .../TaobaoTbkDgMaterialOptionalBybtInfoDTO.go | 68 ++ .../TaobaoTbkDgMaterialOptionalFoodMapData.go | 36 + ...bkDgMaterialOptionalLocalizationMapData.go | 76 ++ ...TbkDgMaterialOptionalMaifanPromotionDTO.go | 36 + .../TaobaoTbkDgMaterialOptionalMapData.go | 700 ++++++++++++++++ .../TaobaoTbkDgMaterialOptionalTopNInfoDTO.go | 44 + ...baoTbkDgMaterialOptionalUcrowdrankitems.go | 28 + .../TaobaoTbkDgMaterialOptionalRequest.go | 430 ++++++++++ .../TaobaoTbkDgMaterialOptionalResponse.go | 31 + service/topsdk/ability371/Ability371.go | 58 ++ .../domain/TaobaoTbkCouponGetMapData.go | 76 ++ .../domain/TaobaoTbkItemInfoGetNTbkItem.go | 332 ++++++++ .../request/TaobaoTbkCouponGetRequest.go | 45 + .../request/TaobaoTbkItemInfoGetRequest.go | 45 + .../response/TaobaoTbkCouponGetResponse.go | 23 + .../response/TaobaoTbkItemInfoGetResponse.go | 23 + service/topsdk/ability373/Ability373.go | 38 + .../domain/TaobaoJuItemsSearchExtend.go | 12 + .../domain/TaobaoJuItemsSearchItems.go | 164 ++++ .../TaobaoJuItemsSearchPaginationResult.go | 84 ++ .../domain/TaobaoJuItemsSearchTopItemQuery.go | 60 ++ .../domain/TaobaoJuItemsSearchTrackparams.go | 12 + .../request/TaobaoJuItemsSearchRequest.go | 30 + .../response/TaobaoJuItemsSearchResponse.go | 23 + service/topsdk/ability374/Ability374.go | 38 + .../domain/TaobaoTbkActivityInfoGetData.go | 76 ++ .../TaobaoTbkActivityInfoGetRequest.go | 65 ++ .../TaobaoTbkActivityInfoGetResponse.go | 23 + service/topsdk/ability375/Ability375.go | 38 + .../domain/TaobaoTbkTpwdCreateMapData.go | 20 + .../request/TaobaoTbkTpwdCreateRequest.go | 65 ++ .../response/TaobaoTbkTpwdCreateResponse.go | 23 + service/topsdk/ability376/Ability376.go | 38 + .../domain/TaobaoTbkSpreadGetTbkSpread.go | 20 + .../TaobaoTbkSpreadGetTbkSpreadRequest.go | 12 + .../request/TaobaoTbkSpreadGetRequest.go | 30 + .../response/TaobaoTbkSpreadGetResponse.go | 27 + service/topsdk/ability382/Ability382.go | 38 + .../domain/TaobaoTbkDgVegasSendStatusData.go | 12 + .../TaobaoTbkDgVegasSendStatusMapData.go | 12 + .../TaobaoTbkDgVegasSendStatusRequest.go | 75 ++ .../TaobaoTbkDgVegasSendStatusResponse.go | 27 + service/topsdk/ability414/Ability414.go | 58 ++ .../TaobaoTbkOrderDetailsGetOrderPage.go | 52 ++ ...obaoTbkOrderDetailsGetPublisherOrderDto.go | 516 ++++++++++++ .../TaobaoTbkOrderDetailsGetServiceFeeDto.go | 36 + .../TaobaoTbkRelationRefundPageResult.go | 36 + .../domain/TaobaoTbkRelationRefundResult.go | 200 +++++ .../TaobaoTbkRelationRefundRpcResult.go | 44 + ...oTbkRelationRefundTopApiRefundRptOption.go | 56 ++ .../TaobaoTbkOrderDetailsGetRequest.go | 115 +++ .../request/TaobaoTbkRelationRefundRequest.go | 30 + .../TaobaoTbkOrderDetailsGetResponse.go | 23 + .../TaobaoTbkRelationRefundResponse.go | 23 + service/topsdk/ability417/Ability417.go | 38 + .../TaobaoTbkDgPunishOrderGetPageResult.go | 36 + .../domain/TaobaoTbkDgPunishOrderGetResult.go | 100 +++ .../TaobaoTbkDgPunishOrderGetRpcResult.go | 44 + ...oTbkDgPunishOrderGetTopApiAfOrderOption.go | 104 +++ .../TaobaoTbkDgPunishOrderGetRequest.go | 30 + .../TaobaoTbkDgPunishOrderGetResponse.go | 23 + service/topsdk/ability425/Ability425.go | 78 ++ .../domain/TaobaoTbkScInvitecodeGetData.go | 12 + .../domain/TaobaoTbkScPublisherInfoGetData.go | 28 + .../TaobaoTbkScPublisherInfoGetMapData.go | 128 +++ ...baoTbkScPublisherInfoGetRegisterInfoDto.go | 68 ++ .../TaobaoTbkScPublisherInfoSaveData.go | 36 + .../TaobaoTbkScInvitecodeGetRequest.go | 45 + .../TaobaoTbkScPublisherInfoGetRequest.go | 95 +++ .../TaobaoTbkScPublisherInfoSaveRequest.go | 85 ++ .../TaobaoTbkScInvitecodeGetResponse.go | 23 + .../TaobaoTbkScPublisherInfoGetResponse.go | 23 + .../TaobaoTbkScPublisherInfoSaveResponse.go | 23 + .../topsdk/defaultability/Defaultability.go | 78 ++ .../TaobaoTbkDgTpwdRiskReportDataMap.go | 28 + .../domain/TaobaoTbkDgTpwdRiskReportResult.go | 12 + .../TaobaoTbkDgVegasLbtljCreateResult.go | 36 + ...egasLbtljCreateTaskInstanceCreateResult.go | 36 + .../TaobaoTbkScTpwdRiskReportDataMap.go | 28 + .../domain/TaobaoTbkScTpwdRiskReportResult.go | 12 + .../TaobaoTbkDgTpwdRiskReportRequest.go | 45 + .../TaobaoTbkDgVegasLbtljCreateRequest.go | 199 +++++ .../TaobaoTbkScTpwdRiskReportRequest.go | 45 + .../TaobaoTbkDgTpwdRiskReportResponse.go | 23 + .../TaobaoTbkDgVegasLbtljCreateResponse.go | 23 + .../TaobaoTbkScTpwdRiskReportResponse.go | 23 + service/topsdk/go.mod | 3 + service/topsdk/topclient.go | 146 ++++ service/topsdk/util/TopApiRequestError.go | 34 + service/topsdk/util/util.go | 114 +++ service/wechatminiprogram/app.go | 39 +- .../cgi-bin.getcallbackip.go | 3 +- .../cgi-bin.message.subscribe.send.go | 3 +- service/wechatminiprogram/cgi-bin.token.db.go | 47 -- service/wechatminiprogram/cgi-bin.token.go | 26 +- .../cgi-bin.token.monitor.go | 42 +- .../wechatminiprogram/cgi-bin.token.rdb.go | 18 +- .../cgi-bin.wxaapp.createwxaqrcode.go | 3 +- service/wechatminiprogram/go.mod | 35 - service/wechatminiprogram/mongodb.go | 47 ++ service/wechatminiprogram/save_img.go | 5 +- .../wechatminiprogram/sns.jscode2session.go | 24 +- service/wechatminiprogram/user_info.go | 5 + .../wxa.business.getliveinfo.go | 3 +- .../wxa.business.getuserphonenumber.go | 47 ++ .../wechatminiprogram/wxa.generate_urllink.go | 3 +- .../wechatminiprogram/wxa.generatescheme.go | 3 +- service/wechatminiprogram/wxa.getwxacode.go | 3 +- .../wxa.getwxacodeunlimit.go | 3 +- .../wechatminiprogram/wxa.query_urllink.go | 3 +- service/wechatminiprogram/wxa.queryscheme.go | 3 +- service/wechatoffice/app.go | 70 +- .../wechatoffice/cgi-bin.ticket.getticket.go | 36 + .../cgi-bin.ticket.getticket.monitor.go | 22 + .../cgi-bin.ticket.getticket.rdb.go | 23 + service/wechatoffice/cgi-bin.token.db.go | 47 -- service/wechatoffice/cgi-bin.token.go | 22 +- service/wechatoffice/cgi-bin.token.monitor.go | 40 +- service/wechatoffice/cgi-bin.token.rdb.go | 18 +- service/wechatoffice/cgi-bin.user.get.go | 38 + service/wechatoffice/cgi-bin.user.info.go | 48 ++ .../debug.cgi-bin.ticket.check.go | 34 + service/wechatoffice/getcallbackip.go | 1 + service/wechatoffice/getticket.db.go | 48 -- service/wechatoffice/getticket.go | 35 - service/wechatoffice/getticket.monitor.go | 23 - service/wechatoffice/getticket.rdb.go | 21 - service/wechatoffice/go.mod | 33 - service/wechatoffice/message.template.send.go | 1 + service/wechatoffice/mongodb.go | 47 ++ service/wechatoffice/share.go | 4 +- ...code2_session.go => sns.jscode2session.go} | 20 +- .../wechatoffice/sns.oauth2.access_token.go | 22 +- service/wechatopen | 1 + service/wechatpayapiv2/app.go | 38 + .../mmpaymkttransfers.gettransferinfo.go | 59 ++ .../mmpaymkttransfers.promotion.transfers.go | 58 ++ service/wechatpayapiv2/mongodb.go | 45 + service/wechatpayapiv2/params.go | 72 ++ service/wechatpayapiv2/sign.go | 45 + service/wechatpayapiv3/app.go | 105 +-- service/wechatpayapiv3/go.mod | 32 - service/wechatpayapiv3/mongodb.go | 47 ++ service/wechatpayapiv3/params.go | 2 +- service/wechatpayapiv3/pay.jsapi.go | 2 +- service/wechatpayapiv3/pay.transactions.id.go | 35 +- .../wechatpayapiv3/pay.transactions.jsapi.go | 101 +-- .../pay.transactions.out-trade-no.close.go | 20 +- .../pay.transactions.out-trade-no.go | 35 +- .../wechatpayapiv3/refund.domestic.refunds.go | 31 +- .../refund.domestic.refunds.out_refund_no.go | 30 +- service/wechatpayapiv3/sign.go | 2 +- service/wechatqy/app.go | 20 +- service/wechatqy/go.mod | 31 - service/wechatqy/mongodb.go | 47 ++ service/wechatqy/webhook.send.go | 2 +- service/wechatunion/app.go | 36 +- service/wechatunion/cgi-bin.token.db.go | 47 -- service/wechatunion/cgi-bin.token.monitor.go | 42 +- service/wechatunion/cgi-bin.token.rdb.go | 18 +- service/wechatunion/cgi_bin.token.go | 22 +- service/wechatunion/getcallbackip.go | 1 + service/wechatunion/go.mod | 33 - service/wechatunion/mongodb.go | 47 ++ service/wechatunion/promoter.order.info.go | 71 ++ service/wechatunion/promoter.order.search.go | 68 ++ .../wechatunion/promoter.product.category.go | 32 +- .../wechatunion/promoter.product.generate.go | 33 +- service/wechatunion/promoter.product.list.go | 46 +- .../wechatunion/promoter.product.select.go | 25 +- service/wechatunion/promoter.promotion.add.go | 38 + service/wechatunion/promoter.promotion.del.go | 38 + .../wechatunion/promoter.promotion.list.go | 46 + service/wechatunion/promoter.promotion.upd.go | 36 + service/wechatunion/promotion.go | 164 ---- service/wikeyun/app.go | 17 +- service/wikeyun/go.mod | 33 - service/wikeyun/mongodb.go | 47 ++ service/wikeyun/oil.go | 55 -- service/wikeyun/power.go | 94 --- service/wikeyun/recharge.go | 1 - service/wikeyun/recharge.push_order.go | 43 - service/wikeyun/recharge.query.go | 35 - service/wikeyun/rest.oil.add_card.go | 10 + service/wikeyun/rest.oil.card_info.go | 10 + service/wikeyun/rest.oil.del_card.go | 10 + service/wikeyun/rest.oil.push_order.go | 10 + service/wikeyun/rest.oil.query.go | 10 + service/wikeyun/rest.oiledit_card.go | 10 + service/wikeyun/rest.power.add_card.go | 41 + service/wikeyun/rest.power.card_info.go | 10 + service/wikeyun/rest.power.del_card.go | 12 + service/wikeyun/rest.power.edit_card.go | 10 + service/wikeyun/rest.power.push_order.go | 34 + service/wikeyun/rest.power.query.go | 42 + service/wikeyun/rest.recharge.push_order.go | 35 + service/wikeyun/rest.recharge.query.go | 45 + service/wikeyun/rest.user.query.go | 34 + service/wikeyun/user.go | 30 - utils/go.mod | 3 - utils/goaes/go.mod | 3 - utils/goaes/goaes.go | 57 -- utils/goarray/go.mod | 3 - utils/goarray/goarray.go | 17 - utils/gobase64/go.mod | 3 - utils/gobase64/gobase64.go | 19 +- utils/godecimal/go.mod | 3 - utils/godecimal/godecimal.go | 91 ++ utils/godmail/go.mod | 7 - utils/godmail/go.sum | 4 - utils/goenv/go.mod | 5 - utils/goenv/goenv.go | 22 - utils/gofiles/go.mod | 3 - utils/gofiles/gofiles.go | 104 ++- utils/gofloat/go.mod | 3 - utils/gofloat/gofloat.go | 13 - utils/goget/go.mod | 3 - utils/goget/goget.go | 15 - utils/goheader/go.mod | 3 - utils/gohttp/go.mod | 8 - utils/gohttp/gohttp.go | 73 +- utils/goint/go.mod | 3 - utils/goint/goint.go | 16 - utils/goint64/go.mod | 3 - utils/goint64/goint64.go | 23 - utils/goip/go.mod | 5 - utils/goip/goip.go | 73 -- utils/gojson/go.mod | 3 - utils/gojson/gojson.go | 47 -- utils/goless/go.mod | 3 - utils/golock/go.mod | 12 - utils/golock/lock.go | 9 +- utils/golog/go.mod | 15 - utils/gomac/go.mod | 3 - utils/gomac/gomac.go | 21 - utils/gomd5/go.mod | 3 - utils/gomd5/gomd5.go | 49 -- utils/gomongo/go.mod | 19 - utils/gomysql/app.go | 66 +- utils/gomysql/go.mod | 14 - utils/goparams/go.mod | 5 - utils/gophp/go.mod | 3 - utils/gophp/gophp.go | 115 ++- .../goless.go => gophp/serialize/less.go} | 10 +- utils/gophp/serialize/serialize.go | 5 +- utils/gophp/serialize/unserialize.go | 2 +- utils/gopostgresql/app.go | 74 +- utils/gopostgresql/go.mod | 23 - utils/gopreg/go.mod | 3 - utils/gopreg/gopreg.go | 30 - utils/gorandom/go.mod | 3 - utils/gorandom/gorandom.go | 45 - utils/goredis/go.mod | 10 - utils/gorequest/go.mod | 3 - utils/gorsa/go.mod | 3 - utils/gorsa/gorsa.go | 77 -- utils/gosort/go.mod | 3 - utils/gosort/gosort.go | 26 - utils/gossh/go.mod | 7 - utils/gossh/gossh.go | 66 -- utils/gossl/go.mod | 3 - utils/gossl/gossl.go | 43 - utils/gostring/go.mod | 3 - utils/gostring/gostring.go | 18 + utils/gotime/Tomorrow.go | 15 - utils/gotime/app.go | 91 -- utils/gotime/differ.go | 69 -- utils/gotime/errors.go | 8 - utils/gotime/go.mod | 3 - utils/gotime/location.go | 14 - utils/gotime/start_end.go | 124 --- utils/gotime/today.go | 112 --- utils/gotime/yesterday.go | 17 - utils/gourl/go.mod | 3 - utils/gouuid/go.mod | 3 - utils/gouuid/gouuid.go | 18 - utils/goxml/goxml.go | 43 + utils/phpjson/go.mod | 3 - utils/phpjson/phpjson.go | 50 -- utils/rmb/go.mod | 5 - utils/utils.go | 43 - 514 files changed, 17447 insertions(+), 3835 deletions(-) delete mode 100644 go.sum delete mode 100644 service/dingdanxia/go.mod create mode 100644 service/dingdanxia/mongodb.go create mode 100644 service/dingdanxia/waimai.meituan_orderid.go create mode 100644 service/dingdanxia/waimai.meituan_privilege.go create mode 100644 service/dingdanxia/waimai.meituan_sg_privilege.go delete mode 100644 service/dingtalk/go.mod create mode 100644 service/dingtalk/mongodb.go rename service/eastiot/{Iot_api.get_all_sim_type.go => api.Iot_api.get_all_sim_type.go} (100%) delete mode 100644 service/eastiot/go.mod create mode 100644 service/eastiot/mongodb.go delete mode 100644 service/ejiaofei/go.mod create mode 100644 service/ejiaofei/mongodb.go rename service/ejiaofei/{query_tx_product.go => query_txproduct.go} (100%) rename service/ejiaofei/{tx_chongzhi.go => txchongzhi.go} (100%) create mode 100644 service/feishu/app.go create mode 100644 service/feishu/mongodb.go create mode 100644 service/feishu/params.go create mode 100644 service/feishu/webhook.go delete mode 100644 service/go.mod delete mode 100644 service/ip/go.mod create mode 100644 service/ip/log.go delete mode 100644 service/jd/go.mod create mode 100644 service/jd/jd.union.open.activity.query.go create mode 100644 service/jd/jd.union.open.category.goods.get.go create mode 100644 service/jd/jd.union.open.coupon.gift.get.go create mode 100644 service/jd/jd.union.open.coupon.gift.stop.go create mode 100644 service/jd/jd.union.open.goods.bigfield.query.go rename service/jd/{union.open.goods.jingfen.query.go => jd.union.open.goods.jingfen.query.go} (93%) create mode 100644 service/jd/jd.union.open.goods.material.query.go rename service/jd/{union.open.goods.promotiongoodsinfo.query.go => jd.union.open.goods.promotiongoodsinfo.query.go} (92%) create mode 100644 service/jd/jd.union.open.order.query.go create mode 100644 service/jd/jd.union.open.order.row.query.go create mode 100644 service/jd/jd.union.open.promotion.bysubunionid.get.go rename service/jd/{union.open.promotion.common.get.go => jd.union.open.promotion.common.get.go} (83%) create mode 100644 service/jd/jd.union.open.selling.goods.query.go create mode 100644 service/jd/jd.union.open.selling.order.row.query.go create mode 100644 service/jd/jd.union.open.selling.promotion.get.go create mode 100644 service/jd/jd.union.open.statistics.giftcoupon.query.go create mode 100644 service/jd/jd.union.open.statistics.redpacket.query.go create mode 100644 service/jd/mongodb.go create mode 100644 service/jobs/check.go create mode 100644 service/jobs/ip.go create mode 100644 service/jobs/jobs.go create mode 100644 service/jobs/lock.go create mode 100644 service/jobs/model.go create mode 100644 service/jobs/params.go create mode 100644 service/jobs/type.go rename service/kashangwl/{buy.go => api.buy.go} (70%) create mode 100644 service/kashangwl/api.customer.go rename service/kashangwl/{order.go => api.order.go} (76%) create mode 100644 service/kashangwl/api.outer-order.go rename service/kashangwl/{product.go => api.product.go} (52%) create mode 100644 service/kashangwl/api.product.recharge-params.go delete mode 100644 service/kashangwl/go.mod create mode 100644 service/kashangwl/mongodb.go delete mode 100644 service/kashangwl/product.recharge-params.go create mode 100644 service/leshuazf/apiv2.merchant.updateAuthority.go create mode 100644 service/leshuazf/app.go create mode 100644 service/leshuazf/data.area.go create mode 100644 service/leshuazf/data.bankbranch2.go create mode 100644 service/leshuazf/data.mcc.go create mode 100644 service/leshuazf/mongodb.go create mode 100644 service/leshuazf/params.go create mode 100644 service/leshuazf/picture.upload.go create mode 100644 service/leshuazf/sign.go create mode 100644 service/meituan/api.generate_link.go rename service/meituan/{getqualityscorebysid.go => api.getqualityscorebysid.go} (57%) rename service/meituan/{mini_code.go => api.mini_code.go} (55%) rename service/meituan/{order.go => api.order.go} (80%) rename service/meituan/{order_list.go => api.order_list.go} (82%) delete mode 100644 service/meituan/generate_link.go delete mode 100644 service/meituan/go.mod create mode 100644 service/meituan/mongodb.go create mode 100644 service/oauth/gitee/access_token.go create mode 100644 service/oauth/gitee/api_user.go create mode 100644 service/oauth/gitee/app.go create mode 100644 service/oauth/gitee/authorize.go create mode 100644 service/oauth/gitee/config.go create mode 100644 service/oauth/workwechat/access_token.go create mode 100644 service/oauth/workwechat/app.go create mode 100644 service/oauth/workwechat/authorize.go create mode 100644 service/oauth/workwechat/get_user_info.go create mode 100644 service/oauth/workwechat/qr_connect.go delete mode 100644 service/pinduoduo/go.mod create mode 100644 service/pinduoduo/mongodb.go create mode 100644 service/pinduoduo/pdd.ddk.cms.prom.url.generate.go create mode 100644 service/pinduoduo/pdd.ddk.member.authority.query.go create mode 100644 service/pinduoduo/pdd.ddk.order.detail.get.go create mode 100644 service/pinduoduo/pdd.ddk.order.list.range.get.go create mode 100644 service/pinduoduo/pdd.ddk.top.goods.list.query.go rename service/pintoto/{api_order_create-soon-order.go => api.order.create-soon-order.go} (100%) create mode 100644 service/pintoto/api.order.create.go rename service/pintoto/{api_order_query.go => api.order.query.go} (75%) rename service/pintoto/{api_user_info.go => api.user.info.go} (100%) delete mode 100644 service/pintoto/api_order_create.go delete mode 100644 service/pintoto/go.mod create mode 100644 service/pintoto/mongodb.go rename service/pintoto/{movie_info_get_version.go => movieapi.movie-info.get-version.go} (100%) create mode 100644 service/pintoto/params.go create mode 100644 service/sendcloud/apiv2.userinfo.get.go create mode 100644 service/sendcloud/app.go create mode 100644 service/sendcloud/mongodb.go create mode 100644 service/sendcloud/params.go delete mode 100644 service/service.go delete mode 100644 service/taobao/go.mod create mode 100644 service/taobao/help.md create mode 100644 service/taobao/mongodb.go create mode 100644 service/taobao/taobao.tbk.dg.newuser.order.get.go create mode 100644 service/taobao/taobao.tbk.order.details.get.go create mode 100644 service/taobao/tbk.coupon.get.go create mode 100644 service/taobao/tbk.shop.get.go create mode 100644 service/taobao/tbk.shop.recommend.get.go delete mode 100644 service/tianyancha/go.mod create mode 100644 service/topsdk/ability1826/Ability1826.go create mode 100644 service/topsdk/ability1826/domain/TaobaoTbkDgVegasTljCreateResult.go create mode 100644 service/topsdk/ability1826/domain/TaobaoTbkDgVegasTljCreateRightsInstanceCreateResult.go create mode 100644 service/topsdk/ability1826/domain/TaobaoTbkDgVegasTljInstanceReportResult.go create mode 100644 service/topsdk/ability1826/domain/TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto.go create mode 100644 service/topsdk/ability1826/domain/TaobaoTbkDgVegasTljReportExtra.go create mode 100644 service/topsdk/ability1826/domain/TaobaoTbkDgVegasTljReportInstanceDTO.go create mode 100644 service/topsdk/ability1826/domain/TaobaoTbkDgVegasTljStopUpdateStatusResult.go create mode 100644 service/topsdk/ability1826/request/TaobaoTbkDgVegasTljCreateRequest.go create mode 100644 service/topsdk/ability1826/request/TaobaoTbkDgVegasTljInstanceReportRequest.go create mode 100644 service/topsdk/ability1826/request/TaobaoTbkDgVegasTljReportRequest.go create mode 100644 service/topsdk/ability1826/request/TaobaoTbkDgVegasTljStopRequest.go create mode 100644 service/topsdk/ability1826/response/TaobaoTbkDgVegasTljCreateResponse.go create mode 100644 service/topsdk/ability1826/response/TaobaoTbkDgVegasTljInstanceReportResponse.go create mode 100644 service/topsdk/ability1826/response/TaobaoTbkDgVegasTljReportResponse.go create mode 100644 service/topsdk/ability1826/response/TaobaoTbkDgVegasTljStopResponse.go create mode 100644 service/topsdk/ability2138/Ability2138.go create mode 100644 service/topsdk/ability2138/domain/TaobaoTbkDgNewuserOrderGetData.go create mode 100644 service/topsdk/ability2138/domain/TaobaoTbkDgNewuserOrderGetMapData.go create mode 100644 service/topsdk/ability2138/domain/TaobaoTbkDgNewuserOrderGetOrderData.go create mode 100644 service/topsdk/ability2138/domain/TaobaoTbkDgNewuserOrderGetResults.go create mode 100644 service/topsdk/ability2138/request/TaobaoTbkDgNewuserOrderGetRequest.go create mode 100644 service/topsdk/ability2138/response/TaobaoTbkDgNewuserOrderGetResponse.go create mode 100644 service/topsdk/ability2474/Ability2474.go create mode 100644 service/topsdk/ability2474/domain/TaobaoTbkDgVegasSendReportResult.go create mode 100644 service/topsdk/ability2474/domain/TaobaoTbkDgVegasSendReportRightsSendRelationRptDto.go create mode 100644 service/topsdk/ability2474/domain/TaobaoTbkDgVegasSendReportRightsSendRptDTO.go create mode 100644 service/topsdk/ability2474/request/TaobaoTbkDgVegasSendReportRequest.go create mode 100644 service/topsdk/ability2474/response/TaobaoTbkDgVegasSendReportResponse.go create mode 100644 service/topsdk/ability304/Ability304.go create mode 100644 service/topsdk/ability304/domain/TaobaoFilesGetTopDownloadRecordDo.go create mode 100644 service/topsdk/ability304/request/TaobaoFilesGetRequest.go create mode 100644 service/topsdk/ability304/request/TaobaoOpenuidGetBymixnickRequest.go create mode 100644 service/topsdk/ability304/request/TaobaoOpenuidGetBytradeRequest.go create mode 100644 service/topsdk/ability304/request/TaobaoOpenuidGetRequest.go create mode 100644 service/topsdk/ability304/request/TaobaoTopAuthTokenRefreshRequest.go create mode 100644 service/topsdk/ability304/request/TaobaoTopSdkFeedbackUploadRequest.go create mode 100644 service/topsdk/ability304/request/TaobaoTopSecretGetRequest.go create mode 100644 service/topsdk/ability304/response/TaobaoFilesGetResponse.go create mode 100644 service/topsdk/ability304/response/TaobaoOpenuidGetBymixnickResponse.go create mode 100644 service/topsdk/ability304/response/TaobaoOpenuidGetBytradeResponse.go create mode 100644 service/topsdk/ability304/response/TaobaoOpenuidGetResponse.go create mode 100644 service/topsdk/ability304/response/TaobaoTopAuthTokenRefreshResponse.go create mode 100644 service/topsdk/ability304/response/TaobaoTopSdkFeedbackUploadResponse.go create mode 100644 service/topsdk/ability304/response/TaobaoTopSecretGetResponse.go create mode 100644 service/topsdk/ability3261/Ability3261.go create mode 100644 service/topsdk/ability3261/domain/TaobaoTbkDgCpaActivityDetailPageResult.go create mode 100644 service/topsdk/ability3261/domain/TaobaoTbkDgCpaActivityDetailResult.go create mode 100644 service/topsdk/ability3261/domain/TaobaoTbkDgCpaActivityDetailResults.go create mode 100644 service/topsdk/ability3261/domain/TaobaoTbkDgCpaActivityReportPageResult.go create mode 100644 service/topsdk/ability3261/domain/TaobaoTbkDgCpaActivityReportRpcResult.go create mode 100644 service/topsdk/ability3261/domain/TaobaoTbkDgCpaActivityReportVegasCpaReportDTO.go create mode 100644 service/topsdk/ability3261/request/TaobaoTbkDgCpaActivityDetailRequest.go create mode 100644 service/topsdk/ability3261/request/TaobaoTbkDgCpaActivityReportRequest.go create mode 100644 service/topsdk/ability3261/response/TaobaoTbkDgCpaActivityDetailResponse.go create mode 100644 service/topsdk/ability3261/response/TaobaoTbkDgCpaActivityReportResponse.go create mode 100644 service/topsdk/ability3280/Ability3280.go create mode 100644 service/topsdk/ability3280/domain/TaobaoTbkDgTpwdReportGetMapData.go create mode 100644 service/topsdk/ability3280/request/TaobaoTbkDgTpwdReportGetRequest.go create mode 100644 service/topsdk/ability3280/response/TaobaoTbkDgTpwdReportGetResponse.go create mode 100644 service/topsdk/ability369/Ability369.go create mode 100644 service/topsdk/ability369/domain/TaobaoTbkDgOptimusMaterialBybtInfoDTO.go create mode 100644 service/topsdk/ability369/domain/TaobaoTbkDgOptimusMaterialFavoritesDetail.go create mode 100644 service/topsdk/ability369/domain/TaobaoTbkDgOptimusMaterialFavoritesInfo.go create mode 100644 service/topsdk/ability369/domain/TaobaoTbkDgOptimusMaterialMaifanPromotionDTO.go create mode 100644 service/topsdk/ability369/domain/TaobaoTbkDgOptimusMaterialMapData.go create mode 100644 service/topsdk/ability369/domain/TaobaoTbkDgOptimusMaterialTopNInfoDTO.go create mode 100644 service/topsdk/ability369/domain/TaobaoTbkDgOptimusMaterialWordMapData.go create mode 100644 service/topsdk/ability369/domain/TaobaoTbkDgOptimusPromotionMapData.go create mode 100644 service/topsdk/ability369/domain/TaobaoTbkDgOptimusPromotionPromotionExtend.go create mode 100644 service/topsdk/ability369/domain/TaobaoTbkDgOptimusPromotionPromotionList.go create mode 100644 service/topsdk/ability369/domain/TaobaoTbkDgOptimusPromotionRecommendItemList.go create mode 100644 service/topsdk/ability369/domain/TaobaoTbkDgOptimusPromotionYoujiacouponinfo.go create mode 100644 service/topsdk/ability369/request/TaobaoTbkDgOptimusMaterialRequest.go create mode 100644 service/topsdk/ability369/request/TaobaoTbkDgOptimusPromotionRequest.go create mode 100644 service/topsdk/ability369/response/TaobaoTbkDgOptimusMaterialResponse.go create mode 100644 service/topsdk/ability369/response/TaobaoTbkDgOptimusPromotionResponse.go create mode 100644 service/topsdk/ability370/Ability370.go create mode 100644 service/topsdk/ability370/domain/TaobaoTbkDgMaterialOptionalBybtInfoDTO.go create mode 100644 service/topsdk/ability370/domain/TaobaoTbkDgMaterialOptionalFoodMapData.go create mode 100644 service/topsdk/ability370/domain/TaobaoTbkDgMaterialOptionalLocalizationMapData.go create mode 100644 service/topsdk/ability370/domain/TaobaoTbkDgMaterialOptionalMaifanPromotionDTO.go create mode 100644 service/topsdk/ability370/domain/TaobaoTbkDgMaterialOptionalMapData.go create mode 100644 service/topsdk/ability370/domain/TaobaoTbkDgMaterialOptionalTopNInfoDTO.go create mode 100644 service/topsdk/ability370/domain/TaobaoTbkDgMaterialOptionalUcrowdrankitems.go create mode 100644 service/topsdk/ability370/request/TaobaoTbkDgMaterialOptionalRequest.go create mode 100644 service/topsdk/ability370/response/TaobaoTbkDgMaterialOptionalResponse.go create mode 100644 service/topsdk/ability371/Ability371.go create mode 100644 service/topsdk/ability371/domain/TaobaoTbkCouponGetMapData.go create mode 100644 service/topsdk/ability371/domain/TaobaoTbkItemInfoGetNTbkItem.go create mode 100644 service/topsdk/ability371/request/TaobaoTbkCouponGetRequest.go create mode 100644 service/topsdk/ability371/request/TaobaoTbkItemInfoGetRequest.go create mode 100644 service/topsdk/ability371/response/TaobaoTbkCouponGetResponse.go create mode 100644 service/topsdk/ability371/response/TaobaoTbkItemInfoGetResponse.go create mode 100644 service/topsdk/ability373/Ability373.go create mode 100644 service/topsdk/ability373/domain/TaobaoJuItemsSearchExtend.go create mode 100644 service/topsdk/ability373/domain/TaobaoJuItemsSearchItems.go create mode 100644 service/topsdk/ability373/domain/TaobaoJuItemsSearchPaginationResult.go create mode 100644 service/topsdk/ability373/domain/TaobaoJuItemsSearchTopItemQuery.go create mode 100644 service/topsdk/ability373/domain/TaobaoJuItemsSearchTrackparams.go create mode 100644 service/topsdk/ability373/request/TaobaoJuItemsSearchRequest.go create mode 100644 service/topsdk/ability373/response/TaobaoJuItemsSearchResponse.go create mode 100644 service/topsdk/ability374/Ability374.go create mode 100644 service/topsdk/ability374/domain/TaobaoTbkActivityInfoGetData.go create mode 100644 service/topsdk/ability374/request/TaobaoTbkActivityInfoGetRequest.go create mode 100644 service/topsdk/ability374/response/TaobaoTbkActivityInfoGetResponse.go create mode 100644 service/topsdk/ability375/Ability375.go create mode 100644 service/topsdk/ability375/domain/TaobaoTbkTpwdCreateMapData.go create mode 100644 service/topsdk/ability375/request/TaobaoTbkTpwdCreateRequest.go create mode 100644 service/topsdk/ability375/response/TaobaoTbkTpwdCreateResponse.go create mode 100644 service/topsdk/ability376/Ability376.go create mode 100644 service/topsdk/ability376/domain/TaobaoTbkSpreadGetTbkSpread.go create mode 100644 service/topsdk/ability376/domain/TaobaoTbkSpreadGetTbkSpreadRequest.go create mode 100644 service/topsdk/ability376/request/TaobaoTbkSpreadGetRequest.go create mode 100644 service/topsdk/ability376/response/TaobaoTbkSpreadGetResponse.go create mode 100644 service/topsdk/ability382/Ability382.go create mode 100644 service/topsdk/ability382/domain/TaobaoTbkDgVegasSendStatusData.go create mode 100644 service/topsdk/ability382/domain/TaobaoTbkDgVegasSendStatusMapData.go create mode 100644 service/topsdk/ability382/request/TaobaoTbkDgVegasSendStatusRequest.go create mode 100644 service/topsdk/ability382/response/TaobaoTbkDgVegasSendStatusResponse.go create mode 100644 service/topsdk/ability414/Ability414.go create mode 100644 service/topsdk/ability414/domain/TaobaoTbkOrderDetailsGetOrderPage.go create mode 100644 service/topsdk/ability414/domain/TaobaoTbkOrderDetailsGetPublisherOrderDto.go create mode 100644 service/topsdk/ability414/domain/TaobaoTbkOrderDetailsGetServiceFeeDto.go create mode 100644 service/topsdk/ability414/domain/TaobaoTbkRelationRefundPageResult.go create mode 100644 service/topsdk/ability414/domain/TaobaoTbkRelationRefundResult.go create mode 100644 service/topsdk/ability414/domain/TaobaoTbkRelationRefundRpcResult.go create mode 100644 service/topsdk/ability414/domain/TaobaoTbkRelationRefundTopApiRefundRptOption.go create mode 100644 service/topsdk/ability414/request/TaobaoTbkOrderDetailsGetRequest.go create mode 100644 service/topsdk/ability414/request/TaobaoTbkRelationRefundRequest.go create mode 100644 service/topsdk/ability414/response/TaobaoTbkOrderDetailsGetResponse.go create mode 100644 service/topsdk/ability414/response/TaobaoTbkRelationRefundResponse.go create mode 100644 service/topsdk/ability417/Ability417.go create mode 100644 service/topsdk/ability417/domain/TaobaoTbkDgPunishOrderGetPageResult.go create mode 100644 service/topsdk/ability417/domain/TaobaoTbkDgPunishOrderGetResult.go create mode 100644 service/topsdk/ability417/domain/TaobaoTbkDgPunishOrderGetRpcResult.go create mode 100644 service/topsdk/ability417/domain/TaobaoTbkDgPunishOrderGetTopApiAfOrderOption.go create mode 100644 service/topsdk/ability417/request/TaobaoTbkDgPunishOrderGetRequest.go create mode 100644 service/topsdk/ability417/response/TaobaoTbkDgPunishOrderGetResponse.go create mode 100644 service/topsdk/ability425/Ability425.go create mode 100644 service/topsdk/ability425/domain/TaobaoTbkScInvitecodeGetData.go create mode 100644 service/topsdk/ability425/domain/TaobaoTbkScPublisherInfoGetData.go create mode 100644 service/topsdk/ability425/domain/TaobaoTbkScPublisherInfoGetMapData.go create mode 100644 service/topsdk/ability425/domain/TaobaoTbkScPublisherInfoGetRegisterInfoDto.go create mode 100644 service/topsdk/ability425/domain/TaobaoTbkScPublisherInfoSaveData.go create mode 100644 service/topsdk/ability425/request/TaobaoTbkScInvitecodeGetRequest.go create mode 100644 service/topsdk/ability425/request/TaobaoTbkScPublisherInfoGetRequest.go create mode 100644 service/topsdk/ability425/request/TaobaoTbkScPublisherInfoSaveRequest.go create mode 100644 service/topsdk/ability425/response/TaobaoTbkScInvitecodeGetResponse.go create mode 100644 service/topsdk/ability425/response/TaobaoTbkScPublisherInfoGetResponse.go create mode 100644 service/topsdk/ability425/response/TaobaoTbkScPublisherInfoSaveResponse.go create mode 100644 service/topsdk/defaultability/Defaultability.go create mode 100644 service/topsdk/defaultability/domain/TaobaoTbkDgTpwdRiskReportDataMap.go create mode 100644 service/topsdk/defaultability/domain/TaobaoTbkDgTpwdRiskReportResult.go create mode 100644 service/topsdk/defaultability/domain/TaobaoTbkDgVegasLbtljCreateResult.go create mode 100644 service/topsdk/defaultability/domain/TaobaoTbkDgVegasLbtljCreateTaskInstanceCreateResult.go create mode 100644 service/topsdk/defaultability/domain/TaobaoTbkScTpwdRiskReportDataMap.go create mode 100644 service/topsdk/defaultability/domain/TaobaoTbkScTpwdRiskReportResult.go create mode 100644 service/topsdk/defaultability/request/TaobaoTbkDgTpwdRiskReportRequest.go create mode 100644 service/topsdk/defaultability/request/TaobaoTbkDgVegasLbtljCreateRequest.go create mode 100644 service/topsdk/defaultability/request/TaobaoTbkScTpwdRiskReportRequest.go create mode 100644 service/topsdk/defaultability/response/TaobaoTbkDgTpwdRiskReportResponse.go create mode 100644 service/topsdk/defaultability/response/TaobaoTbkDgVegasLbtljCreateResponse.go create mode 100644 service/topsdk/defaultability/response/TaobaoTbkScTpwdRiskReportResponse.go create mode 100644 service/topsdk/go.mod create mode 100644 service/topsdk/topclient.go create mode 100644 service/topsdk/util/TopApiRequestError.go create mode 100644 service/topsdk/util/util.go delete mode 100644 service/wechatminiprogram/cgi-bin.token.db.go delete mode 100644 service/wechatminiprogram/go.mod create mode 100644 service/wechatminiprogram/mongodb.go create mode 100644 service/wechatminiprogram/wxa.business.getuserphonenumber.go create mode 100644 service/wechatoffice/cgi-bin.ticket.getticket.go create mode 100644 service/wechatoffice/cgi-bin.ticket.getticket.monitor.go create mode 100644 service/wechatoffice/cgi-bin.ticket.getticket.rdb.go delete mode 100644 service/wechatoffice/cgi-bin.token.db.go create mode 100644 service/wechatoffice/cgi-bin.user.get.go create mode 100644 service/wechatoffice/cgi-bin.user.info.go create mode 100644 service/wechatoffice/debug.cgi-bin.ticket.check.go delete mode 100644 service/wechatoffice/getticket.db.go delete mode 100644 service/wechatoffice/getticket.go delete mode 100644 service/wechatoffice/getticket.monitor.go delete mode 100644 service/wechatoffice/getticket.rdb.go delete mode 100644 service/wechatoffice/go.mod create mode 100644 service/wechatoffice/mongodb.go rename service/wechatoffice/{auth.code2_session.go => sns.jscode2session.go} (56%) create mode 160000 service/wechatopen create mode 100644 service/wechatpayapiv2/app.go create mode 100644 service/wechatpayapiv2/mmpaymkttransfers.gettransferinfo.go create mode 100644 service/wechatpayapiv2/mmpaymkttransfers.promotion.transfers.go create mode 100644 service/wechatpayapiv2/mongodb.go create mode 100644 service/wechatpayapiv2/params.go create mode 100644 service/wechatpayapiv2/sign.go delete mode 100644 service/wechatpayapiv3/go.mod create mode 100644 service/wechatpayapiv3/mongodb.go delete mode 100644 service/wechatqy/go.mod create mode 100644 service/wechatqy/mongodb.go delete mode 100644 service/wechatunion/cgi-bin.token.db.go delete mode 100644 service/wechatunion/go.mod create mode 100644 service/wechatunion/mongodb.go create mode 100644 service/wechatunion/promoter.order.info.go create mode 100644 service/wechatunion/promoter.order.search.go create mode 100644 service/wechatunion/promoter.promotion.add.go create mode 100644 service/wechatunion/promoter.promotion.del.go create mode 100644 service/wechatunion/promoter.promotion.list.go create mode 100644 service/wechatunion/promoter.promotion.upd.go delete mode 100644 service/wechatunion/promotion.go delete mode 100644 service/wikeyun/go.mod create mode 100644 service/wikeyun/mongodb.go delete mode 100644 service/wikeyun/oil.go delete mode 100644 service/wikeyun/power.go delete mode 100644 service/wikeyun/recharge.go delete mode 100644 service/wikeyun/recharge.push_order.go delete mode 100644 service/wikeyun/recharge.query.go create mode 100644 service/wikeyun/rest.oil.add_card.go create mode 100644 service/wikeyun/rest.oil.card_info.go create mode 100644 service/wikeyun/rest.oil.del_card.go create mode 100644 service/wikeyun/rest.oil.push_order.go create mode 100644 service/wikeyun/rest.oil.query.go create mode 100644 service/wikeyun/rest.oiledit_card.go create mode 100644 service/wikeyun/rest.power.add_card.go create mode 100644 service/wikeyun/rest.power.card_info.go create mode 100644 service/wikeyun/rest.power.del_card.go create mode 100644 service/wikeyun/rest.power.edit_card.go create mode 100644 service/wikeyun/rest.power.push_order.go create mode 100644 service/wikeyun/rest.power.query.go create mode 100644 service/wikeyun/rest.recharge.push_order.go create mode 100644 service/wikeyun/rest.recharge.query.go create mode 100644 service/wikeyun/rest.user.query.go delete mode 100644 service/wikeyun/user.go delete mode 100644 utils/go.mod delete mode 100644 utils/goaes/go.mod delete mode 100644 utils/goaes/goaes.go delete mode 100644 utils/goarray/go.mod delete mode 100644 utils/goarray/goarray.go delete mode 100644 utils/gobase64/go.mod delete mode 100644 utils/godecimal/go.mod delete mode 100644 utils/godmail/go.mod delete mode 100644 utils/godmail/go.sum delete mode 100644 utils/goenv/go.mod delete mode 100644 utils/goenv/goenv.go delete mode 100644 utils/gofiles/go.mod delete mode 100644 utils/gofloat/go.mod delete mode 100644 utils/gofloat/gofloat.go delete mode 100644 utils/goget/go.mod delete mode 100644 utils/goget/goget.go delete mode 100644 utils/goheader/go.mod delete mode 100644 utils/gohttp/go.mod delete mode 100644 utils/goint/go.mod delete mode 100644 utils/goint/goint.go delete mode 100644 utils/goint64/go.mod delete mode 100644 utils/goint64/goint64.go delete mode 100644 utils/goip/go.mod delete mode 100644 utils/goip/goip.go delete mode 100644 utils/gojson/go.mod delete mode 100644 utils/gojson/gojson.go delete mode 100644 utils/goless/go.mod delete mode 100644 utils/golock/go.mod delete mode 100644 utils/golog/go.mod delete mode 100644 utils/gomac/go.mod delete mode 100644 utils/gomac/gomac.go delete mode 100644 utils/gomd5/go.mod delete mode 100644 utils/gomd5/gomd5.go delete mode 100644 utils/gomongo/go.mod delete mode 100644 utils/gomysql/go.mod delete mode 100644 utils/goparams/go.mod delete mode 100644 utils/gophp/go.mod rename utils/{goless/goless.go => gophp/serialize/less.go} (84%) delete mode 100644 utils/gopostgresql/go.mod delete mode 100644 utils/gopreg/go.mod delete mode 100644 utils/gopreg/gopreg.go delete mode 100644 utils/gorandom/go.mod delete mode 100644 utils/gorandom/gorandom.go delete mode 100644 utils/goredis/go.mod delete mode 100644 utils/gorequest/go.mod delete mode 100644 utils/gorsa/go.mod delete mode 100644 utils/gorsa/gorsa.go delete mode 100644 utils/gosort/go.mod delete mode 100644 utils/gosort/gosort.go delete mode 100644 utils/gossh/go.mod delete mode 100644 utils/gossh/gossh.go delete mode 100644 utils/gossl/go.mod delete mode 100644 utils/gossl/gossl.go delete mode 100644 utils/gostring/go.mod delete mode 100644 utils/gotime/Tomorrow.go delete mode 100644 utils/gotime/app.go delete mode 100644 utils/gotime/differ.go delete mode 100644 utils/gotime/errors.go delete mode 100644 utils/gotime/go.mod delete mode 100644 utils/gotime/location.go delete mode 100644 utils/gotime/start_end.go delete mode 100644 utils/gotime/today.go delete mode 100644 utils/gotime/yesterday.go delete mode 100644 utils/gourl/go.mod delete mode 100644 utils/gouuid/go.mod delete mode 100644 utils/gouuid/gouuid.go create mode 100644 utils/goxml/goxml.go delete mode 100644 utils/phpjson/go.mod delete mode 100644 utils/phpjson/phpjson.go delete mode 100644 utils/rmb/go.mod delete mode 100644 utils/utils.go diff --git a/go.sum b/go.sum deleted file mode 100644 index e69de29b..00000000 diff --git a/service/dingdanxia/app.go b/service/dingdanxia/app.go index cd6678bd..96f64137 100644 --- a/service/dingdanxia/app.go +++ b/service/dingdanxia/app.go @@ -1,25 +1,18 @@ package dingdanxia import ( + "dtapps/dta/library/utils/gohttp" + "dtapps/dta/library/utils/gomongo" "errors" - "fmt" - "github.com/dtapps/go-library/utils/gohttp" - "github.com/go-redis/redis/v8" - "go.mongodb.org/mongo-driver/mongo" - "go.uber.org/zap" - "gorm.io/gorm" "net/http" ) type App struct { ApiKey string - ZapLog *zap.Logger // 日志服务 - Db *gorm.DB // 关系数据库服务 - RDb *redis.Client // 缓存数据库服务 - MDb *mongo.Client // 非关系数据库服务 + Mongo gomongo.App // 日志数据库 } -func (app *App) request(url string, params map[string]interface{}, method string) ([]byte, error) { +func (app *App) request(url string, params map[string]interface{}, method string) (resp gohttp.Response, err error) { // 公共参数 params["apikey"] = app.ApiKey switch method { @@ -27,19 +20,15 @@ func (app *App) request(url string, params map[string]interface{}, method string // 请求 get, err := gohttp.Get(url, params) // 日志 - if app.ZapLog != nil { - app.ZapLog.Sugar().Info(fmt.Sprintf("%s %s %s", url, get.Header, get.Body)) - } - return get.Body, err + go app.mongoLog(url, params, method, get) + return get, err case http.MethodPost: // 请求 postJson, err := gohttp.PostForm(url, params) // 日志 - if app.ZapLog != nil { - app.ZapLog.Sugar().Info(fmt.Sprintf("%s %s %s", url, postJson.Header, postJson.Body)) - } - return postJson.Body, err + go app.mongoLog(url, params, method, postJson) + return postJson, err default: - return nil, errors.New("请求类型不支持") + return resp, errors.New("请求类型不支持") } } diff --git a/service/dingdanxia/go.mod b/service/dingdanxia/go.mod deleted file mode 100644 index 09b79fb1..00000000 --- a/service/dingdanxia/go.mod +++ /dev/null @@ -1,31 +0,0 @@ -module github.com/dtapps/go-library/service/dingdanxia - -go 1.18 - -require ( - github.com/dtapps/go-library/utils/gohttp v0.0.0-20220320035257-384fd01c7e13 - github.com/go-redis/redis/v8 v8.11.5 - go.mongodb.org/mongo-driver v1.8.4 - go.uber.org/zap v1.21.0 - gorm.io/gorm v1.23.3 -) - -require ( - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/go-stack/stack v1.8.0 // indirect - github.com/golang/snappy v0.0.1 // indirect - github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jinzhu/now v1.1.4 // indirect - github.com/klauspost/compress v1.13.6 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.0.2 // indirect - github.com/xdg-go/stringprep v1.0.2 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f // indirect - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/text v0.3.6 // indirect -) diff --git a/service/dingdanxia/jd.jy_order_details.go b/service/dingdanxia/jd.jy_order_details.go index d70d0724..5d07e4dc 100644 --- a/service/dingdanxia/jd.jy_order_details.go +++ b/service/dingdanxia/jd.jy_order_details.go @@ -1,6 +1,7 @@ package dingdanxia import ( + "dtapps/dta/library/utils/gohttp" "encoding/json" "net/http" ) @@ -29,11 +30,12 @@ type JdJyOrderDetailsResponse struct { type JdJyOrderDetailsResult struct { Result JdJyOrderDetailsResponse // 结果 Body []byte // 内容 + Http gohttp.Response // 请求 Err error // 错误 } -func NewJdJyOrderDetailsResult(result JdJyOrderDetailsResponse, body []byte, err error) *JdJyOrderDetailsResult { - return &JdJyOrderDetailsResult{Result: result, Body: body, Err: err} +func NewJdJyOrderDetailsResult(result JdJyOrderDetailsResponse, body []byte, http gohttp.Response, err error) *JdJyOrderDetailsResult { + return &JdJyOrderDetailsResult{Result: result, Body: body, Http: http, Err: err} } // JdJyOrderDetails 【官方不维护】 京佣订单 @@ -41,9 +43,9 @@ func (app *App) JdJyOrderDetails(notMustParams ...Params) *JdJyOrderDetailsResul // 参数 params := app.NewParamsWith(notMustParams...) // 请求 - body, err := app.request("https://api.tbk.dingdanxia.com/jd/jy_order_details", params, http.MethodPost) + request, err := app.request("https://api.tbk.dingdanxia.com/jd/jy_order_details", params, http.MethodPost) // 定义 var response JdJyOrderDetailsResponse - err = json.Unmarshal(body, &response) - return NewJdJyOrderDetailsResult(response, body, err) + err = json.Unmarshal(request.Body, &response) + return NewJdJyOrderDetailsResult(response, request.Body, request, err) } diff --git a/service/dingdanxia/jd.order_details2.go b/service/dingdanxia/jd.order_details2.go index f106cc03..ea9e137e 100644 --- a/service/dingdanxia/jd.order_details2.go +++ b/service/dingdanxia/jd.order_details2.go @@ -11,9 +11,9 @@ func (app *App) JdOrderDetails2(notMustParams ...Params) *JdJyOrderDetailsResult // 参数 params := app.NewParamsWith(notMustParams...) // 请求 - body, err := app.request("https://api.tbk.dingdanxia.com/jd/order_details2", params, http.MethodPost) + request, err := app.request("https://api.tbk.dingdanxia.com/jd/order_details2", params, http.MethodPost) // 定义 var response JdJyOrderDetailsResponse - err = json.Unmarshal(body, &response) - return NewJdJyOrderDetailsResult(response, body, err) + err = json.Unmarshal(request.Body, &response) + return NewJdJyOrderDetailsResult(response, request.Body, request, err) } diff --git a/service/dingdanxia/mongodb.go b/service/dingdanxia/mongodb.go new file mode 100644 index 00000000..40477997 --- /dev/null +++ b/service/dingdanxia/mongodb.go @@ -0,0 +1,47 @@ +package dingdanxia + +import ( + "dtapps/dta/library/utils/gohttp" + "encoding/json" + "gitee.com/dtapps/go-library/utils/gotime" +) + +// 日志 +type mongoZap struct { + Url string `json:"url" bson:"url"` + Params interface{} `json:"params" bson:"params"` + Method string `json:"method" bson:"method"` + Header interface{} `json:"header" bson:"header"` + Status string `json:"status" bson:"status"` + StatusCode int `json:"status_code" bson:"status_code"` + Body interface{} `json:"body" bson:"body"` + ContentLength int64 `json:"content_length" bson:"content_length"` + CreateTime string `json:"create_time" bson:"create_time"` +} + +func (m *mongoZap) Database() string { + return "zap_logs" +} + +func (m *mongoZap) TableName() string { + return "dingdanxia_" + gotime.Current().SetFormat("200601") +} + +func (app *App) mongoLog(url string, params map[string]interface{}, method string, request gohttp.Response) { + if app.Mongo.Db == nil { + return + } + var body map[string]interface{} + _ = json.Unmarshal(request.Body, &body) + app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{ + Url: url, + Params: params, + Method: method, + Header: request.Header, + Status: request.Status, + StatusCode: request.StatusCode, + Body: body, + ContentLength: request.ContentLength, + CreateTime: gotime.Current().Format(), + }) +} diff --git a/service/dingdanxia/waimai.meituan_orderid.go b/service/dingdanxia/waimai.meituan_orderid.go new file mode 100644 index 00000000..c24a5b87 --- /dev/null +++ b/service/dingdanxia/waimai.meituan_orderid.go @@ -0,0 +1,63 @@ +package dingdanxia + +import ( + "dtapps/dta/library/utils/gohttp" + "encoding/json" + "net/http" +) + +type WaimaiMeituanOrderidResponse struct { + Code int `json:"code"` + Msg string `json:"msg"` + Data struct { + Order struct { + BusinessLine int `json:"businessLine"` + SubBusinessLine int `json:"subBusinessLine"` + ActId int `json:"actId"` + Quantity int `json:"quantity"` + OrderId string `json:"orderId"` + Paytime string `json:"paytime"` + ModTime string `json:"modTime"` + Payprice string `json:"payprice"` + Profit string `json:"profit"` + CpaProfit string `json:"cpaProfit"` + Sid string `json:"sid"` + Appkey string `json:"appkey"` + Smstitle string `json:"smstitle"` + Status int `json:"status"` + TradeTypeList []int `json:"tradeTypeList"` + RiskOrder interface{} `json:"riskOrder"` + Refundprofit interface{} `json:"refundprofit"` + CpaRefundProfit interface{} `json:"cpaRefundProfit"` + RefundInfoList interface{} `json:"refundInfoList"` + RefundProfitList interface{} `json:"refundProfitList"` + Extra interface{} `json:"extra"` + } `json:"order"` + } `json:"data"` +} + +type WaimaiMeituanOrderidResult struct { + Result WaimaiMeituanOrderidResponse // 结果 + Body []byte // 内容 + Http gohttp.Response // 请求 + Err error // 错误 +} + +func NewWaimaiMeituanOrderidResult(result WaimaiMeituanOrderidResponse, body []byte, http gohttp.Response, err error) *WaimaiMeituanOrderidResult { + return &WaimaiMeituanOrderidResult{Result: result, Body: body, Http: http, Err: err} +} + +// WaimaiMeituanOrderid 美团联盟外卖/闪购/优选/酒店订单查询API(订单号版) +// https://www.dingdanxia.com/doc/179/173 +func (app *App) WaimaiMeituanOrderid(orderid string) *WaimaiMeituanOrderidResult { + // 参数 + param := NewParams() + param.Set("orderid", orderid) + params := app.NewParamsWith(param) + // 请求 + request, err := app.request("https://api.tbk.dingdanxia.com/waimai/meituan_orderid", params, http.MethodPost) + // 定义 + var response WaimaiMeituanOrderidResponse + err = json.Unmarshal(request.Body, &response) + return NewWaimaiMeituanOrderidResult(response, request.Body, request, err) +} diff --git a/service/dingdanxia/waimai.meituan_orders.go b/service/dingdanxia/waimai.meituan_orders.go index 923830c9..be2e052e 100644 --- a/service/dingdanxia/waimai.meituan_orders.go +++ b/service/dingdanxia/waimai.meituan_orders.go @@ -1,6 +1,7 @@ package dingdanxia import ( + "dtapps/dta/library/utils/gohttp" "encoding/json" "net/http" ) @@ -29,11 +30,12 @@ type WaimaiMeituanOrdersResponse struct { type WaimaiMeituanOrdersResult struct { Result WaimaiMeituanOrdersResponse // 结果 Body []byte // 内容 + Http gohttp.Response // 请求 Err error // 错误 } -func NewWaimaiMeituanOrdersResult(result WaimaiMeituanOrdersResponse, body []byte, err error) *WaimaiMeituanOrdersResult { - return &WaimaiMeituanOrdersResult{Result: result, Body: body, Err: err} +func NewWaimaiMeituanOrdersResult(result WaimaiMeituanOrdersResponse, body []byte, http gohttp.Response, err error) *WaimaiMeituanOrdersResult { + return &WaimaiMeituanOrdersResult{Result: result, Body: body, Http: http, Err: err} } // WaimaiMeituanOrders 美团联盟外卖/闪购/优选/酒店订单查询API @@ -42,9 +44,9 @@ func (app *App) WaimaiMeituanOrders(notMustParams ...Params) *WaimaiMeituanOrder // 参数 params := app.NewParamsWith(notMustParams...) // 请求 - body, err := app.request("https://api.tbk.dingdanxia.com/waimai/meituan_orders", params, http.MethodPost) + request, err := app.request("https://api.tbk.dingdanxia.com/waimai/meituan_orders", params, http.MethodPost) // 定义 var response WaimaiMeituanOrdersResponse - err = json.Unmarshal(body, &response) - return NewWaimaiMeituanOrdersResult(response, body, err) + err = json.Unmarshal(request.Body, &response) + return NewWaimaiMeituanOrdersResult(response, request.Body, request, err) } diff --git a/service/dingdanxia/waimai.meituan_privilege.go b/service/dingdanxia/waimai.meituan_privilege.go new file mode 100644 index 00000000..5bb2c426 --- /dev/null +++ b/service/dingdanxia/waimai.meituan_privilege.go @@ -0,0 +1,53 @@ +package dingdanxia + +import ( + "dtapps/dta/library/utils/gohttp" + "encoding/json" + "net/http" +) + +type WaimaiMeituanPrivilegeResponse struct { + Code int `json:"code"` + Msg string `json:"msg"` + Data struct { + H5 string `json:"h5"` + ShortH5 string `json:"short_h5"` + Deeplink string `json:"deeplink"` + H5Evoke string `json:"h5_evoke"` + Tkl string `json:"tkl"` + WeAppInfo struct { + AppId string `json:"app_id"` + PagePath string `json:"page_path"` + MiniCode string `json:"miniCode"` + } `json:"we_app_info"` + Qrcode string `json:"qrcode"` + } `json:"data"` +} + +type WaimaiMeituanPrivilegeResult struct { + Result WaimaiMeituanPrivilegeResponse // 结果 + Body []byte // 内容 + Http gohttp.Response // 请求 + Err error // 错误 +} + +func NewWaimaiMeituanPrivilegeResult(result WaimaiMeituanPrivilegeResponse, body []byte, http gohttp.Response, err error) *WaimaiMeituanPrivilegeResult { + return &WaimaiMeituanPrivilegeResult{Result: result, Body: body, Http: http, Err: err} +} + +// WaimaiMeituanPrivilege 美团外卖CPS推广API接口 +// https://www.dingdanxia.com/doc/174/173 +func (app *App) WaimaiMeituanPrivilege(sid string, generateWeApp, qrcode bool) *WaimaiMeituanPrivilegeResult { + // 参数 + param := NewParams() + param.Set("sid", sid) + param.Set("generate_we_app", generateWeApp) + param.Set("qrcode", qrcode) + params := app.NewParamsWith(param) + // 请求 + request, err := app.request("https://api.tbk.dingdanxia.com/waimai/meituan_privilege", params, http.MethodPost) + // 定义 + var response WaimaiMeituanPrivilegeResponse + err = json.Unmarshal(request.Body, &response) + return NewWaimaiMeituanPrivilegeResult(response, request.Body, request, err) +} diff --git a/service/dingdanxia/waimai.meituan_sg_privilege.go b/service/dingdanxia/waimai.meituan_sg_privilege.go new file mode 100644 index 00000000..af1046a5 --- /dev/null +++ b/service/dingdanxia/waimai.meituan_sg_privilege.go @@ -0,0 +1,52 @@ +package dingdanxia + +import ( + "dtapps/dta/library/utils/gohttp" + "encoding/json" + "net/http" +) + +type WaimaiMeituanSgPrivilegeResponse struct { + Code int `json:"code"` + Msg string `json:"msg"` + Data struct { + H5 string `json:"h5"` + Deeplink string `json:"deeplink"` + H5Evoke string `json:"h5_evoke"` + ShortH5 string `json:"short_h5"` + WeAppInfo struct { + AppId string `json:"app_id"` + PagePath string `json:"page_path"` + MiniCode string `json:"miniCode"` + } `json:"we_app_info"` + Qrcode string `json:"qrcode"` + } `json:"data"` +} + +type WaimaiMeituanSgPrivilegeResult struct { + Result WaimaiMeituanSgPrivilegeResponse // 结果 + Body []byte // 内容 + Http gohttp.Response // 请求 + Err error // 错误 +} + +func NewWaimaiMeituanSgPrivilegeResult(result WaimaiMeituanSgPrivilegeResponse, body []byte, http gohttp.Response, err error) *WaimaiMeituanSgPrivilegeResult { + return &WaimaiMeituanSgPrivilegeResult{Result: result, Body: body, Http: http, Err: err} +} + +// WaimaiMeituanSgPrivilege 美团闪购CPS推广API接口 +// https://www.dingdanxia.com/doc/195/173 +func (app *App) WaimaiMeituanSgPrivilege(sid string, generateWeApp, qrcode bool) *WaimaiMeituanSgPrivilegeResult { + // 参数 + param := NewParams() + param.Set("sid", sid) + param.Set("generate_we_app", generateWeApp) + param.Set("qrcode", qrcode) + params := app.NewParamsWith(param) + // 请求 + request, err := app.request("https://api.tbk.dingdanxia.com/waimai/meituan_sg_privilege", params, http.MethodPost) + // 定义 + var response WaimaiMeituanSgPrivilegeResponse + err = json.Unmarshal(request.Body, &response) + return NewWaimaiMeituanSgPrivilegeResult(response, request.Body, request, err) +} diff --git a/service/dingtalk/app.go b/service/dingtalk/app.go index 172e38cb..84a22395 100644 --- a/service/dingtalk/app.go +++ b/service/dingtalk/app.go @@ -1,24 +1,17 @@ package dingtalk import ( + "dtapps/dta/library/utils/gohttp" + "dtapps/dta/library/utils/gomongo" "encoding/json" "errors" - "fmt" - "github.com/dtapps/go-library/utils/gohttp" - "github.com/go-redis/redis/v8" - "go.mongodb.org/mongo-driver/mongo" - "go.uber.org/zap" - "gorm.io/gorm" "net/http" ) type App struct { Secret string AccessToken string - ZapLog *zap.Logger // 日志服务 - Db *gorm.DB // 关系数据库服务 - RDb *redis.Client // 缓存数据库服务 - MDb *mongo.Client // 非关系数据库服务 + Mongo gomongo.App // 日志数据库 } func (app *App) request(url string, params map[string]interface{}, method string) ([]byte, error) { @@ -27,9 +20,7 @@ func (app *App) request(url string, params map[string]interface{}, method string // 请求 get, err := gohttp.Get(url, params) // 日志 - if app.ZapLog != nil { - app.ZapLog.Sugar().Info(fmt.Sprintf("%s %s %s", url, get.Header, get.Body)) - } + go app.mongoLog(url, params, method, get) return get.Body, err case http.MethodPost: // 请求参数 @@ -40,9 +31,7 @@ func (app *App) request(url string, params map[string]interface{}, method string // 请求 postJson, err := gohttp.PostJson(url, paramsMarshal) // 日志 - if app.ZapLog != nil { - app.ZapLog.Sugar().Info(fmt.Sprintf("%s %s %s", url, postJson.Header, postJson.Body)) - } + go app.mongoLog(url, params, method, postJson) return postJson.Body, err default: return nil, errors.New("请求类型不支持") diff --git a/service/dingtalk/go.mod b/service/dingtalk/go.mod deleted file mode 100644 index 49f9dc74..00000000 --- a/service/dingtalk/go.mod +++ /dev/null @@ -1,31 +0,0 @@ -module github.com/dtapps/go-library/service/dingtalk - -go 1.18 - -require ( - github.com/dtapps/go-library/utils/gohttp v0.0.0-20220320035257-384fd01c7e13 - github.com/go-redis/redis/v8 v8.11.5 - go.mongodb.org/mongo-driver v1.8.4 - go.uber.org/zap v1.21.0 - gorm.io/gorm v1.23.3 -) - -require ( - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/go-stack/stack v1.8.0 // indirect - github.com/golang/snappy v0.0.1 // indirect - github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jinzhu/now v1.1.4 // indirect - github.com/klauspost/compress v1.13.6 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.0.2 // indirect - github.com/xdg-go/stringprep v1.0.2 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f // indirect - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/text v0.3.6 // indirect -) diff --git a/service/dingtalk/mongodb.go b/service/dingtalk/mongodb.go new file mode 100644 index 00000000..6b7d5f9d --- /dev/null +++ b/service/dingtalk/mongodb.go @@ -0,0 +1,47 @@ +package dingtalk + +import ( + "dtapps/dta/library/utils/gohttp" + "encoding/json" + "gitee.com/dtapps/go-library/utils/gotime" +) + +// 日志 +type mongoZap struct { + Url string `json:"url" bson:"url"` + Params interface{} `json:"params" bson:"params"` + Method string `json:"method" bson:"method"` + Header interface{} `json:"header" bson:"header"` + Status string `json:"status" bson:"status"` + StatusCode int `json:"status_code" bson:"status_code"` + Body interface{} `json:"body" bson:"body"` + ContentLength int64 `json:"content_length" bson:"content_length"` + CreateTime string `json:"create_time" bson:"create_time"` +} + +func (m *mongoZap) Database() string { + return "zap_logs" +} + +func (m *mongoZap) TableName() string { + return "dingtalk_" + gotime.Current().SetFormat("200601") +} + +func (app *App) mongoLog(url string, params map[string]interface{}, method string, request gohttp.Response) { + if app.Mongo.Db == nil { + return + } + var body map[string]interface{} + _ = json.Unmarshal(request.Body, &body) + app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{ + Url: url, + Params: params, + Method: method, + Header: request.Header, + Status: request.Status, + StatusCode: request.StatusCode, + Body: body, + ContentLength: request.ContentLength, + CreateTime: gotime.Current().Format(), + }) +} diff --git a/service/eastiot/Iot_api.query_ordered_pkgInfo.go b/service/eastiot/Iot_api.query_ordered_pkgInfo.go index 759319b4..7f21be52 100644 --- a/service/eastiot/Iot_api.query_ordered_pkgInfo.go +++ b/service/eastiot/Iot_api.query_ordered_pkgInfo.go @@ -15,7 +15,7 @@ type IotApiQueryOrderedPkgInfoResponse struct { Ntraffic float64 `json:"ntraffic"` // 已用量,单位:MB Starttime int `json:"starttime"` // 流量生效起始时间时间戳 Endtime int `json:"endtime"` // 流量生效结束时间时间戳 - Addtime int `json:"addtime"` // 订购时间时间戳 + Addtime int64 `json:"addtime"` // 订购时间时间戳 } `json:"data"` Msg string `json:"msg"` } diff --git a/service/eastiot/Iot_api.get_all_sim_type.go b/service/eastiot/api.Iot_api.get_all_sim_type.go similarity index 100% rename from service/eastiot/Iot_api.get_all_sim_type.go rename to service/eastiot/api.Iot_api.get_all_sim_type.go diff --git a/service/eastiot/app.go b/service/eastiot/app.go index 2a0574ec..60ea0833 100644 --- a/service/eastiot/app.go +++ b/service/eastiot/app.go @@ -1,13 +1,9 @@ package eastiot import ( + "dtapps/dta/library/utils/gohttp" + "dtapps/dta/library/utils/gomongo" "errors" - "fmt" - "github.com/dtapps/go-library/utils/gohttp" - "github.com/go-redis/redis/v8" - "go.mongodb.org/mongo-driver/mongo" - "go.uber.org/zap" - "gorm.io/gorm" "net/http" "time" ) @@ -15,10 +11,7 @@ import ( type App struct { AppID string ApiKey string - ZapLog *zap.Logger // 日志服务 - Db *gorm.DB // 关系数据库服务 - RDb *redis.Client // 缓存数据库服务 - MDb *mongo.Client // 非关系数据库服务 + Mongo gomongo.App // 日志数据库 } func (app *App) request(url string, params map[string]interface{}, method string) ([]byte, error) { @@ -32,17 +25,13 @@ func (app *App) request(url string, params map[string]interface{}, method string // 请求 get, err := gohttp.Get(url, params) // 日志 - if app.ZapLog != nil { - app.ZapLog.Sugar().Info(fmt.Sprintf("%s %s %s", url, get.Header, get.Body)) - } + go app.mongoLog(url, params, method, get) return get.Body, err case http.MethodPost: // 请求 postJson, err := gohttp.PostForm(url, params) // 日志 - if app.ZapLog != nil { - app.ZapLog.Sugar().Info(fmt.Sprintf("%s %s %s", url, postJson.Header, postJson.Body)) - } + go app.mongoLog(url, params, method, postJson) return postJson.Body, err default: return nil, errors.New("请求类型不支持") diff --git a/service/eastiot/go.mod b/service/eastiot/go.mod deleted file mode 100644 index e83ee841..00000000 --- a/service/eastiot/go.mod +++ /dev/null @@ -1,32 +0,0 @@ -module github.com/dtapps/go-library/service/eastiot - -go 1.18 - -require ( - github.com/dtapps/go-library/utils/gohttp v0.0.0-20220320035257-384fd01c7e13 - github.com/dtapps/go-library/utils/gomd5 v0.0.0-20220320035257-384fd01c7e13 - github.com/go-redis/redis/v8 v8.11.5 - go.mongodb.org/mongo-driver v1.8.4 - go.uber.org/zap v1.21.0 - gorm.io/gorm v1.23.3 -) - -require ( - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/go-stack/stack v1.8.0 // indirect - github.com/golang/snappy v0.0.1 // indirect - github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jinzhu/now v1.1.4 // indirect - github.com/klauspost/compress v1.13.6 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.0.2 // indirect - github.com/xdg-go/stringprep v1.0.2 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f // indirect - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/text v0.3.6 // indirect -) diff --git a/service/eastiot/mongodb.go b/service/eastiot/mongodb.go new file mode 100644 index 00000000..80f76f07 --- /dev/null +++ b/service/eastiot/mongodb.go @@ -0,0 +1,47 @@ +package eastiot + +import ( + "dtapps/dta/library/utils/gohttp" + "encoding/json" + "gitee.com/dtapps/go-library/utils/gotime" +) + +// 日志 +type mongoZap struct { + Url string `json:"url" bson:"url"` + Params interface{} `json:"params" bson:"params"` + Method string `json:"method" bson:"method"` + Header interface{} `json:"header" bson:"header"` + Status string `json:"status" bson:"status"` + StatusCode int `json:"status_code" bson:"status_code"` + Body interface{} `json:"body" bson:"body"` + ContentLength int64 `json:"content_length" bson:"content_length"` + CreateTime string `json:"create_time" bson:"create_time"` +} + +func (m *mongoZap) Database() string { + return "zap_logs" +} + +func (m *mongoZap) TableName() string { + return "eastiot_" + gotime.Current().SetFormat("200601") +} + +func (app *App) mongoLog(url string, params map[string]interface{}, method string, request gohttp.Response) { + if app.Mongo.Db == nil { + return + } + var body map[string]interface{} + _ = json.Unmarshal(request.Body, &body) + app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{ + Url: url, + Params: params, + Method: method, + Header: request.Header, + Status: request.Status, + StatusCode: request.StatusCode, + Body: body, + ContentLength: request.ContentLength, + CreateTime: gotime.Current().Format(), + }) +} diff --git a/service/eastiot/sign.go b/service/eastiot/sign.go index b0ff1d58..e040658d 100644 --- a/service/eastiot/sign.go +++ b/service/eastiot/sign.go @@ -3,7 +3,7 @@ package eastiot import ( "encoding/json" "fmt" - "github.com/dtapps/go-library/utils/gomd5" + "gitee.com/dtapps/go-library/utils/gomd5" "sort" "strconv" ) diff --git a/service/ejiaofei/app.go b/service/ejiaofei/app.go index ccf5cc10..9be16ff8 100644 --- a/service/ejiaofei/app.go +++ b/service/ejiaofei/app.go @@ -1,14 +1,11 @@ package ejiaofei import ( + "dtapps/dta/library/utils/gohttp" + "dtapps/dta/library/utils/gomongo" "errors" "fmt" - "github.com/dtapps/go-library/utils/gohttp" - "github.com/dtapps/go-library/utils/gomd5" - "github.com/go-redis/redis/v8" - "go.mongodb.org/mongo-driver/mongo" - "go.uber.org/zap" - "gorm.io/gorm" + "gitee.com/dtapps/go-library/utils/gomd5" "net/http" ) @@ -17,10 +14,7 @@ type App struct { Pwd string Key string signStr string - ZapLog *zap.Logger // 日志服务 - Db *gorm.DB // 关系数据库服务 - RDb *redis.Client // 缓存数据库服务 - MDb *mongo.Client // 非关系数据库服务 + Mongo gomongo.App // 日志数据库 } func (app *App) request(url string, params map[string]interface{}, method string) ([]byte, error) { @@ -34,17 +28,13 @@ func (app *App) request(url string, params map[string]interface{}, method string // 请求 get, err := gohttp.Get(url, params) // 日志 - if app.ZapLog != nil { - app.ZapLog.Sugar().Info(fmt.Sprintf("%s %s %s", url, get.Header, get.Body)) - } + go app.mongoLog(url, params, method, get) return get.Body, err case http.MethodPost: // 请求 postJson, err := gohttp.PostForm(url, params) // 日志 - if app.ZapLog != nil { - app.ZapLog.Sugar().Info(fmt.Sprintf("%s %s %s", url, postJson.Header, postJson.Body)) - } + go app.mongoLog(url, params, method, postJson) return postJson.Body, err default: return nil, errors.New("请求类型不支持") diff --git a/service/ejiaofei/go.mod b/service/ejiaofei/go.mod deleted file mode 100644 index 3f730526..00000000 --- a/service/ejiaofei/go.mod +++ /dev/null @@ -1,32 +0,0 @@ -module github.com/dtapps/go-library/service/ejiaofei - -go 1.18 - -require ( - github.com/dtapps/go-library/utils/gohttp v0.0.0-20220320040709-ad8a5f0e9e40 - github.com/dtapps/go-library/utils/gomd5 v0.0.0-20220320040709-ad8a5f0e9e40 - github.com/go-redis/redis/v8 v8.11.5 - go.mongodb.org/mongo-driver v1.8.4 - go.uber.org/zap v1.21.0 - gorm.io/gorm v1.23.3 -) - -require ( - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/go-stack/stack v1.8.0 // indirect - github.com/golang/snappy v0.0.1 // indirect - github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jinzhu/now v1.1.4 // indirect - github.com/klauspost/compress v1.13.6 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.0.2 // indirect - github.com/xdg-go/stringprep v1.0.2 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f // indirect - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/text v0.3.6 // indirect -) diff --git a/service/ejiaofei/mongodb.go b/service/ejiaofei/mongodb.go new file mode 100644 index 00000000..10b1a15b --- /dev/null +++ b/service/ejiaofei/mongodb.go @@ -0,0 +1,44 @@ +package ejiaofei + +import ( + "dtapps/dta/library/utils/gohttp" + "gitee.com/dtapps/go-library/utils/gotime" +) + +// 日志 +type mongoZap struct { + Url string `json:"url" bson:"url"` + Params interface{} `json:"params" bson:"params"` + Method string `json:"method" bson:"method"` + Header interface{} `json:"header" bson:"header"` + Status string `json:"status" bson:"status"` + StatusCode int `json:"status_code" bson:"status_code"` + Body interface{} `json:"body" bson:"body"` + ContentLength int64 `json:"content_length" bson:"content_length"` + CreateTime string `json:"create_time" bson:"create_time"` +} + +func (m *mongoZap) Database() string { + return "zap_logs" +} + +func (m *mongoZap) TableName() string { + return "ejiaofei_" + gotime.Current().SetFormat("200601") +} + +func (app *App) mongoLog(url string, params map[string]interface{}, method string, request gohttp.Response) { + if app.Mongo.Db == nil { + return + } + app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{ + Url: url, + Params: params, + Method: method, + Header: request.Header, + Status: request.Status, + StatusCode: request.StatusCode, + Body: string(request.Body), + ContentLength: request.ContentLength, + CreateTime: gotime.Current().Format(), + }) +} diff --git a/service/ejiaofei/query_tx_product.go b/service/ejiaofei/query_txproduct.go similarity index 100% rename from service/ejiaofei/query_tx_product.go rename to service/ejiaofei/query_txproduct.go diff --git a/service/ejiaofei/tx_chongzhi.go b/service/ejiaofei/txchongzhi.go similarity index 100% rename from service/ejiaofei/tx_chongzhi.go rename to service/ejiaofei/txchongzhi.go diff --git a/service/feishu/app.go b/service/feishu/app.go new file mode 100644 index 00000000..094c67ba --- /dev/null +++ b/service/feishu/app.go @@ -0,0 +1,23 @@ +package feishu + +import ( + "dtapps/dta/library/utils/gohttp" + "dtapps/dta/library/utils/gomongo" + "encoding/json" + "net/http" +) + +type App struct { + Key string + Mongo gomongo.App // 日志数据库 +} + +func (app *App) request(url string, params map[string]interface{}) (body []byte, err error) { + // 请求参数 + paramsStr, err := json.Marshal(params) + // 请求 + postJson, err := gohttp.PostJson(url, paramsStr) + // 日志 + go app.mongoLog(url, params, http.MethodPost, postJson) + return postJson.Body, err +} diff --git a/service/feishu/mongodb.go b/service/feishu/mongodb.go new file mode 100644 index 00000000..a21d5c59 --- /dev/null +++ b/service/feishu/mongodb.go @@ -0,0 +1,47 @@ +package feishu + +import ( + "dtapps/dta/library/utils/gohttp" + "encoding/json" + "gitee.com/dtapps/go-library/utils/gotime" +) + +// 日志 +type mongoZap struct { + Url string `json:"url" bson:"url"` + Params interface{} `json:"params" bson:"params"` + Method string `json:"method" bson:"method"` + Header interface{} `json:"header" bson:"header"` + Status string `json:"status" bson:"status"` + StatusCode int `json:"status_code" bson:"status_code"` + Body interface{} `json:"body" bson:"body"` + ContentLength int64 `json:"content_length" bson:"content_length"` + CreateTime string `json:"create_time" bson:"create_time"` +} + +func (m *mongoZap) Database() string { + return "zap_logs" +} + +func (m *mongoZap) TableName() string { + return "feishu_" + gotime.Current().SetFormat("200601") +} + +func (app *App) mongoLog(url string, params map[string]interface{}, method string, request gohttp.Response) { + if app.Mongo.Db == nil { + return + } + var body map[string]interface{} + _ = json.Unmarshal(request.Body, &body) + app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{ + Url: url, + Params: params, + Method: method, + Header: request.Header, + Status: request.Status, + StatusCode: request.StatusCode, + Body: body, + ContentLength: request.ContentLength, + CreateTime: gotime.Current().Format(), + }) +} diff --git a/service/feishu/params.go b/service/feishu/params.go new file mode 100644 index 00000000..87178f01 --- /dev/null +++ b/service/feishu/params.go @@ -0,0 +1,27 @@ +package feishu + +// Params 请求参数 +type Params map[string]interface{} + +func NewParams() Params { + p := make(Params) + return p +} + +func (app *App) NewParamsWith(params ...Params) Params { + p := make(Params) + for _, v := range params { + p.SetParams(v) + } + return p +} + +func (p Params) Set(key string, value interface{}) { + p[key] = value +} + +func (p Params) SetParams(params Params) { + for key, value := range params { + p[key] = value + } +} diff --git a/service/feishu/webhook.go b/service/feishu/webhook.go new file mode 100644 index 00000000..7435f1aa --- /dev/null +++ b/service/feishu/webhook.go @@ -0,0 +1,36 @@ +package feishu + +import ( + "encoding/json" + "fmt" +) + +type WebhookSendResponse struct { + Errcode int64 `json:"errcode"` + Errmsg string `json:"errmsg"` + Type string `json:"type"` + MediaId string `json:"media_id"` + CreatedAt string `json:"created_at"` +} + +type WebhookSendResult struct { + Result WebhookSendResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewWebhookSendResult(result WebhookSendResponse, body []byte, err error) *WebhookSendResult { + return &WebhookSendResult{Result: result, Body: body, Err: err} +} + +// WebhookSend https://open.feishu.cn/document/ukTMukTMukTM/ucTM5YjL3ETO24yNxkjN +func (app *App) WebhookSend(notMustParams ...Params) *WebhookSendResult { + // 参数 + params := app.NewParamsWith(notMustParams...) + // 请求 + body, err := app.request(fmt.Sprintf("https://open.feishu.cn/open-apis/bot/v2/hook/%s", app.Key), params) + // 定义 + var response WebhookSendResponse + err = json.Unmarshal(body, &response) + return NewWebhookSendResult(response, body, err) +} diff --git a/service/go.mod b/service/go.mod deleted file mode 100644 index 3def193a..00000000 --- a/service/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/dtapps/go-library/service - -go 1.18 diff --git a/service/ip/app.go b/service/ip/app.go index 5130eff7..9e28fc16 100644 --- a/service/ip/app.go +++ b/service/ip/app.go @@ -1,9 +1,10 @@ package ip import ( - "github.com/dtapps/go-library/service/ip/ip2region" - v4 "github.com/dtapps/go-library/service/ip/v4" - v6 "github.com/dtapps/go-library/service/ip/v6" + "dtapps/dta/library/service/ip/ip2region" + v4 "dtapps/dta/library/service/ip/v4" + v6 "dtapps/dta/library/service/ip/v6" + "dtapps/dta/library/utils/gopostgresql" "os" "strings" ) @@ -12,6 +13,7 @@ type App struct { V4Region ip2region.Ip2Region V4db v4.Pointer V6db v6.Pointer + Pgsql gopostgresql.App // 日志数据库 } type FileData struct { @@ -19,6 +21,21 @@ type FileData struct { Path *os.File } +func (app *App) Ipv4(ip string) (res v4.Result, resInfo ip2region.IpInfo) { + res = app.V4db.Find(ip) + resInfo, _ = app.V4Region.MemorySearch(ip) + // 日志 + go app.postgresqlIpv4Log(res, resInfo) + return res, resInfo +} + +func (app *App) Ipv6(ip string) (res v6.Result) { + res = app.V6db.Find(ip) + // 日志 + go app.postgresqlIpv6Log(res) + return res +} + func (app *App) isIpv4OrIpv6(ip string) string { if len(ip) < 7 { return "" diff --git a/service/ip/go.mod b/service/ip/go.mod deleted file mode 100644 index 3519d860..00000000 --- a/service/ip/go.mod +++ /dev/null @@ -1,8 +0,0 @@ -module github.com/dtapps/go-library/service/ip - -go 1.18 - -require ( - github.com/dtapps/go-library/utils/gostring v0.0.0-20220320035257-384fd01c7e13 - golang.org/x/text v0.3.7 -) diff --git a/service/ip/ip2region/ip2region.go b/service/ip/ip2region/ip2region.go index 27cfaaa3..aa77ac1a 100644 --- a/service/ip/ip2region/ip2region.go +++ b/service/ip/ip2region/ip2region.go @@ -1,9 +1,9 @@ package ip2region import ( + "dtapps/dta/library/utils/gostring" _ "embed" "errors" - "github.com/dtapps/go-library/utils/gostring" "os" "strconv" "strings" diff --git a/service/ip/log.go b/service/ip/log.go new file mode 100644 index 00000000..d96ac61d --- /dev/null +++ b/service/ip/log.go @@ -0,0 +1,108 @@ +package ip + +import ( + "dtapps/dta/library/service/ip/ip2region" + v4 "dtapps/dta/library/service/ip/v4" + v6 "dtapps/dta/library/service/ip/v6" +) + +func (app *App) InitLog() { + if app.Pgsql.Db == nil { + return + } + + err := app.Pgsql.Db.AutoMigrate(&postgresqlIpv4{}, &postgresqlIpv6{}) + if err != nil { + panic(err.Error()) + } +} + +// Ipv4 数据库 +type postgresqlIpv4 struct { + Id int64 + Ip string `gorm:"type:cidr"` // 输入的ip地址 + Country string `gorm:"type:text"` // 国家 + Province string `gorm:"type:text"` // 省份 + City string `gorm:"type:text"` // 城市 + Area string `gorm:"type:text"` // 区域 + Isp string `gorm:"type:text"` // 运营商 + Idc string `gorm:"type:text"` // 运营商 +} + +func (m *postgresqlIpv4) TableName() string { + return "ip_v4" +} + +func (app *App) postgresqlIpv4Log(res v4.Result, resInfo ip2region.IpInfo) { + if app.Pgsql.Db == nil { + return + } + var query postgresqlIpv4 + app.Pgsql.Db.Where("ip = ?", resInfo.IP).Select("id").Take(&query) + if query.Id == 0 { + app.Pgsql.Db.Create(&postgresqlIpv4{ + Ip: resInfo.IP, + Country: resInfo.Country, + Province: resInfo.Province, + City: resInfo.City, + Isp: resInfo.ISP, + Idc: res.Area, + }) + } else { + app.Pgsql.Db.Model(&postgresqlIpv4{}). + Where("ip = ?", res.IP). + Select("country", "province", "city", "isp", "idc"). + Updates(postgresqlIpv4{ + Country: resInfo.Country, + Province: resInfo.Province, + City: resInfo.City, + Isp: resInfo.ISP, + Idc: res.Area, + }) + } +} + +// Ipv6 数据库 +type postgresqlIpv6 struct { + Id int64 + Ip string `gorm:"type:cidr"` // 输入的ip地址 + Country string `gorm:"type:text"` // 国家 + Province string `gorm:"type:text"` // 省份 + City string `gorm:"type:text"` // 城市 + Area string `gorm:"type:text"` // 区域 + Isp string `gorm:"type:text"` // 运营商 +} + +func (m *postgresqlIpv6) TableName() string { + return "ip_v6" +} + +func (app *App) postgresqlIpv6Log(res v6.Result) { + if app.Pgsql.Db == nil { + return + } + var query postgresqlIpv6 + app.Pgsql.Db.Where("ip = ?", res.IP).Select("id").Take(&query) + if query.Id == 0 { + app.Pgsql.Db.Create(&postgresqlIpv6{ + Ip: res.IP, + Country: res.Country, + Province: res.Province, + City: res.City, + Area: res.Area, + Isp: res.Isp, + }) + } else { + app.Pgsql.Db.Model(&postgresqlIpv6{}). + Where("ip = ?", res.IP). + Select("country", "area"). + Select("country", "province", "city", "area", "isp"). + Updates(postgresqlIpv6{ + Country: res.Country, + Province: res.Province, + City: res.City, + Area: res.Area, + Isp: res.Isp, + }) + } +} diff --git a/service/ip/v4/ipv4.go b/service/ip/v4/ipv4.go index faed59a0..c2215dd0 100644 --- a/service/ip/v4/ipv4.go +++ b/service/ip/v4/ipv4.go @@ -1,9 +1,9 @@ package v4 import ( + "dtapps/dta/library/utils/gostring" _ "embed" "encoding/binary" - "github.com/dtapps/go-library/utils/gostring" "golang.org/x/text/encoding/simplifiedchinese" "net" ) diff --git a/service/ip/v6/ipv6.go b/service/ip/v6/ipv6.go index b245bfae..b12a0233 100644 --- a/service/ip/v6/ipv6.go +++ b/service/ip/v6/ipv6.go @@ -1,9 +1,9 @@ package v6 import ( + "dtapps/dta/library/utils/gostring" _ "embed" "encoding/binary" - "github.com/dtapps/go-library/utils/gostring" "math/big" "net" "strings" diff --git a/service/jd/app.go b/service/jd/app.go index f35a3253..f0259bdf 100644 --- a/service/jd/app.go +++ b/service/jd/app.go @@ -1,21 +1,18 @@ package jd import ( + "dtapps/dta/library/utils/gohttp" + "dtapps/dta/library/utils/gomongo" "fmt" - "github.com/dtapps/go-library/utils/gohttp" - "github.com/go-redis/redis/v8" - "go.mongodb.org/mongo-driver/mongo" - "go.uber.org/zap" - "gorm.io/gorm" + "net/http" ) type App struct { - AppKey string // 应用Key - SecretKey string // 密钥 - ZapLog *zap.Logger // 日志服务 - Db *gorm.DB // 关系数据库服务 - RDb *redis.Client // 缓存数据库服务 - MDb *mongo.Client // 非关系数据库服务 + AppKey string // 应用Key + SecretKey string // 密钥 + SiteId string // 网站ID/APP ID + PositionId string // 推广位id + Mongo gomongo.App // 日志数据库 } func (app *App) request(params map[string]interface{}) (resp []byte, err error) { @@ -24,9 +21,7 @@ func (app *App) request(params map[string]interface{}) (resp []byte, err error) // 发送请求 get, err := gohttp.PostForm("https://api.jd.com/routerjson", params) // 日志 - if app.ZapLog != nil { - app.ZapLog.Sugar().Info(fmt.Sprintf("https://api.jd.com/routerjson?method=%s %s %s", params["method"], get.Header, get.Body)) - } + go app.mongoLog(fmt.Sprintf("https://api.jd.com/routerjson?method=%s", params["method"]), params, http.MethodPost, get) return get.Body, err } diff --git a/service/jd/go.mod b/service/jd/go.mod deleted file mode 100644 index 58a35af9..00000000 --- a/service/jd/go.mod +++ /dev/null @@ -1,31 +0,0 @@ -module github.com/dtapps/go-library/service/jd - -go 1.18 - -require ( - github.com/dtapps/go-library/utils/gohttp v0.0.0-20220320040709-ad8a5f0e9e40 - github.com/go-redis/redis/v8 v8.11.5 - go.mongodb.org/mongo-driver v1.8.4 - go.uber.org/zap v1.21.0 - gorm.io/gorm v1.23.3 -) - -require ( - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/go-stack/stack v1.8.0 // indirect - github.com/golang/snappy v0.0.1 // indirect - github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jinzhu/now v1.1.4 // indirect - github.com/klauspost/compress v1.13.6 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.0.2 // indirect - github.com/xdg-go/stringprep v1.0.2 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f // indirect - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/text v0.3.6 // indirect -) diff --git a/service/jd/jd.union.open.activity.query.go b/service/jd/jd.union.open.activity.query.go new file mode 100644 index 00000000..ed458d1f --- /dev/null +++ b/service/jd/jd.union.open.activity.query.go @@ -0,0 +1,71 @@ +package jd + +import "encoding/json" + +type UnionOpenActivityQueryResultResponse struct { + JdUnionOpenActivityQueryResponce struct { + Code string `json:"code"` + QueryResult string `json:"queryResult"` + } `json:"jd_union_open_activity_query_responce"` +} + +type UnionOpenActivityQueryQueryResult struct { + Code int `json:"code"` + Data []struct { + ActStatus int `json:"actStatus"` + Advantage string `json:"advantage"` + CategoryList []struct { + CategoryId int `json:"categoryId"` + Type int `json:"type"` + } `json:"categoryList,omitempty"` + Content string `json:"content"` + DownloadCode string `json:"downloadCode"` + DownloadUrl string `json:"downloadUrl"` + EndTime int64 `json:"endTime"` + Id int `json:"id"` + ImgList []struct { + ImgName string `json:"imgName"` + ImgUrl string `json:"imgUrl"` + WidthHeight string `json:"widthHeight"` + } `json:"imgList,omitempty"` + PlatformType int `json:"platformType"` + PromotionEndTime int64 `json:"promotionEndTime,omitempty"` + PromotionStartTime int64 `json:"promotionStartTime,omitempty"` + Recommend int `json:"recommend,omitempty"` + StartTime int64 `json:"startTime"` + Tag string `json:"tag"` + Title string `json:"title"` + UpdateTime int64 `json:"updateTime"` + UrlM string `json:"urlM"` + UrlPC string `json:"urlPC"` + } `json:"data"` + Message string `json:"message"` + RequestId string `json:"requestId"` + TotalCount int `json:"totalCount"` +} + +type UnionOpenActivityQueryResult struct { + Responce UnionOpenActivityQueryResultResponse // 结果 + Result UnionOpenActivityQueryQueryResult // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewUnionOpenActivityQueryResult(responce UnionOpenActivityQueryResultResponse, result UnionOpenActivityQueryQueryResult, body []byte, err error) *UnionOpenActivityQueryResult { + return &UnionOpenActivityQueryResult{Responce: responce, Result: result, Body: body, Err: err} +} + +// UnionOpenActivityQuery 活动查询接口 +// https://union.jd.com/openplatform/api/v2?apiName=jd.union.open.activity.query +func (app *App) UnionOpenActivityQuery(notMustParams ...Params) *UnionOpenActivityQueryResult { + // 参数 + params := NewParamsWithType("jd.union.open.activity.query", notMustParams...) + // 请求 + body, err := app.request(params) + // 定义 + var responce UnionOpenActivityQueryResultResponse + var result UnionOpenActivityQueryQueryResult + err = json.Unmarshal(body, &responce) + err = json.Unmarshal([]byte(responce.JdUnionOpenActivityQueryResponce.QueryResult), &result) + return NewUnionOpenActivityQueryResult(responce, result, body, err) +} diff --git a/service/jd/jd.union.open.category.goods.get.go b/service/jd/jd.union.open.category.goods.get.go new file mode 100644 index 00000000..029cef5b --- /dev/null +++ b/service/jd/jd.union.open.category.goods.get.go @@ -0,0 +1,48 @@ +package jd + +import "encoding/json" + +type UnionOpenCategoryGoodsGetResultResponse struct { + JdUnionOpenCategoryGoodsGetResponce struct { + Code string `json:"code"` + GetResult string `json:"getResult"` + } `json:"jd_union_open_category_goods_get_responce"` +} + +type UnionOpenCategoryGoodsGetQueryResult struct { + Code int `json:"code"` + Data []struct { + Grade int `json:"grade"` // 类目级别(类目级别 0,1,2 代表一、二、三级类目) + Name string `json:"name"` // 类目名称 + Id int `json:"id"` // 类目Id + ParentId int `json:"parentId"` // 父类目Id + } `json:"data"` + Message string `json:"message"` + RequestId string `json:"requestId"` +} + +type UnionOpenCategoryGoodsGetResult struct { + Responce UnionOpenCategoryGoodsGetResultResponse // 结果 + Result UnionOpenCategoryGoodsGetQueryResult // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewUnionOpenCategoryGoodsGetResult(responce UnionOpenCategoryGoodsGetResultResponse, result UnionOpenCategoryGoodsGetQueryResult, body []byte, err error) *UnionOpenCategoryGoodsGetResult { + return &UnionOpenCategoryGoodsGetResult{Responce: responce, Result: result, Body: body, Err: err} +} + +// UnionOpenCategoryGoodsGet 商品类目查询接口 +// https://union.jd.com/openplatform/api/v2?apiName=jd.union.open.category.goods.get +func (app *App) UnionOpenCategoryGoodsGet(notMustParams ...Params) *UnionOpenCategoryGoodsGetResult { + // 参数 + params := NewParamsWithType("jd.union.open.category.goods.get", notMustParams...) + // 请求 + body, err := app.request(params) + // 定义 + var responce UnionOpenCategoryGoodsGetResultResponse + var result UnionOpenCategoryGoodsGetQueryResult + err = json.Unmarshal(body, &responce) + err = json.Unmarshal([]byte(responce.JdUnionOpenCategoryGoodsGetResponce.GetResult), &result) + return NewUnionOpenCategoryGoodsGetResult(responce, result, body, err) +} diff --git a/service/jd/jd.union.open.coupon.gift.get.go b/service/jd/jd.union.open.coupon.gift.get.go new file mode 100644 index 00000000..fdd9350f --- /dev/null +++ b/service/jd/jd.union.open.coupon.gift.get.go @@ -0,0 +1 @@ +package jd diff --git a/service/jd/jd.union.open.coupon.gift.stop.go b/service/jd/jd.union.open.coupon.gift.stop.go new file mode 100644 index 00000000..fdd9350f --- /dev/null +++ b/service/jd/jd.union.open.coupon.gift.stop.go @@ -0,0 +1 @@ +package jd diff --git a/service/jd/jd.union.open.goods.bigfield.query.go b/service/jd/jd.union.open.goods.bigfield.query.go new file mode 100644 index 00000000..4234381c --- /dev/null +++ b/service/jd/jd.union.open.goods.bigfield.query.go @@ -0,0 +1,68 @@ +package jd + +import "encoding/json" + +type UnionOpenGoodsBigfieldQueryResultResponse struct { + JdUnionOpenGoodsBigfieldQueryResponce struct { + Code string `json:"code"` + QueryResult string `json:"queryResult"` + } `json:"jd_union_open_goods_bigfield_query_responce"` +} + +type UnionOpenGoodsBigfieldQueryQueryResult struct { + Code int `json:"code"` + Data []struct { + BaseBigFieldInfo struct { + WareQD string `json:"wareQD"` + Wdis string `json:"wdis"` + } `json:"baseBigFieldInfo"` + CategoryInfo struct { + Cid1 int `json:"cid1"` + Cid1Name string `json:"cid1Name"` + Cid2 int `json:"cid2"` + Cid2Name string `json:"cid2Name"` + Cid3 int `json:"cid3"` + Cid3Name string `json:"cid3Name"` + } `json:"categoryInfo"` + DetailImages string `json:"detailImages"` + ImageInfo struct { + ImageList []struct { + Url string `json:"url"` + } `json:"imageList"` + } `json:"imageInfo"` + MainSkuId int64 `json:"mainSkuId"` + Owner string `json:"owner"` + ProductId int64 `json:"productId"` + SkuId int64 `json:"skuId"` + SkuName string `json:"skuName"` + SkuStatus int `json:"skuStatus"` + } `json:"data"` + Message string `json:"message"` + RequestId string `json:"requestId"` +} + +type UnionOpenGoodsBigfieldQueryResult struct { + Responce UnionOpenGoodsBigfieldQueryResultResponse // 结果 + Result UnionOpenGoodsBigfieldQueryQueryResult // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewUnionOpenGoodsBigfieldQueryResult(responce UnionOpenGoodsBigfieldQueryResultResponse, result UnionOpenGoodsBigfieldQueryQueryResult, body []byte, err error) *UnionOpenGoodsBigfieldQueryResult { + return &UnionOpenGoodsBigfieldQueryResult{Responce: responce, Result: result, Body: body, Err: err} +} + +// UnionOpenGoodsBigfieldQuery 商品详情查询接口 +// https://union.jd.com/openplatform/api/v2?apiName=jd.union.open.goods.bigfield.query +func (app *App) UnionOpenGoodsBigfieldQuery(notMustParams ...Params) *UnionOpenGoodsBigfieldQueryResult { + // 参数 + params := NewParamsWithType("jd.union.open.goods.bigfield.query", notMustParams...) + // 请求 + body, err := app.request(params) + // 定义 + var responce UnionOpenGoodsBigfieldQueryResultResponse + var result UnionOpenGoodsBigfieldQueryQueryResult + err = json.Unmarshal(body, &responce) + err = json.Unmarshal([]byte(responce.JdUnionOpenGoodsBigfieldQueryResponce.QueryResult), &result) + return NewUnionOpenGoodsBigfieldQueryResult(responce, result, body, err) +} diff --git a/service/jd/union.open.goods.jingfen.query.go b/service/jd/jd.union.open.goods.jingfen.query.go similarity index 93% rename from service/jd/union.open.goods.jingfen.query.go rename to service/jd/jd.union.open.goods.jingfen.query.go index 4eb5f3b5..a885fb28 100644 --- a/service/jd/union.open.goods.jingfen.query.go +++ b/service/jd/jd.union.open.goods.jingfen.query.go @@ -102,7 +102,7 @@ type UnionOpenGoodsJIngFenQueryQueryResult struct { Spuid int64 `json:"spuid"` } `json:"data"` Message string `json:"message"` - TotalCount int `json:"totalCount"` + TotalCount int64 `json:"totalCount"` } type UnionOpenGoodsJIngFenQueryResult struct { @@ -116,8 +116,7 @@ func NewUnionOpenGoodsJIngFenQueryResult(responce UnionOpenGoodsJIngFenQueryResu return &UnionOpenGoodsJIngFenQueryResult{Responce: responce, Result: result, Body: body, Err: err} } -// UnionOpenGoodsJIngFenQuery -// 京东联盟精选优质商品,每日更新,可通过频道ID查询各个频道下的精选商品。用获取的优惠券链接调用转链接口时,需传入搜索接口link字段返回的原始优惠券链接,切勿对链接进行任何encode、decode操作,否则将导致转链二合一推广链接时校验失败 +// UnionOpenGoodsJIngFenQuery 京粉精选商品查询接口 // https://union.jd.com/openplatform/api/v2?apiName=jd.union.open.goods.jingfen.query func (app *App) UnionOpenGoodsJIngFenQuery(notMustParams ...Params) *UnionOpenGoodsJIngFenQueryResult { // 参数 diff --git a/service/jd/jd.union.open.goods.material.query.go b/service/jd/jd.union.open.goods.material.query.go new file mode 100644 index 00000000..0c0bca92 --- /dev/null +++ b/service/jd/jd.union.open.goods.material.query.go @@ -0,0 +1,129 @@ +package jd + +import "encoding/json" + +type UnionOpenGoodsMaterialQueryResultResponse struct { + JdUnionOpenGoodsMaterialQueryResponce struct { + Code string `json:"code"` + QueryResult string `json:"queryResult"` + } `json:"jd_union_open_goods_material_query_responce"` +} + +type UnionOpenGoodsMaterialQueryQueryResult struct { + Code int `json:"code"` + Data []struct { + BrandCode string `json:"brandCode"` + BrandName string `json:"brandName"` + CategoryInfo struct { + Cid1 int `json:"cid1"` + Cid1Name string `json:"cid1Name"` + Cid2 int `json:"cid2"` + Cid2Name string `json:"cid2Name"` + Cid3 int `json:"cid3"` + Cid3Name string `json:"cid3Name"` + } `json:"categoryInfo"` + Comments int `json:"comments"` + CommissionInfo struct { + Commission float64 `json:"commission"` + CommissionShare float64 `json:"commissionShare"` + CouponCommission float64 `json:"couponCommission"` + PlusCommissionShare float64 `json:"plusCommissionShare"` + } `json:"commissionInfo"` + CouponInfo struct { + CouponList []struct { + BindType int `json:"bindType"` + Discount float64 `json:"discount"` + GetEndTime int64 `json:"getEndTime"` + GetStartTime int64 `json:"getStartTime"` + IsBest int `json:"isBest"` + Link string `json:"link"` + PlatformType int `json:"platformType"` + Quota float64 `json:"quota"` + UseEndTime int64 `json:"useEndTime"` + UseStartTime int64 `json:"useStartTime"` + } `json:"couponList"` + } `json:"couponInfo"` + DeliveryType int `json:"deliveryType"` + ForbidTypes []int `json:"forbidTypes"` + GoodCommentsShare float64 `json:"goodCommentsShare"` + ImageInfo struct { + ImageList []struct { + Url string `json:"url"` + } `json:"imageList"` + WhiteImage string `json:"whiteImage,omitempty"` + } `json:"imageInfo"` + InOrderCount30Days int `json:"inOrderCount30Days"` + InOrderCount30DaysSku int `json:"inOrderCount30DaysSku"` + IsHot int `json:"isHot"` + JxFlags []int `json:"jxFlags,omitempty"` + MaterialUrl string `json:"materialUrl"` + Owner string `json:"owner"` + PinGouInfo struct { + PingouEndTime int64 `json:"pingouEndTime,omitempty"` + PingouPrice float64 `json:"pingouPrice,omitempty"` + PingouStartTime int64 `json:"pingouStartTime,omitempty"` + PingouTmCount int `json:"pingouTmCount,omitempty"` + PingouUrl string `json:"pingouUrl,omitempty"` + } `json:"pinGouInfo"` + PriceInfo struct { + LowestCouponPrice float64 `json:"lowestCouponPrice"` + LowestPrice float64 `json:"lowestPrice"` + LowestPriceType int `json:"lowestPriceType"` + Price float64 `json:"price"` + } `json:"priceInfo"` + PromotionInfo struct { + ClickURL string `json:"clickURL"` + } `json:"promotionInfo"` + ResourceInfo struct { + EliteId int `json:"eliteId"` + EliteName string `json:"eliteName"` + } `json:"resourceInfo"` + ShopInfo struct { + ShopId int `json:"shopId"` + ShopLabel string `json:"shopLabel"` + ShopLevel float64 `json:"shopLevel"` + ShopName string `json:"shopName"` + AfsFactorScoreRankGrade string `json:"afsFactorScoreRankGrade,omitempty"` + AfterServiceScore string `json:"afterServiceScore,omitempty"` + CommentFactorScoreRankGrade string `json:"commentFactorScoreRankGrade,omitempty"` + LogisticsFactorScoreRankGrade string `json:"logisticsFactorScoreRankGrade,omitempty"` + LogisticsLvyueScore string `json:"logisticsLvyueScore,omitempty"` + ScoreRankRate string `json:"scoreRankRate,omitempty"` + UserEvaluateScore string `json:"userEvaluateScore,omitempty"` + } `json:"shopInfo"` + SkuId int64 `json:"skuId"` + SkuName string `json:"skuName"` + Spuid int64 `json:"spuid"` + VideoInfo struct { + } `json:"videoInfo"` + } `json:"data"` + Message string `json:"message"` + RequestId string `json:"requestId"` + TotalCount int `json:"totalCount"` +} + +type UnionOpenGoodsMaterialQueryResult struct { + Responce UnionOpenGoodsMaterialQueryResultResponse // 结果 + Result UnionOpenGoodsMaterialQueryQueryResult // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewUnionOpenGoodsMaterialQueryResult(responce UnionOpenGoodsMaterialQueryResultResponse, result UnionOpenGoodsMaterialQueryQueryResult, body []byte, err error) *UnionOpenGoodsMaterialQueryResult { + return &UnionOpenGoodsMaterialQueryResult{Responce: responce, Result: result, Body: body, Err: err} +} + +// UnionOpenGoodsMaterialQuery 猜你喜欢商品推荐 +// https://union.jd.com/openplatform/api/v2?apiName=jd.union.open.goods.material.query +func (app *App) UnionOpenGoodsMaterialQuery(notMustParams ...Params) *UnionOpenGoodsMaterialQueryResult { + // 参数 + params := NewParamsWithType("jd.union.open.goods.material.query", notMustParams...) + // 请求 + body, err := app.request(params) + // 定义 + var responce UnionOpenGoodsMaterialQueryResultResponse + var result UnionOpenGoodsMaterialQueryQueryResult + err = json.Unmarshal(body, &responce) + err = json.Unmarshal([]byte(responce.JdUnionOpenGoodsMaterialQueryResponce.QueryResult), &result) + return NewUnionOpenGoodsMaterialQueryResult(responce, result, body, err) +} diff --git a/service/jd/union.open.goods.promotiongoodsinfo.query.go b/service/jd/jd.union.open.goods.promotiongoodsinfo.query.go similarity index 92% rename from service/jd/union.open.goods.promotiongoodsinfo.query.go rename to service/jd/jd.union.open.goods.promotiongoodsinfo.query.go index a67be49a..1225e451 100644 --- a/service/jd/union.open.goods.promotiongoodsinfo.query.go +++ b/service/jd/jd.union.open.goods.promotiongoodsinfo.query.go @@ -51,8 +51,7 @@ func NewUnionOpenGoodsPromotionGoodsInfoQueryResult(responce UnionOpenGoodsPromo return &UnionOpenGoodsPromotionGoodsInfoQueryResult{Responce: responce, Result: result, Body: body, Err: err} } -// UnionOpenGoodsPromotionGoodsInfoQuery -// 通过SKUID查询推广商品的名称、主图、类目、价格、物流、是否自营、30天引单数量等详细信息,支持批量获取。通常用于在媒体侧展示商品详情。 +// UnionOpenGoodsPromotionGoodsInfoQuery 根据skuid查询商品信息接口 // https://union.jd.com/openplatform/api/v2?apiName=jd.union.open.goods.promotiongoodsinfo.query func (app *App) UnionOpenGoodsPromotionGoodsInfoQuery(notMustParams ...Params) *UnionOpenGoodsPromotionGoodsInfoQueryResult { // 参数 diff --git a/service/jd/jd.union.open.order.query.go b/service/jd/jd.union.open.order.query.go new file mode 100644 index 00000000..e81db2f1 --- /dev/null +++ b/service/jd/jd.union.open.order.query.go @@ -0,0 +1,92 @@ +package jd + +import "encoding/json" + +type UnionOpenOrderQueryResultResponse struct { + JdUnionOpenOrderQueryResponce struct { + Code string `json:"code"` + QueryResult string `json:"queryResult"` + } `json:"jd_union_open_order_query_responce"` +} + +type UnionOpenOrderQueryQueryResult struct { + Code int `json:"code"` + Data []struct { + Ext1 string `json:"ext1"` + FinishTime int64 `json:"finishTime"` + OrderEmt int `json:"orderEmt"` + OrderId int64 `json:"orderId"` + OrderTime int64 `json:"orderTime"` + ParentId int `json:"parentId"` + PayMonth int `json:"payMonth"` + Plus int `json:"plus"` + PopId int `json:"popId"` + SkuList []struct { + ActualCosPrice float64 `json:"actualCosPrice"` + ActualFee float64 `json:"actualFee"` + Cid1 int `json:"cid1"` + Cid2 int `json:"cid2"` + Cid3 int `json:"cid3"` + CommissionRate float64 `json:"commissionRate"` + CpActId int `json:"cpActId"` + EstimateCosPrice float64 `json:"estimateCosPrice"` + EstimateFee float64 `json:"estimateFee"` + Ext1 string `json:"ext1"` + FinalRate float64 `json:"finalRate"` + FrozenSkuNum int `json:"frozenSkuNum"` + GiftCouponKey string `json:"giftCouponKey"` + GiftCouponOcsAmount float64 `json:"giftCouponOcsAmount"` + PayMonth int `json:"payMonth"` + Pid string `json:"pid"` + PopId int `json:"popId"` + PositionId int `json:"positionId"` + Price float64 `json:"price"` + ProPriceAmount float64 `json:"proPriceAmount"` + SiteId int `json:"siteId"` + SkuId int64 `json:"skuId"` + SkuName string `json:"skuName"` + SkuNum int `json:"skuNum"` + SkuReturnNum int `json:"skuReturnNum"` + SubSideRate float64 `json:"subSideRate"` + SubUnionId string `json:"subUnionId"` + SubsidyRate float64 `json:"subsidyRate"` + TraceType int `json:"traceType"` + UnionAlias string `json:"unionAlias"` + UnionRole int `json:"unionRole"` + UnionTag string `json:"unionTag"` + UnionTrafficGroup int `json:"unionTrafficGroup"` + ValidCode int `json:"validCode"` + } `json:"skuList"` + UnionId int `json:"unionId"` + ValidCode int `json:"validCode"` + } `json:"data"` + HasMore bool `json:"hasMore"` + Message string `json:"message"` + RequestId string `json:"requestId"` +} + +type UnionOpenOrderQueryResult struct { + Responce UnionOpenOrderQueryResultResponse // 结果 + Result UnionOpenOrderQueryQueryResult // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewUnionOpenOrderQueryResult(responce UnionOpenOrderQueryResultResponse, result UnionOpenOrderQueryQueryResult, body []byte, err error) *UnionOpenOrderQueryResult { + return &UnionOpenOrderQueryResult{Responce: responce, Result: result, Body: body, Err: err} +} + +// UnionOpenOrderQuery 订单查询接口 +// https://union.jd.com/openplatform/api/v2?apiName=jd.union.open.order.query +func (app *App) UnionOpenOrderQuery(notMustParams ...Params) *UnionOpenOrderQueryResult { + // 参数 + params := NewParamsWithType("jd.union.open.order.query", notMustParams...) + // 请求 + body, err := app.request(params) + // 定义 + var responce UnionOpenOrderQueryResultResponse + var result UnionOpenOrderQueryQueryResult + err = json.Unmarshal(body, &responce) + err = json.Unmarshal([]byte(responce.JdUnionOpenOrderQueryResponce.QueryResult), &result) + return NewUnionOpenOrderQueryResult(responce, result, body, err) +} diff --git a/service/jd/jd.union.open.order.row.query.go b/service/jd/jd.union.open.order.row.query.go new file mode 100644 index 00000000..4748448a --- /dev/null +++ b/service/jd/jd.union.open.order.row.query.go @@ -0,0 +1,101 @@ +package jd + +import "encoding/json" + +type UnionOpenOrderRowQueryResultResponse struct { + JdUnionOpenOrderRowQueryResponce struct { + Code string `json:"code"` + QueryResult string `json:"queryResult"` + } `json:"jd_union_open_order_row_query_responce"` +} + +type UnionOpenOrderRowQueryQueryResult struct { + Code int `json:"code"` + Data []struct { + ActualCosPrice float64 `json:"actualCosPrice"` + ActualFee float64 `json:"actualFee"` + BalanceExt string `json:"balanceExt"` + CategoryInfo struct { + Cid1 int `json:"cid1"` + Cid2 int `json:"cid2"` + Cid3 int `json:"cid3"` + } `json:"categoryInfo"` + ChannelId int `json:"channelId"` + Cid1 int `json:"cid1"` + Cid2 int `json:"cid2"` + Cid3 int `json:"cid3"` + CommissionRate float64 `json:"commissionRate"` + CpActId int `json:"cpActId"` + EstimateCosPrice float64 `json:"estimateCosPrice"` + EstimateFee float64 `json:"estimateFee"` + ExpressStatus int `json:"expressStatus"` + Ext1 string `json:"ext1"` + FinalRate float64 `json:"finalRate"` + FinishTime string `json:"finishTime"` + GiftCouponKey string `json:"giftCouponKey"` + GiftCouponOcsAmount float64 `json:"giftCouponOcsAmount"` + GoodsInfo struct { + MainSkuId int `json:"mainSkuId"` + ProductId int `json:"productId"` + ShopId int `json:"shopId"` + } `json:"goodsInfo"` + Id string `json:"id"` + ModifyTime string `json:"modifyTime"` + OrderEmt int `json:"orderEmt"` + OrderId int64 `json:"orderId"` + OrderTime string `json:"orderTime"` + ParentId int `json:"parentId"` + PayMonth int `json:"payMonth"` + Pid string `json:"pid"` + Plus int `json:"plus"` + PopId int `json:"popId"` + PositionId int `json:"positionId"` + Price float64 `json:"price"` + ProPriceAmount float64 `json:"proPriceAmount"` + Rid int `json:"rid"` + SiteId int `json:"siteId"` + SkuFrozenNum int `json:"skuFrozenNum"` + SkuId int64 `json:"skuId"` + SkuName string `json:"skuName"` + SkuNum int `json:"skuNum"` + SkuReturnNum int `json:"skuReturnNum"` + SubSideRate float64 `json:"subSideRate"` + SubUnionId string `json:"subUnionId"` + SubsidyRate float64 `json:"subsidyRate"` + TraceType int `json:"traceType"` + UnionAlias string `json:"unionAlias"` + UnionId int `json:"unionId"` + UnionRole int `json:"unionRole"` + UnionTag string `json:"unionTag"` + ValidCode int `json:"validCode"` + } `json:"data"` + HasMore bool `json:"hasMore"` + Message string `json:"message"` + RequestId string `json:"requestId"` +} + +type UnionOpenOrderRowQueryResult struct { + Responce UnionOpenOrderRowQueryResultResponse // 结果 + Result UnionOpenOrderRowQueryQueryResult // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewUnionOpenOrderRowQueryResult(responce UnionOpenOrderRowQueryResultResponse, result UnionOpenOrderRowQueryQueryResult, body []byte, err error) *UnionOpenOrderRowQueryResult { + return &UnionOpenOrderRowQueryResult{Responce: responce, Result: result, Body: body, Err: err} +} + +// UnionOpenOrderRowQuery 订单行查询接口 +// https://union.jd.com/openplatform/api/v2?apiName=jd.union.open.order.row.query +func (app *App) UnionOpenOrderRowQuery(notMustParams ...Params) *UnionOpenOrderRowQueryResult { + // 参数 + params := NewParamsWithType("jd.union.open.order.row.query", notMustParams...) + // 请求 + body, err := app.request(params) + // 定义 + var responce UnionOpenOrderRowQueryResultResponse + var result UnionOpenOrderRowQueryQueryResult + err = json.Unmarshal(body, &responce) + err = json.Unmarshal([]byte(responce.JdUnionOpenOrderRowQueryResponce.QueryResult), &result) + return NewUnionOpenOrderRowQueryResult(responce, result, body, err) +} diff --git a/service/jd/jd.union.open.promotion.bysubunionid.get.go b/service/jd/jd.union.open.promotion.bysubunionid.get.go new file mode 100644 index 00000000..180f7201 --- /dev/null +++ b/service/jd/jd.union.open.promotion.bysubunionid.get.go @@ -0,0 +1,46 @@ +package jd + +import "encoding/json" + +type UnionOpenPromotionBySubUnionIdGetResultResponse struct { + JdUnionOpenPromotionBySubUnionIdGetResponce struct { + Code string `json:"code"` + GetResult string `json:"getResult"` + } `json:"jd_union_open_promotion_common_get_responce"` +} + +type UnionOpenPromotionBySubUnionIdGetGetResult struct { + Code int `json:"code"` + Data struct { + ClickURL string `json:"clickURL"` + JCommand string `json:"jCommand"` + } `json:"data"` + Message string `json:"message"` + RequestId string `json:"requestId"` +} + +type UnionOpenPromotionBySubUnionIdGetResult struct { + Responce UnionOpenPromotionBySubUnionIdGetResultResponse // 结果 + Result UnionOpenPromotionBySubUnionIdGetGetResult // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewUnionOpenPromotionBySubUnionIdGetResult(responce UnionOpenPromotionBySubUnionIdGetResultResponse, result UnionOpenPromotionBySubUnionIdGetGetResult, body []byte, err error) *UnionOpenPromotionBySubUnionIdGetResult { + return &UnionOpenPromotionBySubUnionIdGetResult{Responce: responce, Result: result, Body: body, Err: err} +} + +// UnionOpenPromotionBySubUnionIdGet 社交媒体获取推广链接接口【申请】 +// https://union.jd.com/openplatform/api/v2?apiName=jd.union.open.promotion.bysubunionid.get +func (app *App) UnionOpenPromotionBySubUnionIdGet(notMustParams ...Params) *UnionOpenPromotionBySubUnionIdGetResult { + // 参数 + params := NewParamsWithType("jd.union.open.promotion.bysubunionid.get", notMustParams...) + // 请求 + body, err := app.request(params) + // 定义 + var responce UnionOpenPromotionBySubUnionIdGetResultResponse + var result UnionOpenPromotionBySubUnionIdGetGetResult + err = json.Unmarshal(body, &responce) + err = json.Unmarshal([]byte(responce.JdUnionOpenPromotionBySubUnionIdGetResponce.GetResult), &result) + return NewUnionOpenPromotionBySubUnionIdGetResult(responce, result, body, err) +} diff --git a/service/jd/union.open.promotion.common.get.go b/service/jd/jd.union.open.promotion.common.get.go similarity index 83% rename from service/jd/union.open.promotion.common.get.go rename to service/jd/jd.union.open.promotion.common.get.go index ea64f0f5..537d0c34 100644 --- a/service/jd/union.open.promotion.common.get.go +++ b/service/jd/jd.union.open.promotion.common.get.go @@ -30,8 +30,7 @@ func NewUnionOpenPromotionCommonGetResult(responce UnionOpenPromotionCommonGetRe return &UnionOpenPromotionCommonGetResult{Responce: responce, Result: result, Body: body, Err: err} } -// UnionOpenPromotionCommonGet -// 网站/APP来获取的推广链接,功能同宙斯接口的自定义链接转换、 APP领取代码接口通过商品链接、活动链接获取普通推广链接,支持传入subunionid参数,可用于区分媒体自身的用户ID,该参数可在订单查询接口返回,需向cps-qxsq@jd.com申请权限。 +// UnionOpenPromotionCommonGet 网站/APP获取推广链接接口 // https://union.jd.com/openplatform/api/v2?apiName=jd.union.open.promotion.common.get func (app *App) UnionOpenPromotionCommonGet(notMustParams ...Params) *UnionOpenPromotionCommonGetResult { // 参数 diff --git a/service/jd/jd.union.open.selling.goods.query.go b/service/jd/jd.union.open.selling.goods.query.go new file mode 100644 index 00000000..fdd9350f --- /dev/null +++ b/service/jd/jd.union.open.selling.goods.query.go @@ -0,0 +1 @@ +package jd diff --git a/service/jd/jd.union.open.selling.order.row.query.go b/service/jd/jd.union.open.selling.order.row.query.go new file mode 100644 index 00000000..fdd9350f --- /dev/null +++ b/service/jd/jd.union.open.selling.order.row.query.go @@ -0,0 +1 @@ +package jd diff --git a/service/jd/jd.union.open.selling.promotion.get.go b/service/jd/jd.union.open.selling.promotion.get.go new file mode 100644 index 00000000..fdd9350f --- /dev/null +++ b/service/jd/jd.union.open.selling.promotion.get.go @@ -0,0 +1 @@ +package jd diff --git a/service/jd/jd.union.open.statistics.giftcoupon.query.go b/service/jd/jd.union.open.statistics.giftcoupon.query.go new file mode 100644 index 00000000..fdd9350f --- /dev/null +++ b/service/jd/jd.union.open.statistics.giftcoupon.query.go @@ -0,0 +1 @@ +package jd diff --git a/service/jd/jd.union.open.statistics.redpacket.query.go b/service/jd/jd.union.open.statistics.redpacket.query.go new file mode 100644 index 00000000..fdd9350f --- /dev/null +++ b/service/jd/jd.union.open.statistics.redpacket.query.go @@ -0,0 +1 @@ +package jd diff --git a/service/jd/mongodb.go b/service/jd/mongodb.go new file mode 100644 index 00000000..c840a337 --- /dev/null +++ b/service/jd/mongodb.go @@ -0,0 +1,47 @@ +package jd + +import ( + "dtapps/dta/library/utils/gohttp" + "encoding/json" + "gitee.com/dtapps/go-library/utils/gotime" +) + +// 日志 +type mongoZap struct { + Url string `json:"url" bson:"url"` + Params interface{} `json:"params" bson:"params"` + Method string `json:"method" bson:"method"` + Header interface{} `json:"header" bson:"header"` + Status string `json:"status" bson:"status"` + StatusCode int `json:"status_code" bson:"status_code"` + Body interface{} `json:"body" bson:"body"` + ContentLength int64 `json:"content_length" bson:"content_length"` + CreateTime string `json:"create_time" bson:"create_time"` +} + +func (m *mongoZap) Database() string { + return "zap_logs" +} + +func (m *mongoZap) TableName() string { + return "jd_" + gotime.Current().SetFormat("200601") +} + +func (app *App) mongoLog(url string, params map[string]interface{}, method string, request gohttp.Response) { + if app.Mongo.Db == nil { + return + } + var body map[string]interface{} + _ = json.Unmarshal(request.Body, &body) + app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{ + Url: url, + Params: params, + Method: method, + Header: request.Header, + Status: request.Status, + StatusCode: request.StatusCode, + Body: body, + ContentLength: request.ContentLength, + CreateTime: gotime.Current().Format(), + }) +} diff --git a/service/jd/params.go b/service/jd/params.go index 857bbaf6..94c7aace 100644 --- a/service/jd/params.go +++ b/service/jd/params.go @@ -16,6 +16,14 @@ func NewParams() Params { return p } +func NewParamsWith(params ...Params) Params { + p := make(Params) + for _, v := range params { + p.SetParams(v) + } + return p +} + func NewParamsWithType(_method string, params ...Params) Params { p := make(Params) p["method"] = _method diff --git a/service/jobs/check.go b/service/jobs/check.go new file mode 100644 index 00000000..ff0e604c --- /dev/null +++ b/service/jobs/check.go @@ -0,0 +1,19 @@ +package jobs + +import ( + "gitee.com/dtapps/go-library/utils/gotime" + "log" +) + +// Check 任务检查 +func (app *App) Check(vs []Task) { + if app.MainService > 0 && len(vs) > 0 { + for _, v := range vs { + diffInSecondWithAbs := gotime.Current().DiffInSecondWithAbs(gotime.SetCurrentParse(v.UpdatedAt).Time) + if diffInSecondWithAbs >= v.Frequency*3 { + log.Printf("每隔%v秒任务:%v相差%v秒\n", v.Frequency, v.Id, diffInSecondWithAbs) + app.Db.Where("task_id = ?", v.Id).Where("run_id = ?", v.RunId).Delete(&TaskLogRun{}) // 删除 + } + } + } +} diff --git a/service/jobs/ip.go b/service/jobs/ip.go new file mode 100644 index 00000000..89335a0a --- /dev/null +++ b/service/jobs/ip.go @@ -0,0 +1,144 @@ +package jobs + +import "gitee.com/dtapps/go-library/utils/goip" + +var TypeIp = map[string]string{ + // 微信支付查询 + TypeWechatPayPrepaidRefill: "", + TypeWechatPayPower: "", + TypeWechatPayKashangwl: "", + TypeWechatPayEastiot: "", + TypeWechatPayEjiaofei: "", + TypeWechatPayMovie: "", + + // 接口支付申请 + TypeApiPaySubmitPrepaidRefill: "", + TypeApiPaySubmitPower: "", + TypeApiPaySubmitKashangwl: "", + TypeApiPaySubmitEastiot: "47.112.146.193", + TypeApiPaySubmitEjiaofei: "47.112.146.193", + TypeApiPaySubmitMovie: "", + + // 接口支付查询 + TypeApiPayQueryPrepaidRefill: "", + TypeApiPayQueryPower: "", + TypeApiPayQueryKashangwl: "", + TypeApiPayQueryEastiot: "47.112.146.193", + TypeApiPayQueryEjiaofei: "", + TypeApiPayQueryMovie: "", + TypeApiPayQueryPinduoduo: "", + TypeApiPayQueryMeituan: "", + + // 微信支付退款申请 + TypeWechatRefundsSubmitPrepaidRefill: "", + TypeWechatRefundsSubmitPower: "", + TypeWechatRefundsSubmitKashangwl: "", + TypeWechatRefundsSubmitEastiot: "", + TypeWechatRefundsSubmitEjiaofei: "", + TypeWechatRefundsSubmitMovie: "", + + // 微信支付退款查询 + TypeWechatRefundsQueryPrepaidRefill: "", + TypeWechatRefundsQueryPower: "", + TypeWechatRefundsQueryKashangwl: "", + TypeWechatRefundsQueryEastiot: "", + TypeWechatRefundsQueryEjiaofei: "", + TypeWechatRefundsQueryMovie: "", + + // 返拥 + TypeGoldenBeansIssuePrepaidRefill: "", + TypeGoldenBeansIssuePower: "", + TypeGoldenBeansIssueKashangwl: "", + TypeGoldenBeansIssueEastiot: "", + TypeGoldenBeansIssueMovie: "", + TypeGoldenBeansIssueRewardedvideo: "", + + // 冻结返拥金豆 + TypeGoldenBeansFrozenPinduoduo: "", + TypeGoldenBeansFrozenMeituan: "", + + // 解冻返拥金豆正常发放 + TypeGoldenBeansThawSuccessPinduoduo: "", + TypeGoldenBeansThawSuccessMeituan: "", + + // 解冻返拥金豆扣款 + TypeGoldenBeansThawErrorPinduoduo: "", + TypeGoldenBeansThawErrorMeituan: "", + + // 抵扣金豆退款 + TypeGoldenBeansRefundsPrepaidRefill: "", + TypeGoldenBeansRefundsPower: "", + + // 金豆退款 + TypeGoldenBeansRefundsEjiaofei: "", + + // 客服进度 + TypeCustomerAutoPrepaidRefill: "", + TypeCustomerAutoPower: "", + TypeCustomerAutoKashangwl: "", + TypeCustomerAutoEjiaofei: "", + TypeCustomerAutoMovie: "", + + // 订单同步 + TypeSyncOrderPinduoduo: "", + TypeSyncOrderMeituan: "", + + // 商品同步 + TypeSyncGoodsEastiot: "47.112.146.193", + TypeSyncGoodsTypeEastiot: "47.112.146.193", + TypeSyncGoodsPriceAllKashangwl: "", + TypeSyncGoodsPriceSingleKashangwl: "", + TypeCheckGoodsAllPinduoduo: "", + TypeCheckGoodsSinglePinduoduo: "", + + // 微信更新 + TypeSyncWechat: "119.3.235.113,119.3.132.197,47.112.146.193", + + // 商家金豆转换 + TypeGoldenBeanConversionUserGoldenBean: "", + TypeGoldenBeanConversionUserDeductGoldenBean: "", + + // 企业自定义 + TypeNewServiceAgentIssue: "", + TypeNewServiceAgentIssueNext: "", + + // 团队 + TypeTeamInv: "", + + // 修复商家账号数量 + TypeRepairMerchantAccountQuantityTesting: "", + TypeRepairMerchantAccountQuantityLevel: "", + + // 观察接口 + TypeApiPayObservationPrepaidRefill: "", + TypeApiPayObservationPower: "", + TypeApiPayObservationKashangwl: "", + TypeApiPayObservationEjiaofei: "47.112.146.193", + TypeApiPayObservationMovie: "", + TypeApiPayObservationPinduoduo: "", + TypeApiPayObservationMeituan: "", + TypeApiPayObservationWechat: "", + TypeApiPayObservationWechatRefunds: "", + TypeApiPayObservationWechatWithdrawal: "", + + // 微信提现 + TypeWechatPayWithdrawalSubmit: "47.112.146.193", + TypeWechatPayWithdrawalQuery: "", + TypeWechatPayWithdrawalRefunds: "", +} + +func (app *App) Ip(Type string) string { + return TypeIp[Type] +} + +func (app *App) RefreshIp() { + xip := goip.GetOutsideIp() + if app.OutsideIp == "" || app.OutsideIp == "0.0.0.0" { + return + } + if app.OutsideIp == xip { + return + } + app.Db.Where("ips = ?", app.OutsideIp).Delete(&TaskIp{}) // 删除 + app.OutsideIp = xip +} diff --git a/service/jobs/jobs.go b/service/jobs/jobs.go new file mode 100644 index 00000000..26be70a0 --- /dev/null +++ b/service/jobs/jobs.go @@ -0,0 +1,379 @@ +package jobs + +import ( + "dtapps/dta/library/utils/goredis" + "fmt" + "gitee.com/dtapps/go-library/utils/gojson" + "gitee.com/dtapps/go-library/utils/gotime" + "gitee.com/dtapps/go-library/utils/gouuid" + "gorm.io/gorm" + "net/http" +) + +type App struct { + RunVersion int `json:"run_version"` // 运行版本 + Os string `json:"os"` // 系统类型 + Arch string `json:"arch"` // 系统架构 + MaxProCs int `json:"max_pro_cs"` // CPU核数 + Version string `json:"version"` // GO版本 + MacAddrS string `json:"mac_addr_s"` // Mac地址 + InsideIp string `json:"inside_ip"` // 内网ip + OutsideIp string `json:"outside_ip"` // 外网ip + MainService int `json:"main_service"` // 主要服务 + AddIpService int `json:"add_ip_service"` // 添加IP + Db *gorm.DB // 数据库 + Redis goredis.App // 缓存数据库服务 +} + +// Add 添加任务 +func (app *App) Add(Type string, params interface{}, frequency int64) int64 { + return app.Db.Create(&Task{ + Status: TASK_IN, + Params: gojson.JsonEncodeNoError(params), + StatusDesc: "首次添加任务", + Frequency: frequency, + RunId: gouuid.GetUuId(), + Type: Type, + CreatedIp: app.OutsideIp, + UpdatedIp: app.OutsideIp, + CreatedAt: gotime.Current().Format(), + UpdatedAt: gotime.Current().Format(), + }).RowsAffected +} + +// AddCustomId 添加任务 +func (app *App) AddCustomId(Type string, params interface{}, frequency int64, customId string) int64 { + query := app.TaskCustomIdTake(Type, customId) + if query.Id != 0 { + return 0 + } + return app.Db.Create(&Task{ + Status: TASK_IN, + Params: gojson.JsonEncodeNoError(params), + StatusDesc: "首次添加任务", + Frequency: frequency, + RunId: gouuid.GetUuId(), + CustomId: customId, + Type: Type, + CreatedIp: app.OutsideIp, + UpdatedIp: app.OutsideIp, + CreatedAt: gotime.Current().Format(), + UpdatedAt: gotime.Current().Format(), + }).RowsAffected +} + +// AddCustomIdMaxNumber 添加任务并设置最大数量 +func (app *App) AddCustomIdMaxNumber(Type string, params interface{}, frequency int64, customId string, maxNumber int64) int64 { + query := app.TaskCustomIdTakeStatus(Type, customId, TASK_IN) + if query.Id != 0 { + return 0 + } + return app.Db.Create(&Task{ + Status: TASK_IN, + Params: gojson.JsonEncodeNoError(params), + StatusDesc: "首次添加任务", + Frequency: frequency, + MaxNumber: maxNumber, + RunId: gouuid.GetUuId(), + CustomId: customId, + Type: Type, + CreatedIp: app.OutsideIp, + UpdatedIp: app.OutsideIp, + CreatedAt: gotime.Current().Format(), + UpdatedAt: gotime.Current().Format(), + }).RowsAffected +} + +type TaskParams = Task + +// AddInOrder 添加订单可执行任务 +func (app *App) AddInOrder(Type string, params interface{}, frequency int64) int64 { + var param TaskParams + param.Type = Type + param.Frequency = frequency + param.ParamsType = ParamsOrderType + return app.AddIn(param, params) +} + +// AddInOrderCustomId 添加订单可执行任务 +func (app *App) AddInOrderCustomId(Type string, params interface{}, frequency int64, customId string) int64 { + query := app.TaskCustomIdTakeStatus(Type, customId, TASK_IN) + if query.Id != 0 { + return 0 + } + var param TaskParams + param.Type = Type + param.Frequency = frequency + param.CustomId = customId + param.ParamsType = ParamsOrderType + return app.AddIn(param, params) +} + +// AddInOrderCustomIdSpecifyIp 添加订单可执行任务 +func (app *App) AddInOrderCustomIdSpecifyIp(Type string, params interface{}, frequency int64, customId, specifyIp string) int64 { + query := app.TaskCustomIdTakeStatus(Type, customId, TASK_IN) + if query.Id != 0 { + return 0 + } + var param TaskParams + param.Type = Type + param.Frequency = frequency + param.CustomId = customId + param.SpecifyIp = specifyIp + param.ParamsType = ParamsOrderType + return app.AddIn(param, params) +} + +// AddInMerchantGoldenBean 添加商家金豆可执行任务 +func (app *App) AddInMerchantGoldenBean(Type string, params interface{}, frequency int64) int64 { + var param TaskParams + param.Type = Type + param.Frequency = frequency + param.ParamsType = ParamsMerchantGoldenBeanType + return app.AddIn(param, params) +} + +// AddInTeamInv 添加团队邀请可执行任务 +func (app *App) AddInTeamInv(Type string, params interface{}, frequency int64) int64 { + var param TaskParams + param.Type = Type + param.Frequency = frequency + param.ParamsType = ParamsTeamInvType + return app.AddIn(param, params) +} + +// AddInNewService 添加企业自定义可执行任务 +func (app *App) AddInNewService(Type string, params interface{}, frequency int64) int64 { + var param TaskParams + param.Type = Type + param.Frequency = frequency + param.ParamsType = ParamsNewServiceType + return app.AddIn(param, params) +} + +// AddInNewServiceNext 添加企业自定义下一步可执行任务 +func (app *App) AddInNewServiceNext(param TaskParams, params interface{}) int64 { + param.ParamsType = ParamsNewServiceNextType + return app.AddIn(param, params) +} + +// AddInRepairMerchantAccountQuantity 添加可执行任务 +func (app *App) AddInRepairMerchantAccountQuantity() int64 { + var param TaskParams + param.Type = TypeRepairMerchantAccountQuantityTesting + param.Frequency = 90000 + return app.AddIn(param, map[string]interface{}{}) +} + +// AddInRepairMerchantAccountQuantityLevel 添加修复商家账号数量下一步可执行任务 +func (app *App) AddInRepairMerchantAccountQuantityLevel(param TaskParams, params interface{}) int64 { + param.ParamsType = ParamsRepairMerchantAccountQuantityLevelType + return app.AddIn(param, params) +} + +// AddInOrderCustomIdObservation 添加观察接口任务 +func (app *App) AddInOrderCustomIdObservation(Type string, customId string) int64 { + query := app.TaskCustomIdTakeStatus(Type, customId, TASK_IN) + if query.Id != 0 { + return query.Id + } + var param TaskParams + param.Type = Type + param.Frequency = 3600 + param.MaxNumber = 24 * 5 // 一个星期 + param.CustomId = customId + param.ParamsType = ParamsOrderType + return app.AddIn(param, ParamsOrderId{ + OrderId: customId, + }) +} + +// AddInOrderCustomIdObservationClone 观察接口关闭 +func (app *App) AddInOrderCustomIdObservationClone(Type string, customId string) int64 { + query := app.TaskCustomIdTakeStatus(Type, customId, TASK_IN) + if query.Id == 0 { + return 0 + } + return app.Edit(query.Id).Select("status", "status_desc", "run_id", "updated_ip", "updated_at").Updates(Task{ + Status: TASK_SUCCESS, + StatusDesc: "已完成,停止观察", + RunId: gouuid.GetUuId(), + UpdatedIp: app.OutsideIp, + UpdatedAt: gotime.Current().Format(), + }).RowsAffected +} + +// AddIn 添加可执行任务 +// params.Type 任务类型 +// params.Frequency 任务频率 +// params.CustomId 自定义编号 +// params 任务参数 +func (app *App) AddIn(param TaskParams, params interface{}) int64 { + param.Status = TASK_IN + param.StatusDesc = "首次添加任务" + param.RunId = gouuid.GetUuId() + param.Params = gojson.JsonEncodeNoError(params) + param.CreatedIp = app.OutsideIp + param.UpdatedIp = app.OutsideIp + param.CreatedAt = gotime.Current().Format() + param.UpdatedAt = gotime.Current().Format() + return app.Db.Create(¶m).RowsAffected +} + +// AddWaitNewServiceNext 添加企业自定义下一步等待执行任务 +func (app *App) AddWaitNewServiceNext(param TaskParams, params interface{}) int64 { + param.ParamsType = ParamsNewServiceNextType + return app.AddWait(param, params) +} + +// AddWaitRepairMerchantAccountQuantityLevel 添加修复商家账号数量下一步等待执行任务 +func (app *App) AddWaitRepairMerchantAccountQuantityLevel(param TaskParams, params interface{}) int64 { + param.ParamsType = ParamsRepairMerchantAccountQuantityLevelType + return app.AddWait(param, params) +} + +// AddInKashangwlPriceCustomId 添加刷新卡商网价格任务 +func (app *App) AddInKashangwlPriceCustomId(productId int64) int64 { + query := app.TaskCustomIdTakeStatus(TypeSyncGoodsPriceSingleKashangwl, fmt.Sprintf("%v", productId), TASK_IN) + if query.Id != 0 { + return query.Id + } + var param TaskParams + param.Type = TypeSyncGoodsPriceSingleKashangwl + param.Frequency = 1800 + param.CustomId = fmt.Sprintf("%v", productId) + param.ParamsType = ParamsKashangwlType + return app.AddIn(param, ParamsKashangwlId{ + ProductID: productId, + }) +} + +// AddWait 添加等待执行任务 +// params.Type 任务类型 +// params.Frequency 任务频率 +// params.CustomId 自定义编号 +// params.CustomSequence 自定义顺序 +// params 任务参数 +func (app *App) AddWait(param TaskParams, params interface{}) int64 { + param.Status = TASK_WAIT + param.StatusDesc = "首次添加任务" + param.RunId = gouuid.GetUuId() + param.Params = gojson.JsonEncodeNoError(params) + param.CreatedIp = app.OutsideIp + param.UpdatedIp = app.OutsideIp + param.CreatedAt = gotime.Current().Format() + param.UpdatedAt = gotime.Current().Format() + return app.Db.Create(¶m).RowsAffected +} + +// Edit 任务修改 +func (app *App) Edit(id int64) *gorm.DB { + return app.Db.Model(&Task{}).Where("id = ?", id) +} + +// UpdateFrequency 更新任务频率 +func (app *App) UpdateFrequency(id, frequency int64) *gorm.DB { + return app.Edit(id).Updates(map[string]interface{}{ + "frequency": frequency, + }) +} + +// Start 任务启动 +func (app *App) Start(customId string, customSequence int64) int64 { + return app.Db.Model(&Task{}). + Where("custom_id = ?", customId). + Where("custom_sequence = ?", customSequence). + Where("status = ?", TASK_WAIT). + Select("status", "status_desc", "updated_ip", "updated_at").Updates(Task{ + Status: TASK_IN, + StatusDesc: "启动任务", + UpdatedIp: app.OutsideIp, + UpdatedAt: gotime.Current().Format(), + }).RowsAffected +} + +// RunAddLog 任务执行日志 +func (app *App) RunAddLog(id int64, runId string) int64 { + return app.Db.Create(&TaskLogRun{ + TaskId: id, + RunId: runId, + InsideIp: app.InsideIp, + OutsideIp: app.OutsideIp, + Os: app.Os, + Arch: app.Arch, + Gomaxprocs: app.MaxProCs, + GoVersion: app.Version, + MacAddrs: app.MacAddrS, + CreatedAt: gotime.Current().Format(), + }).RowsAffected +} + +type CronParamsResp struct { + ParamsOrderId + ParamsMerchantUserIdOpenid + ParamsTaskId + ParamsTaskIdNext + ParamsWechat + ParamsTeamInv + ParamsRepairMerchantAccountQuantityLevel +} + +// Run 任务执行 +func (app *App) Run(info Task, status int, desc string) { + // 请求函数记录 + app.Db.Create(&TaskLog{ + TaskId: info.Id, + StatusCode: status, + Desc: desc, + Version: app.RunVersion, + CreatedAt: gotime.Current().Format(), + }) + if status == 0 { + app.Edit(info.Id).Select("run_id").Updates(Task{ + RunId: gouuid.GetUuId(), + }) + return + } + // 任务 + if status == http.StatusOK { + // 执行成功 + app.Edit(info.Id).Select("status_desc", "number", "run_id", "updated_ip", "updated_at", "result").Updates(Task{ + StatusDesc: "执行成功", + Number: info.Number + 1, + RunId: gouuid.GetUuId(), + UpdatedIp: app.OutsideIp, + UpdatedAt: gotime.Current().Format(), + Result: desc, + }) + } + if status == http.StatusCreated { + // 执行成功、提前结束 + app.Edit(info.Id).Select("status", "status_desc", "number", "updated_ip", "updated_at", "result").Updates(Task{ + Status: TASK_SUCCESS, + StatusDesc: "结束执行", + Number: info.Number + 1, + UpdatedIp: app.OutsideIp, + UpdatedAt: gotime.Current().Format(), + Result: desc, + }) + } + if status == http.StatusInternalServerError { + // 执行失败 + app.Edit(info.Id).Select("status_desc", "number", "run_id", "updated_ip", "updated_at", "result").Updates(Task{ + StatusDesc: "执行失败", + Number: info.Number + 1, + RunId: gouuid.GetUuId(), + UpdatedIp: app.OutsideIp, + UpdatedAt: gotime.Current().Format(), + Result: desc, + }) + } + if info.MaxNumber != 0 { + if info.Number+1 >= info.MaxNumber { + // 关闭执行 + app.Edit(info.Id).Select("status").Updates(Task{ + Status: TASK_TIMEOUT, + }) + } + } +} diff --git a/service/jobs/lock.go b/service/jobs/lock.go new file mode 100644 index 00000000..55358efd --- /dev/null +++ b/service/jobs/lock.go @@ -0,0 +1,35 @@ +package jobs + +import ( + "dtapps/dta/library/utils/goredis" + "fmt" + "time" +) + +// Lock 上锁 +func (app *App) Lock(info Task, id any) string { + cacheName := fmt.Sprintf("cron:%v:%v", info.Type, id) + judgeCache := app.Redis.NewStringOperation().Get(cacheName).UnwrapOr("") + if judgeCache != "" { + return judgeCache + } + app.Redis.NewStringOperation().Set(cacheName, fmt.Sprintf("已在%v机器上锁成功", app.OutsideIp), goredis.WithExpire(time.Millisecond*time.Duration(info.Frequency)*3)) + return "" +} + +// Unlock Lock 解锁 +func (app *App) Unlock(info Task, id any) { + cacheName := fmt.Sprintf("cron:%v:%v", info.Type, id) + app.Redis.NewStringOperation().Del(cacheName) +} + +// LockForever 永远上锁 +func (app *App) LockForever(info Task, id any) string { + cacheName := fmt.Sprintf("cron:%v:%v", info.Type, id) + judgeCache := app.Redis.NewStringOperation().Get(cacheName).UnwrapOr("") + if judgeCache != "" { + return judgeCache + } + app.Redis.NewStringOperation().Set(cacheName, fmt.Sprintf("已在%v机器永远上锁成功", app.OutsideIp)) + return "" +} diff --git a/service/jobs/model.go b/service/jobs/model.go new file mode 100644 index 00000000..544eea4a --- /dev/null +++ b/service/jobs/model.go @@ -0,0 +1,169 @@ +package jobs + +import ( + "strings" +) + +const ( + TASK_IN = "IN" // 任务运行 + TASK_SUCCESS = "SUCCESS" // 任务完成 + TASK_ERROR = "ERROR" // 任务异常 + TASK_TIMEOUT = "TIMEOUT" // 任务超时 + TASK_WAIT = "WAIT" // 任务等待 +) + +// Task 任务 +type Task struct { + Id int64 + Status string `gorm:"type:text" json:"status"` // 状态码 + Params string `gorm:"type:text" json:"params"` // 参数 + ParamsType string `gorm:"type:text" json:"params_type"` // 参数类型 + StatusDesc string `gorm:"type:text" json:"status_desc"` // 状态描述 + Frequency int64 `gorm:"type:bigint" json:"frequency"` // 频率(秒单位) + Number int64 `gorm:"type:bigint" json:"number"` // 当前次数 + MaxNumber int64 `gorm:"type:bigint" json:"max_number"` // 最大次数 + RunId string `gorm:"type:text" json:"run_id"` // 执行编号 + CustomId string `gorm:"type:text" json:"custom_id"` // 自定义编号 + CustomSequence int64 `gorm:"type:bigint" json:"custom_sequence"` // 自定义顺序 + Type string `gorm:"type:text" json:"type"` // 类型 + CreatedIp string `gorm:"type:text" json:"created_ip"` // 创建外网IP + SpecifyIp string `gorm:"type:text" json:"specify_ip"` // 指定外网IP + UpdatedIp string `gorm:"type:text" json:"updated_ip"` // 更新外网IP + Result string `gorm:"type:text" json:"result"` // 结果 + CreatedAt string `gorm:"type:text" json:"created_at"` // 创建时间 + UpdatedAt string `gorm:"type:text" json:"updated_at"` // 更新时间 +} + +func (m *Task) TableName() string { + return "task" +} + +// TaskTake 查询任务 +func (app *App) TaskTake(customId string) (result Task) { + app.Db.Where("custom_id = ?", customId).Where("status = ?", TASK_IN).Take(&result) + return result +} + +// TaskCustomIdTake 查询任务 +func (app *App) TaskCustomIdTake(Type, customId string) (result Task) { + app.Db.Where("type = ?", Type).Where("custom_id = ?", customId).Take(&result) + return result +} + +// TaskCustomIdTakeStatus 查询任务 +func (app *App) TaskCustomIdTakeStatus(Type, customId, status string) (result Task) { + app.Db.Where("type = ?", Type).Where("custom_id = ?", customId).Where("status = ?", status).Take(&result) + return result +} + +// TaskFind 查询任务 +func (app *App) TaskFind(frequency int) (results []Task) { + app.Db.Table("task").Select("task.*").Where("task.frequency = ?", frequency).Where("task.status = ?", TASK_IN).Where("task_ip.ips = ?", app.OutsideIp).Order("task.id asc").Joins("left join task_ip on task_ip.task_type = task.type").Find(&results) + return app.taskFindCheck(results) +} + +// 检查任务 +func (app *App) taskFindCheck(lists []Task) (results []Task) { + for _, v := range lists { + if v.SpecifyIp == "" { + results = append(results, v) + } else { + if app.OutsideIp == v.SpecifyIp { + results = append(results, v) + } + } + } + return results +} + +// TaskLog 任务日志 +type TaskLog struct { + Id int64 + TaskId int64 `gorm:"type:bigint" json:"task_id"` // 任务编号 + StatusCode int `gorm:"type:bigint" json:"status_code"` // 状态码 + Desc string `gorm:"type:text" json:"desc"` // 结果 + Version int `gorm:"type:bigint" json:"version"` // 版本 + CreatedAt string `gorm:"type:text" json:"created_at"` // 创建时间 +} + +func (m *TaskLog) TableName() string { + return "task_log" +} + +// TaskLogRun 任务执行日志 +type TaskLogRun struct { + Id int64 + TaskId int64 `gorm:"type:bigint" json:"task_id"` // 任务编号 + RunId string `gorm:"type:text" json:"run_id"` // 执行编号 + OutsideIp string `gorm:"type:text" json:"outside_ip"` // 外网ip + InsideIp string `gorm:"type:text" json:"inside_ip"` // 内网ip + Os string `gorm:"type:text" json:"os"` // 系统类型 + Arch string `gorm:"type:text" json:"arch"` // 系统架构 + Gomaxprocs int `gorm:"type:bigint" json:"gomaxprocs"` // CPU核数 + GoVersion string `gorm:"type:text" json:"go_version"` // GO版本 + MacAddrs string `gorm:"type:text" json:"mac_addrs"` // Mac地址 + CreatedAt string `gorm:"type:text" json:"created_at"` // 创建时间 +} + +func (m *TaskLogRun) TableName() string { + return "task_log_run" +} + +// TaskLogRunTake 查询任务执行日志 +func (app *App) TaskLogRunTake(taskId int64, runId string) (result TaskLogRun) { + app.Db.Select("id", "os", "arch", "outside_ip", "created_at").Where("task_id = ?", taskId).Where("run_id = ?", runId).Take(&result) + return result +} + +// TaskIp 任务Ip +type TaskIp struct { + Id int64 + TaskType string `gorm:"type:text" json:"task_type"` // 任务编号 + Ips string `gorm:"type:text" json:"ips"` // 任务IP +} + +func (m *TaskIp) TableName() string { + return "task_ip" +} + +func (app *App) TaskIpUpdate(taskType, ips string) int64 { + var query TaskIp + app.Db.Where("task_type = ?", taskType).Where("ips = ?", ips).Take(&query) + if query.Id != 0 { + return query.Id + } + return app.Db.Create(&TaskIp{ + TaskType: taskType, + Ips: ips, + }).RowsAffected +} + +// TaskIpInit 实例任务ip +func (app *App) TaskIpInit(ips map[string]string) bool { + if app.OutsideIp == "" || app.OutsideIp == "0.0.0.0" { + return false + } + app.Db.Where("ips = ?", app.OutsideIp).Delete(&TaskIp{}) // 删除 + for k, v := range ips { + if v == "" { + app.TaskIpUpdate(k, app.OutsideIp) + } else { + find := strings.Contains(v, ",") + if find == true { + // 包含 + parts := strings.Split(v, ",") + for _, vv := range parts { + if vv == app.OutsideIp { + app.TaskIpUpdate(k, app.OutsideIp) + } + } + } else { + // 不包含 + if v == app.OutsideIp { + app.TaskIpUpdate(k, app.OutsideIp) + } + } + } + } + return true +} diff --git a/service/jobs/params.go b/service/jobs/params.go new file mode 100644 index 00000000..a32ce7a7 --- /dev/null +++ b/service/jobs/params.go @@ -0,0 +1,168 @@ +package jobs + +import ( + "encoding/json" + "errors" + "fmt" +) + +var ParamsOrderType = "order" + +// ParamsOrderId 订单任务 +type ParamsOrderId struct { + OrderId string `json:"order_id,omitempty"` +} + +var ParamsMerchantGoldenBeanType = "merchant.golden_bean" + +// ParamsMerchantUserIdOpenid 商家金豆任务 +type ParamsMerchantUserIdOpenid struct { + MerchantUserId int64 `json:"merchant_user_id,omitempty"` + Openid string `json:"openid,omitempty"` +} + +var ParamsNewServiceType = "new_service" + +// ParamsTaskId 企业自定义任务 +type ParamsTaskId struct { + TaskId int64 `json:"task_id,omitempty"` +} + +var ParamsNewServiceNextType = "new_service.next" + +// ParamsTaskIdNext 企业自定义下一步任务 +type ParamsTaskIdNext struct { + TaskId int64 `json:"task_id,omitempty"` + MerchantUserId int64 `json:"merchant_user_id,omitempty"` + CurrentNumber int `json:"current_number,omitempty"` + MaxNumber int `json:"max_number,omitempty"` +} + +var ParamsWechatType = "wechat" + +// ParamsWechat 微信任务 +type ParamsWechat struct { + Appid string `json:"appid,omitempty"` + Type string `json:"type,omitempty"` +} + +var ParamsTeamInvType = "team.inv" + +// ParamsTeamInv 团队邀请任务 +type ParamsTeamInv struct { + MerchantUserId int64 `json:"merchant_user_id,omitempty"` + Openid string `json:"openid,omitempty"` + ShareOpenid string `json:"share_openid,omitempty"` +} + +var ParamsRepairMerchantAccountQuantityLevelType = "repair.merchant.account.quantity.level" + +// ParamsRepairMerchantAccountQuantityLevel 修复商家账号数量下一步任务 +type ParamsRepairMerchantAccountQuantityLevel struct { + Level int `json:"level,omitempty"` +} + +var ParamsKashangwlType = "kashangwl" + +type ParamsKashangwlId struct { + ProductID int64 `json:"product_id"` +} + +// Params 任务参数 +func Params(v Task) (response CronParamsResp, err error) { + switch v.ParamsType { + case ParamsOrderType: + // 订单任务 + var resp ParamsOrderId + err = json.Unmarshal([]byte(v.Params), &resp) + if err != nil { + return response, errors.New(fmt.Sprintf("解析失败,%v", err)) + } + if resp.OrderId == "" { + return response, errors.New("参数不存在") + } + response.ParamsOrderId.OrderId = resp.OrderId + return response, nil + case ParamsMerchantGoldenBeanType: + // 商家金豆任务 + var resp ParamsMerchantUserIdOpenid + err = json.Unmarshal([]byte(v.Params), &resp) + if err != nil { + return response, errors.New(fmt.Sprintf("解析失败,%v", err)) + } + if resp.MerchantUserId == 0 || resp.Openid == "" { + return response, errors.New("参数不存在") + } + response.ParamsMerchantUserIdOpenid.MerchantUserId = resp.MerchantUserId + response.ParamsMerchantUserIdOpenid.Openid = resp.Openid + return response, nil + case ParamsNewServiceType: + // 企业自定义任务 + var resp ParamsTaskId + err = json.Unmarshal([]byte(v.Params), &resp) + if err != nil { + return response, errors.New(fmt.Sprintf("解析失败,%v", err)) + } + if resp.TaskId == 0 { + return response, errors.New("参数不存在") + } + response.ParamsTaskId.TaskId = resp.TaskId + return response, nil + case ParamsNewServiceNextType: + // 企业自定义下一步任务 + var resp ParamsTaskIdNext + err = json.Unmarshal([]byte(v.Params), &resp) + if err != nil { + return response, errors.New(fmt.Sprintf("解析失败,%v", err)) + } + if resp.TaskId == 0 || resp.MerchantUserId == 0 || resp.CurrentNumber == 0 || resp.MaxNumber == 0 { + return response, errors.New("参数不存在") + } + response.ParamsTaskIdNext.TaskId = resp.TaskId + response.ParamsTaskIdNext.MerchantUserId = resp.MerchantUserId + response.ParamsTaskIdNext.CurrentNumber = resp.CurrentNumber + response.ParamsTaskIdNext.MaxNumber = resp.MaxNumber + return response, nil + case ParamsWechatType: + // 微信任务 + var resp ParamsWechat + err = json.Unmarshal([]byte(v.Params), &resp) + if err != nil { + return response, errors.New(fmt.Sprintf("解析失败,%v", err)) + } + if resp.Appid == "" || resp.Type == "" { + return response, errors.New("参数不存在") + } + response.ParamsWechat.Appid = resp.Appid + response.ParamsWechat.Type = resp.Type + return response, nil + case ParamsTeamInvType: + // 团队邀请任务 + var resp ParamsTeamInv + err = json.Unmarshal([]byte(v.Params), &resp) + if err != nil { + return response, errors.New(fmt.Sprintf("解析失败,%v", err)) + } + if resp.MerchantUserId == 0 || resp.Openid == "" || resp.ShareOpenid == "" { + return response, errors.New("参数不存在") + } + response.ParamsTeamInv.MerchantUserId = resp.MerchantUserId + response.ParamsTeamInv.Openid = resp.Openid + response.ParamsTeamInv.ShareOpenid = resp.ShareOpenid + return response, nil + case ParamsRepairMerchantAccountQuantityLevelType: + // 修复商家账号数量下一步任务 + var resp ParamsRepairMerchantAccountQuantityLevel + err = json.Unmarshal([]byte(v.Params), &resp) + if err != nil { + return response, errors.New(fmt.Sprintf("解析失败,%v", err)) + } + if resp.Level == 0 { + return response, errors.New("参数不存在") + } + response.ParamsRepairMerchantAccountQuantityLevel.Level = resp.Level + return response, nil + default: + return response, nil + } +} diff --git a/service/jobs/type.go b/service/jobs/type.go new file mode 100644 index 00000000..f6d61ff0 --- /dev/null +++ b/service/jobs/type.go @@ -0,0 +1,161 @@ +package jobs + +const ( + // 微信支付查询 + TypeWechatPayPrepaidRefill = "wechat.pay.prepaid_refill" //【话费充值】 + TypeWechatPayPower = "wechat.pay.power" //【电费充值】 + TypeWechatPayKashangwl = "wechat.pay.kashangwl" //【特惠充值】 + TypeWechatPayEastiot = "wechat.pay.eastiot" //【东方物联】 + TypeWechatPayEjiaofei = "wechat.pay.ejiaofei" //【易缴费】 + TypeWechatPayMovie = "wechat.pay.movie" //【守兔】 + + // 接口支付申请 + TypeApiPaySubmitPrepaidRefill = "api.pay.submit.prepaid_refill" //【话费充值】 + TypeApiPaySubmitPower = "api.pay.submit.power" //【电费充值】 + TypeApiPaySubmitKashangwl = "api.pay.submit.kashangwl" //【特惠充值】 + TypeApiPaySubmitEastiot = "api.pay.submit.eastiot" //【东方物联】 + TypeApiPaySubmitEjiaofei = "api.pay.submit.ejiaofei" //【易缴费】 + TypeApiPaySubmitMovie = "api.pay.submit.movie" //【守兔】 + + // 接口支付查询 + TypeApiPayQueryPrepaidRefill = "api.pay.query.prepaid_refill" //【话费充值】 + TypeApiPayQueryPower = "api.pay.query.power" //【电费充值】 + TypeApiPayQueryKashangwl = "api.pay.query.kashangwl" //【特惠充值】 + TypeApiPayQueryEastiot = "api.pay.query.eastiot" //【东方物联】 + TypeApiPayQueryEjiaofei = "api.pay.query.ejiaofei" //【易缴费】 + TypeApiPayQueryMovie = "api.pay.query.movie" //【守兔】 + TypeApiPayQueryPinduoduo = "api.pay.query.pinduoduo" //【拼多多】 + TypeApiPayQueryMeituan = "api.pay.query.meituan" //【美团】 + + // 微信支付退款申请 + TypeWechatRefundsSubmitPrepaidRefill = "wechat.refunds.submit.prepaid_refill" //【话费充值】 + TypeWechatRefundsSubmitPower = "wechat.refunds.submit.power" //【电费充值】 + TypeWechatRefundsSubmitKashangwl = "wechat.refunds.submit.kashangwl" //【特惠充值】 + TypeWechatRefundsSubmitEastiot = "wechat.refunds.submit.eastiot" //【东方物联】 + TypeWechatRefundsSubmitEjiaofei = "wechat.refunds.submit.ejiaofei" //【易缴费】 + TypeWechatRefundsSubmitMovie = "wechat.refunds.submit.movie" //【守兔】 + + // 微信支付退款查询 + TypeWechatRefundsQueryPrepaidRefill = "wechat.refunds.query.prepaid_refill" //【话费充值】 + TypeWechatRefundsQueryPower = "wechat.refunds.query.power" //【电费充值】 + TypeWechatRefundsQueryKashangwl = "wechat.refunds.query.kashangwl" //【特惠充值】 + TypeWechatRefundsQueryEastiot = "wechat.refunds.query.eastiot" //【东方物联】 + TypeWechatRefundsQueryEjiaofei = "wechat.refunds.query.ejiaofei" //【易缴费】 + TypeWechatRefundsQueryMovie = "wechat.refunds.query.movie" //【守兔】 + + // 返拥 + TypeGoldenBeansIssuePrepaidRefill = "golden_beans.issue.prepaid_refill" //【话费充值】 + TypeGoldenBeansIssuePower = "golden_beans.issue.power" //【电费充值】 + TypeGoldenBeansIssueKashangwl = "golden_beans.issue.kashangwl" //【特惠充值】 + TypeGoldenBeansIssueEastiot = "golden_beans.issue.eastiot" //【东方物联】 + TypeGoldenBeansIssueMovie = "golden_beans.issue.movie" //【守兔】 + TypeGoldenBeansIssueRewardedvideo = "golden_beans.issue.rewardedvideo" //【激励视频】 + + // TypeGoldenBeansFrozenPinduoduo 【拼多多】冻结返拥金豆 + TypeGoldenBeansFrozenPinduoduo = "golden_beans.frozen.pinduoduo" + // TypeGoldenBeansFrozenMeituan 【美团】冻结返拥金豆 + TypeGoldenBeansFrozenMeituan = "golden_beans.frozen.meituan" + + // TypeGoldenBeansThawSuccessPinduoduo 【拼多多】解冻返拥金豆正常发放 + TypeGoldenBeansThawSuccessPinduoduo = "golden_beans.thaw.success.pinduoduo" + // TypeGoldenBeansThawSuccessMeituan 【美团】解冻返拥金豆正常发放 + TypeGoldenBeansThawSuccessMeituan = "golden_beans.thaw.success.meituan" + + // TypeGoldenBeansThawErrorPinduoduo 【拼多多】解冻返拥金豆扣款 + TypeGoldenBeansThawErrorPinduoduo = "golden_beans.thaw.error.pinduoduo" + // TypeGoldenBeansThawErrorMeituan 【美团】解冻返拥金豆扣款 + TypeGoldenBeansThawErrorMeituan = "golden_beans.thaw.error.meituan" + + // 抵扣金豆退款 + TypeGoldenBeansRefundsPrepaidRefill = "golden_beans.refunds.prepaid_refill" //【话费充值】 + TypeGoldenBeansRefundsPower = "golden_beans.refunds.power" //【电费充值】 + + // 金豆退款 + TypeGoldenBeansRefundsEjiaofei = "golden_beans.refunds.ejiaofei" //【易缴费】 + + // 客服进度 + TypeCustomerAutoPrepaidRefill = "customer.auto.prepaid_refill" //【话费充值】 + TypeCustomerAutoPower = "customer.auto.power" //【电费充值】 + TypeCustomerAutoKashangwl = "customer.auto.kashangwl" //【特惠充值】 + TypeCustomerAutoEjiaofei = "customer.auto.ejiaofei" //【易缴费】 + TypeCustomerAutoMovie = "customer.auto.movie" //【守兔】 + + // 订单同步 + TypeSyncOrderPinduoduo = "sync.order.pinduoduo" //【拼多多】 + TypeSyncOrderMeituan = "sync.order.meituan" //【美团】 + + // 商品同步 + TypeSyncGoodsEastiot = "sync.goods.eastiot" //【东方物联】 + TypeSyncGoodsTypeEastiot = "sync.goods.type.eastiot" //【东方物联】 + TypeSyncGoodsPriceAllKashangwl = "sync.goods.price.all.kashangwl" //【特惠充值】 + TypeSyncGoodsPriceSingleKashangwl = "sync.goods.price.single.kashangwl" //【特惠充值】 + TypeCheckGoodsAllPinduoduo = "check.goods.all.pinduoduo" //【拼多多】 + TypeCheckGoodsSinglePinduoduo = "check.goods.single.pinduoduo" //【拼多多】 + + // 微信更新 + TypeSyncWechat = "sync.wechat" //【微信】token/ticket同步 + + // 商家金豆转换 + TypeGoldenBeanConversionUserGoldenBean = "admin.golden_bean.conversion.user.golden_bean" //【商家金豆】转用户金豆 + TypeGoldenBeanConversionUserDeductGoldenBean = "admin.golden_bean.conversion.user.deduct.golden_bean" //【商家金豆】转用户抵扣金豆 + + // 企业自定义 + TypeNewServiceAgentIssue = "new_service.agent.issue" //【企业自定义】【代理商】下发检查 + TypeNewServiceAgentIssueNext = "new_service.agent.issue.next" //【企业自定义】【代理商】下发到商家 + + // 团队 + TypeTeamInv = "team.inv" //【团队邀请】 + + // 修复商家账号数量 + TypeRepairMerchantAccountQuantityTesting = "repair_merchant.account.quantity.testing" //【修复】【商家账号】【数量】查询出等级进行下一步 + TypeRepairMerchantAccountQuantityLevel = "repair_merchant.account.quantity.level" //【修复】【商家账号】【数量】通过等级来修复 + + // 观察接口 + TypeApiPayObservationPrepaidRefill = "api.pay.observation.prepaid_refill" //{600}【话费充值】 + TypeApiPayObservationPower = "api.pay.observation.power" //{600}【电费充值】 + TypeApiPayObservationKashangwl = "api.pay.observation.kashangwl" //{600}【特惠充值】 + TypeApiPayObservationEjiaofei = "api.pay.observation.ejiaofei" //{600}【易缴费】 + TypeApiPayObservationMovie = "api.pay.observation.movie" //{600}【守兔】 + TypeApiPayObservationPinduoduo = "api.pay.observation.pinduoduo" //{600}【拼多多】 + TypeApiPayObservationMeituan = "api.pay.observation.meituan" //{600}【美团】 + TypeApiPayObservationWechat = "api.pay.observation.wechat" //{600}【微信支付】 + TypeApiPayObservationWechatRefunds = "api.pay.observation.wechat.refunds" //{600}【微信支付退款】 + TypeApiPayObservationWechatWithdrawal = "api.pay.observation.wechat.withdrawal" //{600}【微信支付提现】 + + // 微信提现 + TypeWechatPayWithdrawalSubmit = "wechat.pay.withdrawal.submit" // 微信支付提现申请 + TypeWechatPayWithdrawalQuery = "wechat.pay.withdrawal.query" // 微信支付提现查询 + TypeWechatPayWithdrawalRefunds = "wechat.pay.withdrawal.refunds" // 微信支付提现退款 +) + +func GetTypeWechatPay(Type string) string { + return "wechat.pay." + Type +} + +func GetTypeApiPaySubmit(Type string) string { + return "api.pay.submit." + Type +} + +func GetTypeApiPayQuery(Type string) string { + return "api.pay.query." + Type +} + +func GetTypeWechatRefundsSubmit(Type string) string { + return "wechat.refunds.submit." + Type +} + +func GetTypeWechatRefundsQuery(Type string) string { + return "wechat.refunds.query." + Type +} + +func GetTypeGoldenBeansIssue(Type string) string { + return "golden_beans.issue." + Type +} + +func GetTypeGoldenBeansRefunds(Type string) string { + return "golden_beans.refunds." + Type +} + +func GetTypeCustomerAuto(Type string) string { + return "customer.auto." + Type +} diff --git a/service/kashangwl/buy.go b/service/kashangwl/api.buy.go similarity index 70% rename from service/kashangwl/buy.go rename to service/kashangwl/api.buy.go index 423af01d..b60fe8b8 100644 --- a/service/kashangwl/buy.go +++ b/service/kashangwl/api.buy.go @@ -2,7 +2,7 @@ package kashangwl import "encoding/json" -type BuyResponse struct { +type ApiBuyResponse struct { Code string `json:"code"` Message string `json:"message"` Data struct { @@ -22,25 +22,25 @@ type BuyResponse struct { } `json:"data"` } -type BuyResult struct { - Result BuyResponse // 结果 - Body []byte // 内容 - Err error // 错误 +type ApiBuyResult struct { + Result ApiBuyResponse // 结果 + Body []byte // 内容 + Err error // 错误 } -func NewBuyResult(result BuyResponse, body []byte, err error) *BuyResult { - return &BuyResult{Result: result, Body: body, Err: err} +func NewApiBuyResult(result ApiBuyResponse, body []byte, err error) *ApiBuyResult { + return &ApiBuyResult{Result: result, Body: body, Err: err} } -// Buy 购买商品 -// http://doc.cqmeihu.cn/sales/BuyProduct.html -func (app *App) Buy(notMustParams ...Params) *BuyResult { +// ApiBuy 购买商品 +// http://doc.cqmeihu.cn/sales/buy.html +func (app *App) ApiBuy(notMustParams ...Params) *ApiBuyResult { // 参数 params := app.NewParamsWith(notMustParams...) // 请求 body, err := app.request("http://www.kashangwl.com/api/buy", params) // 定义 - var response BuyResponse + var response ApiBuyResponse err = json.Unmarshal(body, &response) - return NewBuyResult(response, body, err) + return NewApiBuyResult(response, body, err) } diff --git a/service/kashangwl/api.customer.go b/service/kashangwl/api.customer.go new file mode 100644 index 00000000..a6788929 --- /dev/null +++ b/service/kashangwl/api.customer.go @@ -0,0 +1,34 @@ +package kashangwl + +import "encoding/json" + +type ApiCustomerResponse struct { + Code string `json:"code"` + Message string `json:"message"` + Data struct { + Id int `json:"id"` // 商家编号 + Name string `json:"name"` // 商家名称 + Balance string `json:"balance"` // 余额 + } `json:"data"` +} + +type ApiCustomerResult struct { + Result ApiCustomerResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewApiCustomerResult(result ApiCustomerResponse, body []byte, err error) *ApiCustomerResult { + return &ApiCustomerResult{Result: result, Body: body, Err: err} +} + +// ApiCustomer 获取商家信息 +// http://doc.cqmeihu.cn/sales/merchant-info.html +func (app *App) ApiCustomer() *ApiCustomerResult { + // 请求 + body, err := app.request("http://www.kashangwl.com/api/customer", map[string]interface{}{}) + // 定义 + var response ApiCustomerResponse + err = json.Unmarshal(body, &response) + return NewApiCustomerResult(response, body, err) +} diff --git a/service/kashangwl/order.go b/service/kashangwl/api.order.go similarity index 76% rename from service/kashangwl/order.go rename to service/kashangwl/api.order.go index 7573f3de..58f07647 100644 --- a/service/kashangwl/order.go +++ b/service/kashangwl/api.order.go @@ -4,7 +4,7 @@ import ( "encoding/json" ) -type OrderResponse struct { +type ApiOrderResponse struct { Code string `json:"code"` Message string `json:"message"` Data struct { @@ -32,25 +32,25 @@ type OrderResponse struct { No string `json:"no"` Password string `json:"password"` } `json:"cards"` //【卡密类订单】卡密 - RechargeParams string `json:"recharge_params"` //【充值类订单】 - OuterOrderID string `json:"outer_order_id,omitempty"` // 外部订单号 + RechargeParams string `json:"recharge_params"` //【充值类订单】 + OuterApiOrderID string `json:"outer_ApiOrder_id,omitempty"` // 外部订单号 } `json:"data"` } -type OrderResult struct { - Result OrderResponse // 结果 - Body []byte // 内容 - Err error // 错误 +type ApiOrderResult struct { + Result ApiOrderResponse // 结果 + Body []byte // 内容 + Err error // 错误 } -func NewOrderResult(result OrderResponse, body []byte, err error) *OrderResult { - return &OrderResult{Result: result, Body: body, Err: err} +func NewApiOrderResult(result ApiOrderResponse, body []byte, err error) *ApiOrderResult { + return &ApiOrderResult{Result: result, Body: body, Err: err} } -// Order 获取单个订单信息。 +// ApiOrder 获取单个订单信息。 // 仅能获取自己购买的订单。 -// http://doc.cqmeihu.cn/sales/OrderInfo.html -func (app App) Order(orderId string) *OrderResult { +// http://doc.cqmeihu.cn/sales/order-info.html +func (app App) ApiOrder(orderId string) *ApiOrderResult { // 参数 param := NewParams() param.Set("order_id", orderId) @@ -58,7 +58,7 @@ func (app App) Order(orderId string) *OrderResult { // 请求 body, err := app.request("http://www.kashangwl.com/api/order", params) // 定义 - var response OrderResponse + var response ApiOrderResponse err = json.Unmarshal(body, &response) - return NewOrderResult(response, body, err) + return NewApiOrderResult(response, body, err) } diff --git a/service/kashangwl/api.outer-order.go b/service/kashangwl/api.outer-order.go new file mode 100644 index 00000000..6a38ed16 --- /dev/null +++ b/service/kashangwl/api.outer-order.go @@ -0,0 +1,64 @@ +package kashangwl + +import ( + "encoding/json" +) + +type ApiOuterOrderResponse struct { + Code string `json:"code"` + Message string `json:"message"` + Data struct { + ID int64 `json:"id"` // 订单号 + ProductID int `json:"product_id"` // 商品编号 + ProductName string `json:"product_name"` // 商品名称 + ProductType int `json:"product_type"` // 商品类型(1:充值,2:卡密,3:卡券,4:人工) + ProductPrice string `json:"product_price"` // 售价 + Quantity int `json:"quantity"` // 购买数量 + TotalPrice string `json:"total_price"` // 总支付价格 + RefundedAmount float64 `json:"refunded_amount"` // 已退款金额 + BuyerCustomerID int `json:"buyer_customer_id"` // 买家编号 + BuyerCustomerName string `json:"buyer_customer_name"` // 买家名称 + SellerCustomerID int `json:"seller_customer_id"` // 卖家编号 + SellerCustomerName string `json:"seller_customer_name"` // 卖家名称 + State int `json:"state"` // 订单状态(100:等待发货,101:正在充值,200:交易成功,500:交易失败,501:未知状态) + CreatedAt string `json:"created_at"` // 下单时间 + RechargeAccount string `json:"recharge_account"` // 充值账号 + ProgressInit int `json:"progress_init"` // 充值进度:初始值 + ProgressNow int `json:"progress_now"` // 充值进度:现在值 + ProgressTarget int `json:"progress_target"` // 充值进度:目标值 + RechargeInfo string `json:"recharge_info"` // 返回信息 + RechargeUrl string `json:"recharge_url"` // 卡密充值网址 + Cards []struct { + No string `json:"no"` + Password string `json:"password"` + } `json:"cards"` //【卡密类订单】卡密 + RechargeParams string `json:"recharge_params"` //【充值类订单】 + OuterOrderID string `json:"outer_order_id,omitempty"` // 外部订单号 + } `json:"data"` +} + +type ApiOuterOrderResult struct { + Result ApiOuterOrderResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewApiOuterOrderResult(result ApiOuterOrderResponse, body []byte, err error) *ApiOuterOrderResult { + return &ApiOuterOrderResult{Result: result, Body: body, Err: err} +} + +// ApiOuterOrder 使用外部订单号获取单个订单信息 +// 仅能获取自己购买的订单 +// http://doc.cqmeihu.cn/sales/outer-order-info.html +func (app App) ApiOuterOrder(orderId string) *ApiOuterOrderResult { + // 参数 + param := NewParams() + param.Set("outer_order_id", orderId) + params := app.NewParamsWith(param) + // 请求 + body, err := app.request("http://www.kashangwl.com/api/outer-order", params) + // 定义 + var response ApiOuterOrderResponse + err = json.Unmarshal(body, &response) + return NewApiOuterOrderResult(response, body, err) +} diff --git a/service/kashangwl/product.go b/service/kashangwl/api.product.go similarity index 52% rename from service/kashangwl/product.go rename to service/kashangwl/api.product.go index 40f5de54..7512bb8e 100644 --- a/service/kashangwl/product.go +++ b/service/kashangwl/api.product.go @@ -2,12 +2,12 @@ package kashangwl import "encoding/json" -type ProductResponse struct { +type ApiProductResponse struct { Code string `json:"code"` Message string `json:"message"` Data struct { - Id int64 `json:"id"` - ProductName string `json:"product_name,omitempty"` + Id int `json:"id"` + ProductName string `json:"product_name"` Name string `json:"name"` Price float64 `json:"price"` ValidPurchasingQuantity string `json:"valid_purchasing_quantity"` @@ -15,31 +15,31 @@ type ProductResponse struct { Type int `json:"type"` SupplyState int `json:"supply_state"` StockState int `json:"stock_state"` - BanStartAt string `json:"ban_start_at,omitempty"` - BanEndAt string `json:"ban_end_at,omitempty"` + BanStartAt string `json:"ban_start_at"` + BanEndAt string `json:"ban_end_at"` } `json:"data"` } -type ProductResult struct { - Result ProductResponse // 结果 - Body []byte // 内容 - Err error // 错误 +type ApiProductResult struct { + Result ApiProductResponse // 结果 + Body []byte // 内容 + Err error // 错误 } -func NewProductResult(result ProductResponse, body []byte, err error) *ProductResult { - return &ProductResult{Result: result, Body: body, Err: err} +func NewApiProductResult(result ApiProductResponse, body []byte, err error) *ApiProductResult { + return &ApiProductResult{Result: result, Body: body, Err: err} } -// Product 获取单个商品信息 +// ApiProduct 获取单个商品信息 // http://doc.cqmeihu.cn/sales/product-info.html -func (app App) Product(productId int64) *ProductResult { +func (app App) ApiProduct(productId int64) *ApiProductResult { // 参数 params := NewParams() params.Set("product_id", productId) // 请求 body, err := app.request("http://www.kashangwl.com/api/product", params) // 定义 - var response ProductResponse + var response ApiProductResponse err = json.Unmarshal(body, &response) - return NewProductResult(response, body, err) + return NewApiProductResult(response, body, err) } diff --git a/service/kashangwl/api.product.recharge-params.go b/service/kashangwl/api.product.recharge-params.go new file mode 100644 index 00000000..30bea897 --- /dev/null +++ b/service/kashangwl/api.product.recharge-params.go @@ -0,0 +1,40 @@ +package kashangwl + +import "encoding/json" + +type ApiProductRechargeParamsResponse struct { + Code string `json:"code"` + Message string `json:"message"` + Data struct { + RechargeAccountLabel string `json:"recharge_account_label"` + RechargeParams []struct { + Name string `json:"name"` + Type string `json:"type"` + Options string `json:"options"` + } `json:"recharge_params"` + } `json:"data"` +} + +type ApiProductRechargeParamsResult struct { + Result ApiProductRechargeParamsResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewApiProductRechargeParamsResult(result ApiProductRechargeParamsResponse, body []byte, err error) *ApiProductRechargeParamsResult { + return &ApiProductRechargeParamsResult{Result: result, Body: body, Err: err} +} + +// ApiProductRechargeParams 接口说明 +// 获取商品的充值参数(仅支持充值类商品) +// http://doc.cqmeihu.cn/sales/ProductParams.html +func (app App) ApiProductRechargeParams(notMustParams ...Params) *ApiProductRechargeParamsResult { + // 参数 + params := app.NewParamsWith(notMustParams...) + // 请求 + body, err := app.request("http://www.kashangwl.com/api/product/recharge-params", params) + // 定义 + var response ApiProductRechargeParamsResponse + err = json.Unmarshal(body, &response) + return NewApiProductRechargeParamsResult(response, body, err) +} diff --git a/service/kashangwl/app.go b/service/kashangwl/app.go index d3d770a5..e51ca367 100644 --- a/service/kashangwl/app.go +++ b/service/kashangwl/app.go @@ -1,24 +1,18 @@ package kashangwl import ( + "dtapps/dta/library/utils/gohttp" + "dtapps/dta/library/utils/gomongo" "encoding/json" - "fmt" - "github.com/dtapps/go-library/utils/gohttp" - "github.com/go-redis/redis/v8" - "go.mongodb.org/mongo-driver/mongo" - "go.uber.org/zap" - "gorm.io/gorm" + "net/http" "time" ) // App 卡商网服务 type App struct { - CustomerId int // 商家编号 - CustomerKey string // 商家密钥 - ZapLog *zap.Logger // 日志服务 - Db *gorm.DB // 关系数据库服务 - RDb *redis.Client // 缓存数据库服务 - MDb *mongo.Client // 非关系数据库服务 + CustomerId int // 商家编号 + CustomerKey string // 商家密钥 + Mongo gomongo.App // 日志数据库 } func (app *App) request(url string, params map[string]interface{}) ([]byte, error) { @@ -32,8 +26,6 @@ func (app *App) request(url string, params map[string]interface{}) ([]byte, erro // 请求 postJson, err := gohttp.PostJson(url, paramsStr) // 日志 - if app.ZapLog != nil { - app.ZapLog.Sugar().Info(fmt.Sprintf("%s %s %s", url, postJson.Header, postJson.Body)) - } + go app.mongoLog(url, params, http.MethodPost, postJson) return postJson.Body, err } diff --git a/service/kashangwl/go.mod b/service/kashangwl/go.mod deleted file mode 100644 index c24eac85..00000000 --- a/service/kashangwl/go.mod +++ /dev/null @@ -1,33 +0,0 @@ -module github.com/dtapps/go-library/service/kashangwl - -go 1.18 - -require ( - github.com/dtapps/go-library/utils/gohttp v0.0.0-20220320040709-ad8a5f0e9e40 - github.com/dtapps/go-library/utils/goparams v0.0.0-20220320040709-ad8a5f0e9e40 - github.com/go-redis/redis/v8 v8.11.5 - go.mongodb.org/mongo-driver v1.8.4 - go.uber.org/zap v1.21.0 - gorm.io/gorm v1.23.3 -) - -require ( - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/go-stack/stack v1.8.0 // indirect - github.com/golang/snappy v0.0.1 // indirect - github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jinzhu/now v1.1.4 // indirect - github.com/klauspost/compress v1.13.6 // indirect - github.com/nilorg/sdk v0.0.0-20210429091026-95b6cdc95c84 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.0.2 // indirect - github.com/xdg-go/stringprep v1.0.2 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f // indirect - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/text v0.3.6 // indirect -) diff --git a/service/kashangwl/mongodb.go b/service/kashangwl/mongodb.go new file mode 100644 index 00000000..a885c2fd --- /dev/null +++ b/service/kashangwl/mongodb.go @@ -0,0 +1,47 @@ +package kashangwl + +import ( + "dtapps/dta/library/utils/gohttp" + "encoding/json" + "gitee.com/dtapps/go-library/utils/gotime" +) + +// 日志 +type mongoZap struct { + Url string `json:"url" bson:"url"` + Params interface{} `json:"params" bson:"params"` + Method string `json:"method" bson:"method"` + Header interface{} `json:"header" bson:"header"` + Status string `json:"status" bson:"status"` + StatusCode int `json:"status_code" bson:"status_code"` + Body interface{} `json:"body" bson:"body"` + ContentLength int64 `json:"content_length" bson:"content_length"` + CreateTime string `json:"create_time" bson:"create_time"` +} + +func (m *mongoZap) Database() string { + return "zap_logs" +} + +func (m *mongoZap) TableName() string { + return "kashangwl_" + gotime.Current().SetFormat("200601") +} + +func (app *App) mongoLog(url string, params map[string]interface{}, method string, request gohttp.Response) { + if app.Mongo.Db == nil { + return + } + var body map[string]interface{} + _ = json.Unmarshal(request.Body, &body) + app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{ + Url: url, + Params: params, + Method: method, + Header: request.Header, + Status: request.Status, + StatusCode: request.StatusCode, + Body: body, + ContentLength: request.ContentLength, + CreateTime: gotime.Current().Format(), + }) +} diff --git a/service/kashangwl/product.recharge-params.go b/service/kashangwl/product.recharge-params.go deleted file mode 100644 index a8b7718c..00000000 --- a/service/kashangwl/product.recharge-params.go +++ /dev/null @@ -1,40 +0,0 @@ -package kashangwl - -import "encoding/json" - -type ProductRechargeParamsResponse struct { - Code string `json:"code"` - Message string `json:"message"` - Data struct { - RechargeAccountLabel string `json:"recharge_account_label"` - RechargeParams []struct { - Name string `json:"name"` - Type string `json:"type"` - Options string `json:"options"` - } `json:"recharge_params"` - } `json:"data"` -} - -type ProductRechargeParamsResult struct { - Result ProductRechargeParamsResponse // 结果 - Body []byte // 内容 - Err error // 错误 -} - -func NewProductRechargeParamsResult(result ProductRechargeParamsResponse, body []byte, err error) *ProductRechargeParamsResult { - return &ProductRechargeParamsResult{Result: result, Body: body, Err: err} -} - -// ProductRechargeParams 接口说明 -// 获取商品的充值参数(仅支持充值类商品) -// http://doc.cqmeihu.cn/sales/ProductParams.html -func (app App) ProductRechargeParams(notMustParams ...Params) *ProductRechargeParamsResult { - // 参数 - params := app.NewParamsWith(notMustParams...) - // 请求 - body, err := app.request("http://www.kashangwl.com/api/product/recharge-params", params) - // 定义 - var response ProductRechargeParamsResponse - err = json.Unmarshal(body, &response) - return NewProductRechargeParamsResult(response, body, err) -} diff --git a/service/kashangwl/sign.go b/service/kashangwl/sign.go index f2fbe561..bd4fba16 100644 --- a/service/kashangwl/sign.go +++ b/service/kashangwl/sign.go @@ -3,9 +3,9 @@ package kashangwl import ( "bytes" "crypto/md5" + "dtapps/dta/library/utils/goparams" "encoding/hex" "encoding/json" - "github.com/dtapps/go-library/utils/goparams" "io" "net/url" "sort" diff --git a/service/leshuazf/apiv2.merchant.updateAuthority.go b/service/leshuazf/apiv2.merchant.updateAuthority.go new file mode 100644 index 00000000..d5f15ef6 --- /dev/null +++ b/service/leshuazf/apiv2.merchant.updateAuthority.go @@ -0,0 +1,32 @@ +package leshuazf + +import ( + "encoding/json" + "net/http" +) + +type ApiV2MerchantUpdateAuthorityResponse struct { +} + +type ApiV2MerchantUpdateAuthorityResult struct { + Result ApiV2MerchantUpdateAuthorityResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewApiV2MerchantUpdateAuthorityResult(result ApiV2MerchantUpdateAuthorityResponse, body []byte, err error) *ApiV2MerchantUpdateAuthorityResult { + return &ApiV2MerchantUpdateAuthorityResult{Result: result, Body: body, Err: err} +} + +// ApiV2MerchantUpdateAuthority 给商户开通D0交易/结算权限接口。其中D0交易影响交易接口内t0字段能否标1,D0结算影响商户该种支付方式的秒到 +// https://www.yuque.com/leshuazf/doc/dbmxyi#Vw97n +func (app *App) ApiV2MerchantUpdateAuthority(notMustParams ...Params) *ApiV2MerchantUpdateAuthorityResult { + // 参数 + params := app.NewParamsWith(notMustParams...) + // 请求 + body, err := app.request("apiv2/merchant/updateAuthority", params, http.MethodPost) + // 定义 + var response ApiV2MerchantUpdateAuthorityResponse + err = json.Unmarshal(body, &response) + return NewApiV2MerchantUpdateAuthorityResult(response, body, err) +} diff --git a/service/leshuazf/app.go b/service/leshuazf/app.go new file mode 100644 index 00000000..e98a1a19 --- /dev/null +++ b/service/leshuazf/app.go @@ -0,0 +1,51 @@ +package leshuazf + +import ( + "dtapps/dta/library/utils/gohttp" + "dtapps/dta/library/utils/gomongo" + "dtapps/dta/library/utils/gopostgresql" + "errors" + "gitee.com/dtapps/go-library/utils/gorandom" + "gitee.com/dtapps/go-library/utils/gotime" + "log" + "net/http" +) + +// App 乐刷 +type App struct { + AgentId string // 服务商编号,由乐刷分配的接入方唯一标识,明文传输。 + Environment string // 环境 + KeyAgent string + Pgsql gopostgresql.App // 日志数据库 + Mongo gomongo.App // 日志数据库 +} + +func (app *App) request(url string, params map[string]interface{}, method string) (resp []byte, err error) { + // 环境 + if app.Environment == "test" { + url = "http://t-saas-mch.lepass.cn/" + url + } else { + url = "https://saas-mch.leshuazf.com/" + url + } + // 参数 + params["agentId"] = app.AgentId // 服务商编号,由乐刷分配的接入方唯一标识,明文传输。 + params["version"] = "2.0" // 目前固定值2.0 + params["reqSerialNo"] = gotime.Current().SetFormat("20060102150405") + gorandom.Numeric(5) // 请求流水号(yyyyMMddHHmmssSSSXXXXX,其中 XXXXX为5位顺序号,禁止使用UUID等无意义数据) + params["sign"] = app.getSign(params) + + log.Println(app) + log.Println(url) + log.Println(params) + + switch method { + case http.MethodGet: + // 请求 + get, err := gohttp.Get(url, params) + return get.Body, err + case http.MethodPost: + postJson, err := gohttp.PostForm(url, params) + return postJson.Body, err + default: + return nil, errors.New("请求类型不支持") + } +} diff --git a/service/leshuazf/data.area.go b/service/leshuazf/data.area.go new file mode 100644 index 00000000..85d30c48 --- /dev/null +++ b/service/leshuazf/data.area.go @@ -0,0 +1,40 @@ +package leshuazf + +import ( + "encoding/json" + "net/http" +) + +type DataAreaResponse struct { + RespCode string `json:"respCode"` + RespMsg string `json:"respMsg"` + ReqSerialNo string `json:"reqSerialNo"` + Data []struct { + AreaName string `json:"areaName"` + AreaCode string `json:"areaCode"` + ParentAreaCode string `json:"parentAreaCode"` + } `json:"data"` +} + +type DataAreaResult struct { + Result DataAreaResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewDataAreaResult(result DataAreaResponse, body []byte, err error) *DataAreaResult { + return &DataAreaResult{Result: result, Body: body, Err: err} +} + +// DataArea 代理商通过地区信息来查地区详细信息 +// https://www.yuque.com/leshuazf/doc/dbmxyi#YwJl7 +func (app *App) DataArea(notMustParams ...Params) *DataAreaResult { + // 参数 + params := app.NewParamsWith(notMustParams...) + // 请求 + body, err := app.request("data/area", params, http.MethodPost) + // 定义 + var response DataAreaResponse + err = json.Unmarshal(body, &response) + return NewDataAreaResult(response, body, err) +} diff --git a/service/leshuazf/data.bankbranch2.go b/service/leshuazf/data.bankbranch2.go new file mode 100644 index 00000000..96857b64 --- /dev/null +++ b/service/leshuazf/data.bankbranch2.go @@ -0,0 +1,53 @@ +package leshuazf + +import ( + "encoding/json" + "net/http" +) + +type DataBankBranch2Response struct { + RespCode string `json:"respCode"` + RespMsg string `json:"respMsg"` + ReqSerialNo string `json:"reqSerialNo"` + Data struct { + Total int `json:"total"` + Page int `json:"page"` + PageSize int `json:"pageSize"` + List []struct { + UnionpayCode string `json:"unionpayCode"` + FinInstitutionCode string `json:"finInstitutionCode"` + BankArea string `json:"bankArea"` + BankCity string `json:"bankCity"` + BranchName string `json:"branchName"` + CftAreaCode string `json:"cftAreaCode"` + CftCityCode string `json:"cftCityCode"` + UnionAreaCode interface{} `json:"unionAreaCode"` + UnionCityCode interface{} `json:"unionCityCode"` + FinInstitutionName string `json:"finInstitutionName"` + BankName string `json:"bankName"` + } `json:"list"` + } `json:"data"` +} + +type DataBankBranch2Result struct { + Result DataBankBranch2Response // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewDataBankBranch2Result(result DataBankBranch2Response, body []byte, err error) *DataBankBranch2Result { + return &DataBankBranch2Result{Result: result, Body: body, Err: err} +} + +// DataBankBranch2 代理商通过联行号来查支行信息 +// https://www.yuque.com/leshuazf/doc/dbmxyi#QYl0c +func (app *App) DataBankBranch2(notMustParams ...Params) *DataBankBranch2Result { + // 参数 + params := app.NewParamsWith(notMustParams...) + // 请求 + body, err := app.request("data/bankbranch2", params, http.MethodPost) + // 定义 + var response DataBankBranch2Response + err = json.Unmarshal(body, &response) + return NewDataBankBranch2Result(response, body, err) +} diff --git a/service/leshuazf/data.mcc.go b/service/leshuazf/data.mcc.go new file mode 100644 index 00000000..cfa64073 --- /dev/null +++ b/service/leshuazf/data.mcc.go @@ -0,0 +1,39 @@ +package leshuazf + +import ( + "encoding/json" + "net/http" +) + +type DataMccResponse struct { + RespCode string `json:"respCode"` + RespMsg string `json:"respMsg"` + ReqSerialNo string `json:"reqSerialNo"` + Data []struct { + GrandpaCode string `json:"grandpaCode"` + GrandpaText string `json:"grandpaText"` + } `json:"data"` +} + +type DataMccResult struct { + Result DataMccResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewDataMccResult(result DataMccResponse, body []byte, err error) *DataMccResult { + return &DataMccResult{Result: result, Body: body, Err: err} +} + +// DataMcc 代理商通过MccCode来查商户类别明细 +// https://www.yuque.com/leshuazf/doc/dbmxyi#jRTHN +func (app *App) DataMcc(notMustParams ...Params) *DataMccResult { + // 参数 + params := app.NewParamsWith(notMustParams...) + // 请求 + body, err := app.request("data/mcc", params, http.MethodPost) + // 定义 + var response DataMccResponse + err = json.Unmarshal(body, &response) + return NewDataMccResult(response, body, err) +} diff --git a/service/leshuazf/mongodb.go b/service/leshuazf/mongodb.go new file mode 100644 index 00000000..21dcc51c --- /dev/null +++ b/service/leshuazf/mongodb.go @@ -0,0 +1,47 @@ +package leshuazf + +import ( + "dtapps/dta/library/utils/gohttp" + "encoding/json" + "gitee.com/dtapps/go-library/utils/gotime" +) + +// 日志 +type mongoZap struct { + Url string `json:"url" bson:"url"` + Params interface{} `json:"params" bson:"params"` + Method string `json:"method" bson:"method"` + Header interface{} `json:"header" bson:"header"` + Status string `json:"status" bson:"status"` + StatusCode int `json:"status_code" bson:"status_code"` + Body interface{} `json:"body" bson:"body"` + ContentLength int64 `json:"content_length" bson:"content_length"` + CreateTime string `json:"create_time" bson:"create_time"` +} + +func (m *mongoZap) Database() string { + return "zap_logs" +} + +func (m *mongoZap) TableName() string { + return "leshuazf_" + gotime.Current().SetFormat("200601") +} + +func (app *App) mongoLog(url string, params map[string]interface{}, method string, request gohttp.Response) { + if app.Mongo.Db == nil { + return + } + var body map[string]interface{} + _ = json.Unmarshal(request.Body, &body) + app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{ + Url: url, + Params: params, + Method: method, + Header: request.Header, + Status: request.Status, + StatusCode: request.StatusCode, + Body: body, + ContentLength: request.ContentLength, + CreateTime: gotime.Current().Format(), + }) +} diff --git a/service/leshuazf/params.go b/service/leshuazf/params.go new file mode 100644 index 00000000..a294b3ab --- /dev/null +++ b/service/leshuazf/params.go @@ -0,0 +1,27 @@ +package leshuazf + +// Params 请求参数 +type Params map[string]interface{} + +func NewParams() Params { + p := make(Params) + return p +} + +func (app *App) NewParamsWith(params ...Params) Params { + p := make(Params) + for _, v := range params { + p.SetParams(v) + } + return p +} + +func (p Params) Set(key string, value interface{}) { + p[key] = value +} + +func (p Params) SetParams(params Params) { + for key, value := range params { + p[key] = value + } +} diff --git a/service/leshuazf/picture.upload.go b/service/leshuazf/picture.upload.go new file mode 100644 index 00000000..1caeac67 --- /dev/null +++ b/service/leshuazf/picture.upload.go @@ -0,0 +1 @@ +package leshuazf diff --git a/service/leshuazf/sign.go b/service/leshuazf/sign.go new file mode 100644 index 00000000..6c5ed9bb --- /dev/null +++ b/service/leshuazf/sign.go @@ -0,0 +1,21 @@ +package leshuazf + +import ( + "dtapps/dta/library/utils/gobase64" + "encoding/json" + "gitee.com/dtapps/go-library/utils/gomd5" + "sort" +) + +// 数据签名 +// https://www.yuque.com/leshuazf/doc/dbmxyi#Nr9Ps +func (app *App) getSign(params map[string]interface{}) string { + // 参数按照参数名的字典升序排列 + var keys []string + for k := range params { + keys = append(keys, k) + } + sort.Strings(keys) + str, _ := json.Marshal(keys) // data字符串值 + return gobase64.Encode(gomd5.ToLower("lepos" + app.KeyAgent + string(str))) +} diff --git a/service/meituan/api.generate_link.go b/service/meituan/api.generate_link.go new file mode 100644 index 00000000..5a0882ec --- /dev/null +++ b/service/meituan/api.generate_link.go @@ -0,0 +1,43 @@ +package meituan + +import ( + "encoding/json" + "net/http" +) + +type ApiGenerateLinkResponse struct { + Status int `json:"status"` // 状态值,0为成功,非0为异常 + Des string `json:"des,omitempty"` // 异常描述信息 + Data string `json:"data,omitempty"` // 最终的推广链接 +} + +type ApiGenerateLinkResult struct { + Result ApiGenerateLinkResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewApiGenerateLinkResult(result ApiGenerateLinkResponse, body []byte, err error) *ApiGenerateLinkResult { + return &ApiGenerateLinkResult{Result: result, Body: body, Err: err} +} + +// ApiGenerateLink 自助取链接口(新版) +// https://union.meituan.com/v2/apiDetail?id=25 +func (app *App) ApiGenerateLink(actId int64, sid string, linkType, shortLink int) *ApiGenerateLinkResult { + // 参数 + param := NewParams() + param.Set("actId", actId) // 活动id,可以在联盟活动列表中查看获取 + param.Set("appkey", app.AppKey) // 媒体名称,可在推广者备案-媒体管理中查询 + param.Set("sid", sid) // 推广位sid,支持通过接口自定义创建,不受平台200个上限限制,长度不能超过64个字符,支持小写字母和数字,历史已创建的推广位不受这个约束 + param.Set("linkType", linkType) // 投放链接的类型 + param.Set("shortLink", shortLink) // 获取长链还是短链 + // 转换 + params := app.NewParamsWith(param) + params["sign"] = app.getSign(app.Secret, params) + // 请求 + body, err := app.request("https://openapi.meituan.com/api/generateLink", params, http.MethodGet) + // 定义 + var response ApiGenerateLinkResponse + err = json.Unmarshal(body, &response) + return NewApiGenerateLinkResult(response, body, err) +} diff --git a/service/meituan/getqualityscorebysid.go b/service/meituan/api.getqualityscorebysid.go similarity index 57% rename from service/meituan/getqualityscorebysid.go rename to service/meituan/api.getqualityscorebysid.go index 2ed6ffda..d88ff147 100644 --- a/service/meituan/getqualityscorebysid.go +++ b/service/meituan/api.getqualityscorebysid.go @@ -2,11 +2,11 @@ package meituan import ( "encoding/json" - "github.com/dtapps/go-library/utils/gotime" + "gitee.com/dtapps/go-library/utils/gotime" "net/http" ) -type GetQuaLitYsCoreBySidResponse struct { +type ApiGetQuaLitYsCoreBySidResponse struct { Status int `json:"status"` Des string `json:"des"` Data struct { @@ -20,19 +20,19 @@ type GetQuaLitYsCoreBySidResponse struct { Total int `json:"total"` } `json:"data"` } -type GetQuaLitYsCoreBySidResult struct { - Result GetQuaLitYsCoreBySidResponse // 结果 - Body []byte // 内容 - Err error // 错误 +type ApiGetQuaLitYsCoreBySidResult struct { + Result ApiGetQuaLitYsCoreBySidResponse // 结果 + Body []byte // 内容 + Err error // 错误 } -func NewGetQuaLitYsCoreBySidResult(result GetQuaLitYsCoreBySidResponse, body []byte, err error) *GetQuaLitYsCoreBySidResult { - return &GetQuaLitYsCoreBySidResult{Result: result, Body: body, Err: err} +func NewApiGetQuaLitYsCoreBySidResult(result ApiGetQuaLitYsCoreBySidResponse, body []byte, err error) *ApiGetQuaLitYsCoreBySidResult { + return &ApiGetQuaLitYsCoreBySidResult{Result: result, Body: body, Err: err} } -// GetQuaLitYsCoreBySid 优选sid质量分&复购率查询 +// ApiGetQuaLitYsCoreBySid 优选sid质量分&复购率查询 // https://union.meituan.com/v2/apiDetail?id=28 -func (app *App) GetQuaLitYsCoreBySid(notMustParams ...Params) *GetQuaLitYsCoreBySidResult { +func (app *App) ApiGetQuaLitYsCoreBySid(notMustParams ...Params) *ApiGetQuaLitYsCoreBySidResult { // 参数 params := app.NewParamsWith(notMustParams...) // 请求时刻10位时间戳(秒级),有效期60s @@ -42,7 +42,7 @@ func (app *App) GetQuaLitYsCoreBySid(notMustParams ...Params) *GetQuaLitYsCoreBy // 请求 body, err := app.request("https://openapi.meituan.com/api/getqualityscorebysid", params, http.MethodGet) // 定义 - var response GetQuaLitYsCoreBySidResponse + var response ApiGetQuaLitYsCoreBySidResponse err = json.Unmarshal(body, &response) - return NewGetQuaLitYsCoreBySidResult(response, body, err) + return NewApiGetQuaLitYsCoreBySidResult(response, body, err) } diff --git a/service/meituan/mini_code.go b/service/meituan/api.mini_code.go similarity index 55% rename from service/meituan/mini_code.go rename to service/meituan/api.mini_code.go index 803e5ebb..1f888b2a 100644 --- a/service/meituan/mini_code.go +++ b/service/meituan/api.mini_code.go @@ -5,25 +5,25 @@ import ( "net/http" ) -type MiniCodeResponse struct { +type ApiMiniCodeResponse struct { Status int `json:"status"` // 状态值,0为成功,非0为异常 Des string `json:"des,omitempty"` // 异常描述信息 Data string `json:"data,omitempty"` // 小程序二维码图片地址 } -type MiniCodeResult struct { - Result MiniCodeResponse // 结果 - Body []byte // 内容 - Err error // 错误 +type ApiMiniCodeResult struct { + Result ApiMiniCodeResponse // 结果 + Body []byte // 内容 + Err error // 错误 } -func NewMiniCodeResult(result MiniCodeResponse, body []byte, err error) *MiniCodeResult { - return &MiniCodeResult{Result: result, Body: body, Err: err} +func NewApiMiniCodeResult(result ApiMiniCodeResponse, body []byte, err error) *ApiMiniCodeResult { + return &ApiMiniCodeResult{Result: result, Body: body, Err: err} } -// MiniCode 小程序生成二维码(新版) +// ApiMiniCode 小程序生成二维码(新版) // https://union.meituan.com/v2/apiDetail?id=26 -func (app *App) MiniCode(actId int64, sid string) *MiniCodeResult { +func (app *App) ApiMiniCode(actId int64, sid string) *ApiMiniCodeResult { // 参数 param := NewParams() param.Set("appkey", app.AppKey) @@ -35,7 +35,7 @@ func (app *App) MiniCode(actId int64, sid string) *MiniCodeResult { // 请求 body, err := app.request("https://openapi.meituan.com/api/miniCode", params, http.MethodGet) // 定义 - var response MiniCodeResponse + var response ApiMiniCodeResponse err = json.Unmarshal(body, &response) - return NewMiniCodeResult(response, body, err) + return NewApiMiniCodeResult(response, body, err) } diff --git a/service/meituan/order.go b/service/meituan/api.order.go similarity index 80% rename from service/meituan/order.go rename to service/meituan/api.order.go index 6a977dce..97b3e4dd 100644 --- a/service/meituan/order.go +++ b/service/meituan/api.order.go @@ -5,7 +5,7 @@ import ( "net/http" ) -type OrderResponse struct { +type ApiOrderResponse struct { Status int `json:"status"` Des string `json:"des"` Data struct { @@ -13,7 +13,7 @@ type OrderResponse struct { SubBusinessLine int `json:"subBusinessLine"` // 子业务线 ActId int `json:"actId"` // 活动id,可以在联盟活动列表中查看获取 Quantity int `json:"quantity"` // 商品数量 - OrderId string `json:"orderId"` // 订单id + ApiOrderId string `json:"ApiOrderId"` // 订单id Paytime string `json:"paytime"` // 订单支付时间,10位时间戳 ModTime string `json:"modTime"` // 订单信息修改时间,10位时间戳 Payprice string `json:"payprice"` // 订单用户实际支付金额 @@ -24,7 +24,7 @@ type OrderResponse struct { Smstitle string `json:"smstitle"` // 订单标题 Status int `json:"status"` // 订单状态,外卖、话费、闪购、优选、酒店订单会返回该字段 1 已付款 8 已完成 9 已退款或风控 TradeTypeList []int `json:"tradeTypeList"` // 订单的奖励类型 3 首购奖励 5 留存奖励 2 cps 3 首购奖励 - RiskOrder int `json:"riskOrder"` // 0表示非风控订单,1表示风控订单 + RiskApiOrder int `json:"riskApiOrder"` // 0表示非风控订单,1表示风控订单 Refundprofit string `json:"refundprofit,omitempty"` // 订单需要扣除的返佣金额,外卖、话费、闪购、优选、酒店订单若发生退款会返回该字段 CpaRefundProfit interface{} `json:"cpaRefundProfit"` // 订单需要扣除的cpa返佣金额(优选、话费券) RefundInfoList interface{} `json:"refundInfoList"` // 退款列表 @@ -33,19 +33,19 @@ type OrderResponse struct { } `json:"data"` } -type OrderResult struct { - Result OrderResponse // 结果 - Body []byte // 内容 - Err error // 错误 +type ApiOrderResult struct { + Result ApiOrderResponse // 结果 + Body []byte // 内容 + Err error // 错误 } -func NewOrderResult(result OrderResponse, body []byte, err error) *OrderResult { - return &OrderResult{Result: result, Body: body, Err: err} +func NewApiOrderResult(result ApiOrderResponse, body []byte, err error) *ApiOrderResult { + return &ApiOrderResult{Result: result, Body: body, Err: err} } -// Order 单订单查询接口(新版) +// ApiOrder 单订单查询接口(新版) // https://union.meituan.com/v2/apiDetail?id=24 -func (app *App) Order(notMustParams ...Params) *OrderResult { +func (app *App) ApiOrder(notMustParams ...Params) *ApiOrderResult { // 参数 params := app.NewParamsWith(notMustParams...) // 请求时刻10位时间戳(秒级),有效期60s @@ -54,7 +54,7 @@ func (app *App) Order(notMustParams ...Params) *OrderResult { // 请求 body, err := app.request("https://openapi.meituan.com/api/order", params, http.MethodGet) // 定义 - var response OrderResponse + var response ApiOrderResponse err = json.Unmarshal(body, &response) - return NewOrderResult(response, body, err) + return NewApiOrderResult(response, body, err) } diff --git a/service/meituan/order_list.go b/service/meituan/api.order_list.go similarity index 82% rename from service/meituan/order_list.go rename to service/meituan/api.order_list.go index 4ed7dc45..4644f0f6 100644 --- a/service/meituan/order_list.go +++ b/service/meituan/api.order_list.go @@ -2,11 +2,11 @@ package meituan import ( "encoding/json" - "github.com/dtapps/go-library/utils/gotime" + "gitee.com/dtapps/go-library/utils/gotime" "net/http" ) -type OrderListResponse struct { +type ApiOrderListResponse struct { DataList []struct { Orderid string `json:"orderid"` // 订单id Paytime string `json:"paytime"` // 订单支付时间,10位时间戳 @@ -32,19 +32,19 @@ type OrderListResponse struct { Total int `json:"total"` // 查询条件命中的总数据条数,用于计算分页参数 } -type OrderListResult struct { - Result OrderListResponse // 结果 - Body []byte // 内容 - Err error // 错误 +type ApiOrderListResult struct { + Result ApiOrderListResponse // 结果 + Body []byte // 内容 + Err error // 错误 } -func NewOrderListResult(result OrderListResponse, body []byte, err error) *OrderListResult { - return &OrderListResult{Result: result, Body: body, Err: err} +func NewApiOrderListResult(result ApiOrderListResponse, body []byte, err error) *ApiOrderListResult { + return &ApiOrderListResult{Result: result, Body: body, Err: err} } -// OrderList 订单列表查询接口(新版) +// ApiOrderList 订单列表查询接口(新版) // https://union.meituan.com/v2/apiDetail?id=23 -func (app *App) OrderList(notMustParams ...Params) *OrderListResult { +func (app *App) ApiOrderList(notMustParams ...Params) *ApiOrderListResult { // 参数 params := app.NewParamsWith(notMustParams...) // 请求时刻10位时间戳(秒级),有效期60s @@ -54,7 +54,7 @@ func (app *App) OrderList(notMustParams ...Params) *OrderListResult { // 请求 body, err := app.request("https://openapi.meituan.com/api/orderList", params, http.MethodGet) // 定义 - var response OrderListResponse + var response ApiOrderListResponse err = json.Unmarshal(body, &response) - return NewOrderListResult(response, body, err) + return NewApiOrderListResult(response, body, err) } diff --git a/service/meituan/app.go b/service/meituan/app.go index 59bfbd0f..11878744 100644 --- a/service/meituan/app.go +++ b/service/meituan/app.go @@ -1,25 +1,18 @@ package meituan import ( + "dtapps/dta/library/utils/gohttp" + "dtapps/dta/library/utils/gomongo" "encoding/json" "errors" - "fmt" - "github.com/dtapps/go-library/utils/gohttp" - "github.com/go-redis/redis/v8" - "go.mongodb.org/mongo-driver/mongo" - "go.uber.org/zap" - "gorm.io/gorm" "net/http" ) // App 美团联盟 type App struct { - Secret string // 秘钥 - AppKey string // 渠道标记 - ZapLog *zap.Logger // 日志服务 - Db *gorm.DB // 关系数据库服务 - RDb *redis.Client // 缓存数据库服务 - MDb *mongo.Client // 非关系数据库服务 + Secret string // 秘钥 + AppKey string // 渠道标记 + Mongo gomongo.App // 日志数据库 } func (app *App) request(url string, params map[string]interface{}, method string) (resp []byte, err error) { @@ -28,18 +21,14 @@ func (app *App) request(url string, params map[string]interface{}, method string // 请求 get, err := gohttp.Get(url, params) // 日志 - if app.ZapLog != nil { - app.ZapLog.Sugar().Info(get) - } + go app.mongoLog(url, params, method, get) return get.Body, err case http.MethodPost: // 请求 paramsStr, err := json.Marshal(params) postJson, err := gohttp.PostJson(url, paramsStr) // 日志 - if app.ZapLog != nil { - app.ZapLog.Sugar().Info(fmt.Sprintf("%s %s %s", url, postJson.Header, postJson.Body)) - } + go app.mongoLog(url, params, method, postJson) return postJson.Body, err default: return nil, errors.New("请求类型不支持") diff --git a/service/meituan/generate_link.go b/service/meituan/generate_link.go deleted file mode 100644 index 7e97577e..00000000 --- a/service/meituan/generate_link.go +++ /dev/null @@ -1,43 +0,0 @@ -package meituan - -import ( - "encoding/json" - "net/http" -) - -type GenerateLinkResponse struct { - Status int `json:"status"` // 状态值,0为成功,非0为异常 - Des string `json:"des,omitempty"` // 异常描述信息 - Data string `json:"data,omitempty"` // 最终的推广链接 -} - -type GenerateLinkResult struct { - Result GenerateLinkResponse // 结果 - Body []byte // 内容 - Err error // 错误 -} - -func NewGenerateLinkResult(result GenerateLinkResponse, body []byte, err error) *GenerateLinkResult { - return &GenerateLinkResult{Result: result, Body: body, Err: err} -} - -// GenerateLink 自助取链接口(新版) -// https://union.meituan.com/v2/apiDetail?id=25 -func (app *App) GenerateLink(actId int64, sid string, linkType, shortLink int) *GenerateLinkResult { - // 参数 - param := NewParams() - param.Set("appkey", app.AppKey) - param.Set("actId", actId) - param.Set("sid", sid) - param.Set("linkType", linkType) - param.Set("shortLink", shortLink) - // 转换 - params := app.NewParamsWith(param) - params["sign"] = app.getSign(app.Secret, params) - // 请求 - body, err := app.request("https://openapi.meituan.com/api/generateLink", params, http.MethodGet) - // 定义 - var response GenerateLinkResponse - err = json.Unmarshal(body, &response) - return NewGenerateLinkResult(response, body, err) -} diff --git a/service/meituan/go.mod b/service/meituan/go.mod deleted file mode 100644 index ab0056b8..00000000 --- a/service/meituan/go.mod +++ /dev/null @@ -1,32 +0,0 @@ -module github.com/dtapps/go-library/service/meituan - -go 1.18 - -require ( - github.com/dtapps/go-library/utils/gohttp v0.0.0-20220320040709-ad8a5f0e9e40 - github.com/dtapps/go-library/utils/gotime v0.0.0-20220320040709-ad8a5f0e9e40 - github.com/go-redis/redis/v8 v8.11.5 - go.mongodb.org/mongo-driver v1.8.4 - go.uber.org/zap v1.21.0 - gorm.io/gorm v1.23.3 -) - -require ( - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/go-stack/stack v1.8.0 // indirect - github.com/golang/snappy v0.0.1 // indirect - github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jinzhu/now v1.1.4 // indirect - github.com/klauspost/compress v1.13.6 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.0.2 // indirect - github.com/xdg-go/stringprep v1.0.2 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f // indirect - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/text v0.3.6 // indirect -) diff --git a/service/meituan/mongodb.go b/service/meituan/mongodb.go new file mode 100644 index 00000000..32cbda33 --- /dev/null +++ b/service/meituan/mongodb.go @@ -0,0 +1,47 @@ +package meituan + +import ( + "dtapps/dta/library/utils/gohttp" + "encoding/json" + "gitee.com/dtapps/go-library/utils/gotime" +) + +// 日志 +type mongoZap struct { + Url string `json:"url" bson:"url"` + Params interface{} `json:"params" bson:"params"` + Method string `json:"method" bson:"method"` + Header interface{} `json:"header" bson:"header"` + Status string `json:"status" bson:"status"` + StatusCode int `json:"status_code" bson:"status_code"` + Body interface{} `json:"body" bson:"body"` + ContentLength int64 `json:"content_length" bson:"content_length"` + CreateTime string `json:"create_time" bson:"create_time"` +} + +func (m *mongoZap) Database() string { + return "zap_logs" +} + +func (m *mongoZap) TableName() string { + return "meituan_" + gotime.Current().SetFormat("200601") +} + +func (app *App) mongoLog(url string, params map[string]interface{}, method string, request gohttp.Response) { + if app.Mongo.Db == nil { + return + } + var body map[string]interface{} + _ = json.Unmarshal(request.Body, &body) + app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{ + Url: url, + Params: params, + Method: method, + Header: request.Header, + Status: request.Status, + StatusCode: request.StatusCode, + Body: body, + ContentLength: request.ContentLength, + CreateTime: gotime.Current().Format(), + }) +} diff --git a/service/oauth/gitee/access_token.go b/service/oauth/gitee/access_token.go new file mode 100644 index 00000000..202522a4 --- /dev/null +++ b/service/oauth/gitee/access_token.go @@ -0,0 +1,36 @@ +package gitee + +import ( + "encoding/json" + "fmt" +) + +// GetAccessToken 请求参数 +type GetAccessToken struct { + Code string +} + +// GetAccessTokenResult 返回参数 +type GetAccessTokenResult struct { + AccessToken string `json:"access_token"` +} + +// GetAccessToken OAuth2 获取 AccessToken 认证步骤 https://gitee.com/api/v5/oauth_doc#/list-item-2 +func (app *App) GetAccessToken(param GetAccessToken) (result GetAccessTokenResult, err error) { + url := fmt.Sprintf("https://gitee.com/oauth/token?grant_type=authorization_code&code=%s&client_id=%s&redirect_uri=%s&client_secret=%s", param.Code, app.ClientID, app.RedirectUri, app.ClientSecret) + + // api params + params := map[string]interface{}{} + + // common params + + // request + body, err := app.request(url, params, "POST") + if err != nil { + return + } + if err = json.Unmarshal(body, &result); err != nil { + return + } + return +} diff --git a/service/oauth/gitee/api_user.go b/service/oauth/gitee/api_user.go new file mode 100644 index 00000000..65df36d9 --- /dev/null +++ b/service/oauth/gitee/api_user.go @@ -0,0 +1,53 @@ +package gitee + +import ( + "encoding/json" + "fmt" + "time" +) + +// UserResult 返回参数 +type UserResult struct { + Id int64 `json:"id"` + Login string `json:"login"` + Name string `json:"name"` + AvatarUrl string `json:"avatar_url"` + Url string `json:"url"` + HtmlUrl string `json:"html_url"` + FollowersUrl string `json:"followers_url"` + FollowingUrl string `json:"following_url"` + GistsUrl string `json:"gists_url"` + StarredUrl string `json:"starred_url"` + SubscriptionsUrl string `json:"subscriptions_url"` + OrganizationsUrl string `json:"organizations_url"` + ReposUrl string `json:"repos_url"` + EventsUrl string `json:"events_url"` + ReceivedEventsUrl string `json:"received_events_url"` + Type string `json:"type"` + Blog string `json:"blog"` + Weibo string `json:"weibo"` + Bio string `json:"bio"` + PublicRepos int `json:"public_repos"` + PublicGists int `json:"public_gists"` + Followers int `json:"followers"` + Following int `json:"following"` + Stared int `json:"stared"` + Watched int `json:"watched"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + Email string `json:"email"` +} + +// User 获取授权用户的资料 https://gitee.com/api/v5/swagger#/getV5User +func (app *App) User() (result UserResult, err error) { + // request + body, err := app.request(fmt.Sprintf("https://gitee.com/api/v5/user?access_token=%s", app.AccessToken), map[string]interface{}{}, "GET") + + if err != nil { + return + } + if err = json.Unmarshal(body, &result); err != nil { + return + } + return +} diff --git a/service/oauth/gitee/app.go b/service/oauth/gitee/app.go new file mode 100644 index 00000000..10390fb3 --- /dev/null +++ b/service/oauth/gitee/app.go @@ -0,0 +1,42 @@ +package gitee + +import ( + "bytes" + "encoding/json" + "io/ioutil" + + "net/http" + // "strconv" +) + +// App 基本配置 +type App struct { + ClientID string + ClientSecret string + RedirectUri string + AccessToken string +} + +func (app *App) request(url string, params map[string]interface{}, method string) (resp []byte, err error) { + // 请求参数 + marshal, _ := json.Marshal(params) + var req *http.Request + req, err = http.NewRequest(method, url, bytes.NewReader(marshal)) + if err != nil { + return nil, err + } + + httpClient := &http.Client{} + var response *http.Response + response, err = httpClient.Do(req) + + if err != nil { + return nil, err + } + + // 处理成功 + defer response.Body.Close() + resp, err = ioutil.ReadAll(response.Body) + + return resp, err +} diff --git a/service/oauth/gitee/authorize.go b/service/oauth/gitee/authorize.go new file mode 100644 index 00000000..1ee3abdf --- /dev/null +++ b/service/oauth/gitee/authorize.go @@ -0,0 +1,8 @@ +package gitee + +import "fmt" + +// GetRedirectUri 获取登录地址 +func (app *App) GetRedirectUri() string { + return fmt.Sprintf("https://gitee.com/oauth/authorize?client_id=%s&redirect_uri=%s&response_type=code", app.ClientID, app.RedirectUri) +} diff --git a/service/oauth/gitee/config.go b/service/oauth/gitee/config.go new file mode 100644 index 00000000..27ba881d --- /dev/null +++ b/service/oauth/gitee/config.go @@ -0,0 +1,6 @@ +package gitee + +const ( + GiteeOAuth2AuthorizeServer = "https://gitee.com/oauth/authorize" + GiteeOAuth2TokenServer = "https://gitee.com/oauth/token" +) diff --git a/service/oauth/workwechat/access_token.go b/service/oauth/workwechat/access_token.go new file mode 100644 index 00000000..5f7d3159 --- /dev/null +++ b/service/oauth/workwechat/access_token.go @@ -0,0 +1,29 @@ +package workwechat + +import ( + "encoding/json" + "fmt" +) + +// AuthAccessTokenResult 返回参数 +type AuthAccessTokenResult struct { + Errcode int `json:"errcode"` + Errmsg string `json:"errmsg"` + AccessToken string `json:"access_token"` + ExpiresIn int `json:"expires_in"` +} + +// AuthAccessToken 获取access_token https://open.work.weixin.qq.com/api/doc/90000/90135/91039 +func (app *App) AuthAccessToken() (result AuthAccessTokenResult, err error) { + url := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s", app.AppID, app.Secret) + + // request + body, err := app.request(url, map[string]interface{}{}, "GET") + if err != nil { + return + } + if err = json.Unmarshal(body, &result); err != nil { + return + } + return +} diff --git a/service/oauth/workwechat/app.go b/service/oauth/workwechat/app.go new file mode 100644 index 00000000..1c3bd630 --- /dev/null +++ b/service/oauth/workwechat/app.go @@ -0,0 +1,41 @@ +package workwechat + +import ( + "bytes" + "encoding/json" + "io/ioutil" + "net/http" +) + +// App 基本配置 +type App struct { + AppID string + AgentID int + Secret string + RedirectUri string + AccessToken string +} + +func (app *App) request(url string, params map[string]interface{}, method string) (resp []byte, err error) { + // 请求参数 + marshal, _ := json.Marshal(params) + var req *http.Request + req, err = http.NewRequest(method, url, bytes.NewReader(marshal)) + if err != nil { + return nil, err + } + + httpClient := &http.Client{} + var response *http.Response + response, err = httpClient.Do(req) + + if err != nil { + return nil, err + } + + // 处理成功 + defer response.Body.Close() + resp, err = ioutil.ReadAll(response.Body) + + return resp, err +} diff --git a/service/oauth/workwechat/authorize.go b/service/oauth/workwechat/authorize.go new file mode 100644 index 00000000..9d69fcd7 --- /dev/null +++ b/service/oauth/workwechat/authorize.go @@ -0,0 +1,8 @@ +package workwechat + +import "fmt" + +// GetRedirectUri 构造网页授权链接 https://work.weixin.qq.com/api/doc/90000/90135/91022 +func (app *App) GetRedirectUri() string { + return fmt.Sprintf("https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect", app.AppID, app.RedirectUri) +} diff --git a/service/oauth/workwechat/get_user_info.go b/service/oauth/workwechat/get_user_info.go new file mode 100644 index 00000000..41f22156 --- /dev/null +++ b/service/oauth/workwechat/get_user_info.go @@ -0,0 +1,35 @@ +package workwechat + +import ( + "encoding/json" + "fmt" +) + +type GetUserInfo struct { + Code string `json:"code"` +} + +// GetUserInfoResult 返回参数 +type GetUserInfoResult struct { + Errcode int `json:"errcode"` // 返回码 + Errmsg string `json:"errmsg"` // 对返回码的文本描述内容 + UserId string `json:"UserId"` // 成员UserID。若需要获得用户详情信息 + OpenId string `json:"OpenId"` // 非企业成员的标识,对当前企业唯一。不超过64字节 + DeviceId string `json:"DeviceId"` // 手机设备号(由企业微信在安装时随机生成,删除重装会改变,升级不受影响) + ExternalUserid string `json:"external_userid"` // 外部联系人id,当且仅当用户是企业的客户,且跟进人在应用的可见范围内时返回。如果是第三方应用调用,针对同一个客户,同一个服务商不同应用获取到的id相同 +} + +// GetUserInfo 获取访问用户身份 https://open.work.weixin.qq.com/api/doc/90000/90135/91023 +func (app *App) GetUserInfo(param GetUserInfo) (result GetUserInfoResult, err error) { + url := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=%s&code=%s", app.AccessToken, param.Code) + + // request + body, err := app.request(url, map[string]interface{}{}, "GET") + if err != nil { + return + } + if err = json.Unmarshal(body, &result); err != nil { + return + } + return +} diff --git a/service/oauth/workwechat/qr_connect.go b/service/oauth/workwechat/qr_connect.go new file mode 100644 index 00000000..120f8a3d --- /dev/null +++ b/service/oauth/workwechat/qr_connect.go @@ -0,0 +1,8 @@ +package workwechat + +import "fmt" + +// QrConnect 构造独立窗口登录二维码 https://open.work.weixin.qq.com/api/doc/90000/90135/91019 +func (app *App) QrConnect() string { + return fmt.Sprintf("https://open.work.weixin.qq.com/wwopen/sso/qrConnect?appid=%s&agentid=%d&redirect_uri=%s&state=STATE&lang=zh", app.AppID, app.AgentID, app.RedirectUri) +} diff --git a/service/pinduoduo/app.go b/service/pinduoduo/app.go index d94b4518..4c461469 100644 --- a/service/pinduoduo/app.go +++ b/service/pinduoduo/app.go @@ -1,14 +1,12 @@ package pinduoduo import ( + "dtapps/dta/library/utils/gohttp" + "dtapps/dta/library/utils/gomongo" + "dtapps/dta/library/utils/gostring" "encoding/json" "fmt" - "github.com/dtapps/go-library/utils/gohttp" - "github.com/dtapps/go-library/utils/gostring" - "github.com/go-redis/redis/v8" - "go.mongodb.org/mongo-driver/mongo" - "go.uber.org/zap" - "gorm.io/gorm" + "net/http" "regexp" "strconv" "strings" @@ -16,13 +14,11 @@ import ( // App 公共请求参数 type App struct { - ClientId string // POP分配给应用的client_id - ClientSecret string // POP分配给应用的client_secret - Pid string // 推广位 - ZapLog *zap.Logger // 日志服务 - Db *gorm.DB // 关系数据库服务 - RDb *redis.Client // 缓存数据库服务 - MDb *mongo.Client // 非关系数据库服务 + ClientId string // POP分配给应用的client_id + ClientSecret string // POP分配给应用的client_secret + MediaId string // 媒体ID + Pid string // 推广位 + Mongo gomongo.App // 日志数据库 } type ErrResp struct { @@ -46,9 +42,7 @@ func (app *App) request(params map[string]interface{}) (resp []byte, err error) // 发送请求 get, err := gohttp.Get("https://gw-api.pinduoduo.com/api/router", params) // 日志 - if app.ZapLog != nil { - app.ZapLog.Sugar().Info(fmt.Sprintf("https://gw-api.pinduoduo.com/api/router?method=%s %s %s", params["type"], get.Header, get.Body)) - } + go app.mongoLog(fmt.Sprintf("https://gw-api.pinduoduo.com/api/router?type=%s", params["type"]), params, http.MethodPost, get) // 检查错误 var errResp ErrResp _ = json.Unmarshal(get.Body, &errResp) diff --git a/service/pinduoduo/go.mod b/service/pinduoduo/go.mod deleted file mode 100644 index d90485a8..00000000 --- a/service/pinduoduo/go.mod +++ /dev/null @@ -1,32 +0,0 @@ -module github.com/dtapps/go-library/service/pinduoduo - -go 1.18 - -require ( - github.com/dtapps/go-library/utils/gohttp v0.0.0-20220320040709-ad8a5f0e9e40 - github.com/dtapps/go-library/utils/gostring v0.0.0-20220320040709-ad8a5f0e9e40 - github.com/go-redis/redis/v8 v8.11.5 - go.mongodb.org/mongo-driver v1.8.4 - go.uber.org/zap v1.21.0 - gorm.io/gorm v1.23.3 -) - -require ( - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/go-stack/stack v1.8.0 // indirect - github.com/golang/snappy v0.0.1 // indirect - github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jinzhu/now v1.1.4 // indirect - github.com/klauspost/compress v1.13.6 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.0.2 // indirect - github.com/xdg-go/stringprep v1.0.2 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f // indirect - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/text v0.3.6 // indirect -) diff --git a/service/pinduoduo/mongodb.go b/service/pinduoduo/mongodb.go new file mode 100644 index 00000000..66b559f8 --- /dev/null +++ b/service/pinduoduo/mongodb.go @@ -0,0 +1,47 @@ +package pinduoduo + +import ( + "dtapps/dta/library/utils/gohttp" + "encoding/json" + "gitee.com/dtapps/go-library/utils/gotime" +) + +// 日志 +type mongoZap struct { + Url string `json:"url" bson:"url"` + Params interface{} `json:"params" bson:"params"` + Method string `json:"method" bson:"method"` + Header interface{} `json:"header" bson:"header"` + Status string `json:"status" bson:"status"` + StatusCode int `json:"status_code" bson:"status_code"` + Body interface{} `json:"body" bson:"body"` + ContentLength int64 `json:"content_length" bson:"content_length"` + CreateTime string `json:"create_time" bson:"create_time"` +} + +func (m *mongoZap) Database() string { + return "zap_logs" +} + +func (m *mongoZap) TableName() string { + return "pinduoduo_" + gotime.Current().SetFormat("200601") +} + +func (app *App) mongoLog(url string, params map[string]interface{}, method string, request gohttp.Response) { + if app.Mongo.Db == nil { + return + } + var body map[string]interface{} + _ = json.Unmarshal(request.Body, &body) + app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{ + Url: url, + Params: params, + Method: method, + Header: request.Header, + Status: request.Status, + StatusCode: request.StatusCode, + Body: body, + ContentLength: request.ContentLength, + CreateTime: gotime.Current().Format(), + }) +} diff --git a/service/pinduoduo/params.go b/service/pinduoduo/params.go index 6de13577..64ec8699 100644 --- a/service/pinduoduo/params.go +++ b/service/pinduoduo/params.go @@ -59,6 +59,11 @@ func (p Params) SetCustomParameters(uid string, sid string) { } } +// SetGoodsSignList 设置商品goodsSign列表 +func (p Params) SetGoodsSignList(goodsSign string) { + p["goods_sign_list"] = []string{goodsSign} +} + func (p Params) GetQuery() string { u := url.Values{} for k, v := range p { diff --git a/service/pinduoduo/pdd.ddk.cms.prom.url.generate.go b/service/pinduoduo/pdd.ddk.cms.prom.url.generate.go new file mode 100644 index 00000000..5ba285ce --- /dev/null +++ b/service/pinduoduo/pdd.ddk.cms.prom.url.generate.go @@ -0,0 +1,73 @@ +package pinduoduo + +import "encoding/json" + +type CmsPromUrlGenerateResponse struct { + CmsPromotionUrlGenerateResponse struct { + Total int `json:"total"` + UrlList []struct { + SingleUrlList struct { + TzSchemaUrl string `json:"tz_schema_url"` + MobileUrl string `json:"mobile_url"` + SchemaUrl string `json:"schema_url"` + MobileShortUrl string `json:"mobile_short_url"` + WeAppWebViewUrl string `json:"we_app_web_view_url"` + Url string `json:"url"` + ShortUrl string `json:"short_url"` + WeAppWebViewShortUrl string `json:"we_app_web_view_short_url"` + } `json:"single_url_list"` + MobileUrl string `json:"mobile_url"` + Sign string `json:"sign"` + WeAppInfo struct { + WeAppIconUrl string `json:"we_app_icon_url"` + UserName string `json:"user_name"` + PagePath string `json:"page_path"` + SourceDisplayName string `json:"source_display_name"` + Title string `json:"title"` + AppId string `json:"app_id"` + Desc string `json:"desc"` + } `json:"we_app_info"` + MobileShortUrl string `json:"mobile_short_url"` + WeAppWebViewUrl string `json:"we_app_web_view_url"` + Url string `json:"url"` + ShortUrl string `json:"short_url"` + WeAppWebViewShortUrl string `json:"we_app_web_view_short_url"` + } `json:"url_list"` + RequestId string `json:"request_id"` + } `json:"cms_promotion_url_generate_response"` +} + +type CmsPromUrlGenerateError struct { + ErrorResponse struct { + ErrorMsg string `json:"error_msg"` + SubMsg string `json:"sub_msg"` + SubCode string `json:"sub_code"` + } `json:"error_response"` +} + +type CmsPromUrlGenerateResult struct { + Result CmsPromUrlGenerateResponse // 结果 + Body []byte // 内容 + Err error // 错误 + Error CmsPromUrlGenerateError // 错误结果 +} + +func NewCmsPromUrlGenerateResult(result CmsPromUrlGenerateResponse, body []byte, err error, error CmsPromUrlGenerateError) *CmsPromUrlGenerateResult { + return &CmsPromUrlGenerateResult{Result: result, Body: body, Err: err, Error: error} +} + +// CmsPromUrlGenerate 生成商城-频道推广链接 +// https://jinbao.pinduoduo.com/third-party/api-detail?apiName=pdd.ddk.cms.prom.url.generate +func (app *App) CmsPromUrlGenerate(notMustParams ...Params) *CmsPromUrlGenerateResult { + // 参数 + params := NewParamsWithType("pdd.ddk.cms.prom.url.generate", notMustParams...) + params.Set("p_id_list", []string{app.Pid}) + // 请求 + body, err := app.request(params) + // 定义 + var response CmsPromUrlGenerateResponse + err = json.Unmarshal(body, &response) + var responseError CmsPromUrlGenerateError + err = json.Unmarshal(body, &responseError) + return NewCmsPromUrlGenerateResult(response, body, err, responseError) +} diff --git a/service/pinduoduo/pdd.ddk.goods.detail.go b/service/pinduoduo/pdd.ddk.goods.detail.go index 76bafe89..83922bd8 100644 --- a/service/pinduoduo/pdd.ddk.goods.detail.go +++ b/service/pinduoduo/pdd.ddk.goods.detail.go @@ -96,6 +96,7 @@ func NewGoodsDetailResult(result GoodsDetailResponse, body []byte, err error) *G func (app *App) GoodsDetail(notMustParams ...Params) *GoodsDetailResult { // 参数 params := NewParamsWithType("pdd.ddk.goods.detail", notMustParams...) + params.Set("pid", app.Pid) // 请求 body, err := app.request(params) // 定义 diff --git a/service/pinduoduo/pdd.ddk.goods.promotion.url.generate.go b/service/pinduoduo/pdd.ddk.goods.promotion.url.generate.go index e72d6adc..f1bf841e 100644 --- a/service/pinduoduo/pdd.ddk.goods.promotion.url.generate.go +++ b/service/pinduoduo/pdd.ddk.goods.promotion.url.generate.go @@ -49,6 +49,7 @@ func NewGoodsPromotionUrlGenerateResult(result GoodsPromotionUrlGenerateResponse func (app *App) GoodsPromotionUrlGenerate(notMustParams ...Params) *GoodsPromotionUrlGenerateResult { // 参数 params := NewParamsWithType("pdd.ddk.goods.promotion.url.generate", notMustParams...) + params.Set("p_id", app.Pid) // 请求 body, err := app.request(params) // 定义 diff --git a/service/pinduoduo/pdd.ddk.goods.recommend.get.go b/service/pinduoduo/pdd.ddk.goods.recommend.get.go index b0531e30..002b3058 100644 --- a/service/pinduoduo/pdd.ddk.goods.recommend.get.go +++ b/service/pinduoduo/pdd.ddk.goods.recommend.get.go @@ -59,7 +59,7 @@ type GoodsRecommendGetResponse struct { } `json:"list"` ListId string `json:"list_id"` SearchId string `json:"search_id"` - Total int `json:"total"` + Total int64 `json:"total"` } `json:"goods_basic_detail_response"` } @@ -78,6 +78,7 @@ func NewGoodsRecommendGetResult(result GoodsRecommendGetResponse, body []byte, e func (app *App) GoodsRecommendGet(notMustParams ...Params) *GoodsRecommendGetResult { // 参数 params := NewParamsWithType("pdd.ddk.goods.recommend.get", notMustParams...) + params.Set("pid", app.Pid) // 请求 body, err := app.request(params) // 定义 diff --git a/service/pinduoduo/pdd.ddk.goods.search.go b/service/pinduoduo/pdd.ddk.goods.search.go index efe87c32..eaa447fd 100644 --- a/service/pinduoduo/pdd.ddk.goods.search.go +++ b/service/pinduoduo/pdd.ddk.goods.search.go @@ -73,7 +73,7 @@ type GoodsSearchResponse struct { } `json:"goods_list"` ListId string `json:"list_id"` SearchId string `json:"search_id"` - TotalCount int `json:"total_count"` + TotalCount int64 `json:"total_count"` } `json:"goods_search_response"` } @@ -87,10 +87,12 @@ func NewGoodsSearchResult(result GoodsSearchResponse, body []byte, err error) *G return &GoodsSearchResult{Result: result, Body: body, Err: err} } -// GoodsSearch 多多进宝商品查询 https://jinbao.pinduoduo.com/third-party/api-detail?apiName=pdd.ddk.goods.search +// GoodsSearch 多多进宝商品查询 +// https://jinbao.pinduoduo.com/third-party/api-detail?apiName=pdd.ddk.goods.search func (app *App) GoodsSearch(notMustParams ...Params) *GoodsSearchResult { // 参数 params := NewParamsWithType("pdd.ddk.goods.search", notMustParams...) + params.Set("pid", app.Pid) // 请求 body, err := app.request(params) // 定义 diff --git a/service/pinduoduo/pdd.ddk.member.authority.query.go b/service/pinduoduo/pdd.ddk.member.authority.query.go new file mode 100644 index 00000000..ec18febf --- /dev/null +++ b/service/pinduoduo/pdd.ddk.member.authority.query.go @@ -0,0 +1,34 @@ +package pinduoduo + +import "encoding/json" + +type MemberAuthorityQueryResponse struct { + AuthorityQueryResponse struct { + Bind int `json:"bind"` + RequestId string `json:"request_id"` + } `json:"authority_query_response"` +} + +type MemberAuthorityQueryResult struct { + Result MemberAuthorityQueryResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewMemberAuthorityQueryResult(result MemberAuthorityQueryResponse, body []byte, err error) *MemberAuthorityQueryResult { + return &MemberAuthorityQueryResult{Result: result, Body: body, Err: err} +} + +// MemberAuthorityQuery 查询是否绑定备案 +// https://jinbao.pinduoduo.com/third-party/api-detail?apiName=pdd.ddk.goods.search +func (app *App) MemberAuthorityQuery(notMustParams ...Params) *MemberAuthorityQueryResult { + // 参数 + params := NewParamsWithType("pdd.ddk.member.authority.query", notMustParams...) + params.Set("pid", app.Pid) + // 请求 + body, err := app.request(params) + // 定义 + var response MemberAuthorityQueryResponse + err = json.Unmarshal(body, &response) + return NewMemberAuthorityQueryResult(response, body, err) +} diff --git a/service/pinduoduo/pdd.ddk.order.detail.get.go b/service/pinduoduo/pdd.ddk.order.detail.get.go new file mode 100644 index 00000000..41700fcc --- /dev/null +++ b/service/pinduoduo/pdd.ddk.order.detail.get.go @@ -0,0 +1,76 @@ +package pinduoduo + +import "encoding/json" + +type OrderDetailGetResponse struct { + OrderDetailResponse struct { + SepMarketFee int `json:"sep_market_fee"` + GoodsPrice int `json:"goods_price"` + SepDuoId int `json:"sep_duo_id"` + Pid string `json:"pid"` + PromotionRate int `json:"promotion_rate"` + CpsSign string `json:"cps_sign"` + Type int `json:"type"` + SubsidyDuoAmountLevel int `json:"subsidy_duo_amount_level"` + OrderStatus int `json:"order_status"` + CatIds []int `json:"cat_ids"` + OrderCreateTime int64 `json:"order_create_time"` + IsDirect int `json:"is_direct"` + OrderGroupSuccessTime int `json:"order_group_success_time"` + MallId int `json:"mall_id"` + OrderAmount int64 `json:"order_amount"` + PriceCompareStatus int `json:"price_compare_status"` + MallName string `json:"mall_name"` + OrderModifyAt int `json:"order_modify_at"` + AuthDuoId int `json:"auth_duo_id"` + CpaNew int `json:"cpa_new"` + GoodsName string `json:"goods_name"` + BatchNo string `json:"batch_no"` + RedPacketType int `json:"red_packet_type"` + UrlLastGenerateTime int `json:"url_last_generate_time"` + GoodsQuantity int `json:"goods_quantity"` + GoodsId int64 `json:"goods_id"` + SepParameters string `json:"sep_parameters"` + SepRate int `json:"sep_rate"` + SubsidyType int `json:"subsidy_type"` + ShareRate int `json:"share_rate"` + CustomParameters string `json:"custom_parameters"` + GoodsThumbnailUrl string `json:"goods_thumbnail_url"` + PromotionAmount int64 `json:"promotion_amount"` + OrderPayTime int `json:"order_pay_time"` + GroupId int64 `json:"group_id"` + SepPid string `json:"sep_pid"` + ReturnStatus int `json:"return_status"` + OrderStatusDesc string `json:"order_status_desc"` + ShareAmount int `json:"share_amount"` + GoodsCategoryName string `json:"goods_category_name"` + RequestId string `json:"request_id"` + GoodsSign string `json:"goods_sign"` + OrderSn string `json:"order_sn"` + ZsDuoId int `json:"zs_duo_id"` + } `json:"order_detail_response"` +} + +type OrderDetailGetResult struct { + Result OrderDetailGetResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewOrderDetailGetResult(result OrderDetailGetResponse, body []byte, err error) *OrderDetailGetResult { + return &OrderDetailGetResult{Result: result, Body: body, Err: err} +} + +// OrderDetailGet 多多进宝商品查询 https://jinbao.pinduoduo.com/third-party/api-detail?apiName=pdd.ddk.order.detail.get +func (app *App) OrderDetailGet(orderSn string) *OrderDetailGetResult { + // 参数 + param := NewParams() + param.Set("order_sn", orderSn) + params := NewParamsWithType("pdd.ddk.order.detail.get", param) + // 请求 + body, err := app.request(params) + // 定义 + var response OrderDetailGetResponse + err = json.Unmarshal(body, &response) + return NewOrderDetailGetResult(response, body, err) +} diff --git a/service/pinduoduo/pdd.ddk.order.list.increment.get.go b/service/pinduoduo/pdd.ddk.order.list.increment.get.go index 10b635c5..e6593c51 100644 --- a/service/pinduoduo/pdd.ddk.order.list.increment.get.go +++ b/service/pinduoduo/pdd.ddk.order.list.increment.get.go @@ -14,7 +14,7 @@ type OrderListIncrementGetResponse struct { SubsidyDuoAmountLevel int `json:"subsidy_duo_amount_level"` CatIds []int `json:"cat_ids"` OrderStatus int `json:"order_status"` - OrderCreateTime int `json:"order_create_time"` + OrderCreateTime int64 `json:"order_create_time"` IsDirect int `json:"is_direct"` OrderGroupSuccessTime int `json:"order_group_success_time"` MallId int `json:"mall_id"` @@ -65,6 +65,8 @@ func NewOrderListIncrementGetResult(result OrderListIncrementGetResponse, body [ return &OrderListIncrementGetResult{Result: result, Body: body, Err: err} } +// OrderListIncrementGet 最后更新时间段增量同步推广订单信息 +// https://jinbao.pinduoduo.com/third-party/api-detail?apiName=pdd.ddk.order.list.increment.get func (app *App) OrderListIncrementGet(notMustParams ...Params) *OrderListIncrementGetResult { // 参数 params := NewParamsWithType("pdd.ddk.order.list.increment.get", notMustParams...) diff --git a/service/pinduoduo/pdd.ddk.order.list.range.get.go b/service/pinduoduo/pdd.ddk.order.list.range.get.go new file mode 100644 index 00000000..ebacf696 --- /dev/null +++ b/service/pinduoduo/pdd.ddk.order.list.range.get.go @@ -0,0 +1,79 @@ +package pinduoduo + +import "encoding/json" + +type OrderListRangeGetResponse struct { + OrderListGetResponse struct { + TotalCount int `json:"total_count"` + OrderList []struct { + SepMarketFee int `json:"sep_market_fee"` + GoodsPrice int64 `json:"goods_price"` + SepDuoId int `json:"sep_duo_id"` + PromotionRate int64 `json:"promotion_rate"` + Type int `json:"type"` + SubsidyDuoAmountLevel int `json:"subsidy_duo_amount_level"` + CatIds []int `json:"cat_ids"` + OrderStatus int `json:"order_status"` + OrderCreateTime int64 `json:"order_create_time"` + IsDirect int `json:"is_direct"` + OrderGroupSuccessTime int `json:"order_group_success_time"` + MallId int `json:"mall_id"` + OrderAmount int64 `json:"order_amount"` + PriceCompareStatus int `json:"price_compare_status"` + OrderModifyAt int `json:"order_modify_at"` + AuthDuoId int `json:"auth_duo_id"` + CpaNew int `json:"cpa_new"` + GoodsName string `json:"goods_name"` + BatchNo string `json:"batch_no"` + RedPacketType int `json:"red_packet_type"` + GoodsQuantity int `json:"goods_quantity"` + FailReason string `json:"fail_reason,omitempty"` + GoodsId int64 `json:"goods_id"` + SepParameters string `json:"sep_parameters"` + SepRate int `json:"sep_rate"` + SubsidyType int `json:"subsidy_type"` + CustomParameters string `json:"custom_parameters"` + GoodsThumbnailUrl string `json:"goods_thumbnail_url"` + ShareRate int `json:"share_rate"` + PromotionAmount int64 `json:"promotion_amount"` + OrderPayTime int64 `json:"order_pay_time"` + OrderReceiveTime int64 `json:"order_receive_time"` + OrderSettleTime int64 `json:"order_settle_time"` + ActivityTags []int `json:"activity_tags"` + GroupId int64 `json:"group_id"` + SepPid string `json:"sep_pid"` + OrderStatusDesc string `json:"order_status_desc"` + ShareAmount int `json:"share_amount"` + OrderId string `json:"order_id"` + GoodsSign string `json:"goods_sign"` + OrderSn string `json:"order_sn"` + OrderVerifyTime int64 `json:"order_verify_time"` + PId string `json:"p_id"` + ZsDuoId int `json:"zs_duo_id"` + } `json:"order_list"` + RequestId string `json:"request_id"` + } `json:"order_list_get_response"` +} + +type OrderListRangeGetResult struct { + Result OrderListRangeGetResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewOrderListRangeGetResult(result OrderListRangeGetResponse, body []byte, err error) *OrderListRangeGetResult { + return &OrderListRangeGetResult{Result: result, Body: body, Err: err} +} + +// OrderListRangeGet 用时间段查询推广订单接口 +// https://jinbao.pinduoduo.com/third-party/api-detail?apiName=pdd.ddk.order.list.range.get +func (app *App) OrderListRangeGet(notMustParams ...Params) *OrderListRangeGetResult { + // 参数 + params := NewParamsWithType("pdd.ddk.order.list.range.get", notMustParams...) + // 请求 + body, err := app.request(params) + // 定义 + var response OrderListRangeGetResponse + err = json.Unmarshal(body, &response) + return NewOrderListRangeGetResult(response, body, err) +} diff --git a/service/pinduoduo/pdd.ddk.resource.url.gen.go b/service/pinduoduo/pdd.ddk.resource.url.gen.go index e86449ab..c99bb057 100644 --- a/service/pinduoduo/pdd.ddk.resource.url.gen.go +++ b/service/pinduoduo/pdd.ddk.resource.url.gen.go @@ -26,25 +26,37 @@ type ResourceUrlGenResponse struct { } `json:"resource_url_response"` } +type ResourceUrlGenError struct { + ErrorResponse struct { + ErrorMsg string `json:"error_msg"` + SubMsg string `json:"sub_msg"` + SubCode string `json:"sub_code"` + } `json:"error_response"` +} + type ResourceUrlGenResult struct { Result ResourceUrlGenResponse // 结果 Body []byte // 内容 Err error // 错误 + Error ResourceUrlGenError // 错误结果 } -func NewResourceUrlGenResult(result ResourceUrlGenResponse, body []byte, err error) *ResourceUrlGenResult { - return &ResourceUrlGenResult{Result: result, Body: body, Err: err} +func NewResourceUrlGenResult(result ResourceUrlGenResponse, body []byte, err error, error ResourceUrlGenError) *ResourceUrlGenResult { + return &ResourceUrlGenResult{Result: result, Body: body, Err: err, Error: error} } -// ResourceUrlGen 创建多多进宝推广位 +// ResourceUrlGen 生成多多进宝频道推广 // https://jinbao.pinduoduo.com/third-party/api-detail?apiName=pdd.ddk.goods.pid.generate func (app *App) ResourceUrlGen(notMustParams ...Params) *ResourceUrlGenResult { // 参数 params := NewParamsWithType("pdd.ddk.resource.url.gen", notMustParams...) + params.Set("pid", app.Pid) // 请求 body, err := app.request(params) // 定义 var response ResourceUrlGenResponse err = json.Unmarshal(body, &response) - return NewResourceUrlGenResult(response, body, err) + var responseError ResourceUrlGenError + err = json.Unmarshal(body, &responseError) + return NewResourceUrlGenResult(response, body, err, responseError) } diff --git a/service/pinduoduo/pdd.ddk.rp.prom.url.generate.go b/service/pinduoduo/pdd.ddk.rp.prom.url.generate.go index 078176d8..3442f468 100644 --- a/service/pinduoduo/pdd.ddk.rp.prom.url.generate.go +++ b/service/pinduoduo/pdd.ddk.rp.prom.url.generate.go @@ -41,15 +41,23 @@ type RpPromUrlGenerateResponse struct { } `json:"url_list"` } `json:"rp_promotion_url_generate_response"` } +type RpPromUrlGenerateError struct { + ErrorResponse struct { + ErrorMsg string `json:"error_msg"` + SubMsg string `json:"sub_msg"` + SubCode string `json:"sub_code"` + } `json:"error_response"` +} type RpPromUrlGenerateResult struct { Result RpPromUrlGenerateResponse // 结果 Body []byte // 内容 Err error // 错误 + Error RpPromUrlGenerateError // 错误结果 } -func NewRpPromUrlGenerateResult(result RpPromUrlGenerateResponse, body []byte, err error) *RpPromUrlGenerateResult { - return &RpPromUrlGenerateResult{Result: result, Body: body, Err: err} +func NewRpPromUrlGenerateResult(result RpPromUrlGenerateResponse, body []byte, err error, error RpPromUrlGenerateError) *RpPromUrlGenerateResult { + return &RpPromUrlGenerateResult{Result: result, Body: body, Err: err, Error: error} } // RpPromUrlGenerate 生成营销工具推广链接 @@ -57,10 +65,13 @@ func NewRpPromUrlGenerateResult(result RpPromUrlGenerateResponse, body []byte, e func (app *App) RpPromUrlGenerate(notMustParams ...Params) *RpPromUrlGenerateResult { // 参数 params := NewParamsWithType("pdd.ddk.rp.prom.url.generate", notMustParams...) + params.Set("p_id_list", []string{app.Pid}) // 请求 body, err := app.request(params) // 定义 var response RpPromUrlGenerateResponse err = json.Unmarshal(body, &response) - return NewRpPromUrlGenerateResult(response, body, err) + var responseError RpPromUrlGenerateError + err = json.Unmarshal(body, &responseError) + return NewRpPromUrlGenerateResult(response, body, err, responseError) } diff --git a/service/pinduoduo/pdd.ddk.top.goods.list.query.go b/service/pinduoduo/pdd.ddk.top.goods.list.query.go new file mode 100644 index 00000000..4e644e00 --- /dev/null +++ b/service/pinduoduo/pdd.ddk.top.goods.list.query.go @@ -0,0 +1,68 @@ +package pinduoduo + +import "encoding/json" + +type TopGoodsListQueryResponse struct { + TopGoodsListGetResponse struct { + List []struct { + CatIds []int `json:"cat_ids"` + CouponDiscount int `json:"coupon_discount"` + CouponEndTime int `json:"coupon_end_time"` + CouponMinOrderAmount int `json:"coupon_min_order_amount"` + CouponRemainQuantity int `json:"coupon_remain_quantity"` + CouponStartTime int `json:"coupon_start_time"` + CouponTotalQuantity int `json:"coupon_total_quantity"` + DescTxt string `json:"desc_txt"` + GoodsDesc string `json:"goods_desc"` + GoodsGalleryUrls []string `json:"goods_gallery_urls"` + GoodsId int64 `json:"goods_id"` + GoodsImageUrl string `json:"goods_image_url"` + GoodsName string `json:"goods_name"` + GoodsSign string `json:"goods_sign"` + GoodsThumbnailUrl string `json:"goods_thumbnail_url"` + LgstTxt string `json:"lgst_txt"` + MallId int64 `json:"mall_id"` + MallName string `json:"mall_name"` + MerchantType string `json:"merchant_type"` + MinGroupPrice int `json:"min_group_price"` + MinNormalPrice int `json:"min_normal_price"` + OptId int `json:"opt_id"` + OptIds []int `json:"opt_ids"` + OptName string `json:"opt_name"` + PredictPromotionRate int `json:"predict_promotion_rate"` + PromotionRate int `json:"promotion_rate"` + SalesTip string `json:"sales_tip"` + SearchId string `json:"search_id"` + ServTxt string `json:"serv_txt"` + ShareRate int `json:"share_rate"` + CategoryId int64 `json:"category_id"` + CategoryName string `json:"category_name"` + } `json:"list"` + ListId string `json:"list_id"` + SearchId string `json:"search_id"` + Total int64 `json:"total"` + } `json:"top_goods_list_get_response"` +} +type TopGoodsListQueryResult struct { + Result TopGoodsListQueryResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewTopGoodsListQueryResult(result TopGoodsListQueryResponse, body []byte, err error) *TopGoodsListQueryResult { + return &TopGoodsListQueryResult{Result: result, Body: body, Err: err} +} + +// TopGoodsListQuery 多多客获取爆款排行商品接口 +// https://jinbao.pinduoduo.com/third-party/api-detail?apiName=pdd.ddk.top.goods.list.query +func (app *App) TopGoodsListQuery(notMustParams ...Params) *TopGoodsListQueryResult { + // 参数 + params := NewParamsWithType("pdd.ddk.top.goods.list.query", notMustParams...) + params.Set("p_id", app.Pid) + // 请求 + body, err := app.request(params) + // 定义 + var response TopGoodsListQueryResponse + err = json.Unmarshal(body, &response) + return NewTopGoodsListQueryResult(response, body, err) +} diff --git a/service/pintoto/api_order_create-soon-order.go b/service/pintoto/api.order.create-soon-order.go similarity index 100% rename from service/pintoto/api_order_create-soon-order.go rename to service/pintoto/api.order.create-soon-order.go diff --git a/service/pintoto/api.order.create.go b/service/pintoto/api.order.create.go new file mode 100644 index 00000000..5757fc8a --- /dev/null +++ b/service/pintoto/api.order.create.go @@ -0,0 +1,31 @@ +package pintoto + +import "encoding/json" + +type ApiOrderCreateResponse struct { + Code int `json:"code"` + Message string `json:"message"` + Success bool `json:"success"` +} + +type ApiOrderCreateResult struct { + Result ApiOrderCreateResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewApiOrderCreateResult(result ApiOrderCreateResponse, body []byte, err error) *ApiOrderCreateResult { + return &ApiOrderCreateResult{Result: result, Body: body, Err: err} +} + +// ApiOrderCreate 下单api https://www.showdoc.com.cn/1154868044931571/5891022916496848 +func (app *App) ApiOrderCreate(notMustParams ...Params) *ApiOrderCreateResult { + // 参数 + params := app.NewParamsWith(notMustParams...) + // 请求 + body, err := app.request("https://movieapi2.pintoto.cn/api/order/create", params) + // 定义 + var response ApiOrderCreateResponse + err = json.Unmarshal(body, &response) + return NewApiOrderCreateResult(response, body, err) +} diff --git a/service/pintoto/api_order_query.go b/service/pintoto/api.order.query.go similarity index 75% rename from service/pintoto/api_order_query.go rename to service/pintoto/api.order.query.go index a9453cc6..0a8ae6be 100644 --- a/service/pintoto/api_order_query.go +++ b/service/pintoto/api.order.query.go @@ -4,11 +4,7 @@ import ( "encoding/json" ) -type ApiOrderQuery struct { - ThirdOrderId string `json:"thirdOrderId"` // 接入方的订单号 -} - -type ApiOrderQueryResult struct { +type ApiOrderQueryResponse struct { Success bool `json:"success"` Message string `json:"message"` Data struct { @@ -36,22 +32,26 @@ type ApiOrderQueryResult struct { Code int `json:"code"` } +type ApiOrderQueryResult struct { + Result ApiOrderQueryResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewApiOrderQueryResult(result ApiOrderQueryResponse, body []byte, err error) *ApiOrderQueryResult { + return &ApiOrderQueryResult{Result: result, Body: body, Err: err} +} + // ApiOrderQuery 订单查询 https://www.showdoc.com.cn/1154868044931571/5965244588489845 -func (app *App) ApiOrderQuery(param ApiOrderQuery) (result ApiOrderQueryResult, err error) { - // api params - params := map[string]interface{}{} - b, _ := json.Marshal(¶m) - var m map[string]interface{} - _ = json.Unmarshal(b, &m) - for k, v := range m { - params[k] = v - } +func (app *App) ApiOrderQuery(thirdOrderId string) *ApiOrderQueryResult { + // 测试 + param := NewParams() + param.Set("thirdOrderId", thirdOrderId) + params := app.NewParamsWith(param) + // 请求 body, err := app.request("https://movieapi2.pintoto.cn/api/order/query", params) - if err != nil { - return - } - if err = json.Unmarshal(body, &result); err != nil { - return - } - return + // 定义 + var response ApiOrderQueryResponse + err = json.Unmarshal(body, &response) + return NewApiOrderQueryResult(response, body, err) } diff --git a/service/pintoto/api_user_info.go b/service/pintoto/api.user.info.go similarity index 100% rename from service/pintoto/api_user_info.go rename to service/pintoto/api.user.info.go diff --git a/service/pintoto/api_order_create.go b/service/pintoto/api_order_create.go deleted file mode 100644 index 70c7200f..00000000 --- a/service/pintoto/api_order_create.go +++ /dev/null @@ -1,40 +0,0 @@ -package pintoto - -import "encoding/json" - -type ApiOrderCreate struct { - ShowId string `json:"showId"` // 排期的showId,由影院接口得来 - Seat string `json:"seat"` // 用户所选的座位,例:1排1座,1排2座 以英文的逗号 “ , “隔开。 如果座位是情侣座,请传入 : 1排1座(情侣座),1排2座(情侣座) - ReservedPhone string `json:"reservedPhone,omitempty"` // 下单时预留的手机号,方便问题沟通 - ThirdOrderId string `json:"thirdOrderId"` // 接入方的订单号, 接入方须保证此订单号唯一性 - NotifyUrl string `json:"notifyUrl"` // 回调地址,各个场景发生时,将通过此地址通知接入方,详情请看【回调api】 - AcceptChangeSeat int `json:"acceptChangeSeat"` // 是否允许调座,1-允许,0-不允许 - SeatId string `json:"seatId,omitempty"` // 座位接口的seatId字段, 如果有多个,则以竖线分割 - SeatNo string `json:"seatNo,omitempty"` // 座位接口的seatNo字段,如果有多个,则以竖线分割 -} - -type ApiOrderCreateResult struct { - Code int `json:"code"` - Message string `json:"message"` - Success bool `json:"success"` -} - -// ApiOrderCreate 下单api https://www.showdoc.com.cn/1154868044931571/5891022916496848 -func (app *App) ApiOrderCreate(param ApiOrderCreate) (result ApiOrderCreateResult, err error) { - // api params - params := map[string]interface{}{} - b, _ := json.Marshal(¶m) - var m map[string]interface{} - _ = json.Unmarshal(b, &m) - for k, v := range m { - params[k] = v - } - body, err := app.request("https://movieapi2.pintoto.cn/api/order/create", params) - if err != nil { - return - } - if err = json.Unmarshal(body, &result); err != nil { - return - } - return -} diff --git a/service/pintoto/app.go b/service/pintoto/app.go index 941a90a2..19228b09 100644 --- a/service/pintoto/app.go +++ b/service/pintoto/app.go @@ -1,18 +1,11 @@ package pintoto import ( - "encoding/json" - "errors" - "fmt" - "github.com/go-redis/redis/v8" - "go.mongodb.org/mongo-driver/mongo" - "go.uber.org/zap" - "gorm.io/gorm" - "io/ioutil" + "dtapps/dta/library/utils/gohttp" + "dtapps/dta/library/utils/gomongo" "math" "net/http" "strconv" - "strings" "time" ) @@ -20,62 +13,21 @@ import ( type App struct { AppKey string AppSecret string - ZapLog *zap.Logger // 日志服务 - Db *gorm.DB // 关系数据库服务 - RDb *redis.Client // 缓存数据库服务 - MDb *mongo.Client // 非关系数据库服务 -} - -type ErrResp struct { - Success bool `json:"success"` - Message string `json:"message"` - Data interface{} `json:"data"` - Code int `json:"code"` + Mongo gomongo.App // 日志数据库 } +// 请求 func (app *App) request(url string, params map[string]interface{}) ([]byte, error) { // 公共参数 params["time"] = time.Now().Unix() params["appKey"] = app.AppKey // 签名 params["sign"] = app.getSign(app.AppSecret, params) - var req *http.Request - req, err := http.NewRequest("POST", url, strings.NewReader(app.getRequestData(params))) - if err != nil { - return nil, err - } - req.Header.Add("Content-Type", "application/x-www-form-urlencoded") - httpClient := &http.Client{} - var response *http.Response - response, err = httpClient.Do(req) - if err != nil { - return nil, nil - } - - // 请求错误 - if response.StatusCode != 200 { - return nil, errors.New(fmt.Sprintf("请求错误:%d", response.StatusCode)) - } - - defer response.Body.Close() - body, err := ioutil.ReadAll(response.Body) - + // 请求 + postForm, err := gohttp.PostForm(url, params) // 日志 - if app.ZapLog != nil { - app.ZapLog.Sugar().Info(fmt.Sprintf("%s %s", url, body)) - } - - // 检查错误 - apiErr := ErrResp{} - err = json.Unmarshal(body, &apiErr) - if err != nil { - return nil, err - } - // 接口状态错误 - if apiErr.Code != 200 { - return nil, errors.New(apiErr.Message) - } - return body, nil + go app.mongoLog(url, params, http.MethodPost, postForm) + return postForm.Body, err } func (app *App) GradeToFloat64(i interface{}) float64 { diff --git a/service/pintoto/go.mod b/service/pintoto/go.mod deleted file mode 100644 index 072a8434..00000000 --- a/service/pintoto/go.mod +++ /dev/null @@ -1,30 +0,0 @@ -module github.com/dtapps/go-library/service/pintoto - -go 1.18 - -require ( - github.com/go-redis/redis/v8 v8.11.5 - go.mongodb.org/mongo-driver v1.8.4 - go.uber.org/zap v1.21.0 - gorm.io/gorm v1.23.3 -) - -require ( - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/go-stack/stack v1.8.0 // indirect - github.com/golang/snappy v0.0.1 // indirect - github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jinzhu/now v1.1.4 // indirect - github.com/klauspost/compress v1.13.6 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.0.2 // indirect - github.com/xdg-go/stringprep v1.0.2 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f // indirect - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/text v0.3.6 // indirect -) diff --git a/service/pintoto/mongodb.go b/service/pintoto/mongodb.go new file mode 100644 index 00000000..8704e8cd --- /dev/null +++ b/service/pintoto/mongodb.go @@ -0,0 +1,47 @@ +package pintoto + +import ( + "dtapps/dta/library/utils/gohttp" + "encoding/json" + "gitee.com/dtapps/go-library/utils/gotime" +) + +// 日志 +type mongoZap struct { + Url string `json:"url" bson:"url"` + Params interface{} `json:"params" bson:"params"` + Method string `json:"method" bson:"method"` + Header interface{} `json:"header" bson:"header"` + Status string `json:"status" bson:"status"` + StatusCode int `json:"status_code" bson:"status_code"` + Body interface{} `json:"body" bson:"body"` + ContentLength int64 `json:"content_length" bson:"content_length"` + CreateTime string `json:"create_time" bson:"create_time"` +} + +func (m *mongoZap) Database() string { + return "zap_logs" +} + +func (m *mongoZap) TableName() string { + return "pintoto_" + gotime.Current().SetFormat("200601") +} + +func (app *App) mongoLog(url string, params map[string]interface{}, method string, request gohttp.Response) { + if app.Mongo.Db == nil { + return + } + var body map[string]interface{} + _ = json.Unmarshal(request.Body, &body) + app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{ + Url: url, + Params: params, + Method: method, + Header: request.Header, + Status: request.Status, + StatusCode: request.StatusCode, + Body: body, + ContentLength: request.ContentLength, + CreateTime: gotime.Current().Format(), + }) +} diff --git a/service/pintoto/movie_info_get_cinema_list.go b/service/pintoto/movie_info_get_cinema_list.go index 0fe6c47a..30be1edb 100644 --- a/service/pintoto/movie_info_get_cinema_list.go +++ b/service/pintoto/movie_info_get_cinema_list.go @@ -4,10 +4,6 @@ import ( "encoding/json" ) -type GetCinemaList struct { - CityId int `json:"cityId"` // 城市id -} - type GetCinemaListResult struct { Code int `json:"code"` Message string `json:"message"` @@ -29,15 +25,13 @@ type GetCinemaListResult struct { } // GetCinemaList 影院列表 https://www.showdoc.com.cn/1154868044931571/5866426126744792 -func (app *App) GetCinemaList(param GetCinemaList) (result GetCinemaListResult, err error) { - // api params - params := map[string]interface{}{} - b, _ := json.Marshal(¶m) - var m map[string]interface{} - _ = json.Unmarshal(b, &m) - for k, v := range m { - params[k] = v - } +func (app *App) GetCinemaList(cityId int) (result GetCinemaListResult, err error) { + // 参数 + param := NewParams() + param.Set("cityId", cityId) + // 转换 + params := app.NewParamsWith(param) + // 请求 body, err := app.request("https://movieapi2.pintoto.cn/movieapi/movie-info/get-cinema-list", params) if err != nil { return diff --git a/service/pintoto/movie_info_get_city_area.go b/service/pintoto/movie_info_get_city_area.go index 13bee929..ffeb3327 100644 --- a/service/pintoto/movie_info_get_city_area.go +++ b/service/pintoto/movie_info_get_city_area.go @@ -4,11 +4,7 @@ import ( "encoding/json" ) -type GetCityArea struct { - CityId int `json:"cityId"` // 城市id -} - -type GetCityAreaResult struct { +type GetCityAreaResponse struct { Code int `json:"code"` Message string `json:"message"` Data struct { @@ -20,22 +16,26 @@ type GetCityAreaResult struct { Success bool `json:"success"` } -// GetCityArea 城市下区域 https://www.showdoc.com.cn/1154868044931571/6243539682553126 -func (app *App) GetCityArea(param GetCityArea) (result GetCityAreaResult, err error) { - // api params - params := map[string]interface{}{} - b, _ := json.Marshal(¶m) - var m map[string]interface{} - _ = json.Unmarshal(b, &m) - for k, v := range m { - params[k] = v - } +type GetCityAreaResult struct { + Result GetCityAreaResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewGetCityAreaResult(result GetCityAreaResponse, body []byte, err error) *GetCityAreaResult { + return &GetCityAreaResult{Result: result, Body: body, Err: err} +} + +// GetCityArea 城市下区域 +// https://www.showdoc.com.cn/1154868044931571/6243539682553126 +func (app *App) GetCityArea(cityId int) *GetCityAreaResult { + // 测试 + param := NewParams() + param.Set("cityId", cityId) + params := app.NewParamsWith(param) + // 请求 body, err := app.request("https://movieapi2.pintoto.cn/movieapi/movie-info/get-city-area", params) - if err != nil { - return - } - if err = json.Unmarshal(body, &result); err != nil { - return - } - return + var response GetCityAreaResponse + err = json.Unmarshal(body, &response) + return NewGetCityAreaResult(response, body, err) } diff --git a/service/pintoto/movie_info_get_city_list.go b/service/pintoto/movie_info_get_city_list.go index da50cd4a..7583dd74 100644 --- a/service/pintoto/movie_info_get_city_list.go +++ b/service/pintoto/movie_info_get_city_list.go @@ -4,27 +4,36 @@ import ( "encoding/json" ) -type GetCityListResult struct { +type GetCityListResponse struct { Code int `json:"code"` Message string `json:"message"` Data struct { - List []struct { - PinYin string `json:"pinYin"` // 城市首字母 - RegionName string `json:"regionName"` // 城市名 - CityId int `json:"cityId"` // 城市id - } `json:"list"` + List []GetCityListResponseDataList `json:"list"` } `json:"data"` Success bool `json:"success"` } -// GetCityList 城市列表 https://www.showdoc.com.cn/1154868044931571/5865562425538244 -func (app *App) GetCityList() (result GetCityListResult, err error) { +type GetCityListResponseDataList struct { + PinYin string `json:"pinYin"` // 城市首字母 + RegionName string `json:"regionName"` // 城市名 + CityId int `json:"cityId"` // 城市id +} + +type GetCityListResult struct { + Result GetCityListResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewGetCityListResult(result GetCityListResponse, body []byte, err error) *GetCityListResult { + return &GetCityListResult{Result: result, Body: body, Err: err} +} + +// GetCityList 城市列表 +// https://www.showdoc.com.cn/1154868044931571/5865562425538244 +func (app *App) GetCityList() *GetCityListResult { body, err := app.request("https://movieapi2.pintoto.cn/movieapi/movie-info/get-city-list", map[string]interface{}{}) - if err != nil { - return - } - if err = json.Unmarshal(body, &result); err != nil { - return - } - return + var response GetCityListResponse + err = json.Unmarshal(body, &response) + return NewGetCityListResult(response, body, err) } diff --git a/service/pintoto/movie_info_get_hot_list.go b/service/pintoto/movie_info_get_hot_list.go index 74cb4891..3409920a 100644 --- a/service/pintoto/movie_info_get_hot_list.go +++ b/service/pintoto/movie_info_get_hot_list.go @@ -4,10 +4,6 @@ import ( "encoding/json" ) -type GetHotList struct { - CityId int `json:"cityId,omitempty"` // 传入cityId时,会显示当前城市下的相关电影。 如果不传,则默认显示北京的电影 -} - type GetHotListResult struct { Code int `json:"code"` Message string `json:"message"` @@ -34,15 +30,13 @@ type GetHotListResult struct { } // GetHotList 正在热映 https://www.showdoc.com.cn/1154868044931571/5866125707634369 -func (app *App) GetHotList(param GetHotList) (result GetHotListResult, err error) { - // api params - params := map[string]interface{}{} - b, _ := json.Marshal(¶m) - var m map[string]interface{} - _ = json.Unmarshal(b, &m) - for k, v := range m { - params[k] = v - } +func (app *App) GetHotList(cityId int) (result GetHotListResult, err error) { + // 参数 + param := NewParams() + param.Set("cityId", cityId) + // 转换 + params := app.NewParamsWith(param) + // 请求 body, err := app.request("https://movieapi2.pintoto.cn/movieapi/movie-info/get-hot-list", params) if err != nil { return diff --git a/service/pintoto/movie_info_get_schedule_list.go b/service/pintoto/movie_info_get_schedule_list.go index 219e1a8c..eb575999 100644 --- a/service/pintoto/movie_info_get_schedule_list.go +++ b/service/pintoto/movie_info_get_schedule_list.go @@ -4,10 +4,6 @@ import ( "encoding/json" ) -type GetScheduleList struct { - CinemaId int `json:"cinemaId"` // 影院id -} - type GetScheduleListResult struct { Code int `json:"code"` Message string `json:"message"` @@ -38,15 +34,13 @@ type GetScheduleListResult struct { } // GetScheduleList 场次排期 https://www.showdoc.com.cn/1154868044931571/5866708808899217 -func (app *App) GetScheduleList(param GetScheduleList) (result GetScheduleListResult, err error) { - // api params - params := map[string]interface{}{} - b, _ := json.Marshal(¶m) - var m map[string]interface{} - _ = json.Unmarshal(b, &m) - for k, v := range m { - params[k] = v - } +func (app *App) GetScheduleList(cinemaId int) (result GetScheduleListResult, err error) { + // 参数 + param := NewParams() + param.Set("cinemaId", cinemaId) + // 转换 + params := app.NewParamsWith(param) + // 请求 body, err := app.request("https://movieapi2.pintoto.cn/movieapi/movie-info/get-schedule-list", params) if err != nil { return diff --git a/service/pintoto/movie_info_get_sea.go b/service/pintoto/movie_info_get_sea.go index 2a6ef55e..51b2f2c8 100644 --- a/service/pintoto/movie_info_get_sea.go +++ b/service/pintoto/movie_info_get_sea.go @@ -31,15 +31,13 @@ type GetSeatSeats struct { } // GetSeat 座位 https://www.showdoc.com.cn/1154868044931571/5866824368760475 -func (app *App) GetSeat(param GetSeat) (result GetSeatResult, err error) { - // api params - params := map[string]interface{}{} - b, _ := json.Marshal(¶m) - var m map[string]interface{} - _ = json.Unmarshal(b, &m) - for k, v := range m { - params[k] = v - } +func (app *App) GetSeat(showId string) (result GetSeatResult, err error) { + // 参数 + param := NewParams() + param.Set("showId", showId) + // 转换 + params := app.NewParamsWith(param) + // 请求 body, err := app.request("https://movieapi2.pintoto.cn/movieapi/movie-info/get-seat", params) if err != nil { return diff --git a/service/pintoto/movie_info_get_show_date.go b/service/pintoto/movie_info_get_show_date.go index 86722a03..9cd8fc4d 100644 --- a/service/pintoto/movie_info_get_show_date.go +++ b/service/pintoto/movie_info_get_show_date.go @@ -19,15 +19,14 @@ type GetShowDateResult struct { } // GetShowDate 包含某电影的日期 https://www.showdoc.com.cn/1154868044931571/6091788579441818 -func (app *App) GetShowDate(param GetShowDate) (result GetShowDateResult, err error) { - // api params - params := map[string]interface{}{} - b, _ := json.Marshal(¶m) - var m map[string]interface{} - _ = json.Unmarshal(b, &m) - for k, v := range m { - params[k] = v - } +func (app *App) GetShowDate(cityId, filmId int) (result GetShowDateResult, err error) { + // 参数 + param := NewParams() + param.Set("cityId", cityId) + param.Set("filmId", filmId) + // 转换 + params := app.NewParamsWith(param) + // 请求 body, err := app.request("https://movieapi2.pintoto.cn/movieapi/movie-info/get-show-date", params) if err != nil { return diff --git a/service/pintoto/movie_info_get_soon_list.go b/service/pintoto/movie_info_get_soon_list.go index a5a1f810..64ef1a2b 100644 --- a/service/pintoto/movie_info_get_soon_list.go +++ b/service/pintoto/movie_info_get_soon_list.go @@ -4,10 +4,6 @@ import ( "encoding/json" ) -type GetSoonList struct { - CityId int `json:"cityId,omitempty"` // 传入cityId时,会显示当前城市下的相关电影。 如果不传,则默认显示北京的电影 -} - type GetSoonListResult struct { Code int `json:"code"` Message string `json:"message"` @@ -34,15 +30,13 @@ type GetSoonListResult struct { } // GetSoonList 即将上映 https://www.showdoc.com.cn/1154868044931571/5866125707634369 -func (app *App) GetSoonList(param GetSoonList) (result GetSoonListResult, err error) { - // api params - params := map[string]interface{}{} - b, _ := json.Marshal(¶m) - var m map[string]interface{} - _ = json.Unmarshal(b, &m) - for k, v := range m { - params[k] = v - } +func (app *App) GetSoonList(cityId int) (result GetSoonListResult, err error) { + // 参数 + param := NewParams() + param.Set("cityId", cityId) + // 转换 + params := app.NewParamsWith(param) + // 请求 body, err := app.request("https://movieapi2.pintoto.cn/movieapi/movie-info/get-soon-list", params) if err != nil { return diff --git a/service/pintoto/movie_info_get_version.go b/service/pintoto/movieapi.movie-info.get-version.go similarity index 100% rename from service/pintoto/movie_info_get_version.go rename to service/pintoto/movieapi.movie-info.get-version.go diff --git a/service/pintoto/params.go b/service/pintoto/params.go new file mode 100644 index 00000000..3f6a9f1b --- /dev/null +++ b/service/pintoto/params.go @@ -0,0 +1,27 @@ +package pintoto + +// Params 请求参数 +type Params map[string]interface{} + +func NewParams() Params { + p := make(Params) + return p +} + +func (app *App) NewParamsWith(params ...Params) Params { + p := make(Params) + for _, v := range params { + p.SetParams(v) + } + return p +} + +func (p Params) Set(key string, value interface{}) { + p[key] = value +} + +func (p Params) SetParams(params Params) { + for key, value := range params { + p[key] = value + } +} diff --git a/service/sendcloud/apiv2.userinfo.get.go b/service/sendcloud/apiv2.userinfo.get.go new file mode 100644 index 00000000..9dbfe4ce --- /dev/null +++ b/service/sendcloud/apiv2.userinfo.get.go @@ -0,0 +1,66 @@ +package sendcloud + +import ( + "encoding/json" + "net/http" +) + +type ApiV2UserinfoGetResponse struct { + Code string `json:"code"` + Message string `json:"message"` + Data struct { + ID int64 `json:"id"` // 订单号 + ProductID int `json:"product_id"` // 商品编号 + ProductName string `json:"product_name"` // 商品名称 + ProductType int `json:"product_type"` // 商品类型(1:充值,2:卡密,3:卡券,4:人工) + ProductPrice string `json:"product_price"` // 售价 + Quantity int `json:"quantity"` // 购买数量 + TotalPrice string `json:"total_price"` // 总支付价格 + RefundedAmount float64 `json:"refunded_amount"` // 已退款金额 + BuyerCustomerID int `json:"buyer_customer_id"` // 买家编号 + BuyerCustomerName string `json:"buyer_customer_name"` // 买家名称 + SellerCustomerID int `json:"seller_customer_id"` // 卖家编号 + SellerCustomerName string `json:"seller_customer_name"` // 卖家名称 + State int `json:"state"` // 订单状态(100:等待发货,101:正在充值,200:交易成功,500:交易失败,501:未知状态) + CreatedAt string `json:"created_at"` // 下单时间 + RechargeAccount string `json:"recharge_account"` // 充值账号 + ProgressInit int `json:"progress_init"` // 充值进度:初始值 + ProgressNow int `json:"progress_now"` // 充值进度:现在值 + ProgressTarget int `json:"progress_target"` // 充值进度:目标值 + RechargeInfo string `json:"recharge_info"` // 返回信息 + RechargeUrl string `json:"recharge_url"` // 卡密充值网址 + Cards []struct { + No string `json:"no"` + Password string `json:"password"` + } `json:"cards"` //【卡密类订单】卡密 + RechargeParams string `json:"recharge_params"` //【充值类订单】 + OuterApiV2UserinfoGetID string `json:"outer_ApiV2UserinfoGet_id,omitempty"` // 外部订单号 + } `json:"data"` +} + +type ApiV2UserinfoGetResult struct { + Result ApiV2UserinfoGetResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewApiV2UserinfoGetResult(result ApiV2UserinfoGetResponse, body []byte, err error) *ApiV2UserinfoGetResult { + return &ApiV2UserinfoGetResult{Result: result, Body: body, Err: err} +} + +// ApiV2UserinfoGet 获取单个订单信息。 +// 仅能获取自己购买的订单。 +// http://doc.cqmeihu.cn/sales/ApiV2UserinfoGet-info.html +func (app App) ApiV2UserinfoGet() *ApiV2UserinfoGetResult { + // 参数 + param := NewParams() + param.Set("apiUser", app.ApiUser) + param.Set("apiKey", app.ApiKey) + params := app.NewParamsWith(param) + // 请求 + body, err := app.request("https://api.sendcloud.net/apiv2/userinfo/get", params, http.MethodGet) + // 定义 + var response ApiV2UserinfoGetResponse + err = json.Unmarshal(body, &response) + return NewApiV2UserinfoGetResult(response, body, err) +} diff --git a/service/sendcloud/app.go b/service/sendcloud/app.go new file mode 100644 index 00000000..0007112b --- /dev/null +++ b/service/sendcloud/app.go @@ -0,0 +1,35 @@ +package sendcloud + +import ( + "dtapps/dta/library/utils/gohttp" + "dtapps/dta/library/utils/gomongo" + "errors" + "net/http" +) + +// App 公共请求参数 +type App struct { + ApiUser string // API_USER + ApiKey string // API_KEY + Mongo gomongo.App // 日志数据库 +} + +func (app *App) request(url string, params map[string]interface{}, method string) ([]byte, error) { + // 公共参数 + //params["userid"] = app.UserID + //params["pwd"] = app.Pwd + //// 签名 + //params["userkey"] = gomd5.ToUpper(fmt.Sprintf("%s%s", app.signStr, app.Key)) + switch method { + case http.MethodGet: + // 请求 + get, err := gohttp.Get(url, params) + return get.Body, err + case http.MethodPost: + // 请求 + postJson, err := gohttp.PostForm(url, params) + return postJson.Body, err + default: + return nil, errors.New("请求类型不支持") + } +} diff --git a/service/sendcloud/mongodb.go b/service/sendcloud/mongodb.go new file mode 100644 index 00000000..6220ee0d --- /dev/null +++ b/service/sendcloud/mongodb.go @@ -0,0 +1,47 @@ +package sendcloud + +import ( + "dtapps/dta/library/utils/gohttp" + "encoding/json" + "gitee.com/dtapps/go-library/utils/gotime" +) + +// 日志 +type mongoZap struct { + Url string `json:"url" bson:"url"` + Params interface{} `json:"params" bson:"params"` + Method string `json:"method" bson:"method"` + Header interface{} `json:"header" bson:"header"` + Status string `json:"status" bson:"status"` + StatusCode int `json:"status_code" bson:"status_code"` + Body interface{} `json:"body" bson:"body"` + ContentLength int64 `json:"content_length" bson:"content_length"` + CreateTime string `json:"create_time" bson:"create_time"` +} + +func (m *mongoZap) Database() string { + return "zap_logs" +} + +func (m *mongoZap) TableName() string { + return "sendcloud_" + gotime.Current().SetFormat("200601") +} + +func (app *App) mongoLog(url string, params map[string]interface{}, method string, request gohttp.Response) { + if app.Mongo.Db == nil { + return + } + var body map[string]interface{} + _ = json.Unmarshal(request.Body, &body) + app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{ + Url: url, + Params: params, + Method: method, + Header: request.Header, + Status: request.Status, + StatusCode: request.StatusCode, + Body: body, + ContentLength: request.ContentLength, + CreateTime: gotime.Current().Format(), + }) +} diff --git a/service/sendcloud/params.go b/service/sendcloud/params.go new file mode 100644 index 00000000..4bef0ec1 --- /dev/null +++ b/service/sendcloud/params.go @@ -0,0 +1,27 @@ +package sendcloud + +// Params 请求参数 +type Params map[string]interface{} + +func NewParams() Params { + p := make(Params) + return p +} + +func (app *App) NewParamsWith(params ...Params) Params { + p := make(Params) + for _, v := range params { + p.SetParams(v) + } + return p +} + +func (p Params) Set(key string, value interface{}) { + p[key] = value +} + +func (p Params) SetParams(params Params) { + for key, value := range params { + p[key] = value + } +} diff --git a/service/service.go b/service/service.go deleted file mode 100644 index 99a6b9af..00000000 --- a/service/service.go +++ /dev/null @@ -1,22 +0,0 @@ -package service - -import ( - _ "github.com/dtapps/go-library/service/dingdanxia" - _ "github.com/dtapps/go-library/service/dingtalk" - _ "github.com/dtapps/go-library/service/eastiot" - _ "github.com/dtapps/go-library/service/ejiaofei" - _ "github.com/dtapps/go-library/service/ip" - _ "github.com/dtapps/go-library/service/jd" - _ "github.com/dtapps/go-library/service/kashangwl" - _ "github.com/dtapps/go-library/service/meituan" - _ "github.com/dtapps/go-library/service/pinduoduo" - _ "github.com/dtapps/go-library/service/pintoto" - _ "github.com/dtapps/go-library/service/taobao" - _ "github.com/dtapps/go-library/service/tianyancha" - _ "github.com/dtapps/go-library/service/wechatminiprogram" - _ "github.com/dtapps/go-library/service/wechatoffice" - _ "github.com/dtapps/go-library/service/wechatpayapiv3" - _ "github.com/dtapps/go-library/service/wechatqy" - _ "github.com/dtapps/go-library/service/wechatunion" - _ "github.com/dtapps/go-library/service/wikeyun" -) diff --git a/service/taobao/app.go b/service/taobao/app.go index e6318621..96a9d100 100644 --- a/service/taobao/app.go +++ b/service/taobao/app.go @@ -1,27 +1,24 @@ package taobao import ( + "dtapps/dta/library/utils/gohttp" + "dtapps/dta/library/utils/gomongo" + "dtapps/dta/library/utils/gostring" "encoding/json" "fmt" - "github.com/dtapps/go-library/utils/gohttp" - "github.com/dtapps/go-library/utils/gostring" - "github.com/go-redis/redis/v8" - "go.mongodb.org/mongo-driver/mongo" - "go.uber.org/zap" - "gorm.io/gorm" + "net/http" "regexp" "strconv" ) // App 公共请求参数 type App struct { - AppKey string // 应用Key - AppSecret string // 密钥 - ZapLog *zap.Logger // 日志服务 - Db *gorm.DB // 关系数据库服务 - RDb *redis.Client // 缓存数据库服务 - MDb *mongo.Client // 非关系数据库服务 + AppKey string // 应用Key + AppSecret string // 密钥 + AdzoneId int64 // mm_xxx_xxx_xxx的第三位 + Mongo gomongo.App // 日志数据库 } + type ErrResp struct { ErrorResponse struct { Code int `json:"code"` @@ -38,9 +35,7 @@ func (app *App) request(params map[string]interface{}) (resp []byte, err error) // 发送请求 get, err := gohttp.Get("https://eco.taobao.com/router/rest", params) // 日志 - if app.ZapLog != nil { - app.ZapLog.Sugar().Info(fmt.Sprintf("https://eco.taobao.com/router/rest?method=%s %s %s", params["method"], get.Header, get.Body)) - } + go app.mongoLog(fmt.Sprintf("https://eco.taobao.com/router/rest?method=%s", params["method"]), params, http.MethodPost, get) // 检查错误 var errResp ErrResp _ = json.Unmarshal(get.Body, &errResp) diff --git a/service/taobao/go.mod b/service/taobao/go.mod deleted file mode 100644 index 20c3aca6..00000000 --- a/service/taobao/go.mod +++ /dev/null @@ -1,32 +0,0 @@ -module github.com/dtapps/go-library/service/taobao - -go 1.18 - -require ( - github.com/dtapps/go-library/utils/gohttp v0.0.0-20220320040709-ad8a5f0e9e40 - github.com/dtapps/go-library/utils/gostring v0.0.0-20220320040709-ad8a5f0e9e40 - github.com/go-redis/redis/v8 v8.11.5 - go.mongodb.org/mongo-driver v1.8.4 - go.uber.org/zap v1.21.0 - gorm.io/gorm v1.23.3 -) - -require ( - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/go-stack/stack v1.8.0 // indirect - github.com/golang/snappy v0.0.1 // indirect - github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jinzhu/now v1.1.4 // indirect - github.com/klauspost/compress v1.13.6 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.0.2 // indirect - github.com/xdg-go/stringprep v1.0.2 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f // indirect - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/text v0.3.6 // indirect -) diff --git a/service/taobao/help.md b/service/taobao/help.md new file mode 100644 index 00000000..0294f86c --- /dev/null +++ b/service/taobao/help.md @@ -0,0 +1,2 @@ +https://market.m.taobao.com/app/qn/toutiao-new/index-pc.html#/detail/10628679 +https://www.yuque.com/docs/share/20abfe17-16ef-41f9-9182-412474cce0bd \ No newline at end of file diff --git a/service/taobao/mongodb.go b/service/taobao/mongodb.go new file mode 100644 index 00000000..66ed4f00 --- /dev/null +++ b/service/taobao/mongodb.go @@ -0,0 +1,47 @@ +package taobao + +import ( + "dtapps/dta/library/utils/gohttp" + "encoding/json" + "gitee.com/dtapps/go-library/utils/gotime" +) + +// 日志 +type mongoZap struct { + Url string `json:"url" bson:"url"` + Params interface{} `json:"params" bson:"params"` + Method string `json:"method" bson:"method"` + Header interface{} `json:"header" bson:"header"` + Status string `json:"status" bson:"status"` + StatusCode int `json:"status_code" bson:"status_code"` + Body interface{} `json:"body" bson:"body"` + ContentLength int64 `json:"content_length" bson:"content_length"` + CreateTime string `json:"create_time" bson:"create_time"` +} + +func (m *mongoZap) Database() string { + return "zap_logs" +} + +func (m *mongoZap) TableName() string { + return "taobao_" + gotime.Current().SetFormat("200601") +} + +func (app *App) mongoLog(url string, params map[string]interface{}, method string, request gohttp.Response) { + if app.Mongo.Db == nil { + return + } + var body map[string]interface{} + _ = json.Unmarshal(request.Body, &body) + app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{ + Url: url, + Params: params, + Method: method, + Header: request.Header, + Status: request.Status, + StatusCode: request.StatusCode, + Body: body, + ContentLength: request.ContentLength, + CreateTime: gotime.Current().Format(), + }) +} diff --git a/service/taobao/taobao.tbk.dg.newuser.order.get.go b/service/taobao/taobao.tbk.dg.newuser.order.get.go new file mode 100644 index 00000000..9bb34b90 --- /dev/null +++ b/service/taobao/taobao.tbk.dg.newuser.order.get.go @@ -0,0 +1,36 @@ +package taobao + +import "encoding/json" + +type TbkDgNewuserOrderGetResponse struct { + TbkDgNewuserOrderGetResponse struct { + Data struct { + Model string `json:"model"` + PasswordSimple string `json:"password_simple"` + } `json:"data"` + RequestId string `json:"request_id"` + } `json:"tbk_tpwd_create_response"` +} + +type TbkDgNewuserOrderGetResult struct { + Result TbkDgNewuserOrderGetResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewTbkDgNewuserOrderGetResult(result TbkDgNewuserOrderGetResponse, body []byte, err error) *TbkDgNewuserOrderGetResult { + return &TbkDgNewuserOrderGetResult{Result: result, Body: body, Err: err} +} + +// TbkDgNewuserOrderGet 淘宝客-推广者-新用户订单明细查询 +// https://open.taobao.com/api.htm?docId=33892&docType=2 +func (app *App) TbkDgNewuserOrderGet(notMustParams ...Params) *TbkDgNewuserOrderGetResult { + // 参数 + params := NewParamsWithType("taobao.tbk.dg.newuser.order.get", notMustParams...) + // 请求 + body, err := app.request(params) + // 定义 + var response TbkDgNewuserOrderGetResponse + err = json.Unmarshal(body, &response) + return NewTbkDgNewuserOrderGetResult(response, body, err) +} diff --git a/service/taobao/taobao.tbk.order.details.get.go b/service/taobao/taobao.tbk.order.details.get.go new file mode 100644 index 00000000..c43471c4 --- /dev/null +++ b/service/taobao/taobao.tbk.order.details.get.go @@ -0,0 +1,90 @@ +package taobao + +import "encoding/json" + +type TbkOrderDetailsGetResponse struct { + TbkOrderDetailsGetResponse struct { + Data struct { + HasNext bool `json:"has_next"` + HasPre bool `json:"has_pre"` + PageNo int `json:"page_no"` + PageSize int `json:"page_size"` + PositionIndex string `json:"position_index"` + Results struct { + PublisherOrderDto []struct { + AdzoneId int64 `json:"adzone_id"` + AdzoneName string `json:"adzone_name"` + AlimamaRate string `json:"alimama_rate"` + AlimamaShareFee string `json:"alimama_share_fee"` + AlipayTotalPrice string `json:"alipay_total_price"` + ClickTime string `json:"click_time"` + DepositPrice string `json:"deposit_price"` + FlowSource string `json:"flow_source"` + IncomeRate string `json:"income_rate"` + IsLx string `json:"is_lx"` + ItemCategoryName string `json:"item_category_name"` + ItemImg string `json:"item_img"` + ItemNum int `json:"item_num"` + ItemTitle string `json:"item_title"` + MarketingType string `json:"marketing_type"` + ModifiedTime string `json:"modified_time"` + OrderType string `json:"order_type"` + PayPrice string `json:"pay_price"` + PubId int `json:"pub_id"` + PubShareFee string `json:"pub_share_fee"` + PubSharePreFee string `json:"pub_share_pre_fee"` + PubShareRate string `json:"pub_share_rate"` + RefundTag int `json:"refund_tag"` + SellerNick string `json:"seller_nick"` + SellerShopTitle string `json:"seller_shop_title"` + SiteId int `json:"site_id"` + SiteName string `json:"site_name"` + SubsidyFee string `json:"subsidy_fee"` + SubsidyRate string `json:"subsidy_rate"` + SubsidyType string `json:"subsidy_type"` + TbDepositTime string `json:"tb_deposit_time"` + TbPaidTime string `json:"tb_paid_time"` + TerminalType string `json:"terminal_type"` + TkCommissionFeeForMediaPlatform string `json:"tk_commission_fee_for_media_platform"` + TkCommissionPreFeeForMediaPlatform string `json:"tk_commission_pre_fee_for_media_platform"` + TkCommissionRateForMediaPlatform string `json:"tk_commission_rate_for_media_platform"` + TkCreateTime string `json:"tk_create_time"` + TkDepositTime string `json:"tk_deposit_time"` + TkEarningTime string `json:"tk_earning_time"` + TkOrderRole int `json:"tk_order_role"` + TkPaidTime string `json:"tk_paid_time"` + TkStatus int `json:"tk_status"` + TkTotalRate string `json:"tk_total_rate"` + TotalCommissionFee string `json:"total_commission_fee"` + TotalCommissionRate string `json:"total_commission_rate"` + TradeId string `json:"trade_id"` + TradeParentId string `json:"trade_parent_id"` + } `json:"publisher_order_dto"` + } `json:"results"` + } `json:"data"` + RequestId string `json:"request_id"` + } `json:"tbk_order_details_get_response"` +} + +type TbkOrderDetailsGetResult struct { + Result TbkOrderDetailsGetResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewTbkOrderDetailsGetResult(result TbkOrderDetailsGetResponse, body []byte, err error) *TbkOrderDetailsGetResult { + return &TbkOrderDetailsGetResult{Result: result, Body: body, Err: err} +} + +// TbkOrderDetailsGet 淘宝客-推广者-所有订单查询 +// https://open.taobao.com/api.htm?docId=43328&docType=2&scopeId=16175 +func (app *App) TbkOrderDetailsGet(notMustParams ...Params) *TbkOrderDetailsGetResult { + // 参数 + params := NewParamsWithType("taobao.tbk.order.details.get", notMustParams...) + // 请求 + body, err := app.request(params) + // 定义 + var response TbkOrderDetailsGetResponse + err = json.Unmarshal(body, &response) + return NewTbkOrderDetailsGetResult(response, body, err) +} diff --git a/service/taobao/tbk.activity.info.get.go b/service/taobao/tbk.activity.info.get.go index 3c973cde..385f93c2 100644 --- a/service/taobao/tbk.activity.info.get.go +++ b/service/taobao/tbk.activity.info.get.go @@ -33,6 +33,7 @@ func NewTbkActivityInfoGetResult(result TbkActivityInfoGetResponse, body []byte, func (app *App) TbkActivityInfoGet(notMustParams ...Params) *TbkActivityInfoGetResult { // 参数 params := NewParamsWithType("taobao.tbk.activity.info.get", notMustParams...) + params.Set("adzone_id", app.AdzoneId) // 请求 body, err := app.request(params) // 定义 diff --git a/service/taobao/tbk.coupon.get.go b/service/taobao/tbk.coupon.get.go new file mode 100644 index 00000000..420ec018 --- /dev/null +++ b/service/taobao/tbk.coupon.get.go @@ -0,0 +1,66 @@ +package taobao + +import "encoding/json" + +type TbkCouponGetResponse struct { + TbkCouponGetResponse struct { + Results struct { + NTbkItem []struct { + CatLeafName string `json:"cat_leaf_name"` + CatName string `json:"cat_name"` + FreeShipment bool `json:"free_shipment"` + HotFlag string `json:"hot_flag"` + ItemUrl string `json:"item_url"` + JuOnlineEnd string `json:"ju_online_end"` + JuOnlineStartTime string `json:"ju_online_start_time"` + JuPreShowEndTime string `json:"ju_pre_show_end_time"` + JuPreShowStartTime string `json:"ju_pre_show_start_time"` + MaterialLibType string `json:"material_lib_type"` + Nick string `json:"nick"` + NumIid int64 `json:"num_iid"` + PictUrl string `json:"pict_url"` + PresaleDeposit string `json:"presale_deposit"` + PresaleEndTime int `json:"presale_end_time"` + PresaleStartTime int `json:"presale_start_time"` + PresaleTailEndTime int `json:"presale_tail_end_time"` + PresaleTailStartTime int `json:"presale_tail_start_time"` + Provcity string `json:"provcity"` + ReservePrice string `json:"reserve_price"` + SellerId int64 `json:"seller_id"` + SmallImages struct { + String []string `json:"string"` + } `json:"small_images"` + SuperiorBrand string `json:"superior_brand"` + Title string `json:"title"` + TmallPllPlayActivityStartTime int `json:"tmall_pll_play_activity_start_time"` + UserType int `json:"user_type"` + Volume int64 `json:"volume"` + ZkFinalPrice string `json:"zk_final_price"` + } `json:"n_tbk_item"` + } `json:"results"` + RequestId string `json:"request_id"` + } `json:"tbk_item_info_get_response"` +} + +type TbkCouponGetResult struct { + Result TbkCouponGetResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewTbkCouponGetResult(result TbkCouponGetResponse, body []byte, err error) *TbkCouponGetResult { + return &TbkCouponGetResult{Result: result, Body: body, Err: err} +} + +// TbkCouponGet 淘宝客-公用-阿里妈妈推广券详情查询 +// https://open.taobao.com/api.htm?docId=31106&docType=2 +func (app *App) TbkCouponGet(notMustParams ...Params) *TbkCouponGetResult { + // 参数 + params := NewParamsWithType("taobao.tbk.coupon.get", notMustParams...) + // 请求 + body, err := app.request(params) + // 定义 + var response TbkCouponGetResponse + err = json.Unmarshal(body, &response) + return NewTbkCouponGetResult(response, body, err) +} diff --git a/service/taobao/tbk.dg.material.optional.go b/service/taobao/tbk.dg.material.optional.go index 980d9f8d..b898e7c0 100644 --- a/service/taobao/tbk.dg.material.optional.go +++ b/service/taobao/tbk.dg.material.optional.go @@ -56,7 +56,7 @@ type TbkDgMaterialOptionalResponse struct { CouponAmount string `json:"coupon_amount"` } `json:"map_data"` } `json:"result_list"` - TotalResults int `json:"total_results"` + TotalResults int64 `json:"total_results"` RequestId string `json:"request_id"` } `json:"tbk_dg_material_optional_response"` } @@ -76,6 +76,7 @@ func NewTbkDgMaterialOptionalResult(result TbkDgMaterialOptionalResponse, body [ func (app *App) TbkDgMaterialOptional(notMustParams ...Params) *TbkDgMaterialOptionalResult { // 参数 params := NewParamsWithType("taobao.tbk.dg.material.optional", notMustParams...) + params.Set("adzone_id", app.AdzoneId) // 请求 body, err := app.request(params) // 定义 diff --git a/service/taobao/tbk.dg.optimus.material.go b/service/taobao/tbk.dg.optimus.material.go index 52eaac0f..3c244c78 100644 --- a/service/taobao/tbk.dg.optimus.material.go +++ b/service/taobao/tbk.dg.optimus.material.go @@ -60,6 +60,7 @@ func NewTbkDgOptimusMaterialResult(result TbkDgOptimusMaterialResponse, body []b func (app *App) TbkDgOptimusMaterial(notMustParams ...Params) *TbkDgOptimusMaterialResult { // 参数 params := NewParamsWithType("taobao.tbk.dg.optimus.material", notMustParams...) + params.Set("adzone_id", app.AdzoneId) // 请求 body, err := app.request(params) // 定义 diff --git a/service/taobao/tbk.shop.get.go b/service/taobao/tbk.shop.get.go new file mode 100644 index 00000000..a7e8c197 --- /dev/null +++ b/service/taobao/tbk.shop.get.go @@ -0,0 +1,43 @@ +package taobao + +import "encoding/json" + +type TbkShopGetResponse struct { + TbkShopGetResponse struct { + Results struct { + NTbkShop []struct { + PictUrl string `json:"pict_url"` + SellerNick string `json:"seller_nick"` + ShopTitle string `json:"shop_title"` + ShopType string `json:"shop_type"` + ShopUrl string `json:"shop_url"` + UserId int64 `json:"user_id"` + } `json:"n_tbk_shop"` + } `json:"results"` + TotalResults int `json:"total_results"` + RequestId string `json:"request_id"` + } `json:"tbk_shop_get_response"` +} + +type TbkShopGetResult struct { + Result TbkShopGetResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewTbkShopGetResult(result TbkShopGetResponse, body []byte, err error) *TbkShopGetResult { + return &TbkShopGetResult{Result: result, Body: body, Err: err} +} + +// TbkShopGet 淘宝客-推广者-店铺搜索 +// https://open.taobao.com/api.htm?docId=24521&docType=2 +func (app *App) TbkShopGet(notMustParams ...Params) *TbkShopGetResult { + // 参数 + params := NewParamsWithType("taobao.tbk.shop.get", notMustParams...) + // 请求 + body, err := app.request(params) + // 定义 + var response TbkShopGetResponse + err = json.Unmarshal(body, &response) + return NewTbkShopGetResult(response, body, err) +} diff --git a/service/taobao/tbk.shop.recommend.get.go b/service/taobao/tbk.shop.recommend.get.go new file mode 100644 index 00000000..25f0c833 --- /dev/null +++ b/service/taobao/tbk.shop.recommend.get.go @@ -0,0 +1,41 @@ +package taobao + +import "encoding/json" + +type TbkShopRecommendGetResponse struct { + TbkShopRecommendGetResponse struct { + Results struct { + NTbkShop []struct { + UserId int `json:"user_id"` + ShopTitle string `json:"shop_title"` + ShopType string `json:"shop_type"` + SellerNick string `json:"seller_nick"` + PictUrl string `json:"pict_url"` + ShopUrl string `json:"shop_url"` + } `json:"n_tbk_shop"` + } `json:"results"` + } `json:"tbk_shop_recommend_get_response"` +} + +type TbkShopRecommendGetResult struct { + Result TbkShopRecommendGetResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewTbkShopRecommendGetResult(result TbkShopRecommendGetResponse, body []byte, err error) *TbkShopRecommendGetResult { + return &TbkShopRecommendGetResult{Result: result, Body: body, Err: err} +} + +// TbkShopRecommendGet 淘宝客-公用-店铺关联推荐 +// https://open.taobao.com/api.htm?docId=24522&docType=2 +func (app *App) TbkShopRecommendGet(notMustParams ...Params) *TbkShopRecommendGetResult { + // 参数 + params := NewParamsWithType("taobao.tbk.shop.recommend.get", notMustParams...) + // 请求 + body, err := app.request(params) + // 定义 + var response TbkShopRecommendGetResponse + err = json.Unmarshal(body, &response) + return NewTbkShopRecommendGetResult(response, body, err) +} diff --git a/service/tianyancha/app.go b/service/tianyancha/app.go index ce61462e..50fa9145 100644 --- a/service/tianyancha/app.go +++ b/service/tianyancha/app.go @@ -1,8 +1,8 @@ package tianyancha import ( + "dtapps/dta/library/utils/gohttp" "encoding/json" - "github.com/dtapps/go-library/utils/gohttp" "net/http" ) diff --git a/service/tianyancha/go.mod b/service/tianyancha/go.mod deleted file mode 100644 index d9a23d84..00000000 --- a/service/tianyancha/go.mod +++ /dev/null @@ -1,10 +0,0 @@ -module github.com/dtapps/go-library/service/tianyancha - -go 1.18 - -require github.com/dtapps/go-library/utils/gohttp v0.0.0-20220320064127-7d7f1f882cd8 - -require ( - github.com/dtapps/go-library/utils/goheader v0.0.0-20220320040709-ad8a5f0e9e40 // indirect - github.com/dtapps/go-library/utils/gorequest v0.0.0-20220320040709-ad8a5f0e9e40 // indirect -) diff --git a/service/topsdk/ability1826/Ability1826.go b/service/topsdk/ability1826/Ability1826.go new file mode 100644 index 00000000..844a0872 --- /dev/null +++ b/service/topsdk/ability1826/Ability1826.go @@ -0,0 +1,98 @@ +package ability1826 + +import ( + "errors" + "log" + "topsdk" + "topsdk/ability1826/request" + "topsdk/ability1826/response" + "topsdk/util" +) + +type Ability1826 struct { + Client *topsdk.TopClient +} + +func NewAbility1826(client *topsdk.TopClient) *Ability1826 { + return &Ability1826{client} +} + +/* + 淘宝客-推广者-淘礼金发放及使用报表(将停用,按描述说明换新API) +*/ +func (ability *Ability1826) TaobaoTbkDgVegasTljInstanceReport(req *request.TaobaoTbkDgVegasTljInstanceReportRequest) (*response.TaobaoTbkDgVegasTljInstanceReportResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability1826 topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.tbk.dg.vegas.tlj.instance.report", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoTbkDgVegasTljInstanceReportResponse{} + if err != nil { + log.Fatal("taobaoTbkDgVegasTljInstanceReport error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} + +/* + 淘宝客-推广者-淘礼金暂停发放 +*/ +func (ability *Ability1826) TaobaoTbkDgVegasTljStop(req *request.TaobaoTbkDgVegasTljStopRequest) (*response.TaobaoTbkDgVegasTljStopResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability1826 topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.tbk.dg.vegas.tlj.stop", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoTbkDgVegasTljStopResponse{} + if err != nil { + log.Fatal("taobaoTbkDgVegasTljStop error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} + +/* + 淘宝客-推广者-淘礼金创建 +*/ +func (ability *Ability1826) TaobaoTbkDgVegasTljCreate(req *request.TaobaoTbkDgVegasTljCreateRequest) (*response.TaobaoTbkDgVegasTljCreateResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability1826 topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.tbk.dg.vegas.tlj.create", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoTbkDgVegasTljCreateResponse{} + if err != nil { + log.Fatal("taobaoTbkDgVegasTljCreate error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} + +/* + 淘宝客-推广者-淘礼金效果数据 +*/ +func (ability *Ability1826) TaobaoTbkDgVegasTljReport(req *request.TaobaoTbkDgVegasTljReportRequest) (*response.TaobaoTbkDgVegasTljReportResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability1826 topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.tbk.dg.vegas.tlj.report", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoTbkDgVegasTljReportResponse{} + if err != nil { + log.Fatal("taobaoTbkDgVegasTljReport error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} diff --git a/service/topsdk/ability1826/domain/TaobaoTbkDgVegasTljCreateResult.go b/service/topsdk/ability1826/domain/TaobaoTbkDgVegasTljCreateResult.go new file mode 100644 index 00000000..b83e67e7 --- /dev/null +++ b/service/topsdk/ability1826/domain/TaobaoTbkDgVegasTljCreateResult.go @@ -0,0 +1,36 @@ +package domain + +type TaobaoTbkDgVegasTljCreateResult struct { + /* + model */ + Model *TaobaoTbkDgVegasTljCreateRightsInstanceCreateResult `json:"model,omitempty" ` + + /* + msgCode */ + MsgCode *string `json:"msg_code,omitempty" ` + + /* + msgInfo */ + MsgInfo *string `json:"msg_info,omitempty" ` + + /* + success */ + Success *bool `json:"success,omitempty" ` +} + +func (s *TaobaoTbkDgVegasTljCreateResult) SetModel(v TaobaoTbkDgVegasTljCreateRightsInstanceCreateResult) *TaobaoTbkDgVegasTljCreateResult { + s.Model = &v + return s +} +func (s *TaobaoTbkDgVegasTljCreateResult) SetMsgCode(v string) *TaobaoTbkDgVegasTljCreateResult { + s.MsgCode = &v + return s +} +func (s *TaobaoTbkDgVegasTljCreateResult) SetMsgInfo(v string) *TaobaoTbkDgVegasTljCreateResult { + s.MsgInfo = &v + return s +} +func (s *TaobaoTbkDgVegasTljCreateResult) SetSuccess(v bool) *TaobaoTbkDgVegasTljCreateResult { + s.Success = &v + return s +} diff --git a/service/topsdk/ability1826/domain/TaobaoTbkDgVegasTljCreateRightsInstanceCreateResult.go b/service/topsdk/ability1826/domain/TaobaoTbkDgVegasTljCreateRightsInstanceCreateResult.go new file mode 100644 index 00000000..ef543e0a --- /dev/null +++ b/service/topsdk/ability1826/domain/TaobaoTbkDgVegasTljCreateRightsInstanceCreateResult.go @@ -0,0 +1,44 @@ +package domain + +type TaobaoTbkDgVegasTljCreateRightsInstanceCreateResult struct { + /* + 淘礼金Id */ + RightsId *string `json:"rights_id,omitempty" ` + + /* + 淘礼金领取Url */ + SendUrl *string `json:"send_url,omitempty" ` + + /* + 投放code【百川商品详情页业务专用】 */ + VegasCode *string `json:"vegas_code,omitempty" ` + + /* + 创建完成后资金账户可用资金,单位元,保留2位小数 */ + AvailableFee *string `json:"available_fee,omitempty" ` + + /* + 媒体针对此商品今日剩余可领取淘礼金数量 */ + ItemTodayNumLeft *int64 `json:"item_today_num_left,omitempty" ` +} + +func (s *TaobaoTbkDgVegasTljCreateRightsInstanceCreateResult) SetRightsId(v string) *TaobaoTbkDgVegasTljCreateRightsInstanceCreateResult { + s.RightsId = &v + return s +} +func (s *TaobaoTbkDgVegasTljCreateRightsInstanceCreateResult) SetSendUrl(v string) *TaobaoTbkDgVegasTljCreateRightsInstanceCreateResult { + s.SendUrl = &v + return s +} +func (s *TaobaoTbkDgVegasTljCreateRightsInstanceCreateResult) SetVegasCode(v string) *TaobaoTbkDgVegasTljCreateRightsInstanceCreateResult { + s.VegasCode = &v + return s +} +func (s *TaobaoTbkDgVegasTljCreateRightsInstanceCreateResult) SetAvailableFee(v string) *TaobaoTbkDgVegasTljCreateRightsInstanceCreateResult { + s.AvailableFee = &v + return s +} +func (s *TaobaoTbkDgVegasTljCreateRightsInstanceCreateResult) SetItemTodayNumLeft(v int64) *TaobaoTbkDgVegasTljCreateRightsInstanceCreateResult { + s.ItemTodayNumLeft = &v + return s +} diff --git a/service/topsdk/ability1826/domain/TaobaoTbkDgVegasTljInstanceReportResult.go b/service/topsdk/ability1826/domain/TaobaoTbkDgVegasTljInstanceReportResult.go new file mode 100644 index 00000000..0bfbada3 --- /dev/null +++ b/service/topsdk/ability1826/domain/TaobaoTbkDgVegasTljInstanceReportResult.go @@ -0,0 +1,36 @@ +package domain + +type TaobaoTbkDgVegasTljInstanceReportResult struct { + /* + model */ + Model *TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto `json:"model,omitempty" ` + + /* + msgCode */ + MsgCode *string `json:"msg_code,omitempty" ` + + /* + msgInfo */ + MsgInfo *string `json:"msg_info,omitempty" ` + + /* + 是否成功 */ + Success *bool `json:"success,omitempty" ` +} + +func (s *TaobaoTbkDgVegasTljInstanceReportResult) SetModel(v TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto) *TaobaoTbkDgVegasTljInstanceReportResult { + s.Model = &v + return s +} +func (s *TaobaoTbkDgVegasTljInstanceReportResult) SetMsgCode(v string) *TaobaoTbkDgVegasTljInstanceReportResult { + s.MsgCode = &v + return s +} +func (s *TaobaoTbkDgVegasTljInstanceReportResult) SetMsgInfo(v string) *TaobaoTbkDgVegasTljInstanceReportResult { + s.MsgInfo = &v + return s +} +func (s *TaobaoTbkDgVegasTljInstanceReportResult) SetSuccess(v bool) *TaobaoTbkDgVegasTljInstanceReportResult { + s.Success = &v + return s +} diff --git a/service/topsdk/ability1826/domain/TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto.go b/service/topsdk/ability1826/domain/TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto.go new file mode 100644 index 00000000..b21a2297 --- /dev/null +++ b/service/topsdk/ability1826/domain/TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto.go @@ -0,0 +1,100 @@ +package domain + +type TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto struct { + /* + 解冻金额 */ + UnfreezeAmount *string `json:"unfreeze_amount,omitempty" ` + + /* + 解冻红包个数 */ + UnfreezeNum *int64 `json:"unfreeze_num,omitempty" ` + + /* + 失效回退金额 */ + RefundAmount *string `json:"refund_amount,omitempty" ` + + /* + 失效回退红包个数 */ + RefundNum *int64 `json:"refund_num,omitempty" ` + + /* + 引导预估佣金金额 */ + PreCommissionAmount *string `json:"pre_commission_amount,omitempty" ` + + /* + 引导成交金额 */ + AlipayAmount *string `json:"alipay_amount,omitempty" ` + + /* + 红包核销金额 */ + UseAmount *string `json:"use_amount,omitempty" ` + + /* + 红包核销个数 */ + UseNum *int64 `json:"use_num,omitempty" ` + + /* + 红包领取金额 */ + WinAmount *string `json:"win_amount,omitempty" ` + + /* + 红包领取个数 */ + WinNum *int64 `json:"win_num,omitempty" ` + + /* + 退款红包金额 */ + FpRefundAmount *string `json:"fp_refund_amount,omitempty" ` + + /* + 退款红包个数 */ + FpRefundNum *int64 `json:"fp_refund_num,omitempty" ` +} + +func (s *TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto) SetUnfreezeAmount(v string) *TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto { + s.UnfreezeAmount = &v + return s +} +func (s *TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto) SetUnfreezeNum(v int64) *TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto { + s.UnfreezeNum = &v + return s +} +func (s *TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto) SetRefundAmount(v string) *TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto { + s.RefundAmount = &v + return s +} +func (s *TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto) SetRefundNum(v int64) *TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto { + s.RefundNum = &v + return s +} +func (s *TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto) SetPreCommissionAmount(v string) *TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto { + s.PreCommissionAmount = &v + return s +} +func (s *TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto) SetAlipayAmount(v string) *TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto { + s.AlipayAmount = &v + return s +} +func (s *TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto) SetUseAmount(v string) *TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto { + s.UseAmount = &v + return s +} +func (s *TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto) SetUseNum(v int64) *TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto { + s.UseNum = &v + return s +} +func (s *TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto) SetWinAmount(v string) *TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto { + s.WinAmount = &v + return s +} +func (s *TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto) SetWinNum(v int64) *TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto { + s.WinNum = &v + return s +} +func (s *TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto) SetFpRefundAmount(v string) *TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto { + s.FpRefundAmount = &v + return s +} +func (s *TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto) SetFpRefundNum(v int64) *TaobaoTbkDgVegasTljInstanceReportTljInstanceReportDto { + s.FpRefundNum = &v + return s +} diff --git a/service/topsdk/ability1826/domain/TaobaoTbkDgVegasTljReportExtra.go b/service/topsdk/ability1826/domain/TaobaoTbkDgVegasTljReportExtra.go new file mode 100644 index 00000000..e6825ae9 --- /dev/null +++ b/service/topsdk/ability1826/domain/TaobaoTbkDgVegasTljReportExtra.go @@ -0,0 +1,116 @@ +package domain + +type TaobaoTbkDgVegasTljReportExtra struct { + /* + 领取率,领取淘礼金个数/创建淘礼金个数 */ + GetRate *string `json:"get_rate,omitempty" ` + + /* + 使用率,使用淘礼金个数/领取淘礼金个数 */ + UseRate *string `json:"use_rate,omitempty" ` + + /* + 引导付款笔数,同一个红包,若因消费者付款使用后取消订单或退货退款,产生二次红包使用行为,引导付款笔数也会记录两单 */ + AlipayNum *int64 `json:"alipay_num,omitempty" ` + + /* + 引导付款金额,同一个红包,若因消费者付款使用后取消订单或退货退款,产生二次红包使用行为,引导付款笔数也会记录两单 */ + AlipayAmt *string `json:"alipay_amt,omitempty" ` + + /* + 付款佣金,下单付款,产生二次红包使用行为,会记录2次 */ + PrePubShareFeeForDisp *string `json:"pre_pub_share_fee_for_disp,omitempty" ` + + /* + 结算佣金,确认收货,产生二次红包使用行为,会记录2次 */ + CmSettleAmt *string `json:"cm_settle_amt,omitempty" ` + + /* + 领取淘礼金个数 */ + WinPv *int64 `json:"win_pv,omitempty" ` + + /* + 领取淘礼金金额 */ + WinSumAmt *string `json:"win_sum_amt,omitempty" ` + + /* + 未领取淘礼金个数,过了领取有效期或者暂停后没有被领取的红包个数 */ + RemainingNum *int64 `json:"remaining_num,omitempty" ` + + /* + 未领取金额,过了领取有效期或者暂停后没有被领取的红包金额 */ + RemainingAmt *string `json:"remaining_amt,omitempty" ` + + /* + 使用淘礼金个数,同一个红包,若因消费者付款使用后取消订单或退货退款,产生二次红包使用行为,使用淘礼金个数一天内会去重,所以相当于不会重记 */ + UseNum *int64 `json:"use_num,omitempty" ` + + /* + 使用淘礼金金额,若红包被重复使用(1)淘礼金红包被拆分,并且产生部分退款,会保留部分退款的订单淘礼金金额;若全部退款,会保留订单全部淘礼金金额),因此,已使用金额可能大于消费者实际使用金额(使用红包后,若产生红包退回后再次使用,已使用金额会被二次计算,已使用数量不会) */ + UseSumAmt *string `json:"use_sum_amt,omitempty" ` + + /* + 退款淘礼金个数,红包使用后,由于订单取消,退货退款等行为带来的淘礼金红包退回数量,退款红包数量单日内不重复计算,跨天重复计算 */ + RefundNum *int64 `json:"refund_num,omitempty" ` + + /* + 退款淘礼金金额,红包使用后,由于订单取消,退货退款等行为行为带来的淘礼金红包退回数量 (退款红包若产生多次使用,退款红包金额会被多次计算,退款红包数量单日内不重复计算,跨天重复计算) */ + RefundSumAmt *string `json:"refund_sum_amt,omitempty" ` +} + +func (s *TaobaoTbkDgVegasTljReportExtra) SetGetRate(v string) *TaobaoTbkDgVegasTljReportExtra { + s.GetRate = &v + return s +} +func (s *TaobaoTbkDgVegasTljReportExtra) SetUseRate(v string) *TaobaoTbkDgVegasTljReportExtra { + s.UseRate = &v + return s +} +func (s *TaobaoTbkDgVegasTljReportExtra) SetAlipayNum(v int64) *TaobaoTbkDgVegasTljReportExtra { + s.AlipayNum = &v + return s +} +func (s *TaobaoTbkDgVegasTljReportExtra) SetAlipayAmt(v string) *TaobaoTbkDgVegasTljReportExtra { + s.AlipayAmt = &v + return s +} +func (s *TaobaoTbkDgVegasTljReportExtra) SetPrePubShareFeeForDisp(v string) *TaobaoTbkDgVegasTljReportExtra { + s.PrePubShareFeeForDisp = &v + return s +} +func (s *TaobaoTbkDgVegasTljReportExtra) SetCmSettleAmt(v string) *TaobaoTbkDgVegasTljReportExtra { + s.CmSettleAmt = &v + return s +} +func (s *TaobaoTbkDgVegasTljReportExtra) SetWinPv(v int64) *TaobaoTbkDgVegasTljReportExtra { + s.WinPv = &v + return s +} +func (s *TaobaoTbkDgVegasTljReportExtra) SetWinSumAmt(v string) *TaobaoTbkDgVegasTljReportExtra { + s.WinSumAmt = &v + return s +} +func (s *TaobaoTbkDgVegasTljReportExtra) SetRemainingNum(v int64) *TaobaoTbkDgVegasTljReportExtra { + s.RemainingNum = &v + return s +} +func (s *TaobaoTbkDgVegasTljReportExtra) SetRemainingAmt(v string) *TaobaoTbkDgVegasTljReportExtra { + s.RemainingAmt = &v + return s +} +func (s *TaobaoTbkDgVegasTljReportExtra) SetUseNum(v int64) *TaobaoTbkDgVegasTljReportExtra { + s.UseNum = &v + return s +} +func (s *TaobaoTbkDgVegasTljReportExtra) SetUseSumAmt(v string) *TaobaoTbkDgVegasTljReportExtra { + s.UseSumAmt = &v + return s +} +func (s *TaobaoTbkDgVegasTljReportExtra) SetRefundNum(v int64) *TaobaoTbkDgVegasTljReportExtra { + s.RefundNum = &v + return s +} +func (s *TaobaoTbkDgVegasTljReportExtra) SetRefundSumAmt(v string) *TaobaoTbkDgVegasTljReportExtra { + s.RefundSumAmt = &v + return s +} diff --git a/service/topsdk/ability1826/domain/TaobaoTbkDgVegasTljReportInstanceDTO.go b/service/topsdk/ability1826/domain/TaobaoTbkDgVegasTljReportInstanceDTO.go new file mode 100644 index 00000000..20784066 --- /dev/null +++ b/service/topsdk/ability1826/domain/TaobaoTbkDgVegasTljReportInstanceDTO.go @@ -0,0 +1,12 @@ +package domain + +type TaobaoTbkDgVegasTljReportInstanceDTO struct { + /* + extra */ + Extra *TaobaoTbkDgVegasTljReportExtra `json:"extra,omitempty" ` +} + +func (s *TaobaoTbkDgVegasTljReportInstanceDTO) SetExtra(v TaobaoTbkDgVegasTljReportExtra) *TaobaoTbkDgVegasTljReportInstanceDTO { + s.Extra = &v + return s +} diff --git a/service/topsdk/ability1826/domain/TaobaoTbkDgVegasTljStopUpdateStatusResult.go b/service/topsdk/ability1826/domain/TaobaoTbkDgVegasTljStopUpdateStatusResult.go new file mode 100644 index 00000000..ccfc2dbd --- /dev/null +++ b/service/topsdk/ability1826/domain/TaobaoTbkDgVegasTljStopUpdateStatusResult.go @@ -0,0 +1,12 @@ +package domain + +type TaobaoTbkDgVegasTljStopUpdateStatusResult struct { + /* + 暂停成功 */ + UpdateSuccess *bool `json:"update_success,omitempty" ` +} + +func (s *TaobaoTbkDgVegasTljStopUpdateStatusResult) SetUpdateSuccess(v bool) *TaobaoTbkDgVegasTljStopUpdateStatusResult { + s.UpdateSuccess = &v + return s +} diff --git a/service/topsdk/ability1826/request/TaobaoTbkDgVegasTljCreateRequest.go b/service/topsdk/ability1826/request/TaobaoTbkDgVegasTljCreateRequest.go new file mode 100644 index 00000000..9f44181e --- /dev/null +++ b/service/topsdk/ability1826/request/TaobaoTbkDgVegasTljCreateRequest.go @@ -0,0 +1,159 @@ +package request + +import ( + "topsdk/util" +) + +type TaobaoTbkDgVegasTljCreateRequest struct { + /* + 妈妈广告位Id */ + AdzoneId *int64 `json:"adzone_id" required:"true" ` + /* + 必须传入0 */ + SecurityLevel *int64 `json:"security_level,omitempty" required:"false" ` + /* + 使用开始日期。相对时间,无需填写,以用户领取时间作为使用开始时间。绝对时间,格式 yyyy-MM-dd,例如,2019-01-29,表示从2019-01-29 00:00:00 开始 */ + UseStartTime *string `json:"use_start_time,omitempty" required:"false" ` + /* + 结束日期的模式,1:相对时间,2:绝对时间 */ + UseEndTimeMode *int64 `json:"use_end_time_mode,omitempty" required:"false" ` + /* + 使用结束日期。如果是结束时间模式为相对时间,时间格式为1-7直接的整数, 例如,1(相对领取时间1天); 如果是绝对时间,格式为yyyy-MM-dd,例如,2019-01-29,表示到2019-01-29 23:59:59结束 */ + UseEndTime *string `json:"use_end_time,omitempty" required:"false" ` + /* + 发放截止时间 */ + SendEndTime *util.LocalTime `json:"send_end_time,omitempty" required:"false" ` + /* + 发放开始时间 */ + SendStartTime *util.LocalTime `json:"send_start_time" required:"true" ` + /* + 单个淘礼金面额,支持两位小数,单位元 */ + PerFace *string `json:"per_face" required:"true" ` + /* + 必须设置为true,默认开启安全 */ + SecuritySwitch *bool `json:"security_switch" required:"true" ` + /* + 单用户累计中奖次数上限 */ + UserTotalWinNumLimit *int64 `json:"user_total_win_num_limit" required:"true" ` + /* + 淘礼金名称,最大10个字符 */ + Name *string `json:"name" required:"true" ` + /* + 淘礼金总个数 */ + TotalNum *int64 `json:"total_num" required:"true" ` + /* + 宝贝ID */ + ItemId *int64 `json:"item_id" required:"true" ` + /* + CPS佣金类型 defalutValue��MKT */ + CampaignType *string `json:"campaign_type,omitempty" required:"false" ` +} + +func (s *TaobaoTbkDgVegasTljCreateRequest) SetAdzoneId(v int64) *TaobaoTbkDgVegasTljCreateRequest { + s.AdzoneId = &v + return s +} +func (s *TaobaoTbkDgVegasTljCreateRequest) SetSecurityLevel(v int64) *TaobaoTbkDgVegasTljCreateRequest { + s.SecurityLevel = &v + return s +} +func (s *TaobaoTbkDgVegasTljCreateRequest) SetUseStartTime(v string) *TaobaoTbkDgVegasTljCreateRequest { + s.UseStartTime = &v + return s +} +func (s *TaobaoTbkDgVegasTljCreateRequest) SetUseEndTimeMode(v int64) *TaobaoTbkDgVegasTljCreateRequest { + s.UseEndTimeMode = &v + return s +} +func (s *TaobaoTbkDgVegasTljCreateRequest) SetUseEndTime(v string) *TaobaoTbkDgVegasTljCreateRequest { + s.UseEndTime = &v + return s +} +func (s *TaobaoTbkDgVegasTljCreateRequest) SetSendEndTime(v util.LocalTime) *TaobaoTbkDgVegasTljCreateRequest { + s.SendEndTime = &v + return s +} +func (s *TaobaoTbkDgVegasTljCreateRequest) SetSendStartTime(v util.LocalTime) *TaobaoTbkDgVegasTljCreateRequest { + s.SendStartTime = &v + return s +} +func (s *TaobaoTbkDgVegasTljCreateRequest) SetPerFace(v string) *TaobaoTbkDgVegasTljCreateRequest { + s.PerFace = &v + return s +} +func (s *TaobaoTbkDgVegasTljCreateRequest) SetSecuritySwitch(v bool) *TaobaoTbkDgVegasTljCreateRequest { + s.SecuritySwitch = &v + return s +} +func (s *TaobaoTbkDgVegasTljCreateRequest) SetUserTotalWinNumLimit(v int64) *TaobaoTbkDgVegasTljCreateRequest { + s.UserTotalWinNumLimit = &v + return s +} +func (s *TaobaoTbkDgVegasTljCreateRequest) SetName(v string) *TaobaoTbkDgVegasTljCreateRequest { + s.Name = &v + return s +} +func (s *TaobaoTbkDgVegasTljCreateRequest) SetTotalNum(v int64) *TaobaoTbkDgVegasTljCreateRequest { + s.TotalNum = &v + return s +} +func (s *TaobaoTbkDgVegasTljCreateRequest) SetItemId(v int64) *TaobaoTbkDgVegasTljCreateRequest { + s.ItemId = &v + return s +} +func (s *TaobaoTbkDgVegasTljCreateRequest) SetCampaignType(v string) *TaobaoTbkDgVegasTljCreateRequest { + s.CampaignType = &v + return s +} + +func (req *TaobaoTbkDgVegasTljCreateRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.AdzoneId != nil { + paramMap["adzone_id"] = *req.AdzoneId + } + if req.SecurityLevel != nil { + paramMap["security_level"] = *req.SecurityLevel + } + if req.UseStartTime != nil { + paramMap["use_start_time"] = *req.UseStartTime + } + if req.UseEndTimeMode != nil { + paramMap["use_end_time_mode"] = *req.UseEndTimeMode + } + if req.UseEndTime != nil { + paramMap["use_end_time"] = *req.UseEndTime + } + if req.SendEndTime != nil { + paramMap["send_end_time"] = *req.SendEndTime + } + if req.SendStartTime != nil { + paramMap["send_start_time"] = *req.SendStartTime + } + if req.PerFace != nil { + paramMap["per_face"] = *req.PerFace + } + if req.SecuritySwitch != nil { + paramMap["security_switch"] = *req.SecuritySwitch + } + if req.UserTotalWinNumLimit != nil { + paramMap["user_total_win_num_limit"] = *req.UserTotalWinNumLimit + } + if req.Name != nil { + paramMap["name"] = *req.Name + } + if req.TotalNum != nil { + paramMap["total_num"] = *req.TotalNum + } + if req.ItemId != nil { + paramMap["item_id"] = *req.ItemId + } + if req.CampaignType != nil { + paramMap["campaign_type"] = *req.CampaignType + } + return paramMap +} + +func (req *TaobaoTbkDgVegasTljCreateRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability1826/request/TaobaoTbkDgVegasTljInstanceReportRequest.go b/service/topsdk/ability1826/request/TaobaoTbkDgVegasTljInstanceReportRequest.go new file mode 100644 index 00000000..392c8196 --- /dev/null +++ b/service/topsdk/ability1826/request/TaobaoTbkDgVegasTljInstanceReportRequest.go @@ -0,0 +1,25 @@ +package request + +type TaobaoTbkDgVegasTljInstanceReportRequest struct { + /* + 实例ID */ + RightsId *string `json:"rights_id" required:"true" ` +} + +func (s *TaobaoTbkDgVegasTljInstanceReportRequest) SetRightsId(v string) *TaobaoTbkDgVegasTljInstanceReportRequest { + s.RightsId = &v + return s +} + +func (req *TaobaoTbkDgVegasTljInstanceReportRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.RightsId != nil { + paramMap["rights_id"] = *req.RightsId + } + return paramMap +} + +func (req *TaobaoTbkDgVegasTljInstanceReportRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability1826/request/TaobaoTbkDgVegasTljReportRequest.go b/service/topsdk/ability1826/request/TaobaoTbkDgVegasTljReportRequest.go new file mode 100644 index 00000000..e4ad5ce5 --- /dev/null +++ b/service/topsdk/ability1826/request/TaobaoTbkDgVegasTljReportRequest.go @@ -0,0 +1,35 @@ +package request + +type TaobaoTbkDgVegasTljReportRequest struct { + /* + adzoneId */ + AdzoneId *int64 `json:"adzone_id" required:"true" ` + /* + 创建淘礼金时返回的rightsId */ + RightsId *string `json:"rights_id" required:"true" ` +} + +func (s *TaobaoTbkDgVegasTljReportRequest) SetAdzoneId(v int64) *TaobaoTbkDgVegasTljReportRequest { + s.AdzoneId = &v + return s +} +func (s *TaobaoTbkDgVegasTljReportRequest) SetRightsId(v string) *TaobaoTbkDgVegasTljReportRequest { + s.RightsId = &v + return s +} + +func (req *TaobaoTbkDgVegasTljReportRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.AdzoneId != nil { + paramMap["adzone_id"] = *req.AdzoneId + } + if req.RightsId != nil { + paramMap["rights_id"] = *req.RightsId + } + return paramMap +} + +func (req *TaobaoTbkDgVegasTljReportRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability1826/request/TaobaoTbkDgVegasTljStopRequest.go b/service/topsdk/ability1826/request/TaobaoTbkDgVegasTljStopRequest.go new file mode 100644 index 00000000..e94890f9 --- /dev/null +++ b/service/topsdk/ability1826/request/TaobaoTbkDgVegasTljStopRequest.go @@ -0,0 +1,35 @@ +package request + +type TaobaoTbkDgVegasTljStopRequest struct { + /* + adzoneId */ + AdzoneId *int64 `json:"adzone_id" required:"true" ` + /* + 创建淘礼金时返回的rightsId */ + RightsId *string `json:"rights_id" required:"true" ` +} + +func (s *TaobaoTbkDgVegasTljStopRequest) SetAdzoneId(v int64) *TaobaoTbkDgVegasTljStopRequest { + s.AdzoneId = &v + return s +} +func (s *TaobaoTbkDgVegasTljStopRequest) SetRightsId(v string) *TaobaoTbkDgVegasTljStopRequest { + s.RightsId = &v + return s +} + +func (req *TaobaoTbkDgVegasTljStopRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.AdzoneId != nil { + paramMap["adzone_id"] = *req.AdzoneId + } + if req.RightsId != nil { + paramMap["rights_id"] = *req.RightsId + } + return paramMap +} + +func (req *TaobaoTbkDgVegasTljStopRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability1826/response/TaobaoTbkDgVegasTljCreateResponse.go b/service/topsdk/ability1826/response/TaobaoTbkDgVegasTljCreateResponse.go new file mode 100644 index 00000000..7f94f1ce --- /dev/null +++ b/service/topsdk/ability1826/response/TaobaoTbkDgVegasTljCreateResponse.go @@ -0,0 +1,23 @@ +package response + +import ( + "topsdk/ability1826/domain" +) + +type TaobaoTbkDgVegasTljCreateResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + result + */ + Result domain.TaobaoTbkDgVegasTljCreateResult `json:"result,omitempty" ` +} diff --git a/service/topsdk/ability1826/response/TaobaoTbkDgVegasTljInstanceReportResponse.go b/service/topsdk/ability1826/response/TaobaoTbkDgVegasTljInstanceReportResponse.go new file mode 100644 index 00000000..29264ef6 --- /dev/null +++ b/service/topsdk/ability1826/response/TaobaoTbkDgVegasTljInstanceReportResponse.go @@ -0,0 +1,23 @@ +package response + +import ( + "topsdk/ability1826/domain" +) + +type TaobaoTbkDgVegasTljInstanceReportResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + 接口返回model + */ + Result domain.TaobaoTbkDgVegasTljInstanceReportResult `json:"result,omitempty" ` +} diff --git a/service/topsdk/ability1826/response/TaobaoTbkDgVegasTljReportResponse.go b/service/topsdk/ability1826/response/TaobaoTbkDgVegasTljReportResponse.go new file mode 100644 index 00000000..0781c8a1 --- /dev/null +++ b/service/topsdk/ability1826/response/TaobaoTbkDgVegasTljReportResponse.go @@ -0,0 +1,35 @@ +package response + +import ( + "topsdk/ability1826/domain" +) + +type TaobaoTbkDgVegasTljReportResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + 结果 + */ + Model domain.TaobaoTbkDgVegasTljReportInstanceDTO `json:"model,omitempty" ` + /* + msgInfo + */ + MsgInfo string `json:"msg_info,omitempty" ` + /* + msgCode + */ + MsgCode string `json:"msg_code,omitempty" ` + /* + 调用接口是否成功 + */ + ResultSuccess bool `json:"result_success,omitempty" ` +} diff --git a/service/topsdk/ability1826/response/TaobaoTbkDgVegasTljStopResponse.go b/service/topsdk/ability1826/response/TaobaoTbkDgVegasTljStopResponse.go new file mode 100644 index 00000000..469b04ab --- /dev/null +++ b/service/topsdk/ability1826/response/TaobaoTbkDgVegasTljStopResponse.go @@ -0,0 +1,35 @@ +package response + +import ( + "topsdk/ability1826/domain" +) + +type TaobaoTbkDgVegasTljStopResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + model + */ + Model domain.TaobaoTbkDgVegasTljStopUpdateStatusResult `json:"model,omitempty" ` + /* + msgInfo + */ + MsgInfo string `json:"msg_info,omitempty" ` + /* + msgCode + */ + MsgCode string `json:"msg_code,omitempty" ` + /* + 调用接口是否成功 + */ + ResultSuccess bool `json:"result_success,omitempty" ` +} diff --git a/service/topsdk/ability2138/Ability2138.go b/service/topsdk/ability2138/Ability2138.go new file mode 100644 index 00000000..0a8ac4cc --- /dev/null +++ b/service/topsdk/ability2138/Ability2138.go @@ -0,0 +1,38 @@ +package ability2138 + +import ( + "errors" + "log" + "topsdk" + "topsdk/ability2138/request" + "topsdk/ability2138/response" + "topsdk/util" +) + +type Ability2138 struct { + Client *topsdk.TopClient +} + +func NewAbility2138(client *topsdk.TopClient) *Ability2138 { + return &Ability2138{client} +} + +/* + 淘宝客-推广者-新用户订单明细查询 +*/ +func (ability *Ability2138) TaobaoTbkDgNewuserOrderGet(req *request.TaobaoTbkDgNewuserOrderGetRequest) (*response.TaobaoTbkDgNewuserOrderGetResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability2138 topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.tbk.dg.newuser.order.get", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoTbkDgNewuserOrderGetResponse{} + if err != nil { + log.Fatal("taobaoTbkDgNewuserOrderGet error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} diff --git a/service/topsdk/ability2138/domain/TaobaoTbkDgNewuserOrderGetData.go b/service/topsdk/ability2138/domain/TaobaoTbkDgNewuserOrderGetData.go new file mode 100644 index 00000000..836d5cf8 --- /dev/null +++ b/service/topsdk/ability2138/domain/TaobaoTbkDgNewuserOrderGetData.go @@ -0,0 +1,36 @@ +package domain + +type TaobaoTbkDgNewuserOrderGetData struct { + /* + resultList */ + Results *[]TaobaoTbkDgNewuserOrderGetMapData `json:"results,omitempty" ` + + /* + 页码 */ + PageNo *int64 `json:"page_no,omitempty" ` + + /* + 每页大小 */ + PageSize *int64 `json:"page_size,omitempty" ` + + /* + 是否有下一页 */ + HasNext *bool `json:"has_next,omitempty" ` +} + +func (s *TaobaoTbkDgNewuserOrderGetData) SetResults(v []TaobaoTbkDgNewuserOrderGetMapData) *TaobaoTbkDgNewuserOrderGetData { + s.Results = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetData) SetPageNo(v int64) *TaobaoTbkDgNewuserOrderGetData { + s.PageNo = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetData) SetPageSize(v int64) *TaobaoTbkDgNewuserOrderGetData { + s.PageSize = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetData) SetHasNext(v bool) *TaobaoTbkDgNewuserOrderGetData { + s.HasNext = &v + return s +} diff --git a/service/topsdk/ability2138/domain/TaobaoTbkDgNewuserOrderGetMapData.go b/service/topsdk/ability2138/domain/TaobaoTbkDgNewuserOrderGetMapData.go new file mode 100644 index 00000000..be4a10f3 --- /dev/null +++ b/service/topsdk/ability2138/domain/TaobaoTbkDgNewuserOrderGetMapData.go @@ -0,0 +1,224 @@ +package domain + +import ( + "topsdk/util" +) + +type TaobaoTbkDgNewuserOrderGetMapData struct { + /* + 新注册时间,仅淘宝拉新适用 */ + RegisterTime *util.LocalTime `json:"register_time,omitempty" ` + + /* + 当前活动为淘宝拉新活动时,bind_time为新激活时间; 当前活动为支付宝拉新活动时,bind_time为绑定时间。 */ + BindTime *util.LocalTime `json:"bind_time,omitempty" ` + + /* + 首购时间,仅淘宝,天猫拉新适用 */ + BuyTime *util.LocalTime `json:"buy_time,omitempty" ` + + /* + 新人状态, 当前活动为淘宝拉新活动时,1: 新注册,2:激活,3:首购,4:确认收货; 当前活动为支付宝实名活动时,1:已绑定,2:拉新成功,3:无效用户;当前活动为支付宝新登活动时,3:手淘首购,4:手淘确认收货;当前活动为天猫拉新活动时,2:已领取,3:已首购,4:已收货 */ + Status *int64 `json:"status,omitempty" ` + + /* + 新人手机号 */ + Mobile *string `json:"mobile,omitempty" ` + + /* + 订单淘客类型:1.淘客订单;2.非淘客订单,仅淘宝,天猫拉新适用 */ + OrderTkType *int64 `json:"order_tk_type,omitempty" ` + + /* + 分享用户(unionid),仅淘宝,天猫拉新适用 */ + UnionId *string `json:"union_id,omitempty" ` + + /* + 来源媒体ID(pid中mm_1_2_3)中第1位 */ + MemberId *int64 `json:"member_id,omitempty" ` + + /* + 来源媒体名称 */ + MemberNick *string `json:"member_nick,omitempty" ` + + /* + 来源站点ID(pid中mm_1_2_3)中第2位 */ + SiteId *int64 `json:"site_id,omitempty" ` + + /* + 来源站点名称 */ + SiteName *string `json:"site_name,omitempty" ` + + /* + 来源广告位ID(pid中mm_1_2_3)中第3位 */ + AdzoneId *int64 `json:"adzone_id,omitempty" ` + + /* + 来源广告位名称 */ + AdzoneName *string `json:"adzone_name,omitempty" ` + + /* + 淘宝订单id,仅淘宝,天猫拉新适用 */ + TbTradeParentId *int64 `json:"tb_trade_parent_id,omitempty" ` + + /* + 确认收货时间,仅天猫拉新适用 */ + AcceptTime *util.LocalTime `json:"accept_time,omitempty" ` + + /* + 领取红包时间,仅天猫拉新适用 */ + ReceiveTime *util.LocalTime `json:"receive_time,omitempty" ` + + /* + 拉新成功时间,仅支付宝拉新适用 */ + SuccessTime *util.LocalTime `json:"success_time,omitempty" ` + + /* + 活动类型,taobao-淘宝 alipay-支付宝 tmall-天猫 */ + ActivityType *string `json:"activity_type,omitempty" ` + + /* + 活动id */ + ActivityId *string `json:"activity_id,omitempty" ` + + /* + 日期,格式为"20180202" */ + BizDate *string `json:"biz_date,omitempty" ` + + /* + 复购订单,仅适用于手淘拉新 */ + Orders *[]TaobaoTbkDgNewuserOrderGetOrderData `json:"orders,omitempty" ` + + /* + 绑卡日期,仅适用于手淘拉新 */ + BindCardTime *util.LocalTime `json:"bind_card_time,omitempty" ` + + /* + loginTime */ + LoginTime *util.LocalTime `json:"login_time,omitempty" ` + + /* + 银行卡是否是绑定状态:1-绑定,0-未绑定 */ + IsCardSave *int64 `json:"is_card_save,omitempty" ` + + /* + 使用权益时间 */ + UseRightsTime *util.LocalTime `json:"use_rights_time,omitempty" ` + + /* + 领取权益时间 */ + GetRightsTime *util.LocalTime `json:"get_rights_time,omitempty" ` + + /* + 渠道关系id */ + RelationId *string `json:"relation_id,omitempty" ` +} + +func (s *TaobaoTbkDgNewuserOrderGetMapData) SetRegisterTime(v util.LocalTime) *TaobaoTbkDgNewuserOrderGetMapData { + s.RegisterTime = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetMapData) SetBindTime(v util.LocalTime) *TaobaoTbkDgNewuserOrderGetMapData { + s.BindTime = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetMapData) SetBuyTime(v util.LocalTime) *TaobaoTbkDgNewuserOrderGetMapData { + s.BuyTime = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetMapData) SetStatus(v int64) *TaobaoTbkDgNewuserOrderGetMapData { + s.Status = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetMapData) SetMobile(v string) *TaobaoTbkDgNewuserOrderGetMapData { + s.Mobile = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetMapData) SetOrderTkType(v int64) *TaobaoTbkDgNewuserOrderGetMapData { + s.OrderTkType = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetMapData) SetUnionId(v string) *TaobaoTbkDgNewuserOrderGetMapData { + s.UnionId = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetMapData) SetMemberId(v int64) *TaobaoTbkDgNewuserOrderGetMapData { + s.MemberId = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetMapData) SetMemberNick(v string) *TaobaoTbkDgNewuserOrderGetMapData { + s.MemberNick = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetMapData) SetSiteId(v int64) *TaobaoTbkDgNewuserOrderGetMapData { + s.SiteId = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetMapData) SetSiteName(v string) *TaobaoTbkDgNewuserOrderGetMapData { + s.SiteName = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetMapData) SetAdzoneId(v int64) *TaobaoTbkDgNewuserOrderGetMapData { + s.AdzoneId = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetMapData) SetAdzoneName(v string) *TaobaoTbkDgNewuserOrderGetMapData { + s.AdzoneName = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetMapData) SetTbTradeParentId(v int64) *TaobaoTbkDgNewuserOrderGetMapData { + s.TbTradeParentId = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetMapData) SetAcceptTime(v util.LocalTime) *TaobaoTbkDgNewuserOrderGetMapData { + s.AcceptTime = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetMapData) SetReceiveTime(v util.LocalTime) *TaobaoTbkDgNewuserOrderGetMapData { + s.ReceiveTime = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetMapData) SetSuccessTime(v util.LocalTime) *TaobaoTbkDgNewuserOrderGetMapData { + s.SuccessTime = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetMapData) SetActivityType(v string) *TaobaoTbkDgNewuserOrderGetMapData { + s.ActivityType = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetMapData) SetActivityId(v string) *TaobaoTbkDgNewuserOrderGetMapData { + s.ActivityId = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetMapData) SetBizDate(v string) *TaobaoTbkDgNewuserOrderGetMapData { + s.BizDate = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetMapData) SetOrders(v []TaobaoTbkDgNewuserOrderGetOrderData) *TaobaoTbkDgNewuserOrderGetMapData { + s.Orders = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetMapData) SetBindCardTime(v util.LocalTime) *TaobaoTbkDgNewuserOrderGetMapData { + s.BindCardTime = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetMapData) SetLoginTime(v util.LocalTime) *TaobaoTbkDgNewuserOrderGetMapData { + s.LoginTime = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetMapData) SetIsCardSave(v int64) *TaobaoTbkDgNewuserOrderGetMapData { + s.IsCardSave = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetMapData) SetUseRightsTime(v util.LocalTime) *TaobaoTbkDgNewuserOrderGetMapData { + s.UseRightsTime = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetMapData) SetGetRightsTime(v util.LocalTime) *TaobaoTbkDgNewuserOrderGetMapData { + s.GetRightsTime = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetMapData) SetRelationId(v string) *TaobaoTbkDgNewuserOrderGetMapData { + s.RelationId = &v + return s +} diff --git a/service/topsdk/ability2138/domain/TaobaoTbkDgNewuserOrderGetOrderData.go b/service/topsdk/ability2138/domain/TaobaoTbkDgNewuserOrderGetOrderData.go new file mode 100644 index 00000000..ed56d1fa --- /dev/null +++ b/service/topsdk/ability2138/domain/TaobaoTbkDgNewuserOrderGetOrderData.go @@ -0,0 +1,36 @@ +package domain + +type TaobaoTbkDgNewuserOrderGetOrderData struct { + /* + 预估佣金 */ + Commission *string `json:"commission,omitempty" ` + + /* + 收货时间 */ + ConfirmReceiveTime *string `json:"confirm_receive_time,omitempty" ` + + /* + 支付时间 */ + PayTime *string `json:"pay_time,omitempty" ` + + /* + 订单号 */ + OrderNo *string `json:"order_no,omitempty" ` +} + +func (s *TaobaoTbkDgNewuserOrderGetOrderData) SetCommission(v string) *TaobaoTbkDgNewuserOrderGetOrderData { + s.Commission = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetOrderData) SetConfirmReceiveTime(v string) *TaobaoTbkDgNewuserOrderGetOrderData { + s.ConfirmReceiveTime = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetOrderData) SetPayTime(v string) *TaobaoTbkDgNewuserOrderGetOrderData { + s.PayTime = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetOrderData) SetOrderNo(v string) *TaobaoTbkDgNewuserOrderGetOrderData { + s.OrderNo = &v + return s +} diff --git a/service/topsdk/ability2138/domain/TaobaoTbkDgNewuserOrderGetResults.go b/service/topsdk/ability2138/domain/TaobaoTbkDgNewuserOrderGetResults.go new file mode 100644 index 00000000..9442c290 --- /dev/null +++ b/service/topsdk/ability2138/domain/TaobaoTbkDgNewuserOrderGetResults.go @@ -0,0 +1,12 @@ +package domain + +type TaobaoTbkDgNewuserOrderGetResults struct { + /* + data */ + Data *TaobaoTbkDgNewuserOrderGetData `json:"data,omitempty" ` +} + +func (s *TaobaoTbkDgNewuserOrderGetResults) SetData(v TaobaoTbkDgNewuserOrderGetData) *TaobaoTbkDgNewuserOrderGetResults { + s.Data = &v + return s +} diff --git a/service/topsdk/ability2138/request/TaobaoTbkDgNewuserOrderGetRequest.go b/service/topsdk/ability2138/request/TaobaoTbkDgNewuserOrderGetRequest.go new file mode 100644 index 00000000..baf0d29e --- /dev/null +++ b/service/topsdk/ability2138/request/TaobaoTbkDgNewuserOrderGetRequest.go @@ -0,0 +1,79 @@ +package request + +import ( + "topsdk/util" +) + +type TaobaoTbkDgNewuserOrderGetRequest struct { + /* + 页大小,默认20,1~100 defalutValue��20 */ + PageSize *int64 `json:"page_size,omitempty" required:"false" ` + /* + 页码,默认1 defalutValue��1 */ + PageNo *int64 `json:"page_no,omitempty" required:"false" ` + /* + mm_xxx_xxx_xxx的第三位 */ + AdzoneId *int64 `json:"adzone_id,omitempty" required:"false" ` + /* + 开始时间,当活动为淘宝活动,表示最早注册时间;当活动为支付宝活动,表示最早绑定时间;当活动为天猫活动,表示最早领取红包时间 */ + StartTime *util.LocalTime `json:"start_time,omitempty" required:"false" ` + /* + 结束时间,当活动为淘宝活动,表示最晚结束时间;当活动为支付宝活动,表示最晚绑定时间;当活动为天猫活动,表示最晚领取红包的时间 */ + EndTime *util.LocalTime `json:"end_time,omitempty" required:"false" ` + /* + 活动id, 活动名称与活动ID列表(该字段已废弃) */ + ActivityId *string `json:"activity_id" required:"true" ` +} + +func (s *TaobaoTbkDgNewuserOrderGetRequest) SetPageSize(v int64) *TaobaoTbkDgNewuserOrderGetRequest { + s.PageSize = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetRequest) SetPageNo(v int64) *TaobaoTbkDgNewuserOrderGetRequest { + s.PageNo = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetRequest) SetAdzoneId(v int64) *TaobaoTbkDgNewuserOrderGetRequest { + s.AdzoneId = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetRequest) SetStartTime(v util.LocalTime) *TaobaoTbkDgNewuserOrderGetRequest { + s.StartTime = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetRequest) SetEndTime(v util.LocalTime) *TaobaoTbkDgNewuserOrderGetRequest { + s.EndTime = &v + return s +} +func (s *TaobaoTbkDgNewuserOrderGetRequest) SetActivityId(v string) *TaobaoTbkDgNewuserOrderGetRequest { + s.ActivityId = &v + return s +} + +func (req *TaobaoTbkDgNewuserOrderGetRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.PageSize != nil { + paramMap["page_size"] = *req.PageSize + } + if req.PageNo != nil { + paramMap["page_no"] = *req.PageNo + } + if req.AdzoneId != nil { + paramMap["adzone_id"] = *req.AdzoneId + } + if req.StartTime != nil { + paramMap["start_time"] = *req.StartTime + } + if req.EndTime != nil { + paramMap["end_time"] = *req.EndTime + } + if req.ActivityId != nil { + paramMap["activity_id"] = *req.ActivityId + } + return paramMap +} + +func (req *TaobaoTbkDgNewuserOrderGetRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability2138/response/TaobaoTbkDgNewuserOrderGetResponse.go b/service/topsdk/ability2138/response/TaobaoTbkDgNewuserOrderGetResponse.go new file mode 100644 index 00000000..a570ff1e --- /dev/null +++ b/service/topsdk/ability2138/response/TaobaoTbkDgNewuserOrderGetResponse.go @@ -0,0 +1,23 @@ +package response + +import ( + "topsdk/ability2138/domain" +) + +type TaobaoTbkDgNewuserOrderGetResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + data + */ + Results domain.TaobaoTbkDgNewuserOrderGetResults `json:"results,omitempty" ` +} diff --git a/service/topsdk/ability2474/Ability2474.go b/service/topsdk/ability2474/Ability2474.go new file mode 100644 index 00000000..96a45991 --- /dev/null +++ b/service/topsdk/ability2474/Ability2474.go @@ -0,0 +1,38 @@ +package ability2474 + +import ( + "errors" + "log" + "topsdk" + "topsdk/ability2474/request" + "topsdk/ability2474/response" + "topsdk/util" +) + +type Ability2474 struct { + Client *topsdk.TopClient +} + +func NewAbility2474(client *topsdk.TopClient) *Ability2474 { + return &Ability2474{client} +} + +/* + 淘宝客-推广者-查询红包发放个数 +*/ +func (ability *Ability2474) TaobaoTbkDgVegasSendReport(req *request.TaobaoTbkDgVegasSendReportRequest) (*response.TaobaoTbkDgVegasSendReportResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability2474 topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.tbk.dg.vegas.send.report", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoTbkDgVegasSendReportResponse{} + if err != nil { + log.Fatal("taobaoTbkDgVegasSendReport error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} diff --git a/service/topsdk/ability2474/domain/TaobaoTbkDgVegasSendReportResult.go b/service/topsdk/ability2474/domain/TaobaoTbkDgVegasSendReportResult.go new file mode 100644 index 00000000..55eb3420 --- /dev/null +++ b/service/topsdk/ability2474/domain/TaobaoTbkDgVegasSendReportResult.go @@ -0,0 +1,36 @@ +package domain + +type TaobaoTbkDgVegasSendReportResult struct { + /* + 是否成功 */ + Success *bool `json:"success,omitempty" ` + + /* + model */ + Model *TaobaoTbkDgVegasSendReportRightsSendRptDTO `json:"model,omitempty" ` + + /* + msgInfo */ + MsgInfo *string `json:"msg_info,omitempty" ` + + /* + msgCode */ + MsgCode *string `json:"msg_code,omitempty" ` +} + +func (s *TaobaoTbkDgVegasSendReportResult) SetSuccess(v bool) *TaobaoTbkDgVegasSendReportResult { + s.Success = &v + return s +} +func (s *TaobaoTbkDgVegasSendReportResult) SetModel(v TaobaoTbkDgVegasSendReportRightsSendRptDTO) *TaobaoTbkDgVegasSendReportResult { + s.Model = &v + return s +} +func (s *TaobaoTbkDgVegasSendReportResult) SetMsgInfo(v string) *TaobaoTbkDgVegasSendReportResult { + s.MsgInfo = &v + return s +} +func (s *TaobaoTbkDgVegasSendReportResult) SetMsgCode(v string) *TaobaoTbkDgVegasSendReportResult { + s.MsgCode = &v + return s +} diff --git a/service/topsdk/ability2474/domain/TaobaoTbkDgVegasSendReportRightsSendRelationRptDto.go b/service/topsdk/ability2474/domain/TaobaoTbkDgVegasSendReportRightsSendRelationRptDto.go new file mode 100644 index 00000000..08dd1e98 --- /dev/null +++ b/service/topsdk/ability2474/domain/TaobaoTbkDgVegasSendReportRightsSendRelationRptDto.go @@ -0,0 +1,28 @@ +package domain + +type TaobaoTbkDgVegasSendReportRightsSendRelationRptDto struct { + /* + 日期 */ + BizDate *string `json:"biz_date,omitempty" ` + + /* + 渠道关系id */ + RelationId *int64 `json:"relation_id,omitempty" ` + + /* + 红包发放数量 */ + FundNum *int64 `json:"fund_num,omitempty" ` +} + +func (s *TaobaoTbkDgVegasSendReportRightsSendRelationRptDto) SetBizDate(v string) *TaobaoTbkDgVegasSendReportRightsSendRelationRptDto { + s.BizDate = &v + return s +} +func (s *TaobaoTbkDgVegasSendReportRightsSendRelationRptDto) SetRelationId(v int64) *TaobaoTbkDgVegasSendReportRightsSendRelationRptDto { + s.RelationId = &v + return s +} +func (s *TaobaoTbkDgVegasSendReportRightsSendRelationRptDto) SetFundNum(v int64) *TaobaoTbkDgVegasSendReportRightsSendRelationRptDto { + s.FundNum = &v + return s +} diff --git a/service/topsdk/ability2474/domain/TaobaoTbkDgVegasSendReportRightsSendRptDTO.go b/service/topsdk/ability2474/domain/TaobaoTbkDgVegasSendReportRightsSendRptDTO.go new file mode 100644 index 00000000..c35ce6b6 --- /dev/null +++ b/service/topsdk/ability2474/domain/TaobaoTbkDgVegasSendReportRightsSendRptDTO.go @@ -0,0 +1,12 @@ +package domain + +type TaobaoTbkDgVegasSendReportRightsSendRptDTO struct { + /* + 渠道关系id的发放数据 */ + RelationRptList *[]TaobaoTbkDgVegasSendReportRightsSendRelationRptDto `json:"relation_rpt_list,omitempty" ` +} + +func (s *TaobaoTbkDgVegasSendReportRightsSendRptDTO) SetRelationRptList(v []TaobaoTbkDgVegasSendReportRightsSendRelationRptDto) *TaobaoTbkDgVegasSendReportRightsSendRptDTO { + s.RelationRptList = &v + return s +} diff --git a/service/topsdk/ability2474/request/TaobaoTbkDgVegasSendReportRequest.go b/service/topsdk/ability2474/request/TaobaoTbkDgVegasSendReportRequest.go new file mode 100644 index 00000000..08875b59 --- /dev/null +++ b/service/topsdk/ability2474/request/TaobaoTbkDgVegasSendReportRequest.go @@ -0,0 +1,65 @@ +package request + +type TaobaoTbkDgVegasSendReportRequest struct { + /* + 统计日期 */ + BizDate *string `json:"biz_date" required:"true" ` + /* + 渠道关系id */ + RelationId *int64 `json:"relation_id,omitempty" required:"false" ` + /* + 红包活动id:1462 */ + ActivityId *int64 `json:"activity_id" required:"true" ` + /* + 页码 defalutValue��1 */ + PageNo *int64 `json:"page_no,omitempty" required:"false" ` + /* + 每页大小 defalutValue��10 */ + PageSize *int64 `json:"page_size,omitempty" required:"false" ` +} + +func (s *TaobaoTbkDgVegasSendReportRequest) SetBizDate(v string) *TaobaoTbkDgVegasSendReportRequest { + s.BizDate = &v + return s +} +func (s *TaobaoTbkDgVegasSendReportRequest) SetRelationId(v int64) *TaobaoTbkDgVegasSendReportRequest { + s.RelationId = &v + return s +} +func (s *TaobaoTbkDgVegasSendReportRequest) SetActivityId(v int64) *TaobaoTbkDgVegasSendReportRequest { + s.ActivityId = &v + return s +} +func (s *TaobaoTbkDgVegasSendReportRequest) SetPageNo(v int64) *TaobaoTbkDgVegasSendReportRequest { + s.PageNo = &v + return s +} +func (s *TaobaoTbkDgVegasSendReportRequest) SetPageSize(v int64) *TaobaoTbkDgVegasSendReportRequest { + s.PageSize = &v + return s +} + +func (req *TaobaoTbkDgVegasSendReportRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.BizDate != nil { + paramMap["biz_date"] = *req.BizDate + } + if req.RelationId != nil { + paramMap["relation_id"] = *req.RelationId + } + if req.ActivityId != nil { + paramMap["activity_id"] = *req.ActivityId + } + if req.PageNo != nil { + paramMap["page_no"] = *req.PageNo + } + if req.PageSize != nil { + paramMap["page_size"] = *req.PageSize + } + return paramMap +} + +func (req *TaobaoTbkDgVegasSendReportRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability2474/response/TaobaoTbkDgVegasSendReportResponse.go b/service/topsdk/ability2474/response/TaobaoTbkDgVegasSendReportResponse.go new file mode 100644 index 00000000..47cf1de4 --- /dev/null +++ b/service/topsdk/ability2474/response/TaobaoTbkDgVegasSendReportResponse.go @@ -0,0 +1,23 @@ +package response + +import ( + "topsdk/ability2474/domain" +) + +type TaobaoTbkDgVegasSendReportResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + 返回结果 + */ + Result domain.TaobaoTbkDgVegasSendReportResult `json:"result,omitempty" ` +} diff --git a/service/topsdk/ability304/Ability304.go b/service/topsdk/ability304/Ability304.go new file mode 100644 index 00000000..e0a6ae26 --- /dev/null +++ b/service/topsdk/ability304/Ability304.go @@ -0,0 +1,158 @@ +package ability304 + +import ( + "errors" + "log" + "topsdk" + "topsdk/ability304/request" + "topsdk/ability304/response" + "topsdk/util" +) + +type Ability304 struct { + Client *topsdk.TopClient +} + +func NewAbility304(client *topsdk.TopClient) *Ability304 { + return &Ability304{client} +} + +/* + 业务文件获取 +*/ +func (ability *Ability304) TaobaoFilesGet(req *request.TaobaoFilesGetRequest) (*response.TaobaoFilesGetResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability304 topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.files.get", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoFilesGetResponse{} + if err != nil { + log.Fatal("taobaoFilesGet error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} + +/* + 刷新Access Token +*/ +func (ability *Ability304) TaobaoTopAuthTokenRefresh(req *request.TaobaoTopAuthTokenRefreshRequest) (*response.TaobaoTopAuthTokenRefreshResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability304 topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.top.auth.token.refresh", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoTopAuthTokenRefreshResponse{} + if err != nil { + log.Fatal("taobaoTopAuthTokenRefresh error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} + +/* + 获取授权账号对应的OpenUid +*/ +func (ability *Ability304) TaobaoOpenuidGet(req *request.TaobaoOpenuidGetRequest, session string) (*response.TaobaoOpenuidGetResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability304 topClient is nil") + } + var jsonStr, err = ability.Client.ExecuteWithSession("taobao.openuid.get", req.ToMap(), req.ToFileMap(), session) + var respStruct = response.TaobaoOpenuidGetResponse{} + if err != nil { + log.Fatal("taobaoOpenuidGet error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} + +/* + 通过订单获取对应买家的openUID +*/ +func (ability *Ability304) TaobaoOpenuidGetBytrade(req *request.TaobaoOpenuidGetBytradeRequest, session string) (*response.TaobaoOpenuidGetBytradeResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability304 topClient is nil") + } + var jsonStr, err = ability.Client.ExecuteWithSession("taobao.openuid.get.bytrade", req.ToMap(), req.ToFileMap(), session) + var respStruct = response.TaobaoOpenuidGetBytradeResponse{} + if err != nil { + log.Fatal("taobaoOpenuidGetBytrade error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} + +/* + 获取TOP通道解密秘钥 +*/ +func (ability *Ability304) TaobaoTopSecretGet(req *request.TaobaoTopSecretGetRequest) (*response.TaobaoTopSecretGetResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability304 topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.top.secret.get", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoTopSecretGetResponse{} + if err != nil { + log.Fatal("taobaoTopSecretGet error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} + +/* + 通过mixnick转换openuid +*/ +func (ability *Ability304) TaobaoOpenuidGetBymixnick(req *request.TaobaoOpenuidGetBymixnickRequest) (*response.TaobaoOpenuidGetBymixnickResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability304 topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.openuid.get.bymixnick", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoOpenuidGetBymixnickResponse{} + if err != nil { + log.Fatal("taobaoOpenuidGetBymixnick error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} + +/* + sdk信息回调 +*/ +func (ability *Ability304) TaobaoTopSdkFeedbackUpload(req *request.TaobaoTopSdkFeedbackUploadRequest) (*response.TaobaoTopSdkFeedbackUploadResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability304 topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.top.sdk.feedback.upload", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoTopSdkFeedbackUploadResponse{} + if err != nil { + log.Fatal("taobaoTopSdkFeedbackUpload error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} diff --git a/service/topsdk/ability304/domain/TaobaoFilesGetTopDownloadRecordDo.go b/service/topsdk/ability304/domain/TaobaoFilesGetTopDownloadRecordDo.go new file mode 100644 index 00000000..c4408bdf --- /dev/null +++ b/service/topsdk/ability304/domain/TaobaoFilesGetTopDownloadRecordDo.go @@ -0,0 +1,32 @@ +package domain + +import ( + "topsdk/util" +) + +type TaobaoFilesGetTopDownloadRecordDo struct { + /* + 下载链接 */ + Url *string `json:"url,omitempty" ` + + /* + 文件创建时间 */ + Created *util.LocalTime `json:"created,omitempty" ` + + /* + 下载链接状态。1:未下载。2:已下载 */ + Status *int64 `json:"status,omitempty" ` +} + +func (s *TaobaoFilesGetTopDownloadRecordDo) SetUrl(v string) *TaobaoFilesGetTopDownloadRecordDo { + s.Url = &v + return s +} +func (s *TaobaoFilesGetTopDownloadRecordDo) SetCreated(v util.LocalTime) *TaobaoFilesGetTopDownloadRecordDo { + s.Created = &v + return s +} +func (s *TaobaoFilesGetTopDownloadRecordDo) SetStatus(v int64) *TaobaoFilesGetTopDownloadRecordDo { + s.Status = &v + return s +} diff --git a/service/topsdk/ability304/request/TaobaoFilesGetRequest.go b/service/topsdk/ability304/request/TaobaoFilesGetRequest.go new file mode 100644 index 00000000..fe8c652d --- /dev/null +++ b/service/topsdk/ability304/request/TaobaoFilesGetRequest.go @@ -0,0 +1,49 @@ +package request + +import ( + "topsdk/util" +) + +type TaobaoFilesGetRequest struct { + /* + 下载链接状态。1:未下载。2:已下载 */ + Status *int64 `json:"status,omitempty" required:"false" ` + /* + 搜索开始时间 */ + StartDate *util.LocalTime `json:"start_date" required:"true" ` + /* + 搜索结束时间 */ + EndDate *util.LocalTime `json:"end_date" required:"true" ` +} + +func (s *TaobaoFilesGetRequest) SetStatus(v int64) *TaobaoFilesGetRequest { + s.Status = &v + return s +} +func (s *TaobaoFilesGetRequest) SetStartDate(v util.LocalTime) *TaobaoFilesGetRequest { + s.StartDate = &v + return s +} +func (s *TaobaoFilesGetRequest) SetEndDate(v util.LocalTime) *TaobaoFilesGetRequest { + s.EndDate = &v + return s +} + +func (req *TaobaoFilesGetRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.Status != nil { + paramMap["status"] = *req.Status + } + if req.StartDate != nil { + paramMap["start_date"] = *req.StartDate + } + if req.EndDate != nil { + paramMap["end_date"] = *req.EndDate + } + return paramMap +} + +func (req *TaobaoFilesGetRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability304/request/TaobaoOpenuidGetBymixnickRequest.go b/service/topsdk/ability304/request/TaobaoOpenuidGetBymixnickRequest.go new file mode 100644 index 00000000..41df264a --- /dev/null +++ b/service/topsdk/ability304/request/TaobaoOpenuidGetBymixnickRequest.go @@ -0,0 +1,25 @@ +package request + +type TaobaoOpenuidGetBymixnickRequest struct { + /* + 无线类应用获取到的混淆的nick */ + MixNick *string `json:"mix_nick" required:"true" ` +} + +func (s *TaobaoOpenuidGetBymixnickRequest) SetMixNick(v string) *TaobaoOpenuidGetBymixnickRequest { + s.MixNick = &v + return s +} + +func (req *TaobaoOpenuidGetBymixnickRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.MixNick != nil { + paramMap["mix_nick"] = *req.MixNick + } + return paramMap +} + +func (req *TaobaoOpenuidGetBymixnickRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability304/request/TaobaoOpenuidGetBytradeRequest.go b/service/topsdk/ability304/request/TaobaoOpenuidGetBytradeRequest.go new file mode 100644 index 00000000..2838483a --- /dev/null +++ b/service/topsdk/ability304/request/TaobaoOpenuidGetBytradeRequest.go @@ -0,0 +1,25 @@ +package request + +type TaobaoOpenuidGetBytradeRequest struct { + /* + 订单ID */ + Tid *int64 `json:"tid" required:"true" ` +} + +func (s *TaobaoOpenuidGetBytradeRequest) SetTid(v int64) *TaobaoOpenuidGetBytradeRequest { + s.Tid = &v + return s +} + +func (req *TaobaoOpenuidGetBytradeRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.Tid != nil { + paramMap["tid"] = *req.Tid + } + return paramMap +} + +func (req *TaobaoOpenuidGetBytradeRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability304/request/TaobaoOpenuidGetRequest.go b/service/topsdk/ability304/request/TaobaoOpenuidGetRequest.go new file mode 100644 index 00000000..9bd74fe8 --- /dev/null +++ b/service/topsdk/ability304/request/TaobaoOpenuidGetRequest.go @@ -0,0 +1,14 @@ +package request + +type TaobaoOpenuidGetRequest struct { +} + +func (req *TaobaoOpenuidGetRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + return paramMap +} + +func (req *TaobaoOpenuidGetRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability304/request/TaobaoTopAuthTokenRefreshRequest.go b/service/topsdk/ability304/request/TaobaoTopAuthTokenRefreshRequest.go new file mode 100644 index 00000000..09d30810 --- /dev/null +++ b/service/topsdk/ability304/request/TaobaoTopAuthTokenRefreshRequest.go @@ -0,0 +1,25 @@ +package request + +type TaobaoTopAuthTokenRefreshRequest struct { + /* + grantType==refresh_token 时需要 */ + RefreshToken *string `json:"refresh_token" required:"true" ` +} + +func (s *TaobaoTopAuthTokenRefreshRequest) SetRefreshToken(v string) *TaobaoTopAuthTokenRefreshRequest { + s.RefreshToken = &v + return s +} + +func (req *TaobaoTopAuthTokenRefreshRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.RefreshToken != nil { + paramMap["refresh_token"] = *req.RefreshToken + } + return paramMap +} + +func (req *TaobaoTopAuthTokenRefreshRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability304/request/TaobaoTopSdkFeedbackUploadRequest.go b/service/topsdk/ability304/request/TaobaoTopSdkFeedbackUploadRequest.go new file mode 100644 index 00000000..a0e67173 --- /dev/null +++ b/service/topsdk/ability304/request/TaobaoTopSdkFeedbackUploadRequest.go @@ -0,0 +1,35 @@ +package request + +type TaobaoTopSdkFeedbackUploadRequest struct { + /* + 1、回传加密信息 */ + Type *string `json:"type" required:"true" ` + /* + 具体内容,json形式 */ + Content *string `json:"content,omitempty" required:"false" ` +} + +func (s *TaobaoTopSdkFeedbackUploadRequest) SetType(v string) *TaobaoTopSdkFeedbackUploadRequest { + s.Type = &v + return s +} +func (s *TaobaoTopSdkFeedbackUploadRequest) SetContent(v string) *TaobaoTopSdkFeedbackUploadRequest { + s.Content = &v + return s +} + +func (req *TaobaoTopSdkFeedbackUploadRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.Type != nil { + paramMap["type"] = *req.Type + } + if req.Content != nil { + paramMap["content"] = *req.Content + } + return paramMap +} + +func (req *TaobaoTopSdkFeedbackUploadRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability304/request/TaobaoTopSecretGetRequest.go b/service/topsdk/ability304/request/TaobaoTopSecretGetRequest.go new file mode 100644 index 00000000..947c362b --- /dev/null +++ b/service/topsdk/ability304/request/TaobaoTopSecretGetRequest.go @@ -0,0 +1,45 @@ +package request + +type TaobaoTopSecretGetRequest struct { + /* + 秘钥版本号 */ + SecretVersion *int64 `json:"secret_version,omitempty" required:"false" ` + /* + 伪随机数 */ + RandomNum *string `json:"random_num" required:"true" ` + /* + 自定义用户id */ + CustomerUserId *int64 `json:"customer_user_id,omitempty" required:"false" ` +} + +func (s *TaobaoTopSecretGetRequest) SetSecretVersion(v int64) *TaobaoTopSecretGetRequest { + s.SecretVersion = &v + return s +} +func (s *TaobaoTopSecretGetRequest) SetRandomNum(v string) *TaobaoTopSecretGetRequest { + s.RandomNum = &v + return s +} +func (s *TaobaoTopSecretGetRequest) SetCustomerUserId(v int64) *TaobaoTopSecretGetRequest { + s.CustomerUserId = &v + return s +} + +func (req *TaobaoTopSecretGetRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.SecretVersion != nil { + paramMap["secret_version"] = *req.SecretVersion + } + if req.RandomNum != nil { + paramMap["random_num"] = *req.RandomNum + } + if req.CustomerUserId != nil { + paramMap["customer_user_id"] = *req.CustomerUserId + } + return paramMap +} + +func (req *TaobaoTopSecretGetRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability304/response/TaobaoFilesGetResponse.go b/service/topsdk/ability304/response/TaobaoFilesGetResponse.go new file mode 100644 index 00000000..e9d709fe --- /dev/null +++ b/service/topsdk/ability304/response/TaobaoFilesGetResponse.go @@ -0,0 +1,23 @@ +package response + +import ( + "topsdk/ability304/domain" +) + +type TaobaoFilesGetResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + results + */ + Results []domain.TaobaoFilesGetTopDownloadRecordDo `json:"results,omitempty" ` +} diff --git a/service/topsdk/ability304/response/TaobaoOpenuidGetBymixnickResponse.go b/service/topsdk/ability304/response/TaobaoOpenuidGetBymixnickResponse.go new file mode 100644 index 00000000..a7c9e7cb --- /dev/null +++ b/service/topsdk/ability304/response/TaobaoOpenuidGetBymixnickResponse.go @@ -0,0 +1,19 @@ +package response + +type TaobaoOpenuidGetBymixnickResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + OpenUID + */ + OpenUid string `json:"open_uid,omitempty" ` +} diff --git a/service/topsdk/ability304/response/TaobaoOpenuidGetBytradeResponse.go b/service/topsdk/ability304/response/TaobaoOpenuidGetBytradeResponse.go new file mode 100644 index 00000000..7ba32ff3 --- /dev/null +++ b/service/topsdk/ability304/response/TaobaoOpenuidGetBytradeResponse.go @@ -0,0 +1,19 @@ +package response + +type TaobaoOpenuidGetBytradeResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + 当前交易tid对应买家的openuid + */ + OpenUid string `json:"open_uid,omitempty" ` +} diff --git a/service/topsdk/ability304/response/TaobaoOpenuidGetResponse.go b/service/topsdk/ability304/response/TaobaoOpenuidGetResponse.go new file mode 100644 index 00000000..cd9581d9 --- /dev/null +++ b/service/topsdk/ability304/response/TaobaoOpenuidGetResponse.go @@ -0,0 +1,19 @@ +package response + +type TaobaoOpenuidGetResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + OpenUID + */ + OpenUid string `json:"open_uid,omitempty" ` +} diff --git a/service/topsdk/ability304/response/TaobaoTopAuthTokenRefreshResponse.go b/service/topsdk/ability304/response/TaobaoTopAuthTokenRefreshResponse.go new file mode 100644 index 00000000..4a74f4df --- /dev/null +++ b/service/topsdk/ability304/response/TaobaoTopAuthTokenRefreshResponse.go @@ -0,0 +1,19 @@ +package response + +type TaobaoTopAuthTokenRefreshResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + 返回的是json信息 + */ + TokenResult string `json:"token_result,omitempty" ` +} diff --git a/service/topsdk/ability304/response/TaobaoTopSdkFeedbackUploadResponse.go b/service/topsdk/ability304/response/TaobaoTopSdkFeedbackUploadResponse.go new file mode 100644 index 00000000..36752eb6 --- /dev/null +++ b/service/topsdk/ability304/response/TaobaoTopSdkFeedbackUploadResponse.go @@ -0,0 +1,19 @@ +package response + +type TaobaoTopSdkFeedbackUploadResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + 控制回传间隔(单位:秒) + */ + UploadInterval int64 `json:"upload_interval,omitempty" ` +} diff --git a/service/topsdk/ability304/response/TaobaoTopSecretGetResponse.go b/service/topsdk/ability304/response/TaobaoTopSecretGetResponse.go new file mode 100644 index 00000000..349294df --- /dev/null +++ b/service/topsdk/ability304/response/TaobaoTopSecretGetResponse.go @@ -0,0 +1,35 @@ +package response + +type TaobaoTopSecretGetResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + 下次更新秘钥间隔,单位(秒) + */ + Interval int64 `json:"interval,omitempty" ` + /* + 最长有效期,容灾使用,单位(秒) + */ + MaxInterval int64 `json:"max_interval,omitempty" ` + /* + 秘钥值 + */ + Secret string `json:"secret,omitempty" ` + /* + 秘钥版本号 + */ + SecretVersion int64 `json:"secret_version,omitempty" ` + /* + app配置信息 + */ + AppConfig string `json:"app_config,omitempty" ` +} diff --git a/service/topsdk/ability3261/Ability3261.go b/service/topsdk/ability3261/Ability3261.go new file mode 100644 index 00000000..6a921f79 --- /dev/null +++ b/service/topsdk/ability3261/Ability3261.go @@ -0,0 +1,58 @@ +package ability3261 + +import ( + "errors" + "log" + "topsdk" + "topsdk/ability3261/request" + "topsdk/ability3261/response" + "topsdk/util" +) + +type Ability3261 struct { + Client *topsdk.TopClient +} + +func NewAbility3261(client *topsdk.TopClient) *Ability3261 { + return &Ability3261{client} +} + +/* + 淘宝客-推广者-CPA活动执行明细 +*/ +func (ability *Ability3261) TaobaoTbkDgCpaActivityDetail(req *request.TaobaoTbkDgCpaActivityDetailRequest) (*response.TaobaoTbkDgCpaActivityDetailResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability3261 topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.tbk.dg.cpa.activity.detail", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoTbkDgCpaActivityDetailResponse{} + if err != nil { + log.Fatal("taobaoTbkDgCpaActivityDetail error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} + +/* + 淘宝客-推广者-任务奖励效果报表 +*/ +func (ability *Ability3261) TaobaoTbkDgCpaActivityReport(req *request.TaobaoTbkDgCpaActivityReportRequest) (*response.TaobaoTbkDgCpaActivityReportResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability3261 topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.tbk.dg.cpa.activity.report", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoTbkDgCpaActivityReportResponse{} + if err != nil { + log.Fatal("taobaoTbkDgCpaActivityReport error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} diff --git a/service/topsdk/ability3261/domain/TaobaoTbkDgCpaActivityDetailPageResult.go b/service/topsdk/ability3261/domain/TaobaoTbkDgCpaActivityDetailPageResult.go new file mode 100644 index 00000000..174e9949 --- /dev/null +++ b/service/topsdk/ability3261/domain/TaobaoTbkDgCpaActivityDetailPageResult.go @@ -0,0 +1,76 @@ +package domain + +type TaobaoTbkDgCpaActivityDetailPageResult struct { + /* + 数据结果 */ + Results *[]TaobaoTbkDgCpaActivityDetailResults `json:"results,omitempty" ` + + /* + 上一页页码 */ + PrePage *int64 `json:"pre_page,omitempty" ` + + /* + 下一页页码 */ + NextPage *int64 `json:"next_page,omitempty" ` + + /* + 当前页码 */ + PageNo *int64 `json:"page_no,omitempty" ` + + /* + 总共页数 */ + TotalPages *int64 `json:"total_pages,omitempty" ` + + /* + 每页条数 */ + PageSize *int64 `json:"page_size,omitempty" ` + + /* + 是否有下一页 */ + HasNext *bool `json:"has_next,omitempty" ` + + /* + 总条数 */ + TotalCount *int64 `json:"total_count,omitempty" ` + + /* + 是否有下一页 */ + HasPre *bool `json:"has_pre,omitempty" ` +} + +func (s *TaobaoTbkDgCpaActivityDetailPageResult) SetResults(v []TaobaoTbkDgCpaActivityDetailResults) *TaobaoTbkDgCpaActivityDetailPageResult { + s.Results = &v + return s +} +func (s *TaobaoTbkDgCpaActivityDetailPageResult) SetPrePage(v int64) *TaobaoTbkDgCpaActivityDetailPageResult { + s.PrePage = &v + return s +} +func (s *TaobaoTbkDgCpaActivityDetailPageResult) SetNextPage(v int64) *TaobaoTbkDgCpaActivityDetailPageResult { + s.NextPage = &v + return s +} +func (s *TaobaoTbkDgCpaActivityDetailPageResult) SetPageNo(v int64) *TaobaoTbkDgCpaActivityDetailPageResult { + s.PageNo = &v + return s +} +func (s *TaobaoTbkDgCpaActivityDetailPageResult) SetTotalPages(v int64) *TaobaoTbkDgCpaActivityDetailPageResult { + s.TotalPages = &v + return s +} +func (s *TaobaoTbkDgCpaActivityDetailPageResult) SetPageSize(v int64) *TaobaoTbkDgCpaActivityDetailPageResult { + s.PageSize = &v + return s +} +func (s *TaobaoTbkDgCpaActivityDetailPageResult) SetHasNext(v bool) *TaobaoTbkDgCpaActivityDetailPageResult { + s.HasNext = &v + return s +} +func (s *TaobaoTbkDgCpaActivityDetailPageResult) SetTotalCount(v int64) *TaobaoTbkDgCpaActivityDetailPageResult { + s.TotalCount = &v + return s +} +func (s *TaobaoTbkDgCpaActivityDetailPageResult) SetHasPre(v bool) *TaobaoTbkDgCpaActivityDetailPageResult { + s.HasPre = &v + return s +} diff --git a/service/topsdk/ability3261/domain/TaobaoTbkDgCpaActivityDetailResult.go b/service/topsdk/ability3261/domain/TaobaoTbkDgCpaActivityDetailResult.go new file mode 100644 index 00000000..168fcd29 --- /dev/null +++ b/service/topsdk/ability3261/domain/TaobaoTbkDgCpaActivityDetailResult.go @@ -0,0 +1,60 @@ +package domain + +type TaobaoTbkDgCpaActivityDetailResult struct { + /* + 错误代码 */ + BizErrorFeature *string `json:"biz_error_feature,omitempty" ` + + /* + 返回素材id */ + Data *TaobaoTbkDgCpaActivityDetailPageResult `json:"data,omitempty" ` + + /* + 是否成功 */ + Success *bool `json:"success,omitempty" ` + + /* + 结果码 */ + ResultCode *int64 `json:"result_code,omitempty" ` + + /* + 错误描述 */ + BizErrorDesc *string `json:"biz_error_desc,omitempty" ` + + /* + 错误代码 */ + BizErrorCode *int64 `json:"biz_error_code,omitempty" ` + + /* + 结果信息 */ + ResultMsg *string `json:"result_msg,omitempty" ` +} + +func (s *TaobaoTbkDgCpaActivityDetailResult) SetBizErrorFeature(v string) *TaobaoTbkDgCpaActivityDetailResult { + s.BizErrorFeature = &v + return s +} +func (s *TaobaoTbkDgCpaActivityDetailResult) SetData(v TaobaoTbkDgCpaActivityDetailPageResult) *TaobaoTbkDgCpaActivityDetailResult { + s.Data = &v + return s +} +func (s *TaobaoTbkDgCpaActivityDetailResult) SetSuccess(v bool) *TaobaoTbkDgCpaActivityDetailResult { + s.Success = &v + return s +} +func (s *TaobaoTbkDgCpaActivityDetailResult) SetResultCode(v int64) *TaobaoTbkDgCpaActivityDetailResult { + s.ResultCode = &v + return s +} +func (s *TaobaoTbkDgCpaActivityDetailResult) SetBizErrorDesc(v string) *TaobaoTbkDgCpaActivityDetailResult { + s.BizErrorDesc = &v + return s +} +func (s *TaobaoTbkDgCpaActivityDetailResult) SetBizErrorCode(v int64) *TaobaoTbkDgCpaActivityDetailResult { + s.BizErrorCode = &v + return s +} +func (s *TaobaoTbkDgCpaActivityDetailResult) SetResultMsg(v string) *TaobaoTbkDgCpaActivityDetailResult { + s.ResultMsg = &v + return s +} diff --git a/service/topsdk/ability3261/domain/TaobaoTbkDgCpaActivityDetailResults.go b/service/topsdk/ability3261/domain/TaobaoTbkDgCpaActivityDetailResults.go new file mode 100644 index 00000000..0c39dc32 --- /dev/null +++ b/service/topsdk/ability3261/domain/TaobaoTbkDgCpaActivityDetailResults.go @@ -0,0 +1,20 @@ +package domain + +type TaobaoTbkDgCpaActivityDetailResults struct { + /* + 奖励明细数据,KV结构。字段释义见文档:https://www.yuque.com/docs/share/7ecf8cf1-7f99-4633-a2ed-f9b6f8116af5?# */ + FieldDetail *string `json:"field_detail,omitempty" ` + + /* + 明细类型,1:预估明细,2:结算明细 */ + CalcType *int64 `json:"calc_type,omitempty" ` +} + +func (s *TaobaoTbkDgCpaActivityDetailResults) SetFieldDetail(v string) *TaobaoTbkDgCpaActivityDetailResults { + s.FieldDetail = &v + return s +} +func (s *TaobaoTbkDgCpaActivityDetailResults) SetCalcType(v int64) *TaobaoTbkDgCpaActivityDetailResults { + s.CalcType = &v + return s +} diff --git a/service/topsdk/ability3261/domain/TaobaoTbkDgCpaActivityReportPageResult.go b/service/topsdk/ability3261/domain/TaobaoTbkDgCpaActivityReportPageResult.go new file mode 100644 index 00000000..bb9ae915 --- /dev/null +++ b/service/topsdk/ability3261/domain/TaobaoTbkDgCpaActivityReportPageResult.go @@ -0,0 +1,12 @@ +package domain + +type TaobaoTbkDgCpaActivityReportPageResult struct { + /* + 数据列表 */ + Results *[]TaobaoTbkDgCpaActivityReportVegasCpaReportDTO `json:"results,omitempty" ` +} + +func (s *TaobaoTbkDgCpaActivityReportPageResult) SetResults(v []TaobaoTbkDgCpaActivityReportVegasCpaReportDTO) *TaobaoTbkDgCpaActivityReportPageResult { + s.Results = &v + return s +} diff --git a/service/topsdk/ability3261/domain/TaobaoTbkDgCpaActivityReportRpcResult.go b/service/topsdk/ability3261/domain/TaobaoTbkDgCpaActivityReportRpcResult.go new file mode 100644 index 00000000..69f505f8 --- /dev/null +++ b/service/topsdk/ability3261/domain/TaobaoTbkDgCpaActivityReportRpcResult.go @@ -0,0 +1,12 @@ +package domain + +type TaobaoTbkDgCpaActivityReportRpcResult struct { + /* + 分页模型 */ + Data *TaobaoTbkDgCpaActivityReportPageResult `json:"data,omitempty" ` +} + +func (s *TaobaoTbkDgCpaActivityReportRpcResult) SetData(v TaobaoTbkDgCpaActivityReportPageResult) *TaobaoTbkDgCpaActivityReportRpcResult { + s.Data = &v + return s +} diff --git a/service/topsdk/ability3261/domain/TaobaoTbkDgCpaActivityReportVegasCpaReportDTO.go b/service/topsdk/ability3261/domain/TaobaoTbkDgCpaActivityReportVegasCpaReportDTO.go new file mode 100644 index 00000000..d8ec5545 --- /dev/null +++ b/service/topsdk/ability3261/domain/TaobaoTbkDgCpaActivityReportVegasCpaReportDTO.go @@ -0,0 +1,52 @@ +package domain + +type TaobaoTbkDgCpaActivityReportVegasCpaReportDTO struct { + /* + 符合奖励要求的累计用户数;按入参是预估/结算,区分用户数为预估or可结算结果; */ + Union30dLxUv *int64 `json:"union_30d_lx_uv,omitempty" ` + + /* + 奖励金额;按入参是预估/结算,区分获得金额为预估or可结算结果; */ + RewardAmount *string `json:"reward_amount,omitempty" ` + + /* + rid,当查询数据为rid维度时返回该字段 */ + RelationId *int64 `json:"relation_id,omitempty" ` + + /* + 统计日期(统计活动期内,截止 统计日期 的数据) */ + BizDate *string `json:"biz_date,omitempty" ` + + /* + 媒体三段式id,当查询数据为pid维度时返回该字段 */ + Pid *string `json:"pid,omitempty" ` + + /* + 数据类型:1预估 2结算 */ + QueryType *int32 `json:"query_type,omitempty" ` +} + +func (s *TaobaoTbkDgCpaActivityReportVegasCpaReportDTO) SetUnion30dLxUv(v int64) *TaobaoTbkDgCpaActivityReportVegasCpaReportDTO { + s.Union30dLxUv = &v + return s +} +func (s *TaobaoTbkDgCpaActivityReportVegasCpaReportDTO) SetRewardAmount(v string) *TaobaoTbkDgCpaActivityReportVegasCpaReportDTO { + s.RewardAmount = &v + return s +} +func (s *TaobaoTbkDgCpaActivityReportVegasCpaReportDTO) SetRelationId(v int64) *TaobaoTbkDgCpaActivityReportVegasCpaReportDTO { + s.RelationId = &v + return s +} +func (s *TaobaoTbkDgCpaActivityReportVegasCpaReportDTO) SetBizDate(v string) *TaobaoTbkDgCpaActivityReportVegasCpaReportDTO { + s.BizDate = &v + return s +} +func (s *TaobaoTbkDgCpaActivityReportVegasCpaReportDTO) SetPid(v string) *TaobaoTbkDgCpaActivityReportVegasCpaReportDTO { + s.Pid = &v + return s +} +func (s *TaobaoTbkDgCpaActivityReportVegasCpaReportDTO) SetQueryType(v int32) *TaobaoTbkDgCpaActivityReportVegasCpaReportDTO { + s.QueryType = &v + return s +} diff --git a/service/topsdk/ability3261/request/TaobaoTbkDgCpaActivityDetailRequest.go b/service/topsdk/ability3261/request/TaobaoTbkDgCpaActivityDetailRequest.go new file mode 100644 index 00000000..0853e817 --- /dev/null +++ b/service/topsdk/ability3261/request/TaobaoTbkDgCpaActivityDetailRequest.go @@ -0,0 +1,65 @@ +package request + +type TaobaoTbkDgCpaActivityDetailRequest struct { + /* + 明细类型,1:预估明细,2:结算明细 defalutValue��1 */ + QueryType *int64 `json:"query_type,omitempty" required:"false" ` + /* + 每页条数 defalutValue��10 */ + PageSize *int64 `json:"page_size,omitempty" required:"false" ` + /* + 页码 defalutValue��1 */ + PageNo *int64 `json:"page_no,omitempty" required:"false" ` + /* + CPA活动ID */ + EventId *int64 `json:"event_id" required:"true" ` + /* + CPA活动奖励的统计口径,相关说明见文档:https://www.yuque.com/docs/share/7ecf8cf1-7f99-4633-a2ed-f9b6f8116af5?# */ + IndicatorAlias *string `json:"indicator_alias,omitempty" required:"false" ` +} + +func (s *TaobaoTbkDgCpaActivityDetailRequest) SetQueryType(v int64) *TaobaoTbkDgCpaActivityDetailRequest { + s.QueryType = &v + return s +} +func (s *TaobaoTbkDgCpaActivityDetailRequest) SetPageSize(v int64) *TaobaoTbkDgCpaActivityDetailRequest { + s.PageSize = &v + return s +} +func (s *TaobaoTbkDgCpaActivityDetailRequest) SetPageNo(v int64) *TaobaoTbkDgCpaActivityDetailRequest { + s.PageNo = &v + return s +} +func (s *TaobaoTbkDgCpaActivityDetailRequest) SetEventId(v int64) *TaobaoTbkDgCpaActivityDetailRequest { + s.EventId = &v + return s +} +func (s *TaobaoTbkDgCpaActivityDetailRequest) SetIndicatorAlias(v string) *TaobaoTbkDgCpaActivityDetailRequest { + s.IndicatorAlias = &v + return s +} + +func (req *TaobaoTbkDgCpaActivityDetailRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.QueryType != nil { + paramMap["query_type"] = *req.QueryType + } + if req.PageSize != nil { + paramMap["page_size"] = *req.PageSize + } + if req.PageNo != nil { + paramMap["page_no"] = *req.PageNo + } + if req.EventId != nil { + paramMap["event_id"] = *req.EventId + } + if req.IndicatorAlias != nil { + paramMap["indicator_alias"] = *req.IndicatorAlias + } + return paramMap +} + +func (req *TaobaoTbkDgCpaActivityDetailRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability3261/request/TaobaoTbkDgCpaActivityReportRequest.go b/service/topsdk/ability3261/request/TaobaoTbkDgCpaActivityReportRequest.go new file mode 100644 index 00000000..eb62c3bc --- /dev/null +++ b/service/topsdk/ability3261/request/TaobaoTbkDgCpaActivityReportRequest.go @@ -0,0 +1,85 @@ +package request + +type TaobaoTbkDgCpaActivityReportRequest struct { + /* + CPA活动ID,详见https://www.yuque.com/docs/share/16905f3f-3a22-4e7c-b8c3-4d23791d42f7?# */ + EventId *int64 `json:"event_id" required:"true" ` + /* + 日期(yyyyMMdd) */ + BizDate *string `json:"biz_date" required:"true" ` + /* + 分页页数,从1开始 */ + PageNo *int32 `json:"page_no,omitempty" required:"false" ` + /* + 数据类型:数据类型:1预估 2结算 (选择1可查询含当天实时预估统计的累计数据,选择2可查询最晚截止昨天结算的累计数据,具体逻辑以活动规则描述为准;) defalutValue��1 */ + QueryType *int32 `json:"query_type,omitempty" required:"false" ` + /* + 分页大小 */ + PageSize *int32 `json:"page_size,omitempty" required:"false" ` + /* + 媒体三段式id(如果传入pid则返回pid汇总数据,不传则返回member维度统计数据,pid和relationid不可同时传入) */ + Pid *string `json:"pid,omitempty" required:"false" ` + /* + 代理id(如果传入rid则返回rid统计数据,不传则返回member维度统计数据) */ + RelationId *int64 `json:"relation_id,omitempty" required:"false" ` +} + +func (s *TaobaoTbkDgCpaActivityReportRequest) SetEventId(v int64) *TaobaoTbkDgCpaActivityReportRequest { + s.EventId = &v + return s +} +func (s *TaobaoTbkDgCpaActivityReportRequest) SetBizDate(v string) *TaobaoTbkDgCpaActivityReportRequest { + s.BizDate = &v + return s +} +func (s *TaobaoTbkDgCpaActivityReportRequest) SetPageNo(v int32) *TaobaoTbkDgCpaActivityReportRequest { + s.PageNo = &v + return s +} +func (s *TaobaoTbkDgCpaActivityReportRequest) SetQueryType(v int32) *TaobaoTbkDgCpaActivityReportRequest { + s.QueryType = &v + return s +} +func (s *TaobaoTbkDgCpaActivityReportRequest) SetPageSize(v int32) *TaobaoTbkDgCpaActivityReportRequest { + s.PageSize = &v + return s +} +func (s *TaobaoTbkDgCpaActivityReportRequest) SetPid(v string) *TaobaoTbkDgCpaActivityReportRequest { + s.Pid = &v + return s +} +func (s *TaobaoTbkDgCpaActivityReportRequest) SetRelationId(v int64) *TaobaoTbkDgCpaActivityReportRequest { + s.RelationId = &v + return s +} + +func (req *TaobaoTbkDgCpaActivityReportRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.EventId != nil { + paramMap["event_id"] = *req.EventId + } + if req.BizDate != nil { + paramMap["biz_date"] = *req.BizDate + } + if req.PageNo != nil { + paramMap["page_no"] = *req.PageNo + } + if req.QueryType != nil { + paramMap["query_type"] = *req.QueryType + } + if req.PageSize != nil { + paramMap["page_size"] = *req.PageSize + } + if req.Pid != nil { + paramMap["pid"] = *req.Pid + } + if req.RelationId != nil { + paramMap["relation_id"] = *req.RelationId + } + return paramMap +} + +func (req *TaobaoTbkDgCpaActivityReportRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability3261/response/TaobaoTbkDgCpaActivityDetailResponse.go b/service/topsdk/ability3261/response/TaobaoTbkDgCpaActivityDetailResponse.go new file mode 100644 index 00000000..1be55525 --- /dev/null +++ b/service/topsdk/ability3261/response/TaobaoTbkDgCpaActivityDetailResponse.go @@ -0,0 +1,23 @@ +package response + +import ( + "topsdk/ability3261/domain" +) + +type TaobaoTbkDgCpaActivityDetailResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + 接口返回model + */ + Result domain.TaobaoTbkDgCpaActivityDetailResult `json:"result,omitempty" ` +} diff --git a/service/topsdk/ability3261/response/TaobaoTbkDgCpaActivityReportResponse.go b/service/topsdk/ability3261/response/TaobaoTbkDgCpaActivityReportResponse.go new file mode 100644 index 00000000..c25e7834 --- /dev/null +++ b/service/topsdk/ability3261/response/TaobaoTbkDgCpaActivityReportResponse.go @@ -0,0 +1,23 @@ +package response + +import ( + "topsdk/ability3261/domain" +) + +type TaobaoTbkDgCpaActivityReportResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + 返回模型 + */ + Result domain.TaobaoTbkDgCpaActivityReportRpcResult `json:"result,omitempty" ` +} diff --git a/service/topsdk/ability3280/Ability3280.go b/service/topsdk/ability3280/Ability3280.go new file mode 100644 index 00000000..577d3837 --- /dev/null +++ b/service/topsdk/ability3280/Ability3280.go @@ -0,0 +1,38 @@ +package ability3280 + +import ( + "errors" + "log" + "topsdk" + "topsdk/ability3280/request" + "topsdk/ability3280/response" + "topsdk/util" +) + +type Ability3280 struct { + Client *topsdk.TopClient +} + +func NewAbility3280(client *topsdk.TopClient) *Ability3280 { + return &Ability3280{client} +} + +/* + 淘宝客-推广者-淘口令回流数据查询 +*/ +func (ability *Ability3280) TaobaoTbkDgTpwdReportGet(req *request.TaobaoTbkDgTpwdReportGetRequest) (*response.TaobaoTbkDgTpwdReportGetResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability3280 topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.tbk.dg.tpwd.report.get", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoTbkDgTpwdReportGetResponse{} + if err != nil { + log.Fatal("taobaoTbkDgTpwdReportGet error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} diff --git a/service/topsdk/ability3280/domain/TaobaoTbkDgTpwdReportGetMapData.go b/service/topsdk/ability3280/domain/TaobaoTbkDgTpwdReportGetMapData.go new file mode 100644 index 00000000..58b718ae --- /dev/null +++ b/service/topsdk/ability3280/domain/TaobaoTbkDgTpwdReportGetMapData.go @@ -0,0 +1,36 @@ +package domain + +type TaobaoTbkDgTpwdReportGetMapData struct { + /* + 截止查询时刻近1小时回流pv */ + HourPv *int64 `json:"hour_pv,omitempty" ` + + /* + 截止查询时刻近1小时回流uv */ + HourUv *int64 `json:"hour_uv,omitempty" ` + + /* + 今日截止查询时刻累计uv */ + Uv *int64 `json:"uv,omitempty" ` + + /* + 今日截止查询时刻累计pv */ + Pv *int64 `json:"pv,omitempty" ` +} + +func (s *TaobaoTbkDgTpwdReportGetMapData) SetHourPv(v int64) *TaobaoTbkDgTpwdReportGetMapData { + s.HourPv = &v + return s +} +func (s *TaobaoTbkDgTpwdReportGetMapData) SetHourUv(v int64) *TaobaoTbkDgTpwdReportGetMapData { + s.HourUv = &v + return s +} +func (s *TaobaoTbkDgTpwdReportGetMapData) SetUv(v int64) *TaobaoTbkDgTpwdReportGetMapData { + s.Uv = &v + return s +} +func (s *TaobaoTbkDgTpwdReportGetMapData) SetPv(v int64) *TaobaoTbkDgTpwdReportGetMapData { + s.Pv = &v + return s +} diff --git a/service/topsdk/ability3280/request/TaobaoTbkDgTpwdReportGetRequest.go b/service/topsdk/ability3280/request/TaobaoTbkDgTpwdReportGetRequest.go new file mode 100644 index 00000000..ce9caaf6 --- /dev/null +++ b/service/topsdk/ability3280/request/TaobaoTbkDgTpwdReportGetRequest.go @@ -0,0 +1,35 @@ +package request + +type TaobaoTbkDgTpwdReportGetRequest struct { + /* + 待查询的口令 */ + TaoPassword *string `json:"tao_password" required:"true" ` + /* + mm_xxx_xxx_xxx的第3段数字 */ + AdzoneId *string `json:"adzone_id" required:"true" ` +} + +func (s *TaobaoTbkDgTpwdReportGetRequest) SetTaoPassword(v string) *TaobaoTbkDgTpwdReportGetRequest { + s.TaoPassword = &v + return s +} +func (s *TaobaoTbkDgTpwdReportGetRequest) SetAdzoneId(v string) *TaobaoTbkDgTpwdReportGetRequest { + s.AdzoneId = &v + return s +} + +func (req *TaobaoTbkDgTpwdReportGetRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.TaoPassword != nil { + paramMap["tao_password"] = *req.TaoPassword + } + if req.AdzoneId != nil { + paramMap["adzone_id"] = *req.AdzoneId + } + return paramMap +} + +func (req *TaobaoTbkDgTpwdReportGetRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability3280/response/TaobaoTbkDgTpwdReportGetResponse.go b/service/topsdk/ability3280/response/TaobaoTbkDgTpwdReportGetResponse.go new file mode 100644 index 00000000..86d59ff0 --- /dev/null +++ b/service/topsdk/ability3280/response/TaobaoTbkDgTpwdReportGetResponse.go @@ -0,0 +1,23 @@ +package response + +import ( + "topsdk/ability3280/domain" +) + +type TaobaoTbkDgTpwdReportGetResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + 返回结果 + */ + Data domain.TaobaoTbkDgTpwdReportGetMapData `json:"data,omitempty" ` +} diff --git a/service/topsdk/ability369/Ability369.go b/service/topsdk/ability369/Ability369.go new file mode 100644 index 00000000..89ab1f77 --- /dev/null +++ b/service/topsdk/ability369/Ability369.go @@ -0,0 +1,58 @@ +package ability369 + +import ( + "errors" + "log" + "topsdk" + "topsdk/ability369/request" + "topsdk/ability369/response" + "topsdk/util" +) + +type Ability369 struct { + Client *topsdk.TopClient +} + +func NewAbility369(client *topsdk.TopClient) *Ability369 { + return &Ability369{client} +} + +/* + 淘宝客-推广者-物料精选 +*/ +func (ability *Ability369) TaobaoTbkDgOptimusMaterial(req *request.TaobaoTbkDgOptimusMaterialRequest) (*response.TaobaoTbkDgOptimusMaterialResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability369 topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.tbk.dg.optimus.material", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoTbkDgOptimusMaterialResponse{} + if err != nil { + log.Fatal("taobaoTbkDgOptimusMaterial error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} + +/* + 淘宝客-推广者-权益物料精选 +*/ +func (ability *Ability369) TaobaoTbkDgOptimusPromotion(req *request.TaobaoTbkDgOptimusPromotionRequest) (*response.TaobaoTbkDgOptimusPromotionResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability369 topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.tbk.dg.optimus.promotion", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoTbkDgOptimusPromotionResponse{} + if err != nil { + log.Fatal("taobaoTbkDgOptimusPromotion error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} diff --git a/service/topsdk/ability369/domain/TaobaoTbkDgOptimusMaterialBybtInfoDTO.go b/service/topsdk/ability369/domain/TaobaoTbkDgOptimusMaterialBybtInfoDTO.go new file mode 100644 index 00000000..8b82b427 --- /dev/null +++ b/service/topsdk/ability369/domain/TaobaoTbkDgOptimusMaterialBybtInfoDTO.go @@ -0,0 +1,68 @@ +package domain + +type TaobaoTbkDgOptimusMaterialBybtInfoDTO struct { + /* + 百亿补贴品牌logo */ + BybtBrandLogo *string `json:"bybt_brand_logo,omitempty" ` + + /* + 百亿补贴白底图 */ + BybtPicUrl *string `json:"bybt_pic_url,omitempty" ` + + /* + 百亿补贴商品特征标签,eg.今日发货、晚发补偿、限购一件等 */ + BybtItemTags *[]string `json:"bybt_item_tags,omitempty" ` + + /* + 百亿补贴专属券面额,仅限百亿补贴场景透出 */ + BybtCouponAmount *string `json:"bybt_coupon_amount,omitempty" ` + + /* + 百亿补贴页面实时价 */ + BybtShowPrice *string `json:"bybt_show_price,omitempty" ` + + /* + 全网对比参考价格 */ + BybtLowestPrice *string `json:"bybt_lowest_price,omitempty" ` + + /* + 商品的百亿补贴开始时间 */ + BybtEndTime *string `json:"bybt_end_time,omitempty" ` + + /* + 商品的百亿补贴结束时间 */ + BybtStartTime *string `json:"bybt_start_time,omitempty" ` +} + +func (s *TaobaoTbkDgOptimusMaterialBybtInfoDTO) SetBybtBrandLogo(v string) *TaobaoTbkDgOptimusMaterialBybtInfoDTO { + s.BybtBrandLogo = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialBybtInfoDTO) SetBybtPicUrl(v string) *TaobaoTbkDgOptimusMaterialBybtInfoDTO { + s.BybtPicUrl = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialBybtInfoDTO) SetBybtItemTags(v []string) *TaobaoTbkDgOptimusMaterialBybtInfoDTO { + s.BybtItemTags = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialBybtInfoDTO) SetBybtCouponAmount(v string) *TaobaoTbkDgOptimusMaterialBybtInfoDTO { + s.BybtCouponAmount = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialBybtInfoDTO) SetBybtShowPrice(v string) *TaobaoTbkDgOptimusMaterialBybtInfoDTO { + s.BybtShowPrice = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialBybtInfoDTO) SetBybtLowestPrice(v string) *TaobaoTbkDgOptimusMaterialBybtInfoDTO { + s.BybtLowestPrice = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialBybtInfoDTO) SetBybtEndTime(v string) *TaobaoTbkDgOptimusMaterialBybtInfoDTO { + s.BybtEndTime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialBybtInfoDTO) SetBybtStartTime(v string) *TaobaoTbkDgOptimusMaterialBybtInfoDTO { + s.BybtStartTime = &v + return s +} diff --git a/service/topsdk/ability369/domain/TaobaoTbkDgOptimusMaterialFavoritesDetail.go b/service/topsdk/ability369/domain/TaobaoTbkDgOptimusMaterialFavoritesDetail.go new file mode 100644 index 00000000..f500f28e --- /dev/null +++ b/service/topsdk/ability369/domain/TaobaoTbkDgOptimusMaterialFavoritesDetail.go @@ -0,0 +1,20 @@ +package domain + +type TaobaoTbkDgOptimusMaterialFavoritesDetail struct { + /* + 选品库id */ + FavoritesId *int64 `json:"favorites_id,omitempty" ` + + /* + 选品库标题 */ + FavoritesTitle *string `json:"favorites_title,omitempty" ` +} + +func (s *TaobaoTbkDgOptimusMaterialFavoritesDetail) SetFavoritesId(v int64) *TaobaoTbkDgOptimusMaterialFavoritesDetail { + s.FavoritesId = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialFavoritesDetail) SetFavoritesTitle(v string) *TaobaoTbkDgOptimusMaterialFavoritesDetail { + s.FavoritesTitle = &v + return s +} diff --git a/service/topsdk/ability369/domain/TaobaoTbkDgOptimusMaterialFavoritesInfo.go b/service/topsdk/ability369/domain/TaobaoTbkDgOptimusMaterialFavoritesInfo.go new file mode 100644 index 00000000..9b9753d1 --- /dev/null +++ b/service/topsdk/ability369/domain/TaobaoTbkDgOptimusMaterialFavoritesInfo.go @@ -0,0 +1,20 @@ +package domain + +type TaobaoTbkDgOptimusMaterialFavoritesInfo struct { + /* + 选品库总数量 */ + TotalCount *int64 `json:"total_count,omitempty" ` + + /* + 选品库详细信息 */ + FavoritesList *[]TaobaoTbkDgOptimusMaterialFavoritesDetail `json:"favorites_list,omitempty" ` +} + +func (s *TaobaoTbkDgOptimusMaterialFavoritesInfo) SetTotalCount(v int64) *TaobaoTbkDgOptimusMaterialFavoritesInfo { + s.TotalCount = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialFavoritesInfo) SetFavoritesList(v []TaobaoTbkDgOptimusMaterialFavoritesDetail) *TaobaoTbkDgOptimusMaterialFavoritesInfo { + s.FavoritesList = &v + return s +} diff --git a/service/topsdk/ability369/domain/TaobaoTbkDgOptimusMaterialMaifanPromotionDTO.go b/service/topsdk/ability369/domain/TaobaoTbkDgOptimusMaterialMaifanPromotionDTO.go new file mode 100644 index 00000000..ace321d3 --- /dev/null +++ b/service/topsdk/ability369/domain/TaobaoTbkDgOptimusMaterialMaifanPromotionDTO.go @@ -0,0 +1,36 @@ +package domain + +type TaobaoTbkDgOptimusMaterialMaifanPromotionDTO struct { + /* + 猫超买返卡活动结束时间 */ + MaifanPromotionEndTime *string `json:"maifan_promotion_end_time,omitempty" ` + + /* + 猫超买返卡活动开始时间 */ + MaifanPromotionStartTime *string `json:"maifan_promotion_start_time,omitempty" ` + + /* + 猫超买返卡面额 */ + MaifanPromotionDiscount *string `json:"maifan_promotion_discount,omitempty" ` + + /* + 猫超买返卡总数,-1代表不限量,其他大于等于0的值为总数 */ + MaifanPromotionCondition *string `json:"maifan_promotion_condition,omitempty" ` +} + +func (s *TaobaoTbkDgOptimusMaterialMaifanPromotionDTO) SetMaifanPromotionEndTime(v string) *TaobaoTbkDgOptimusMaterialMaifanPromotionDTO { + s.MaifanPromotionEndTime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMaifanPromotionDTO) SetMaifanPromotionStartTime(v string) *TaobaoTbkDgOptimusMaterialMaifanPromotionDTO { + s.MaifanPromotionStartTime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMaifanPromotionDTO) SetMaifanPromotionDiscount(v string) *TaobaoTbkDgOptimusMaterialMaifanPromotionDTO { + s.MaifanPromotionDiscount = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMaifanPromotionDTO) SetMaifanPromotionCondition(v string) *TaobaoTbkDgOptimusMaterialMaifanPromotionDTO { + s.MaifanPromotionCondition = &v + return s +} diff --git a/service/topsdk/ability369/domain/TaobaoTbkDgOptimusMaterialMapData.go b/service/topsdk/ability369/domain/TaobaoTbkDgOptimusMaterialMapData.go new file mode 100644 index 00000000..cbb682be --- /dev/null +++ b/service/topsdk/ability369/domain/TaobaoTbkDgOptimusMaterialMapData.go @@ -0,0 +1,788 @@ +package domain + +type TaobaoTbkDgOptimusMaterialMapData struct { + /* + 优惠券(元) 若属于预售商品,该优惠券付尾款可用,付定金不可用 */ + CouponAmount *int64 `json:"coupon_amount,omitempty" ` + + /* + 商品信息-商品小图列表 */ + SmallImages *[]string `json:"small_images,omitempty" ` + + /* + 店铺信息-店铺名称 */ + ShopTitle *string `json:"shop_title,omitempty" ` + + /* + 商品信息-叶子类目id */ + CategoryId *int64 `json:"category_id,omitempty" ` + + /* + 优惠券信息-优惠券起用门槛,满X元可用。如:满299元减20元 */ + CouponStartFee *string `json:"coupon_start_fee,omitempty" ` + + /* + 商品信息-宝贝id */ + ItemId *int64 `json:"item_id,omitempty" ` + + /* + 优惠券信息-优惠券总量 */ + CouponTotalCount *int64 `json:"coupon_total_count,omitempty" ` + + /* + 店铺信息-卖家类型,0表示淘宝,1表示天猫,3表示特价版 */ + UserType *int32 `json:"user_type,omitempty" ` + + /* + 折扣价(元) 若属于预售商品,付定金时间内,折扣价=预售价 */ + ZkFinalPrice *string `json:"zk_final_price,omitempty" ` + + /* + 优惠券信息-优惠券剩余量 */ + CouponRemainCount *int64 `json:"coupon_remain_count,omitempty" ` + + /* + 商品信息-佣金比率(%) */ + CommissionRate *string `json:"commission_rate,omitempty" ` + + /* + 优惠券信息-优惠券开始时间 */ + CouponStartTime *string `json:"coupon_start_time,omitempty" ` + + /* + 商品信息-商品标题 */ + Title *string `json:"title,omitempty" ` + + /* + 商品信息-宝贝描述(推荐理由,不一定有) */ + ItemDescription *string `json:"item_description,omitempty" ` + + /* + 店铺信息-卖家id */ + SellerId *int64 `json:"seller_id,omitempty" ` + + /* + 商品信息-30天销量 */ + Volume *int64 `json:"volume,omitempty" ` + + /* + 优惠券信息-优惠券结束时间 */ + CouponEndTime *string `json:"coupon_end_time,omitempty" ` + + /* + 链接-宝贝+券二合一页面链接(该字段废弃,请勿再用) */ + CouponClickUrl *string `json:"coupon_click_url,omitempty" ` + + /* + 商品信息-商品主图 */ + PictUrl *string `json:"pict_url,omitempty" ` + + /* + 链接-宝贝推广链接 */ + ClickUrl *string `json:"click_url,omitempty" ` + + /* + 拼团专用-拼团剩余库存 */ + Stock *int64 `json:"stock,omitempty" ` + + /* + 拼团专用-拼团已售数量 */ + SellNum *int64 `json:"sell_num,omitempty" ` + + /* + 拼团专用-拼团库存数量 */ + TotalStock *int64 `json:"total_stock,omitempty" ` + + /* + 拼团专用-拼团结束时间 */ + Oetime *string `json:"oetime,omitempty" ` + + /* + 拼团专用-拼团开始时间 */ + Ostime *string `json:"ostime,omitempty" ` + + /* + 拼团专用-拼团几人团 */ + JddNum *int64 `json:"jdd_num,omitempty" ` + + /* + 拼团专用-拼团拼成价,单位元 */ + JddPrice *string `json:"jdd_price,omitempty" ` + + /* + 拼团专用-拼团一人价(原价),单位元 */ + OrigPrice *string `json:"orig_price,omitempty" ` + + /* + 商品信息-一级类目名称 */ + LevelOneCategoryName *string `json:"level_one_category_name,omitempty" ` + + /* + 商品信息-一级类目ID */ + LevelOneCategoryId *int64 `json:"level_one_category_id,omitempty" ` + + /* + 商品信息-叶子类目名称 */ + CategoryName *string `json:"category_name,omitempty" ` + + /* + 商品信息-商品白底图 */ + WhiteImage *string `json:"white_image,omitempty" ` + + /* + 商品信息-商品短标题 */ + ShortTitle *string `json:"short_title,omitempty" ` + + /* + 商品信息-商品关联词 */ + WordList *[]TaobaoTbkDgOptimusMaterialWordMapData `json:"word_list,omitempty" ` + + /* + 营销-天猫营销玩法 */ + TmallPlayActivityInfo *string `json:"tmall_play_activity_info,omitempty" ` + + /* + 商品信息-预售数量 */ + UvSumPreSale *int64 `json:"uv_sum_pre_sale,omitempty" ` + + /* + 物料块id(测试中请勿使用) */ + XId *string `json:"x_id,omitempty" ` + + /* + 商品信息-新人价 */ + NewUserPrice *string `json:"new_user_price,omitempty" ` + + /* + 优惠券信息-优惠券满减信息 */ + CouponInfo *string `json:"coupon_info,omitempty" ` + + /* + 链接-宝贝+券二合一页面链接 */ + CouponShareUrl *string `json:"coupon_share_url,omitempty" ` + + /* + 店铺信息-卖家昵称 */ + Nick *string `json:"nick,omitempty" ` + + /* + 商品信息-一口价 */ + ReservePrice *string `json:"reserve_price,omitempty" ` + + /* + 聚划算信息-聚淘结束时间 */ + JuOnlineEndTime *string `json:"ju_online_end_time,omitempty" ` + + /* + 聚划算信息-聚淘开始时间 */ + JuOnlineStartTime *string `json:"ju_online_start_time,omitempty" ` + + /* + 猫超玩法信息-活动结束时间,精确到毫秒 */ + MaochaoPlayEndTime *string `json:"maochao_play_end_time,omitempty" ` + + /* + 猫超玩法信息-活动开始时间,精确到毫秒 */ + MaochaoPlayStartTime *string `json:"maochao_play_start_time,omitempty" ` + + /* + 猫超玩法信息-折扣条件,价格百分数存储,件数按数量存储。可以有多个折扣条件,与折扣字段对应,','分割 */ + MaochaoPlayConditions *string `json:"maochao_play_conditions,omitempty" ` + + /* + 猫超玩法信息-折扣,折扣按照百分数存储,其余按照单位分存储。可以有多个折扣,','分割 */ + MaochaoPlayDiscounts *string `json:"maochao_play_discounts,omitempty" ` + + /* + 猫超玩法信息-玩法类型,2:折扣(满n件折扣),5:减钱(满n元减m元) */ + MaochaoPlayDiscountType *string `json:"maochao_play_discount_type,omitempty" ` + + /* + 猫超玩法信息-当前是否包邮,1:是,0:否 */ + MaochaoPlayFreePostFee *string `json:"maochao_play_free_post_fee,omitempty" ` + + /* + 多件券优惠比例 */ + MultiCouponZkRate *string `json:"multi_coupon_zk_rate,omitempty" ` + + /* + 多件券件单价 */ + PriceAfterMultiCoupon *string `json:"price_after_multi_coupon,omitempty" ` + + /* + 多件券单品件数 */ + MultiCouponItemCount *string `json:"multi_coupon_item_count,omitempty" ` + + /* + 锁住的佣金率 */ + LockRate *string `json:"lock_rate,omitempty" ` + + /* + 锁佣结束时间 */ + LockRateEndTime *int64 `json:"lock_rate_end_time,omitempty" ` + + /* + 锁佣开始时间 */ + LockRateStartTime *int64 `json:"lock_rate_start_time,omitempty" ` + + /* + 满减满折的类型(1. 满减 2. 满折) */ + PromotionType *string `json:"promotion_type,omitempty" ` + + /* + 满减满折信息 */ + PromotionInfo *string `json:"promotion_info,omitempty" ` + + /* + 满减满折门槛(满2件打5折中值为2;满300减20中值为300) */ + PromotionDiscount *string `json:"promotion_discount,omitempty" ` + + /* + 满减满折优惠(满2件打5折中值为5;满300减20中值为20) */ + PromotionCondition *string `json:"promotion_condition,omitempty" ` + + /* + 预售商品-优惠信息 */ + PresaleDiscountFeeText *string `json:"presale_discount_fee_text,omitempty" ` + + /* + 预售商品-付尾款结束时间(毫秒) */ + PresaleTailEndTime *int64 `json:"presale_tail_end_time,omitempty" ` + + /* + 预售商品-付尾款开始时间(毫秒) */ + PresaleTailStartTime *int64 `json:"presale_tail_start_time,omitempty" ` + + /* + 预售商品-付定金结束时间(毫秒) */ + PresaleEndTime *int64 `json:"presale_end_time,omitempty" ` + + /* + 预售商品-付定金开始时间(毫秒) */ + PresaleStartTime *int64 `json:"presale_start_time,omitempty" ` + + /* + 预售商品-定金(元) */ + PresaleDeposit *string `json:"presale_deposit,omitempty" ` + + /* + 预售有礼-淘礼金使用开始时间 */ + YsylTljUseStartTime *string `json:"ysyl_tlj_use_start_time,omitempty" ` + + /* + 预售有礼-佣金比例( 预售有礼活动享受的推广佣金比例,注:推广该活动有特殊分成规则,请详见:https://tbk.bbs.taobao.com/detail.html?appId=45301&postId=9334376 ) */ + YsylCommissionRate *string `json:"ysyl_commission_rate,omitempty" ` + + /* + 预售有礼-淘礼金发放时间 */ + YsylTljSendTime *string `json:"ysyl_tlj_send_time,omitempty" ` + + /* + 预售有礼-预估淘礼金(元) */ + YsylTljFace *string `json:"ysyl_tlj_face,omitempty" ` + + /* + 预售有礼-推广链接 */ + YsylClickUrl *string `json:"ysyl_click_url,omitempty" ` + + /* + 预售有礼-淘礼金使用结束时间 */ + YsylTljUseEndTime *string `json:"ysyl_tlj_use_end_time,omitempty" ` + + /* + 聚划算满减 -结束时间(毫秒) */ + JuPlayEndTime *int64 `json:"ju_play_end_time,omitempty" ` + + /* + 聚划算满减 -开始时间(毫秒) */ + JuPlayStartTime *int64 `json:"ju_play_start_time,omitempty" ` + + /* + 1聚划算满减:满N件减X元,满N件X折,满N件X元) 2天猫限时抢:前N分钟每件X元,前N分钟满N件每件X元,前N件每件X元) */ + PlayInfo *string `json:"play_info,omitempty" ` + + /* + 天猫限时抢可售 -结束时间(毫秒) */ + TmallPlayActivityEndTime *int64 `json:"tmall_play_activity_end_time,omitempty" ` + + /* + 天猫限时抢可售 -开始时间(毫秒) */ + TmallPlayActivityStartTime *int64 `json:"tmall_play_activity_start_time,omitempty" ` + + /* + 聚划算信息-商品预热开始时间(毫秒) */ + JuPreShowEndTime *string `json:"ju_pre_show_end_time,omitempty" ` + + /* + 聚划算信息-商品预热结束时间(毫秒) */ + JuPreShowStartTime *string `json:"ju_pre_show_start_time,omitempty" ` + + /* + 选品库信息 */ + FavoritesInfo *TaobaoTbkDgOptimusMaterialFavoritesInfo `json:"favorites_info,omitempty" ` + + /* + 活动价 */ + SalePrice *string `json:"sale_price,omitempty" ` + + /* + 跨店满减信息 */ + KuadianPromotionInfo *string `json:"kuadian_promotion_info,omitempty" ` + + /* + 商品子标题 */ + SubTitle *string `json:"sub_title,omitempty" ` + + /* + 聚划算商品价格卖点描述 */ + JhsPriceUspList *string `json:"jhs_price_usp_list,omitempty" ` + + /* + 淘抢购商品专用-结束时间 */ + TqgOnlineEndTime *string `json:"tqg_online_end_time,omitempty" ` + + /* + 淘抢购商品专用-开团时间 */ + TqgOnlineStartTime *string `json:"tqg_online_start_time,omitempty" ` + + /* + 淘抢购商品专用-已抢购数量 */ + TqgSoldCount *int64 `json:"tqg_sold_count,omitempty" ` + + /* + 淘抢购商品专用-总库存 */ + TqgTotalCount *int64 `json:"tqg_total_count,omitempty" ` + + /* + 是否品牌精选,0不是,1是 */ + SuperiorBrand *string `json:"superior_brand,omitempty" ` + + /* + 是否品牌快抢,0不是,1是 */ + IsBrandFlashSale *string `json:"is_brand_flash_sale,omitempty" ` + + /* + 是否是热门商品,0不是,1是 */ + HotFlag *string `json:"hot_flag,omitempty" ` + + /* + 前N件佣金信息-前N件佣金生效或预热时透出以下字段 */ + TopnInfo *TaobaoTbkDgOptimusMaterialTopNInfoDTO `json:"topn_info,omitempty" ` + + /* + 百亿补贴信息 */ + BybtInfo *TaobaoTbkDgOptimusMaterialBybtInfoDTO `json:"bybt_info,omitempty" ` + + /* + 商品入驻淘特后产生的所有销量量级,不特指某段具体时间 */ + TtSoldCount *string `json:"tt_sold_count,omitempty" ` + + /* + 猫超买返卡信息 */ + MaifanPromotion *TaobaoTbkDgOptimusMaterialMaifanPromotionDTO `json:"maifan_promotion,omitempty" ` + + /* + 额外奖励活动类型,如果一个商品有多个奖励类型,返回结果使用空格分割,0=单单奖励(已失效),1=超级单单奖励(已失效),2=年货节单单奖励 */ + CpaRewardType *string `json:"cpa_reward_type,omitempty" ` + + /* + 额外奖励活动金额,活动奖励金额的类型与cpa_reward_type字段对应,如果一个商品有多个奖励类型,返回结果使用空格分割 */ + CpaRewardAmount *string `json:"cpa_reward_amount,omitempty" ` + + /* + 合作伙伴单单补ID,用作“年货节超级单单补”活动合作伙伴奖励统计依据 */ + ActivityId *string `json:"activity_id,omitempty" ` +} + +func (s *TaobaoTbkDgOptimusMaterialMapData) SetCouponAmount(v int64) *TaobaoTbkDgOptimusMaterialMapData { + s.CouponAmount = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetSmallImages(v []string) *TaobaoTbkDgOptimusMaterialMapData { + s.SmallImages = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetShopTitle(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.ShopTitle = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetCategoryId(v int64) *TaobaoTbkDgOptimusMaterialMapData { + s.CategoryId = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetCouponStartFee(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.CouponStartFee = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetItemId(v int64) *TaobaoTbkDgOptimusMaterialMapData { + s.ItemId = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetCouponTotalCount(v int64) *TaobaoTbkDgOptimusMaterialMapData { + s.CouponTotalCount = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetUserType(v int32) *TaobaoTbkDgOptimusMaterialMapData { + s.UserType = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetZkFinalPrice(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.ZkFinalPrice = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetCouponRemainCount(v int64) *TaobaoTbkDgOptimusMaterialMapData { + s.CouponRemainCount = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetCommissionRate(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.CommissionRate = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetCouponStartTime(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.CouponStartTime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetTitle(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.Title = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetItemDescription(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.ItemDescription = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetSellerId(v int64) *TaobaoTbkDgOptimusMaterialMapData { + s.SellerId = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetVolume(v int64) *TaobaoTbkDgOptimusMaterialMapData { + s.Volume = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetCouponEndTime(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.CouponEndTime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetCouponClickUrl(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.CouponClickUrl = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetPictUrl(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.PictUrl = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetClickUrl(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.ClickUrl = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetStock(v int64) *TaobaoTbkDgOptimusMaterialMapData { + s.Stock = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetSellNum(v int64) *TaobaoTbkDgOptimusMaterialMapData { + s.SellNum = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetTotalStock(v int64) *TaobaoTbkDgOptimusMaterialMapData { + s.TotalStock = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetOetime(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.Oetime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetOstime(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.Ostime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetJddNum(v int64) *TaobaoTbkDgOptimusMaterialMapData { + s.JddNum = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetJddPrice(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.JddPrice = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetOrigPrice(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.OrigPrice = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetLevelOneCategoryName(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.LevelOneCategoryName = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetLevelOneCategoryId(v int64) *TaobaoTbkDgOptimusMaterialMapData { + s.LevelOneCategoryId = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetCategoryName(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.CategoryName = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetWhiteImage(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.WhiteImage = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetShortTitle(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.ShortTitle = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetWordList(v []TaobaoTbkDgOptimusMaterialWordMapData) *TaobaoTbkDgOptimusMaterialMapData { + s.WordList = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetTmallPlayActivityInfo(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.TmallPlayActivityInfo = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetUvSumPreSale(v int64) *TaobaoTbkDgOptimusMaterialMapData { + s.UvSumPreSale = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetXId(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.XId = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetNewUserPrice(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.NewUserPrice = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetCouponInfo(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.CouponInfo = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetCouponShareUrl(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.CouponShareUrl = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetNick(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.Nick = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetReservePrice(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.ReservePrice = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetJuOnlineEndTime(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.JuOnlineEndTime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetJuOnlineStartTime(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.JuOnlineStartTime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetMaochaoPlayEndTime(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.MaochaoPlayEndTime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetMaochaoPlayStartTime(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.MaochaoPlayStartTime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetMaochaoPlayConditions(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.MaochaoPlayConditions = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetMaochaoPlayDiscounts(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.MaochaoPlayDiscounts = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetMaochaoPlayDiscountType(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.MaochaoPlayDiscountType = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetMaochaoPlayFreePostFee(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.MaochaoPlayFreePostFee = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetMultiCouponZkRate(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.MultiCouponZkRate = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetPriceAfterMultiCoupon(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.PriceAfterMultiCoupon = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetMultiCouponItemCount(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.MultiCouponItemCount = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetLockRate(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.LockRate = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetLockRateEndTime(v int64) *TaobaoTbkDgOptimusMaterialMapData { + s.LockRateEndTime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetLockRateStartTime(v int64) *TaobaoTbkDgOptimusMaterialMapData { + s.LockRateStartTime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetPromotionType(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.PromotionType = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetPromotionInfo(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.PromotionInfo = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetPromotionDiscount(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.PromotionDiscount = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetPromotionCondition(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.PromotionCondition = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetPresaleDiscountFeeText(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.PresaleDiscountFeeText = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetPresaleTailEndTime(v int64) *TaobaoTbkDgOptimusMaterialMapData { + s.PresaleTailEndTime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetPresaleTailStartTime(v int64) *TaobaoTbkDgOptimusMaterialMapData { + s.PresaleTailStartTime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetPresaleEndTime(v int64) *TaobaoTbkDgOptimusMaterialMapData { + s.PresaleEndTime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetPresaleStartTime(v int64) *TaobaoTbkDgOptimusMaterialMapData { + s.PresaleStartTime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetPresaleDeposit(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.PresaleDeposit = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetYsylTljUseStartTime(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.YsylTljUseStartTime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetYsylCommissionRate(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.YsylCommissionRate = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetYsylTljSendTime(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.YsylTljSendTime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetYsylTljFace(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.YsylTljFace = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetYsylClickUrl(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.YsylClickUrl = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetYsylTljUseEndTime(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.YsylTljUseEndTime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetJuPlayEndTime(v int64) *TaobaoTbkDgOptimusMaterialMapData { + s.JuPlayEndTime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetJuPlayStartTime(v int64) *TaobaoTbkDgOptimusMaterialMapData { + s.JuPlayStartTime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetPlayInfo(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.PlayInfo = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetTmallPlayActivityEndTime(v int64) *TaobaoTbkDgOptimusMaterialMapData { + s.TmallPlayActivityEndTime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetTmallPlayActivityStartTime(v int64) *TaobaoTbkDgOptimusMaterialMapData { + s.TmallPlayActivityStartTime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetJuPreShowEndTime(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.JuPreShowEndTime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetJuPreShowStartTime(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.JuPreShowStartTime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetFavoritesInfo(v TaobaoTbkDgOptimusMaterialFavoritesInfo) *TaobaoTbkDgOptimusMaterialMapData { + s.FavoritesInfo = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetSalePrice(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.SalePrice = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetKuadianPromotionInfo(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.KuadianPromotionInfo = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetSubTitle(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.SubTitle = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetJhsPriceUspList(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.JhsPriceUspList = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetTqgOnlineEndTime(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.TqgOnlineEndTime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetTqgOnlineStartTime(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.TqgOnlineStartTime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetTqgSoldCount(v int64) *TaobaoTbkDgOptimusMaterialMapData { + s.TqgSoldCount = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetTqgTotalCount(v int64) *TaobaoTbkDgOptimusMaterialMapData { + s.TqgTotalCount = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetSuperiorBrand(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.SuperiorBrand = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetIsBrandFlashSale(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.IsBrandFlashSale = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetHotFlag(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.HotFlag = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetTopnInfo(v TaobaoTbkDgOptimusMaterialTopNInfoDTO) *TaobaoTbkDgOptimusMaterialMapData { + s.TopnInfo = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetBybtInfo(v TaobaoTbkDgOptimusMaterialBybtInfoDTO) *TaobaoTbkDgOptimusMaterialMapData { + s.BybtInfo = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetTtSoldCount(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.TtSoldCount = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetMaifanPromotion(v TaobaoTbkDgOptimusMaterialMaifanPromotionDTO) *TaobaoTbkDgOptimusMaterialMapData { + s.MaifanPromotion = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetCpaRewardType(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.CpaRewardType = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetCpaRewardAmount(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.CpaRewardAmount = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialMapData) SetActivityId(v string) *TaobaoTbkDgOptimusMaterialMapData { + s.ActivityId = &v + return s +} diff --git a/service/topsdk/ability369/domain/TaobaoTbkDgOptimusMaterialTopNInfoDTO.go b/service/topsdk/ability369/domain/TaobaoTbkDgOptimusMaterialTopNInfoDTO.go new file mode 100644 index 00000000..f4946637 --- /dev/null +++ b/service/topsdk/ability369/domain/TaobaoTbkDgOptimusMaterialTopNInfoDTO.go @@ -0,0 +1,44 @@ +package domain + +type TaobaoTbkDgOptimusMaterialTopNInfoDTO struct { + /* + 前N件剩余库存 */ + TopnQuantity *int64 `json:"topn_quantity,omitempty" ` + + /* + 前N件初始总库存 */ + TopnTotalCount *int64 `json:"topn_total_count,omitempty" ` + + /* + 前N件佣金结束时间 */ + TopnEndTime *string `json:"topn_end_time,omitempty" ` + + /* + 前N件佣金开始时间 */ + TopnStartTime *string `json:"topn_start_time,omitempty" ` + + /* + 前N件佣金率 */ + TopnRate *string `json:"topn_rate,omitempty" ` +} + +func (s *TaobaoTbkDgOptimusMaterialTopNInfoDTO) SetTopnQuantity(v int64) *TaobaoTbkDgOptimusMaterialTopNInfoDTO { + s.TopnQuantity = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialTopNInfoDTO) SetTopnTotalCount(v int64) *TaobaoTbkDgOptimusMaterialTopNInfoDTO { + s.TopnTotalCount = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialTopNInfoDTO) SetTopnEndTime(v string) *TaobaoTbkDgOptimusMaterialTopNInfoDTO { + s.TopnEndTime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialTopNInfoDTO) SetTopnStartTime(v string) *TaobaoTbkDgOptimusMaterialTopNInfoDTO { + s.TopnStartTime = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialTopNInfoDTO) SetTopnRate(v string) *TaobaoTbkDgOptimusMaterialTopNInfoDTO { + s.TopnRate = &v + return s +} diff --git a/service/topsdk/ability369/domain/TaobaoTbkDgOptimusMaterialWordMapData.go b/service/topsdk/ability369/domain/TaobaoTbkDgOptimusMaterialWordMapData.go new file mode 100644 index 00000000..7bb99c29 --- /dev/null +++ b/service/topsdk/ability369/domain/TaobaoTbkDgOptimusMaterialWordMapData.go @@ -0,0 +1,20 @@ +package domain + +type TaobaoTbkDgOptimusMaterialWordMapData struct { + /* + 链接-商品相关关联词落地页地址 */ + Url *string `json:"url,omitempty" ` + + /* + 商品相关的关联词 */ + Word *string `json:"word,omitempty" ` +} + +func (s *TaobaoTbkDgOptimusMaterialWordMapData) SetUrl(v string) *TaobaoTbkDgOptimusMaterialWordMapData { + s.Url = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialWordMapData) SetWord(v string) *TaobaoTbkDgOptimusMaterialWordMapData { + s.Word = &v + return s +} diff --git a/service/topsdk/ability369/domain/TaobaoTbkDgOptimusPromotionMapData.go b/service/topsdk/ability369/domain/TaobaoTbkDgOptimusPromotionMapData.go new file mode 100644 index 00000000..b406b158 --- /dev/null +++ b/service/topsdk/ability369/domain/TaobaoTbkDgOptimusPromotionMapData.go @@ -0,0 +1,108 @@ +package domain + +type TaobaoTbkDgOptimusPromotionMapData struct { + /* + 权益类型。1 有价券(需要购买的店铺券或单品券) 2 公开券(直接领取的店铺券或单品券) 3 妈妈券(妈妈渠道领取的店铺券或单品券) 4.品类券 (跨店可用券,可与1,2,3叠加) */ + PromotionType *string `json:"promotion_type,omitempty" ` + + /* + 优惠门槛类型: 1 满元 2 满件 */ + ConditionType *string `json:"condition_type,omitempty" ` + + /* + 优惠类型: 1 减钱 2 打折 */ + DiscountType *string `json:"discount_type,omitempty" ` + + /* + 权益信息-总量(权益初始库存量) */ + TotalCount *int64 `json:"total_count,omitempty" ` + + /* + 权益信息-剩余库存(权益剩余库存量) */ + RemainCount *int64 `json:"remain_count,omitempty" ` + + /* + 权益信息展示开始时间,精确到毫秒时间戳 */ + DisplayStartTime *string `json:"display_start_time,omitempty" ` + + /* + 权益信息展示结束时间,精确到毫秒时间戳 */ + DisplayEndTime *string `json:"display_end_time,omitempty" ` + + /* + 权益信息 */ + PromotionList *[]TaobaoTbkDgOptimusPromotionPromotionList `json:"promotion_list,omitempty" ` + + /* + 权益扩展信息 */ + PromotionExtend *TaobaoTbkDgOptimusPromotionPromotionExtend `json:"promotion_extend,omitempty" ` + + /* + 店铺信息-卖家ID */ + SellerId *string `json:"seller_id,omitempty" ` + + /* + 店铺信息-卖家昵称 */ + Nick *string `json:"nick,omitempty" ` + + /* + 店铺信息-店铺名称 */ + ShopTitle *string `json:"shop_title,omitempty" ` + + /* + 店铺信息-店铺logo */ + ShopPictureUrl *string `json:"shop_picture_url,omitempty" ` +} + +func (s *TaobaoTbkDgOptimusPromotionMapData) SetPromotionType(v string) *TaobaoTbkDgOptimusPromotionMapData { + s.PromotionType = &v + return s +} +func (s *TaobaoTbkDgOptimusPromotionMapData) SetConditionType(v string) *TaobaoTbkDgOptimusPromotionMapData { + s.ConditionType = &v + return s +} +func (s *TaobaoTbkDgOptimusPromotionMapData) SetDiscountType(v string) *TaobaoTbkDgOptimusPromotionMapData { + s.DiscountType = &v + return s +} +func (s *TaobaoTbkDgOptimusPromotionMapData) SetTotalCount(v int64) *TaobaoTbkDgOptimusPromotionMapData { + s.TotalCount = &v + return s +} +func (s *TaobaoTbkDgOptimusPromotionMapData) SetRemainCount(v int64) *TaobaoTbkDgOptimusPromotionMapData { + s.RemainCount = &v + return s +} +func (s *TaobaoTbkDgOptimusPromotionMapData) SetDisplayStartTime(v string) *TaobaoTbkDgOptimusPromotionMapData { + s.DisplayStartTime = &v + return s +} +func (s *TaobaoTbkDgOptimusPromotionMapData) SetDisplayEndTime(v string) *TaobaoTbkDgOptimusPromotionMapData { + s.DisplayEndTime = &v + return s +} +func (s *TaobaoTbkDgOptimusPromotionMapData) SetPromotionList(v []TaobaoTbkDgOptimusPromotionPromotionList) *TaobaoTbkDgOptimusPromotionMapData { + s.PromotionList = &v + return s +} +func (s *TaobaoTbkDgOptimusPromotionMapData) SetPromotionExtend(v TaobaoTbkDgOptimusPromotionPromotionExtend) *TaobaoTbkDgOptimusPromotionMapData { + s.PromotionExtend = &v + return s +} +func (s *TaobaoTbkDgOptimusPromotionMapData) SetSellerId(v string) *TaobaoTbkDgOptimusPromotionMapData { + s.SellerId = &v + return s +} +func (s *TaobaoTbkDgOptimusPromotionMapData) SetNick(v string) *TaobaoTbkDgOptimusPromotionMapData { + s.Nick = &v + return s +} +func (s *TaobaoTbkDgOptimusPromotionMapData) SetShopTitle(v string) *TaobaoTbkDgOptimusPromotionMapData { + s.ShopTitle = &v + return s +} +func (s *TaobaoTbkDgOptimusPromotionMapData) SetShopPictureUrl(v string) *TaobaoTbkDgOptimusPromotionMapData { + s.ShopPictureUrl = &v + return s +} diff --git a/service/topsdk/ability369/domain/TaobaoTbkDgOptimusPromotionPromotionExtend.go b/service/topsdk/ability369/domain/TaobaoTbkDgOptimusPromotionPromotionExtend.go new file mode 100644 index 00000000..2dd1ce94 --- /dev/null +++ b/service/topsdk/ability369/domain/TaobaoTbkDgOptimusPromotionPromotionExtend.go @@ -0,0 +1,28 @@ +package domain + +type TaobaoTbkDgOptimusPromotionPromotionExtend struct { + /* + 权益推荐商品 */ + RecommendItemList *[]TaobaoTbkDgOptimusPromotionRecommendItemList `json:"recommend_item_list,omitempty" ` + + /* + 有价券信息 */ + YoujiaCouponInfo *TaobaoTbkDgOptimusPromotionYoujiacouponinfo `json:"youjia_coupon_info,omitempty" ` + + /* + 权益链接 */ + PromotionUrl *string `json:"promotion_url,omitempty" ` +} + +func (s *TaobaoTbkDgOptimusPromotionPromotionExtend) SetRecommendItemList(v []TaobaoTbkDgOptimusPromotionRecommendItemList) *TaobaoTbkDgOptimusPromotionPromotionExtend { + s.RecommendItemList = &v + return s +} +func (s *TaobaoTbkDgOptimusPromotionPromotionExtend) SetYoujiaCouponInfo(v TaobaoTbkDgOptimusPromotionYoujiacouponinfo) *TaobaoTbkDgOptimusPromotionPromotionExtend { + s.YoujiaCouponInfo = &v + return s +} +func (s *TaobaoTbkDgOptimusPromotionPromotionExtend) SetPromotionUrl(v string) *TaobaoTbkDgOptimusPromotionPromotionExtend { + s.PromotionUrl = &v + return s +} diff --git a/service/topsdk/ability369/domain/TaobaoTbkDgOptimusPromotionPromotionList.go b/service/topsdk/ability369/domain/TaobaoTbkDgOptimusPromotionPromotionList.go new file mode 100644 index 00000000..ed6d4b1d --- /dev/null +++ b/service/topsdk/ability369/domain/TaobaoTbkDgOptimusPromotionPromotionList.go @@ -0,0 +1,36 @@ +package domain + +type TaobaoTbkDgOptimusPromotionPromotionList struct { + /* + 权益开始时间,精确到毫秒时间戳 */ + EntryUsedStartTime *string `json:"entry_used_start_time,omitempty" ` + + /* + 权益结束时间,精确到毫秒时间戳 */ + EntryUsedEndTime *string `json:"entry_used_end_time,omitempty" ` + + /* + 权益起用门槛,满X元可用,券场景为满元,精确到分,如满100元可用 */ + EntryCondition *string `json:"entry_condition,omitempty" ` + + /* + 权益面额,券场景为减钱,精确到分 */ + EntryDiscount *string `json:"entry_discount,omitempty" ` +} + +func (s *TaobaoTbkDgOptimusPromotionPromotionList) SetEntryUsedStartTime(v string) *TaobaoTbkDgOptimusPromotionPromotionList { + s.EntryUsedStartTime = &v + return s +} +func (s *TaobaoTbkDgOptimusPromotionPromotionList) SetEntryUsedEndTime(v string) *TaobaoTbkDgOptimusPromotionPromotionList { + s.EntryUsedEndTime = &v + return s +} +func (s *TaobaoTbkDgOptimusPromotionPromotionList) SetEntryCondition(v string) *TaobaoTbkDgOptimusPromotionPromotionList { + s.EntryCondition = &v + return s +} +func (s *TaobaoTbkDgOptimusPromotionPromotionList) SetEntryDiscount(v string) *TaobaoTbkDgOptimusPromotionPromotionList { + s.EntryDiscount = &v + return s +} diff --git a/service/topsdk/ability369/domain/TaobaoTbkDgOptimusPromotionRecommendItemList.go b/service/topsdk/ability369/domain/TaobaoTbkDgOptimusPromotionRecommendItemList.go new file mode 100644 index 00000000..53d82606 --- /dev/null +++ b/service/topsdk/ability369/domain/TaobaoTbkDgOptimusPromotionRecommendItemList.go @@ -0,0 +1,20 @@ +package domain + +type TaobaoTbkDgOptimusPromotionRecommendItemList struct { + /* + 权益推荐商品id */ + ItemId *int64 `json:"item_id,omitempty" ` + + /* + 商品链接 */ + Url *string `json:"url,omitempty" ` +} + +func (s *TaobaoTbkDgOptimusPromotionRecommendItemList) SetItemId(v int64) *TaobaoTbkDgOptimusPromotionRecommendItemList { + s.ItemId = &v + return s +} +func (s *TaobaoTbkDgOptimusPromotionRecommendItemList) SetUrl(v string) *TaobaoTbkDgOptimusPromotionRecommendItemList { + s.Url = &v + return s +} diff --git a/service/topsdk/ability369/domain/TaobaoTbkDgOptimusPromotionYoujiacouponinfo.go b/service/topsdk/ability369/domain/TaobaoTbkDgOptimusPromotionYoujiacouponinfo.go new file mode 100644 index 00000000..f35d457a --- /dev/null +++ b/service/topsdk/ability369/domain/TaobaoTbkDgOptimusPromotionYoujiacouponinfo.go @@ -0,0 +1,20 @@ +package domain + +type TaobaoTbkDgOptimusPromotionYoujiacouponinfo struct { + /* + 有价券商品id */ + ItemId *string `json:"item_id,omitempty" ` + + /* + 商品链接 */ + Url *string `json:"url,omitempty" ` +} + +func (s *TaobaoTbkDgOptimusPromotionYoujiacouponinfo) SetItemId(v string) *TaobaoTbkDgOptimusPromotionYoujiacouponinfo { + s.ItemId = &v + return s +} +func (s *TaobaoTbkDgOptimusPromotionYoujiacouponinfo) SetUrl(v string) *TaobaoTbkDgOptimusPromotionYoujiacouponinfo { + s.Url = &v + return s +} diff --git a/service/topsdk/ability369/request/TaobaoTbkDgOptimusMaterialRequest.go b/service/topsdk/ability369/request/TaobaoTbkDgOptimusMaterialRequest.go new file mode 100644 index 00000000..ac326503 --- /dev/null +++ b/service/topsdk/ability369/request/TaobaoTbkDgOptimusMaterialRequest.go @@ -0,0 +1,125 @@ +package request + +type TaobaoTbkDgOptimusMaterialRequest struct { + /* + 页大小,默认20,1~100 defalutValue��20 */ + PageSize *int64 `json:"page_size,omitempty" required:"false" ` + /* + 第几页,默认:1 defalutValue��1 */ + PageNo *int64 `json:"page_no,omitempty" required:"false" ` + /* + mm_xxx_xxx_xxx的第三位 */ + AdzoneId *int64 `json:"adzone_id" required:"true" ` + /* + 官方的物料Id(详细物料id见:https://market.m.taobao.com/app/qn/toutiao-new/index-pc.html#/detail/10628875?_k=gpov9a) */ + MaterialId *int64 `json:"material_id" required:"true" ` + /* + 智能匹配-设备号加密后的值(MD5加密需32位小写),类型为OAID时传原始OAID值 */ + DeviceValue *string `json:"device_value,omitempty" required:"false" ` + /* + 智能匹配-设备号加密类型:MD5,类型为OAID时不传 */ + DeviceEncrypt *string `json:"device_encrypt,omitempty" required:"false" ` + /* + 智能匹配-设备号类型:IMEI,或者IDFA,或者UTDID(UTDID不支持MD5加密),或者OAID */ + DeviceType *string `json:"device_type,omitempty" required:"false" ` + /* + 内容专用-内容详情ID */ + ContentId *int64 `json:"content_id,omitempty" required:"false" ` + /* + 内容专用-内容渠道信息 */ + ContentSource *string `json:"content_source,omitempty" required:"false" ` + /* + 商品ID,用于相似商品推荐 */ + ItemId *int64 `json:"item_id,omitempty" required:"false" ` + /* + 选品库投放id */ + FavoritesId *string `json:"favorites_id,omitempty" required:"false" ` +} + +func (s *TaobaoTbkDgOptimusMaterialRequest) SetPageSize(v int64) *TaobaoTbkDgOptimusMaterialRequest { + s.PageSize = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialRequest) SetPageNo(v int64) *TaobaoTbkDgOptimusMaterialRequest { + s.PageNo = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialRequest) SetAdzoneId(v int64) *TaobaoTbkDgOptimusMaterialRequest { + s.AdzoneId = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialRequest) SetMaterialId(v int64) *TaobaoTbkDgOptimusMaterialRequest { + s.MaterialId = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialRequest) SetDeviceValue(v string) *TaobaoTbkDgOptimusMaterialRequest { + s.DeviceValue = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialRequest) SetDeviceEncrypt(v string) *TaobaoTbkDgOptimusMaterialRequest { + s.DeviceEncrypt = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialRequest) SetDeviceType(v string) *TaobaoTbkDgOptimusMaterialRequest { + s.DeviceType = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialRequest) SetContentId(v int64) *TaobaoTbkDgOptimusMaterialRequest { + s.ContentId = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialRequest) SetContentSource(v string) *TaobaoTbkDgOptimusMaterialRequest { + s.ContentSource = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialRequest) SetItemId(v int64) *TaobaoTbkDgOptimusMaterialRequest { + s.ItemId = &v + return s +} +func (s *TaobaoTbkDgOptimusMaterialRequest) SetFavoritesId(v string) *TaobaoTbkDgOptimusMaterialRequest { + s.FavoritesId = &v + return s +} + +func (req *TaobaoTbkDgOptimusMaterialRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.PageSize != nil { + paramMap["page_size"] = *req.PageSize + } + if req.PageNo != nil { + paramMap["page_no"] = *req.PageNo + } + if req.AdzoneId != nil { + paramMap["adzone_id"] = *req.AdzoneId + } + if req.MaterialId != nil { + paramMap["material_id"] = *req.MaterialId + } + if req.DeviceValue != nil { + paramMap["device_value"] = *req.DeviceValue + } + if req.DeviceEncrypt != nil { + paramMap["device_encrypt"] = *req.DeviceEncrypt + } + if req.DeviceType != nil { + paramMap["device_type"] = *req.DeviceType + } + if req.ContentId != nil { + paramMap["content_id"] = *req.ContentId + } + if req.ContentSource != nil { + paramMap["content_source"] = *req.ContentSource + } + if req.ItemId != nil { + paramMap["item_id"] = *req.ItemId + } + if req.FavoritesId != nil { + paramMap["favorites_id"] = *req.FavoritesId + } + return paramMap +} + +func (req *TaobaoTbkDgOptimusMaterialRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability369/request/TaobaoTbkDgOptimusPromotionRequest.go b/service/topsdk/ability369/request/TaobaoTbkDgOptimusPromotionRequest.go new file mode 100644 index 00000000..1873f337 --- /dev/null +++ b/service/topsdk/ability369/request/TaobaoTbkDgOptimusPromotionRequest.go @@ -0,0 +1,55 @@ +package request + +type TaobaoTbkDgOptimusPromotionRequest struct { + /* + 页大小,一次请求请限制在10以内 defalutValue��10 */ + PageSize *int64 `json:"page_size,omitempty" required:"false" ` + /* + 第几页,默认:1 defalutValue��1 */ + PageNum *int64 `json:"page_num,omitempty" required:"false" ` + /* + mm_xxx_xxx_xxx的第3段数字 */ + AdzoneId *int64 `json:"adzone_id" required:"true" ` + /* + 官方提供的权益物料Id。有价券-37104、大额店铺券-37116,更多权益物料id敬请期待! */ + PromotionId *int64 `json:"promotion_id" required:"true" ` +} + +func (s *TaobaoTbkDgOptimusPromotionRequest) SetPageSize(v int64) *TaobaoTbkDgOptimusPromotionRequest { + s.PageSize = &v + return s +} +func (s *TaobaoTbkDgOptimusPromotionRequest) SetPageNum(v int64) *TaobaoTbkDgOptimusPromotionRequest { + s.PageNum = &v + return s +} +func (s *TaobaoTbkDgOptimusPromotionRequest) SetAdzoneId(v int64) *TaobaoTbkDgOptimusPromotionRequest { + s.AdzoneId = &v + return s +} +func (s *TaobaoTbkDgOptimusPromotionRequest) SetPromotionId(v int64) *TaobaoTbkDgOptimusPromotionRequest { + s.PromotionId = &v + return s +} + +func (req *TaobaoTbkDgOptimusPromotionRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.PageSize != nil { + paramMap["page_size"] = *req.PageSize + } + if req.PageNum != nil { + paramMap["page_num"] = *req.PageNum + } + if req.AdzoneId != nil { + paramMap["adzone_id"] = *req.AdzoneId + } + if req.PromotionId != nil { + paramMap["promotion_id"] = *req.PromotionId + } + return paramMap +} + +func (req *TaobaoTbkDgOptimusPromotionRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability369/response/TaobaoTbkDgOptimusMaterialResponse.go b/service/topsdk/ability369/response/TaobaoTbkDgOptimusMaterialResponse.go new file mode 100644 index 00000000..eb3a6668 --- /dev/null +++ b/service/topsdk/ability369/response/TaobaoTbkDgOptimusMaterialResponse.go @@ -0,0 +1,31 @@ +package response + +import ( + "topsdk/ability369/domain" +) + +type TaobaoTbkDgOptimusMaterialResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + resultList + */ + ResultList []domain.TaobaoTbkDgOptimusMaterialMapData `json:"result_list,omitempty" ` + /* + 推荐信息-是否抄底 + */ + IsDefault string `json:"is_default,omitempty" ` + /* + 商品总数-目前只有全品库商品查询有该字段 + */ + TotalCount int64 `json:"total_count,omitempty" ` +} diff --git a/service/topsdk/ability369/response/TaobaoTbkDgOptimusPromotionResponse.go b/service/topsdk/ability369/response/TaobaoTbkDgOptimusPromotionResponse.go new file mode 100644 index 00000000..d91ffbc2 --- /dev/null +++ b/service/topsdk/ability369/response/TaobaoTbkDgOptimusPromotionResponse.go @@ -0,0 +1,23 @@ +package response + +import ( + "topsdk/ability369/domain" +) + +type TaobaoTbkDgOptimusPromotionResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + resultList + */ + ResultList []domain.TaobaoTbkDgOptimusPromotionMapData `json:"result_list,omitempty" ` +} diff --git a/service/topsdk/ability370/Ability370.go b/service/topsdk/ability370/Ability370.go new file mode 100644 index 00000000..1bc02684 --- /dev/null +++ b/service/topsdk/ability370/Ability370.go @@ -0,0 +1,38 @@ +package ability370 + +import ( + "errors" + "log" + "topsdk" + "topsdk/ability370/request" + "topsdk/ability370/response" + "topsdk/util" +) + +type Ability370 struct { + Client *topsdk.TopClient +} + +func NewAbility370(client *topsdk.TopClient) *Ability370 { + return &Ability370{client} +} + +/* + 淘宝客-推广者-物料搜索 +*/ +func (ability *Ability370) TaobaoTbkDgMaterialOptional(req *request.TaobaoTbkDgMaterialOptionalRequest) (*response.TaobaoTbkDgMaterialOptionalResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability370 topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.tbk.dg.material.optional", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoTbkDgMaterialOptionalResponse{} + if err != nil { + log.Fatal("taobaoTbkDgMaterialOptional error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} diff --git a/service/topsdk/ability370/domain/TaobaoTbkDgMaterialOptionalBybtInfoDTO.go b/service/topsdk/ability370/domain/TaobaoTbkDgMaterialOptionalBybtInfoDTO.go new file mode 100644 index 00000000..8653a229 --- /dev/null +++ b/service/topsdk/ability370/domain/TaobaoTbkDgMaterialOptionalBybtInfoDTO.go @@ -0,0 +1,68 @@ +package domain + +type TaobaoTbkDgMaterialOptionalBybtInfoDTO struct { + /* + 百亿补贴品牌logo */ + BybtBrandLogo *string `json:"bybt_brand_logo,omitempty" ` + + /* + 百亿补贴白底图 */ + BybtPicUrl *string `json:"bybt_pic_url,omitempty" ` + + /* + 百亿补贴商品特征标签,eg.今日发货、晚发补偿、限购一件等 */ + BybtItemTags *[]string `json:"bybt_item_tags,omitempty" ` + + /* + 百亿补贴专属券面额,仅限百亿补贴场景透出 */ + BybtCouponAmount *string `json:"bybt_coupon_amount,omitempty" ` + + /* + 百亿补贴页面实时价 */ + BybtShowPrice *string `json:"bybt_show_price,omitempty" ` + + /* + 全网对比参考价格 */ + BybtLowestPrice *string `json:"bybt_lowest_price,omitempty" ` + + /* + 商品的百亿补贴开始时间 */ + BybtEndTime *string `json:"bybt_end_time,omitempty" ` + + /* + 商品的百亿补贴结束时间 */ + BybtStartTime *string `json:"bybt_start_time,omitempty" ` +} + +func (s *TaobaoTbkDgMaterialOptionalBybtInfoDTO) SetBybtBrandLogo(v string) *TaobaoTbkDgMaterialOptionalBybtInfoDTO { + s.BybtBrandLogo = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalBybtInfoDTO) SetBybtPicUrl(v string) *TaobaoTbkDgMaterialOptionalBybtInfoDTO { + s.BybtPicUrl = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalBybtInfoDTO) SetBybtItemTags(v []string) *TaobaoTbkDgMaterialOptionalBybtInfoDTO { + s.BybtItemTags = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalBybtInfoDTO) SetBybtCouponAmount(v string) *TaobaoTbkDgMaterialOptionalBybtInfoDTO { + s.BybtCouponAmount = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalBybtInfoDTO) SetBybtShowPrice(v string) *TaobaoTbkDgMaterialOptionalBybtInfoDTO { + s.BybtShowPrice = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalBybtInfoDTO) SetBybtLowestPrice(v string) *TaobaoTbkDgMaterialOptionalBybtInfoDTO { + s.BybtLowestPrice = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalBybtInfoDTO) SetBybtEndTime(v string) *TaobaoTbkDgMaterialOptionalBybtInfoDTO { + s.BybtEndTime = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalBybtInfoDTO) SetBybtStartTime(v string) *TaobaoTbkDgMaterialOptionalBybtInfoDTO { + s.BybtStartTime = &v + return s +} diff --git a/service/topsdk/ability370/domain/TaobaoTbkDgMaterialOptionalFoodMapData.go b/service/topsdk/ability370/domain/TaobaoTbkDgMaterialOptionalFoodMapData.go new file mode 100644 index 00000000..c75ef0a9 --- /dev/null +++ b/service/topsdk/ability370/domain/TaobaoTbkDgMaterialOptionalFoodMapData.go @@ -0,0 +1,36 @@ +package domain + +type TaobaoTbkDgMaterialOptionalFoodMapData struct { + /* + 本地化-商品图片 */ + FoodPic *string `json:"food_pic,omitempty" ` + + /* + 本地化-商品标题 */ + FoodTitle *string `json:"food_title,omitempty" ` + + /* + 本地化-商品促销价 */ + FoodPromotionPrice *string `json:"food_promotion_price,omitempty" ` + + /* + 本地化-商品原价 */ + FoodReservePrice *string `json:"food_reserve_price,omitempty" ` +} + +func (s *TaobaoTbkDgMaterialOptionalFoodMapData) SetFoodPic(v string) *TaobaoTbkDgMaterialOptionalFoodMapData { + s.FoodPic = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalFoodMapData) SetFoodTitle(v string) *TaobaoTbkDgMaterialOptionalFoodMapData { + s.FoodTitle = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalFoodMapData) SetFoodPromotionPrice(v string) *TaobaoTbkDgMaterialOptionalFoodMapData { + s.FoodPromotionPrice = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalFoodMapData) SetFoodReservePrice(v string) *TaobaoTbkDgMaterialOptionalFoodMapData { + s.FoodReservePrice = &v + return s +} diff --git a/service/topsdk/ability370/domain/TaobaoTbkDgMaterialOptionalLocalizationMapData.go b/service/topsdk/ability370/domain/TaobaoTbkDgMaterialOptionalLocalizationMapData.go new file mode 100644 index 00000000..6aac0e3e --- /dev/null +++ b/service/topsdk/ability370/domain/TaobaoTbkDgMaterialOptionalLocalizationMapData.go @@ -0,0 +1,76 @@ +package domain + +type TaobaoTbkDgMaterialOptionalLocalizationMapData struct { + /* + 本地化-配送时间 */ + OrderLeadTime *string `json:"order_lead_time,omitempty" ` + + /* + 本地化-用户评分 */ + UserRating *string `json:"user_rating,omitempty" ` + + /* + 本地化-起送价 */ + DeliveryMinPrice *string `json:"delivery_min_price,omitempty" ` + + /* + 本地化-配送费 */ + DeliveryFee *string `json:"delivery_fee,omitempty" ` + + /* + 本地化-配送费原价 */ + OriginalDeliveryFee *string `json:"original_delivery_fee,omitempty" ` + + /* + 本地化-配送类型;0:蜂鸟专送 1:蜂鸟快送 2:商家自配 3: 全城送 */ + DeliveryType *string `json:"delivery_type,omitempty" ` + + /* + 本地化-推荐理由 */ + RecommendReasons *[]string `json:"recommend_reasons,omitempty" ` + + /* + 本地化-营销标签 */ + SaleTags *[]string `json:"sale_tags,omitempty" ` + + /* + 本地化-单店商品列表 */ + FoodItemList *[]TaobaoTbkDgMaterialOptionalFoodMapData `json:"food_item_list,omitempty" ` +} + +func (s *TaobaoTbkDgMaterialOptionalLocalizationMapData) SetOrderLeadTime(v string) *TaobaoTbkDgMaterialOptionalLocalizationMapData { + s.OrderLeadTime = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalLocalizationMapData) SetUserRating(v string) *TaobaoTbkDgMaterialOptionalLocalizationMapData { + s.UserRating = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalLocalizationMapData) SetDeliveryMinPrice(v string) *TaobaoTbkDgMaterialOptionalLocalizationMapData { + s.DeliveryMinPrice = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalLocalizationMapData) SetDeliveryFee(v string) *TaobaoTbkDgMaterialOptionalLocalizationMapData { + s.DeliveryFee = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalLocalizationMapData) SetOriginalDeliveryFee(v string) *TaobaoTbkDgMaterialOptionalLocalizationMapData { + s.OriginalDeliveryFee = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalLocalizationMapData) SetDeliveryType(v string) *TaobaoTbkDgMaterialOptionalLocalizationMapData { + s.DeliveryType = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalLocalizationMapData) SetRecommendReasons(v []string) *TaobaoTbkDgMaterialOptionalLocalizationMapData { + s.RecommendReasons = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalLocalizationMapData) SetSaleTags(v []string) *TaobaoTbkDgMaterialOptionalLocalizationMapData { + s.SaleTags = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalLocalizationMapData) SetFoodItemList(v []TaobaoTbkDgMaterialOptionalFoodMapData) *TaobaoTbkDgMaterialOptionalLocalizationMapData { + s.FoodItemList = &v + return s +} diff --git a/service/topsdk/ability370/domain/TaobaoTbkDgMaterialOptionalMaifanPromotionDTO.go b/service/topsdk/ability370/domain/TaobaoTbkDgMaterialOptionalMaifanPromotionDTO.go new file mode 100644 index 00000000..393d95c8 --- /dev/null +++ b/service/topsdk/ability370/domain/TaobaoTbkDgMaterialOptionalMaifanPromotionDTO.go @@ -0,0 +1,36 @@ +package domain + +type TaobaoTbkDgMaterialOptionalMaifanPromotionDTO struct { + /* + 猫超买返卡活动结束时间 */ + MaifanPromotionEndTime *string `json:"maifan_promotion_end_time,omitempty" ` + + /* + 猫超买返卡活动开始时间 */ + MaifanPromotionStartTime *string `json:"maifan_promotion_start_time,omitempty" ` + + /* + 猫超买返卡面额 */ + MaifanPromotionDiscount *string `json:"maifan_promotion_discount,omitempty" ` + + /* + 猫超买返卡总数,-1代表不限量,其他大于等于0的值为总数 */ + MaifanPromotionCondition *string `json:"maifan_promotion_condition,omitempty" ` +} + +func (s *TaobaoTbkDgMaterialOptionalMaifanPromotionDTO) SetMaifanPromotionEndTime(v string) *TaobaoTbkDgMaterialOptionalMaifanPromotionDTO { + s.MaifanPromotionEndTime = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMaifanPromotionDTO) SetMaifanPromotionStartTime(v string) *TaobaoTbkDgMaterialOptionalMaifanPromotionDTO { + s.MaifanPromotionStartTime = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMaifanPromotionDTO) SetMaifanPromotionDiscount(v string) *TaobaoTbkDgMaterialOptionalMaifanPromotionDTO { + s.MaifanPromotionDiscount = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMaifanPromotionDTO) SetMaifanPromotionCondition(v string) *TaobaoTbkDgMaterialOptionalMaifanPromotionDTO { + s.MaifanPromotionCondition = &v + return s +} diff --git a/service/topsdk/ability370/domain/TaobaoTbkDgMaterialOptionalMapData.go b/service/topsdk/ability370/domain/TaobaoTbkDgMaterialOptionalMapData.go new file mode 100644 index 00000000..cfe0f791 --- /dev/null +++ b/service/topsdk/ability370/domain/TaobaoTbkDgMaterialOptionalMapData.go @@ -0,0 +1,700 @@ +package domain + +type TaobaoTbkDgMaterialOptionalMapData struct { + /* + 优惠券信息-优惠券开始时间 */ + CouponStartTime *string `json:"coupon_start_time,omitempty" ` + + /* + 优惠券信息-优惠券结束时间 */ + CouponEndTime *string `json:"coupon_end_time,omitempty" ` + + /* + 商品信息-定向计划信息 */ + InfoDxjh *string `json:"info_dxjh,omitempty" ` + + /* + 商品信息-淘客30天推广量 */ + TkTotalSales *string `json:"tk_total_sales,omitempty" ` + + /* + 商品信息-月支出佣金(该字段废弃,请勿再用) */ + TkTotalCommi *string `json:"tk_total_commi,omitempty" ` + + /* + 优惠券信息-优惠券id */ + CouponId *string `json:"coupon_id,omitempty" ` + + /* + 商品信息-宝贝id(该字段废弃,请勿再用) */ + NumIid *int64 `json:"num_iid,omitempty" ` + + /* + 商品信息-商品标题 */ + Title *string `json:"title,omitempty" ` + + /* + 商品信息-商品主图 */ + PictUrl *string `json:"pict_url,omitempty" ` + + /* + 商品信息-商品小图列表 */ + SmallImages *[]string `json:"small_images,omitempty" ` + + /* + 商品信息-商品一口价格 */ + ReservePrice *string `json:"reserve_price,omitempty" ` + + /* + 折扣价(元) 若属于预售商品,付定金时间内,折扣价=预售价 */ + ZkFinalPrice *string `json:"zk_final_price,omitempty" ` + + /* + 店铺信息-卖家类型。0表示集市,1表示天猫 */ + UserType *int32 `json:"user_type,omitempty" ` + + /* + 商品信息-宝贝所在地 */ + Provcity *string `json:"provcity,omitempty" ` + + /* + 链接-宝贝地址 */ + ItemUrl *string `json:"item_url,omitempty" ` + + /* + 商品信息-是否包含营销计划 */ + IncludeMkt *string `json:"include_mkt,omitempty" ` + + /* + 商品信息-是否包含定向计划 */ + IncludeDxjh *string `json:"include_dxjh,omitempty" ` + + /* + 商品信息-佣金比率。1550表示15.5% */ + CommissionRate *string `json:"commission_rate,omitempty" ` + + /* + 商品信息-30天销量(饿了么卡券信息-总销量) */ + Volume *int32 `json:"volume,omitempty" ` + + /* + 店铺信息-卖家id */ + SellerId *int64 `json:"seller_id,omitempty" ` + + /* + 店铺信息-店铺名称 */ + ShopTitle *string `json:"shop_title,omitempty" ` + + /* + 优惠券信息-优惠券总量 */ + CouponTotalCount *int32 `json:"coupon_total_count,omitempty" ` + + /* + 优惠券信息-优惠券剩余量 */ + CouponRemainCount *int32 `json:"coupon_remain_count,omitempty" ` + + /* + 优惠券信息-优惠券满减信息 */ + CouponInfo *string `json:"coupon_info,omitempty" ` + + /* + 商品信息-佣金类型。MKT表示营销计划,SP表示定向计划,COMMON表示通用计划 */ + CommissionType *string `json:"commission_type,omitempty" ` + + /* + 店铺信息-店铺dsr评分 */ + ShopDsr *int64 `json:"shop_dsr,omitempty" ` + + /* + 链接-宝贝+券二合一页面链接 */ + CouponShareUrl *string `json:"coupon_share_url,omitempty" ` + + /* + 链接-宝贝推广链接 */ + Url *string `json:"url,omitempty" ` + + /* + 商品信息-一级类目名称 */ + LevelOneCategoryName *string `json:"level_one_category_name,omitempty" ` + + /* + 商品信息-一级类目ID */ + LevelOneCategoryId *int64 `json:"level_one_category_id,omitempty" ` + + /* + 商品信息-叶子类目名称 */ + CategoryName *string `json:"category_name,omitempty" ` + + /* + 商品信息-叶子类目id */ + CategoryId *int64 `json:"category_id,omitempty" ` + + /* + 商品信息-商品短标题 */ + ShortTitle *string `json:"short_title,omitempty" ` + + /* + 商品信息-商品白底图 */ + WhiteImage *string `json:"white_image,omitempty" ` + + /* + 拼团专用-拼团结束时间 */ + Oetime *string `json:"oetime,omitempty" ` + + /* + 拼团专用-拼团开始时间 */ + Ostime *string `json:"ostime,omitempty" ` + + /* + 拼团专用-拼团几人团 */ + JddNum *int64 `json:"jdd_num,omitempty" ` + + /* + 拼团专用-拼团拼成价,单位元 */ + JddPrice *string `json:"jdd_price,omitempty" ` + + /* + 预售专用-预售数量 */ + UvSumPreSale *int64 `json:"uv_sum_pre_sale,omitempty" ` + + /* + 链接-物料块id(测试中请勿使用) */ + XId *string `json:"x_id,omitempty" ` + + /* + 优惠券信息-优惠券起用门槛,满X元可用。如:满299元减20元 */ + CouponStartFee *string `json:"coupon_start_fee,omitempty" ` + + /* + 优惠券(元) 若属于预售商品,该优惠券付尾款可用,付定金不可用 */ + CouponAmount *string `json:"coupon_amount,omitempty" ` + + /* + 商品信息-宝贝描述(推荐理由) */ + ItemDescription *string `json:"item_description,omitempty" ` + + /* + 店铺信息-卖家昵称 */ + Nick *string `json:"nick,omitempty" ` + + /* + 拼团专用-拼团一人价(原价),单位元 */ + OrigPrice *string `json:"orig_price,omitempty" ` + + /* + 拼团专用-拼团库存数量 */ + TotalStock *int32 `json:"total_stock,omitempty" ` + + /* + 拼团专用-拼团已售数量 */ + SellNum *int32 `json:"sell_num,omitempty" ` + + /* + 拼团专用-拼团剩余库存 */ + Stock *int32 `json:"stock,omitempty" ` + + /* + 营销-天猫营销玩法 */ + TmallPlayActivityInfo *string `json:"tmall_play_activity_info,omitempty" ` + + /* + 商品信息-宝贝id */ + ItemId *int64 `json:"item_id,omitempty" ` + + /* + 商品邮费 */ + RealPostFee *string `json:"real_post_fee,omitempty" ` + + /* + 锁住的佣金率 */ + LockRate *string `json:"lock_rate,omitempty" ` + + /* + 锁佣结束时间 */ + LockRateEndTime *int64 `json:"lock_rate_end_time,omitempty" ` + + /* + 锁佣开始时间 */ + LockRateStartTime *int64 `json:"lock_rate_start_time,omitempty" ` + + /* + 预售商品-优惠 */ + PresaleDiscountFeeText *string `json:"presale_discount_fee_text,omitempty" ` + + /* + 预售商品-付尾款结束时间(毫秒) */ + PresaleTailEndTime *int64 `json:"presale_tail_end_time,omitempty" ` + + /* + 预售商品-付尾款开始时间(毫秒) */ + PresaleTailStartTime *int64 `json:"presale_tail_start_time,omitempty" ` + + /* + 预售商品-付定金结束时间(毫秒) */ + PresaleEndTime *int64 `json:"presale_end_time,omitempty" ` + + /* + 预售商品-付定金开始时间(毫秒) */ + PresaleStartTime *int64 `json:"presale_start_time,omitempty" ` + + /* + 预售商品-定金(元) */ + PresaleDeposit *string `json:"presale_deposit,omitempty" ` + + /* + 预售有礼-淘礼金发放时间 */ + YsylTljSendTime *string `json:"ysyl_tlj_send_time,omitempty" ` + + /* + 预售有礼-佣金比例( 预售有礼活动享受的推广佣金比例,注:推广该活动有特殊分成规则,请详见:https://tbk.bbs.taobao.com/detail.html?appId=45301&postId=9334376 ) */ + YsylCommissionRate *string `json:"ysyl_commission_rate,omitempty" ` + + /* + 预售有礼-预估淘礼金(元) */ + YsylTljFace *string `json:"ysyl_tlj_face,omitempty" ` + + /* + 预售有礼-推广链接 */ + YsylClickUrl *string `json:"ysyl_click_url,omitempty" ` + + /* + 预售有礼-淘礼金使用结束时间 */ + YsylTljUseEndTime *string `json:"ysyl_tlj_use_end_time,omitempty" ` + + /* + 预售有礼-淘礼金使用开始时间 */ + YsylTljUseStartTime *string `json:"ysyl_tlj_use_start_time,omitempty" ` + + /* + 本地化-销售开始时间 */ + SaleBeginTime *string `json:"sale_begin_time,omitempty" ` + + /* + 本地化-销售结束时间 */ + SaleEndTime *string `json:"sale_end_time,omitempty" ` + + /* + 本地化-到门店距离(米) */ + Distance *string `json:"distance,omitempty" ` + + /* + 本地化-可用店铺id */ + UsableShopId *string `json:"usable_shop_id,omitempty" ` + + /* + 本地化-可用店铺名称 */ + UsableShopName *string `json:"usable_shop_name,omitempty" ` + + /* + 活动价 */ + SalePrice *string `json:"sale_price,omitempty" ` + + /* + 跨店满减信息 */ + KuadianPromotionInfo *string `json:"kuadian_promotion_info,omitempty" ` + + /* + 是否品牌精选,0不是,1是 */ + SuperiorBrand *string `json:"superior_brand,omitempty" ` + + /* + 比价场景专用,当系统检测到入参消费者ID购买当前商品会获得《天天开彩蛋》玩法的彩蛋时,该字段显示1,否则为0 */ + RewardInfo *int32 `json:"reward_info,omitempty" ` + + /* + 是否品牌快抢,0不是,1是 */ + IsBrandFlashSale *string `json:"is_brand_flash_sale,omitempty" ` + + /* + 本地化-扩展信息 */ + LocalizationExtend *TaobaoTbkDgMaterialOptionalLocalizationMapData `json:"localization_extend,omitempty" ` + + /* + 物料评估-匹配分 */ + MatchScore *string `json:"match_score,omitempty" ` + + /* + 物料评估-收益分 */ + CommiScore *string `json:"commi_score,omitempty" ` + + /* + 是否是热门商品,0不是,1是 */ + HotFlag *string `json:"hot_flag,omitempty" ` + + /* + 前N件佣金信息-前N件佣金生效或预热时透出以下字段 */ + TopnInfo *TaobaoTbkDgMaterialOptionalTopNInfoDTO `json:"topn_info,omitempty" ` + + /* + 百亿补贴信息 */ + BybtInfo *TaobaoTbkDgMaterialOptionalBybtInfoDTO `json:"bybt_info,omitempty" ` + + /* + 商品入驻淘特后产生的所有销量量级,不特指某段具体时间 */ + TtSoldCount *string `json:"tt_sold_count,omitempty" ` + + /* + 猫超买返卡信息 */ + MaifanPromotion *TaobaoTbkDgMaterialOptionalMaifanPromotionDTO `json:"maifan_promotion,omitempty" ` + + /* + 额外奖励活动类型,如果一个商品有多个奖励类型,返回结果使用空格分割,0=单单奖励(已失效),1=超级单单奖励(已失效),2=年货节单单奖励 */ + CpaRewardType *string `json:"cpa_reward_type,omitempty" ` + + /* + 额外奖励活动金额,活动奖励金额的类型与cpa_reward_type字段对应,如果一个商品有多个奖励类型,返回结果使用空格分割 */ + CpaRewardAmount *string `json:"cpa_reward_amount,omitempty" ` + + /* + 合作伙伴单单补ID,用作“年货节超级单单补”活动合作伙伴奖励统计依据 */ + ActivityId *string `json:"activity_id,omitempty" ` +} + +func (s *TaobaoTbkDgMaterialOptionalMapData) SetCouponStartTime(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.CouponStartTime = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetCouponEndTime(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.CouponEndTime = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetInfoDxjh(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.InfoDxjh = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetTkTotalSales(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.TkTotalSales = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetTkTotalCommi(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.TkTotalCommi = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetCouponId(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.CouponId = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetNumIid(v int64) *TaobaoTbkDgMaterialOptionalMapData { + s.NumIid = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetTitle(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.Title = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetPictUrl(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.PictUrl = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetSmallImages(v []string) *TaobaoTbkDgMaterialOptionalMapData { + s.SmallImages = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetReservePrice(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.ReservePrice = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetZkFinalPrice(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.ZkFinalPrice = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetUserType(v int32) *TaobaoTbkDgMaterialOptionalMapData { + s.UserType = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetProvcity(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.Provcity = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetItemUrl(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.ItemUrl = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetIncludeMkt(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.IncludeMkt = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetIncludeDxjh(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.IncludeDxjh = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetCommissionRate(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.CommissionRate = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetVolume(v int32) *TaobaoTbkDgMaterialOptionalMapData { + s.Volume = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetSellerId(v int64) *TaobaoTbkDgMaterialOptionalMapData { + s.SellerId = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetShopTitle(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.ShopTitle = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetCouponTotalCount(v int32) *TaobaoTbkDgMaterialOptionalMapData { + s.CouponTotalCount = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetCouponRemainCount(v int32) *TaobaoTbkDgMaterialOptionalMapData { + s.CouponRemainCount = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetCouponInfo(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.CouponInfo = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetCommissionType(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.CommissionType = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetShopDsr(v int64) *TaobaoTbkDgMaterialOptionalMapData { + s.ShopDsr = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetCouponShareUrl(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.CouponShareUrl = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetUrl(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.Url = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetLevelOneCategoryName(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.LevelOneCategoryName = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetLevelOneCategoryId(v int64) *TaobaoTbkDgMaterialOptionalMapData { + s.LevelOneCategoryId = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetCategoryName(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.CategoryName = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetCategoryId(v int64) *TaobaoTbkDgMaterialOptionalMapData { + s.CategoryId = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetShortTitle(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.ShortTitle = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetWhiteImage(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.WhiteImage = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetOetime(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.Oetime = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetOstime(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.Ostime = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetJddNum(v int64) *TaobaoTbkDgMaterialOptionalMapData { + s.JddNum = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetJddPrice(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.JddPrice = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetUvSumPreSale(v int64) *TaobaoTbkDgMaterialOptionalMapData { + s.UvSumPreSale = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetXId(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.XId = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetCouponStartFee(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.CouponStartFee = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetCouponAmount(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.CouponAmount = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetItemDescription(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.ItemDescription = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetNick(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.Nick = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetOrigPrice(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.OrigPrice = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetTotalStock(v int32) *TaobaoTbkDgMaterialOptionalMapData { + s.TotalStock = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetSellNum(v int32) *TaobaoTbkDgMaterialOptionalMapData { + s.SellNum = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetStock(v int32) *TaobaoTbkDgMaterialOptionalMapData { + s.Stock = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetTmallPlayActivityInfo(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.TmallPlayActivityInfo = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetItemId(v int64) *TaobaoTbkDgMaterialOptionalMapData { + s.ItemId = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetRealPostFee(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.RealPostFee = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetLockRate(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.LockRate = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetLockRateEndTime(v int64) *TaobaoTbkDgMaterialOptionalMapData { + s.LockRateEndTime = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetLockRateStartTime(v int64) *TaobaoTbkDgMaterialOptionalMapData { + s.LockRateStartTime = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetPresaleDiscountFeeText(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.PresaleDiscountFeeText = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetPresaleTailEndTime(v int64) *TaobaoTbkDgMaterialOptionalMapData { + s.PresaleTailEndTime = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetPresaleTailStartTime(v int64) *TaobaoTbkDgMaterialOptionalMapData { + s.PresaleTailStartTime = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetPresaleEndTime(v int64) *TaobaoTbkDgMaterialOptionalMapData { + s.PresaleEndTime = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetPresaleStartTime(v int64) *TaobaoTbkDgMaterialOptionalMapData { + s.PresaleStartTime = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetPresaleDeposit(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.PresaleDeposit = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetYsylTljSendTime(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.YsylTljSendTime = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetYsylCommissionRate(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.YsylCommissionRate = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetYsylTljFace(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.YsylTljFace = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetYsylClickUrl(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.YsylClickUrl = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetYsylTljUseEndTime(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.YsylTljUseEndTime = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetYsylTljUseStartTime(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.YsylTljUseStartTime = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetSaleBeginTime(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.SaleBeginTime = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetSaleEndTime(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.SaleEndTime = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetDistance(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.Distance = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetUsableShopId(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.UsableShopId = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetUsableShopName(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.UsableShopName = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetSalePrice(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.SalePrice = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetKuadianPromotionInfo(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.KuadianPromotionInfo = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetSuperiorBrand(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.SuperiorBrand = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetRewardInfo(v int32) *TaobaoTbkDgMaterialOptionalMapData { + s.RewardInfo = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetIsBrandFlashSale(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.IsBrandFlashSale = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetLocalizationExtend(v TaobaoTbkDgMaterialOptionalLocalizationMapData) *TaobaoTbkDgMaterialOptionalMapData { + s.LocalizationExtend = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetMatchScore(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.MatchScore = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetCommiScore(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.CommiScore = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetHotFlag(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.HotFlag = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetTopnInfo(v TaobaoTbkDgMaterialOptionalTopNInfoDTO) *TaobaoTbkDgMaterialOptionalMapData { + s.TopnInfo = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetBybtInfo(v TaobaoTbkDgMaterialOptionalBybtInfoDTO) *TaobaoTbkDgMaterialOptionalMapData { + s.BybtInfo = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetTtSoldCount(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.TtSoldCount = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetMaifanPromotion(v TaobaoTbkDgMaterialOptionalMaifanPromotionDTO) *TaobaoTbkDgMaterialOptionalMapData { + s.MaifanPromotion = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetCpaRewardType(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.CpaRewardType = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetCpaRewardAmount(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.CpaRewardAmount = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalMapData) SetActivityId(v string) *TaobaoTbkDgMaterialOptionalMapData { + s.ActivityId = &v + return s +} diff --git a/service/topsdk/ability370/domain/TaobaoTbkDgMaterialOptionalTopNInfoDTO.go b/service/topsdk/ability370/domain/TaobaoTbkDgMaterialOptionalTopNInfoDTO.go new file mode 100644 index 00000000..f96d3daf --- /dev/null +++ b/service/topsdk/ability370/domain/TaobaoTbkDgMaterialOptionalTopNInfoDTO.go @@ -0,0 +1,44 @@ +package domain + +type TaobaoTbkDgMaterialOptionalTopNInfoDTO struct { + /* + 前N件剩余库存 */ + TopnQuantity *int64 `json:"topn_quantity,omitempty" ` + + /* + 前N件初始总库存 */ + TopnTotalCount *int64 `json:"topn_total_count,omitempty" ` + + /* + 前N件佣金结束时间 */ + TopnEndTime *string `json:"topn_end_time,omitempty" ` + + /* + 前N件佣金开始时间 */ + TopnStartTime *string `json:"topn_start_time,omitempty" ` + + /* + 前N件佣金率 */ + TopnRate *string `json:"topn_rate,omitempty" ` +} + +func (s *TaobaoTbkDgMaterialOptionalTopNInfoDTO) SetTopnQuantity(v int64) *TaobaoTbkDgMaterialOptionalTopNInfoDTO { + s.TopnQuantity = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalTopNInfoDTO) SetTopnTotalCount(v int64) *TaobaoTbkDgMaterialOptionalTopNInfoDTO { + s.TopnTotalCount = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalTopNInfoDTO) SetTopnEndTime(v string) *TaobaoTbkDgMaterialOptionalTopNInfoDTO { + s.TopnEndTime = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalTopNInfoDTO) SetTopnStartTime(v string) *TaobaoTbkDgMaterialOptionalTopNInfoDTO { + s.TopnStartTime = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalTopNInfoDTO) SetTopnRate(v string) *TaobaoTbkDgMaterialOptionalTopNInfoDTO { + s.TopnRate = &v + return s +} diff --git a/service/topsdk/ability370/domain/TaobaoTbkDgMaterialOptionalUcrowdrankitems.go b/service/topsdk/ability370/domain/TaobaoTbkDgMaterialOptionalUcrowdrankitems.go new file mode 100644 index 00000000..7f2d6d29 --- /dev/null +++ b/service/topsdk/ability370/domain/TaobaoTbkDgMaterialOptionalUcrowdrankitems.go @@ -0,0 +1,28 @@ +package domain + +type TaobaoTbkDgMaterialOptionalUcrowdrankitems struct { + /* + 物料评估-商品佣金率,如:1234表示12.34%,material_id=41377时选填 */ + Commirate *int64 `json:"commirate,omitempty" ` + + /* + 物料评估-商品价格,单位:元,material_id=41377时选填 */ + Price *string `json:"price,omitempty" ` + + /* + 物料评估-商品ID,material_id=41377时必填 */ + ItemId *string `json:"item_id,omitempty" ` +} + +func (s *TaobaoTbkDgMaterialOptionalUcrowdrankitems) SetCommirate(v int64) *TaobaoTbkDgMaterialOptionalUcrowdrankitems { + s.Commirate = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalUcrowdrankitems) SetPrice(v string) *TaobaoTbkDgMaterialOptionalUcrowdrankitems { + s.Price = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalUcrowdrankitems) SetItemId(v string) *TaobaoTbkDgMaterialOptionalUcrowdrankitems { + s.ItemId = &v + return s +} diff --git a/service/topsdk/ability370/request/TaobaoTbkDgMaterialOptionalRequest.go b/service/topsdk/ability370/request/TaobaoTbkDgMaterialOptionalRequest.go new file mode 100644 index 00000000..c40bf09a --- /dev/null +++ b/service/topsdk/ability370/request/TaobaoTbkDgMaterialOptionalRequest.go @@ -0,0 +1,430 @@ +package request + +import ( + "topsdk/ability370/domain" + "topsdk/util" +) + +type TaobaoTbkDgMaterialOptionalRequest struct { + /* + 商品筛选(特定媒体支持)-店铺dsr评分。筛选大于等于当前设置的店铺dsr评分的商品0-50000之间 */ + StartDsr *int32 `json:"start_dsr,omitempty" required:"false" ` + /* + 页大小,默认20,1~100 defalutValue��20 */ + PageSize *int64 `json:"page_size,omitempty" required:"false" ` + /* + 第几页,默认:1 defalutValue��1 */ + PageNo *int64 `json:"page_no,omitempty" required:"false" ` + /* + 链接形式:1:PC,2:无线,默认:1 defalutValue��1 */ + Platform *int32 `json:"platform,omitempty" required:"false" ` + /* + 商品筛选-淘客佣金比率上限。如:1234表示12.34% */ + EndTkRate *int32 `json:"end_tk_rate,omitempty" required:"false" ` + /* + 商品筛选-淘客佣金比率下限。如:1234表示12.34% */ + StartTkRate *int32 `json:"start_tk_rate,omitempty" required:"false" ` + /* + 商品筛选-折扣价范围上限。单位:元 */ + EndPrice *int32 `json:"end_price,omitempty" required:"false" ` + /* + 商品筛选-折扣价范围下限。单位:元 */ + StartPrice *int32 `json:"start_price,omitempty" required:"false" ` + /* + 商品筛选-是否海外商品。true表示属于海外商品,false或不设置表示不限 */ + IsOverseas *bool `json:"is_overseas,omitempty" required:"false" ` + /* + 商品筛选-是否天猫商品。true表示属于天猫商品,false或不设置表示不限 */ + IsTmall *bool `json:"is_tmall,omitempty" required:"false" ` + /* + 排序_des(降序),排序_asc(升序),销量(total_sales),淘客佣金比率(tk_rate), 累计推广量(tk_total_sales),总支出佣金(tk_total_commi),价格(price),匹配分(match) */ + Sort *string `json:"sort,omitempty" required:"false" ` + /* + 商品筛选-所在地 */ + Itemloc *string `json:"itemloc,omitempty" required:"false" ` + /* + 商品筛选-后台类目ID。用,分割,最大10个,该ID可以通过taobao.itemcats.get接口获取到 */ + Cat *string `json:"cat,omitempty" required:"false" ` + /* + 商品筛选-查询词 */ + Q *string `json:"q,omitempty" required:"false" ` + /* + 不传时默认物料id=2836;如果直接对消费者投放,可使用官方个性化算法优化的搜索物料id=17004 defalutValue��2836 */ + MaterialId *int64 `json:"material_id,omitempty" required:"false" ` + /* + 优惠券筛选-是否有优惠券。true表示该商品有优惠券,false或不设置表示不限 */ + HasCoupon *bool `json:"has_coupon,omitempty" required:"false" ` + /* + ip参数影响邮费获取,如果不传或者传入不准确,邮费无法精准提供 */ + Ip *string `json:"ip,omitempty" required:"false" ` + /* + mm_xxx_xxx_12345678三段式的最后一段数字 */ + AdzoneId *int64 `json:"adzone_id" required:"true" ` + /* + 商品筛选-是否包邮。true表示包邮,false或不设置表示不限 */ + NeedFreeShipment *bool `json:"need_free_shipment,omitempty" required:"false" ` + /* + 商品筛选-是否加入消费者保障。true表示加入,false或不设置表示不限 */ + NeedPrepay *bool `json:"need_prepay,omitempty" required:"false" ` + /* + 商品筛选(特定媒体支持)-成交转化是否高于行业均值。True表示大于等于,false或不设置表示不限 */ + IncludePayRate30 *bool `json:"include_pay_rate_30,omitempty" required:"false" ` + /* + 商品筛选-好评率是否高于行业均值。True表示大于等于,false或不设置表示不限 */ + IncludeGoodRate *bool `json:"include_good_rate,omitempty" required:"false" ` + /* + 商品筛选(特定媒体支持)-退款率是否低于行业均值。True表示大于等于,false或不设置表示不限 */ + IncludeRfdRate *bool `json:"include_rfd_rate,omitempty" required:"false" ` + /* + 商品筛选-牛皮癣程度。取值:1不限,2无,3轻微 defalutValue��1 */ + NpxLevel *int32 `json:"npx_level,omitempty" required:"false" ` + /* + 智能匹配-设备号加密类型:MD5 */ + DeviceEncrypt *string `json:"device_encrypt,omitempty" required:"false" ` + /* + 智能匹配-设备号加密后的值(MD5加密需32位小写) */ + DeviceValue *string `json:"device_value,omitempty" required:"false" ` + /* + 智能匹配-设备号类型:IMEI,或者IDFA,或者UTDID(UTDID不支持MD5加密),或者OAID */ + DeviceType *string `json:"device_type,omitempty" required:"false" ` + /* + 商品筛选-KA媒体淘客佣金比率上限。如:1234表示12.34% */ + EndKaTkRate *int32 `json:"end_ka_tk_rate,omitempty" required:"false" ` + /* + 商品筛选-KA媒体淘客佣金比率下限。如:1234表示12.34% */ + StartKaTkRate *int32 `json:"start_ka_tk_rate,omitempty" required:"false" ` + /* + 锁佣结束时间 */ + LockRateEndTime *int64 `json:"lock_rate_end_time,omitempty" required:"false" ` + /* + 锁佣开始时间 */ + LockRateStartTime *int64 `json:"lock_rate_start_time,omitempty" required:"false" ` + /* + 本地化业务入参-LBS信息-经度 */ + Longitude *string `json:"longitude,omitempty" required:"false" ` + /* + 本地化业务入参-LBS信息-纬度 */ + Latitude *string `json:"latitude,omitempty" required:"false" ` + /* + 本地化业务入参-LBS信息-国标城市码,仅支持单个请求,请求饿了么卡券物料时,该字段必填。 (详细城市ID见:https://mo.m.taobao.com/page_2020010315120200508) */ + CityCode *string `json:"city_code,omitempty" required:"false" ` + /* + 商家id,仅支持饿了么卡券商家ID,支持批量请求1-100以内,多个商家ID使用英文逗号分隔 */ + SellerIds *string `json:"seller_ids,omitempty" required:"false" ` + /* + 会员运营ID */ + SpecialId *string `json:"special_id,omitempty" required:"false" ` + /* + 渠道关系ID,仅适用于渠道推广场景 */ + RelationId *string `json:"relation_id,omitempty" required:"false" ` + /* + 本地化业务入参-分页唯一标识,非首页的请求必传,值为上一页返回结果中的page_result_key字段值 */ + PageResultKey *string `json:"page_result_key,omitempty" required:"false" ` + /* + 人群ID,仅适用于物料评估场景material_id=41377 */ + UcrowdId *int64 `json:"ucrowd_id,omitempty" required:"false" ` + /* + 物料评估-商品列表 */ + UcrowdRankItems *[]domain.TaobaoTbkDgMaterialOptionalUcrowdrankitems `json:"ucrowd_rank_items,omitempty" required:"false" ` + /* + 是否获取前N件佣金信息 0否,1是,其他值否 */ + GetTopnRate *int32 `json:"get_topn_rate,omitempty" required:"false" ` +} + +func (s *TaobaoTbkDgMaterialOptionalRequest) SetStartDsr(v int32) *TaobaoTbkDgMaterialOptionalRequest { + s.StartDsr = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetPageSize(v int64) *TaobaoTbkDgMaterialOptionalRequest { + s.PageSize = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetPageNo(v int64) *TaobaoTbkDgMaterialOptionalRequest { + s.PageNo = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetPlatform(v int32) *TaobaoTbkDgMaterialOptionalRequest { + s.Platform = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetEndTkRate(v int32) *TaobaoTbkDgMaterialOptionalRequest { + s.EndTkRate = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetStartTkRate(v int32) *TaobaoTbkDgMaterialOptionalRequest { + s.StartTkRate = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetEndPrice(v int32) *TaobaoTbkDgMaterialOptionalRequest { + s.EndPrice = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetStartPrice(v int32) *TaobaoTbkDgMaterialOptionalRequest { + s.StartPrice = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetIsOverseas(v bool) *TaobaoTbkDgMaterialOptionalRequest { + s.IsOverseas = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetIsTmall(v bool) *TaobaoTbkDgMaterialOptionalRequest { + s.IsTmall = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetSort(v string) *TaobaoTbkDgMaterialOptionalRequest { + s.Sort = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetItemloc(v string) *TaobaoTbkDgMaterialOptionalRequest { + s.Itemloc = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetCat(v string) *TaobaoTbkDgMaterialOptionalRequest { + s.Cat = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetQ(v string) *TaobaoTbkDgMaterialOptionalRequest { + s.Q = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetMaterialId(v int64) *TaobaoTbkDgMaterialOptionalRequest { + s.MaterialId = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetHasCoupon(v bool) *TaobaoTbkDgMaterialOptionalRequest { + s.HasCoupon = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetIp(v string) *TaobaoTbkDgMaterialOptionalRequest { + s.Ip = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetAdzoneId(v int64) *TaobaoTbkDgMaterialOptionalRequest { + s.AdzoneId = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetNeedFreeShipment(v bool) *TaobaoTbkDgMaterialOptionalRequest { + s.NeedFreeShipment = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetNeedPrepay(v bool) *TaobaoTbkDgMaterialOptionalRequest { + s.NeedPrepay = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetIncludePayRate30(v bool) *TaobaoTbkDgMaterialOptionalRequest { + s.IncludePayRate30 = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetIncludeGoodRate(v bool) *TaobaoTbkDgMaterialOptionalRequest { + s.IncludeGoodRate = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetIncludeRfdRate(v bool) *TaobaoTbkDgMaterialOptionalRequest { + s.IncludeRfdRate = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetNpxLevel(v int32) *TaobaoTbkDgMaterialOptionalRequest { + s.NpxLevel = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetDeviceEncrypt(v string) *TaobaoTbkDgMaterialOptionalRequest { + s.DeviceEncrypt = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetDeviceValue(v string) *TaobaoTbkDgMaterialOptionalRequest { + s.DeviceValue = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetDeviceType(v string) *TaobaoTbkDgMaterialOptionalRequest { + s.DeviceType = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetEndKaTkRate(v int32) *TaobaoTbkDgMaterialOptionalRequest { + s.EndKaTkRate = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetStartKaTkRate(v int32) *TaobaoTbkDgMaterialOptionalRequest { + s.StartKaTkRate = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetLockRateEndTime(v int64) *TaobaoTbkDgMaterialOptionalRequest { + s.LockRateEndTime = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetLockRateStartTime(v int64) *TaobaoTbkDgMaterialOptionalRequest { + s.LockRateStartTime = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetLongitude(v string) *TaobaoTbkDgMaterialOptionalRequest { + s.Longitude = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetLatitude(v string) *TaobaoTbkDgMaterialOptionalRequest { + s.Latitude = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetCityCode(v string) *TaobaoTbkDgMaterialOptionalRequest { + s.CityCode = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetSellerIds(v string) *TaobaoTbkDgMaterialOptionalRequest { + s.SellerIds = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetSpecialId(v string) *TaobaoTbkDgMaterialOptionalRequest { + s.SpecialId = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetRelationId(v string) *TaobaoTbkDgMaterialOptionalRequest { + s.RelationId = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetPageResultKey(v string) *TaobaoTbkDgMaterialOptionalRequest { + s.PageResultKey = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetUcrowdId(v int64) *TaobaoTbkDgMaterialOptionalRequest { + s.UcrowdId = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetUcrowdRankItems(v []domain.TaobaoTbkDgMaterialOptionalUcrowdrankitems) *TaobaoTbkDgMaterialOptionalRequest { + s.UcrowdRankItems = &v + return s +} +func (s *TaobaoTbkDgMaterialOptionalRequest) SetGetTopnRate(v int32) *TaobaoTbkDgMaterialOptionalRequest { + s.GetTopnRate = &v + return s +} + +func (req *TaobaoTbkDgMaterialOptionalRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.StartDsr != nil { + paramMap["start_dsr"] = *req.StartDsr + } + if req.PageSize != nil { + paramMap["page_size"] = *req.PageSize + } + if req.PageNo != nil { + paramMap["page_no"] = *req.PageNo + } + if req.Platform != nil { + paramMap["platform"] = *req.Platform + } + if req.EndTkRate != nil { + paramMap["end_tk_rate"] = *req.EndTkRate + } + if req.StartTkRate != nil { + paramMap["start_tk_rate"] = *req.StartTkRate + } + if req.EndPrice != nil { + paramMap["end_price"] = *req.EndPrice + } + if req.StartPrice != nil { + paramMap["start_price"] = *req.StartPrice + } + if req.IsOverseas != nil { + paramMap["is_overseas"] = *req.IsOverseas + } + if req.IsTmall != nil { + paramMap["is_tmall"] = *req.IsTmall + } + if req.Sort != nil { + paramMap["sort"] = *req.Sort + } + if req.Itemloc != nil { + paramMap["itemloc"] = *req.Itemloc + } + if req.Cat != nil { + paramMap["cat"] = *req.Cat + } + if req.Q != nil { + paramMap["q"] = *req.Q + } + if req.MaterialId != nil { + paramMap["material_id"] = *req.MaterialId + } + if req.HasCoupon != nil { + paramMap["has_coupon"] = *req.HasCoupon + } + if req.Ip != nil { + paramMap["ip"] = *req.Ip + } + if req.AdzoneId != nil { + paramMap["adzone_id"] = *req.AdzoneId + } + if req.NeedFreeShipment != nil { + paramMap["need_free_shipment"] = *req.NeedFreeShipment + } + if req.NeedPrepay != nil { + paramMap["need_prepay"] = *req.NeedPrepay + } + if req.IncludePayRate30 != nil { + paramMap["include_pay_rate_30"] = *req.IncludePayRate30 + } + if req.IncludeGoodRate != nil { + paramMap["include_good_rate"] = *req.IncludeGoodRate + } + if req.IncludeRfdRate != nil { + paramMap["include_rfd_rate"] = *req.IncludeRfdRate + } + if req.NpxLevel != nil { + paramMap["npx_level"] = *req.NpxLevel + } + if req.DeviceEncrypt != nil { + paramMap["device_encrypt"] = *req.DeviceEncrypt + } + if req.DeviceValue != nil { + paramMap["device_value"] = *req.DeviceValue + } + if req.DeviceType != nil { + paramMap["device_type"] = *req.DeviceType + } + if req.EndKaTkRate != nil { + paramMap["end_ka_tk_rate"] = *req.EndKaTkRate + } + if req.StartKaTkRate != nil { + paramMap["start_ka_tk_rate"] = *req.StartKaTkRate + } + if req.LockRateEndTime != nil { + paramMap["lock_rate_end_time"] = *req.LockRateEndTime + } + if req.LockRateStartTime != nil { + paramMap["lock_rate_start_time"] = *req.LockRateStartTime + } + if req.Longitude != nil { + paramMap["longitude"] = *req.Longitude + } + if req.Latitude != nil { + paramMap["latitude"] = *req.Latitude + } + if req.CityCode != nil { + paramMap["city_code"] = *req.CityCode + } + if req.SellerIds != nil { + paramMap["seller_ids"] = *req.SellerIds + } + if req.SpecialId != nil { + paramMap["special_id"] = *req.SpecialId + } + if req.RelationId != nil { + paramMap["relation_id"] = *req.RelationId + } + if req.PageResultKey != nil { + paramMap["page_result_key"] = *req.PageResultKey + } + if req.UcrowdId != nil { + paramMap["ucrowd_id"] = *req.UcrowdId + } + if req.UcrowdRankItems != nil { + paramMap["ucrowd_rank_items"] = util.ConvertStructList(*req.UcrowdRankItems) + } + if req.GetTopnRate != nil { + paramMap["get_topn_rate"] = *req.GetTopnRate + } + return paramMap +} + +func (req *TaobaoTbkDgMaterialOptionalRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability370/response/TaobaoTbkDgMaterialOptionalResponse.go b/service/topsdk/ability370/response/TaobaoTbkDgMaterialOptionalResponse.go new file mode 100644 index 00000000..cd107f5b --- /dev/null +++ b/service/topsdk/ability370/response/TaobaoTbkDgMaterialOptionalResponse.go @@ -0,0 +1,31 @@ +package response + +import ( + "topsdk/ability370/domain" +) + +type TaobaoTbkDgMaterialOptionalResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + 搜索到符合条件的结果总数 + */ + TotalResults int64 `json:"total_results,omitempty" ` + /* + resultList + */ + ResultList []domain.TaobaoTbkDgMaterialOptionalMapData `json:"result_list,omitempty" ` + /* + 本地化-lbs分页标识,请在下一次翻页时作为入参传入 + */ + PageResultKey string `json:"page_result_key,omitempty" ` +} diff --git a/service/topsdk/ability371/Ability371.go b/service/topsdk/ability371/Ability371.go new file mode 100644 index 00000000..0b74b478 --- /dev/null +++ b/service/topsdk/ability371/Ability371.go @@ -0,0 +1,58 @@ +package ability371 + +import ( + "errors" + "log" + "topsdk" + "topsdk/ability371/request" + "topsdk/ability371/response" + "topsdk/util" +) + +type Ability371 struct { + Client *topsdk.TopClient +} + +func NewAbility371(client *topsdk.TopClient) *Ability371 { + return &Ability371{client} +} + +/* + 淘宝客-公用-阿里妈妈推广券详情查询 +*/ +func (ability *Ability371) TaobaoTbkCouponGet(req *request.TaobaoTbkCouponGetRequest) (*response.TaobaoTbkCouponGetResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability371 topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.tbk.coupon.get", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoTbkCouponGetResponse{} + if err != nil { + log.Fatal("taobaoTbkCouponGet error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} + +/* + 淘宝客-公用-淘宝客商品详情查询(简版) +*/ +func (ability *Ability371) TaobaoTbkItemInfoGet(req *request.TaobaoTbkItemInfoGetRequest) (*response.TaobaoTbkItemInfoGetResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability371 topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.tbk.item.info.get", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoTbkItemInfoGetResponse{} + if err != nil { + log.Fatal("taobaoTbkItemInfoGet error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} diff --git a/service/topsdk/ability371/domain/TaobaoTbkCouponGetMapData.go b/service/topsdk/ability371/domain/TaobaoTbkCouponGetMapData.go new file mode 100644 index 00000000..196c8d44 --- /dev/null +++ b/service/topsdk/ability371/domain/TaobaoTbkCouponGetMapData.go @@ -0,0 +1,76 @@ +package domain + +type TaobaoTbkCouponGetMapData struct { + /* + 优惠券门槛金额 */ + CouponStartFee *string `json:"coupon_start_fee,omitempty" ` + + /* + 优惠券剩余量 */ + CouponRemainCount *int64 `json:"coupon_remain_count,omitempty" ` + + /* + 优惠券总量 */ + CouponTotalCount *int64 `json:"coupon_total_count,omitempty" ` + + /* + 优惠券结束时间 */ + CouponEndTime *string `json:"coupon_end_time,omitempty" ` + + /* + 优惠券开始时间 */ + CouponStartTime *string `json:"coupon_start_time,omitempty" ` + + /* + 优惠券金额 */ + CouponAmount *string `json:"coupon_amount,omitempty" ` + + /* + 券类型,1 表示全网公开券,4 表示妈妈渠道券 */ + CouponSrcScene *int64 `json:"coupon_src_scene,omitempty" ` + + /* + 券属性,0表示店铺券,1表示单品券 */ + CouponType *int64 `json:"coupon_type,omitempty" ` + + /* + 券ID */ + CouponActivityId *string `json:"coupon_activity_id,omitempty" ` +} + +func (s *TaobaoTbkCouponGetMapData) SetCouponStartFee(v string) *TaobaoTbkCouponGetMapData { + s.CouponStartFee = &v + return s +} +func (s *TaobaoTbkCouponGetMapData) SetCouponRemainCount(v int64) *TaobaoTbkCouponGetMapData { + s.CouponRemainCount = &v + return s +} +func (s *TaobaoTbkCouponGetMapData) SetCouponTotalCount(v int64) *TaobaoTbkCouponGetMapData { + s.CouponTotalCount = &v + return s +} +func (s *TaobaoTbkCouponGetMapData) SetCouponEndTime(v string) *TaobaoTbkCouponGetMapData { + s.CouponEndTime = &v + return s +} +func (s *TaobaoTbkCouponGetMapData) SetCouponStartTime(v string) *TaobaoTbkCouponGetMapData { + s.CouponStartTime = &v + return s +} +func (s *TaobaoTbkCouponGetMapData) SetCouponAmount(v string) *TaobaoTbkCouponGetMapData { + s.CouponAmount = &v + return s +} +func (s *TaobaoTbkCouponGetMapData) SetCouponSrcScene(v int64) *TaobaoTbkCouponGetMapData { + s.CouponSrcScene = &v + return s +} +func (s *TaobaoTbkCouponGetMapData) SetCouponType(v int64) *TaobaoTbkCouponGetMapData { + s.CouponType = &v + return s +} +func (s *TaobaoTbkCouponGetMapData) SetCouponActivityId(v string) *TaobaoTbkCouponGetMapData { + s.CouponActivityId = &v + return s +} diff --git a/service/topsdk/ability371/domain/TaobaoTbkItemInfoGetNTbkItem.go b/service/topsdk/ability371/domain/TaobaoTbkItemInfoGetNTbkItem.go new file mode 100644 index 00000000..30fe092b --- /dev/null +++ b/service/topsdk/ability371/domain/TaobaoTbkItemInfoGetNTbkItem.go @@ -0,0 +1,332 @@ +package domain + +type TaobaoTbkItemInfoGetNTbkItem struct { + /* + 一级类目名称 */ + CatName *string `json:"cat_name,omitempty" ` + + /* + 商品ID */ + NumIid *int64 `json:"num_iid,omitempty" ` + + /* + 商品标题 */ + Title *string `json:"title,omitempty" ` + + /* + 商品主图 */ + PictUrl *string `json:"pict_url,omitempty" ` + + /* + 商品小图列表 */ + SmallImages *[]string `json:"small_images,omitempty" ` + + /* + 商品一口价格 */ + ReservePrice *string `json:"reserve_price,omitempty" ` + + /* + 折扣价(元) 若属于预售商品,付定金时间内,折扣价=预售价 */ + ZkFinalPrice *string `json:"zk_final_price,omitempty" ` + + /* + 卖家类型,0表示集市,1表示商城,3表示特价版 */ + UserType *int64 `json:"user_type,omitempty" ` + + /* + 商品所在地 */ + Provcity *string `json:"provcity,omitempty" ` + + /* + 商品链接 */ + ItemUrl *string `json:"item_url,omitempty" ` + + /* + 卖家id */ + SellerId *int64 `json:"seller_id,omitempty" ` + + /* + 30天销量 */ + Volume *int64 `json:"volume,omitempty" ` + + /* + 店铺名称 */ + Nick *string `json:"nick,omitempty" ` + + /* + 叶子类目名称 */ + CatLeafName *string `json:"cat_leaf_name,omitempty" ` + + /* + 是否加入消费者保障 */ + IsPrepay *bool `json:"is_prepay,omitempty" ` + + /* + 店铺dsr 评分 */ + ShopDsr *int64 `json:"shop_dsr,omitempty" ` + + /* + 卖家等级 */ + Ratesum *int64 `json:"ratesum,omitempty" ` + + /* + 退款率是否低于行业均值 */ + IRfdRate *bool `json:"i_rfd_rate,omitempty" ` + + /* + 好评率是否高于行业均值 */ + HGoodRate *bool `json:"h_good_rate,omitempty" ` + + /* + 成交转化是否高于行业均值 */ + HPayRate30 *bool `json:"h_pay_rate30,omitempty" ` + + /* + 是否包邮 */ + FreeShipment *bool `json:"free_shipment,omitempty" ` + + /* + 商品库类型,支持多库类型输出,以英文逗号分隔“,”分隔,1:营销商品主推库,如果值为空则不属于1这种商品类型 */ + MaterialLibType *string `json:"material_lib_type,omitempty" ` + + /* + 预售商品-商品优惠信息 */ + PresaleDiscountFeeText *string `json:"presale_discount_fee_text,omitempty" ` + + /* + 预售商品-付定金结束时间(毫秒) */ + PresaleTailEndTime *int64 `json:"presale_tail_end_time,omitempty" ` + + /* + 预售商品-付尾款开始时间(毫秒) */ + PresaleTailStartTime *int64 `json:"presale_tail_start_time,omitempty" ` + + /* + 预售商品-付定金结束时间(毫秒) */ + PresaleEndTime *int64 `json:"presale_end_time,omitempty" ` + + /* + 预售商品-付定金开始时间(毫秒) */ + PresaleStartTime *int64 `json:"presale_start_time,omitempty" ` + + /* + 预售商品-定金(元) */ + PresaleDeposit *string `json:"presale_deposit,omitempty" ` + + /* + 聚划算满减 -结束时间(毫秒) */ + JuPlayEndTime *int64 `json:"ju_play_end_time,omitempty" ` + + /* + 聚划算满减 -开始时间(毫秒) */ + JuPlayStartTime *int64 `json:"ju_play_start_time,omitempty" ` + + /* + 1聚划算满减:满N件减X元,满N件X折,满N件X元) 2天猫限时抢:前N分钟每件X元,前N分钟满N件每件X元,前N件每件X元) */ + PlayInfo *string `json:"play_info,omitempty" ` + + /* + 天猫限时抢可售 -结束时间(毫秒) */ + TmallPlayActivityEndTime *int64 `json:"tmall_play_activity_end_time,omitempty" ` + + /* + 天猫限时抢可售 -开始时间(毫秒) */ + TmallPlayActivityStartTime *int64 `json:"tmall_play_activity_start_time,omitempty" ` + + /* + 聚划算信息-聚淘开始时间(毫秒) */ + JuOnlineStartTime *string `json:"ju_online_start_time,omitempty" ` + + /* + 聚划算信息-聚淘结束时间(毫秒) */ + JuOnlineEndTime *string `json:"ju_online_end_time,omitempty" ` + + /* + 聚划算信息-商品预热开始时间(毫秒) */ + JuPreShowStartTime *string `json:"ju_pre_show_start_time,omitempty" ` + + /* + 聚划算信息-商品预热结束时间(毫秒) */ + JuPreShowEndTime *string `json:"ju_pre_show_end_time,omitempty" ` + + /* + 活动价 */ + SalePrice *string `json:"sale_price,omitempty" ` + + /* + 跨店满减信息 */ + KuadianPromotionInfo *string `json:"kuadian_promotion_info,omitempty" ` + + /* + 是否品牌精选,0不是,1是 */ + SuperiorBrand *string `json:"superior_brand,omitempty" ` + + /* + 是否是热门商品,0不是,1是 */ + HotFlag *string `json:"hot_flag,omitempty" ` +} + +func (s *TaobaoTbkItemInfoGetNTbkItem) SetCatName(v string) *TaobaoTbkItemInfoGetNTbkItem { + s.CatName = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetNumIid(v int64) *TaobaoTbkItemInfoGetNTbkItem { + s.NumIid = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetTitle(v string) *TaobaoTbkItemInfoGetNTbkItem { + s.Title = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetPictUrl(v string) *TaobaoTbkItemInfoGetNTbkItem { + s.PictUrl = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetSmallImages(v []string) *TaobaoTbkItemInfoGetNTbkItem { + s.SmallImages = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetReservePrice(v string) *TaobaoTbkItemInfoGetNTbkItem { + s.ReservePrice = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetZkFinalPrice(v string) *TaobaoTbkItemInfoGetNTbkItem { + s.ZkFinalPrice = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetUserType(v int64) *TaobaoTbkItemInfoGetNTbkItem { + s.UserType = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetProvcity(v string) *TaobaoTbkItemInfoGetNTbkItem { + s.Provcity = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetItemUrl(v string) *TaobaoTbkItemInfoGetNTbkItem { + s.ItemUrl = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetSellerId(v int64) *TaobaoTbkItemInfoGetNTbkItem { + s.SellerId = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetVolume(v int64) *TaobaoTbkItemInfoGetNTbkItem { + s.Volume = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetNick(v string) *TaobaoTbkItemInfoGetNTbkItem { + s.Nick = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetCatLeafName(v string) *TaobaoTbkItemInfoGetNTbkItem { + s.CatLeafName = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetIsPrepay(v bool) *TaobaoTbkItemInfoGetNTbkItem { + s.IsPrepay = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetShopDsr(v int64) *TaobaoTbkItemInfoGetNTbkItem { + s.ShopDsr = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetRatesum(v int64) *TaobaoTbkItemInfoGetNTbkItem { + s.Ratesum = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetIRfdRate(v bool) *TaobaoTbkItemInfoGetNTbkItem { + s.IRfdRate = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetHGoodRate(v bool) *TaobaoTbkItemInfoGetNTbkItem { + s.HGoodRate = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetHPayRate30(v bool) *TaobaoTbkItemInfoGetNTbkItem { + s.HPayRate30 = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetFreeShipment(v bool) *TaobaoTbkItemInfoGetNTbkItem { + s.FreeShipment = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetMaterialLibType(v string) *TaobaoTbkItemInfoGetNTbkItem { + s.MaterialLibType = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetPresaleDiscountFeeText(v string) *TaobaoTbkItemInfoGetNTbkItem { + s.PresaleDiscountFeeText = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetPresaleTailEndTime(v int64) *TaobaoTbkItemInfoGetNTbkItem { + s.PresaleTailEndTime = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetPresaleTailStartTime(v int64) *TaobaoTbkItemInfoGetNTbkItem { + s.PresaleTailStartTime = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetPresaleEndTime(v int64) *TaobaoTbkItemInfoGetNTbkItem { + s.PresaleEndTime = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetPresaleStartTime(v int64) *TaobaoTbkItemInfoGetNTbkItem { + s.PresaleStartTime = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetPresaleDeposit(v string) *TaobaoTbkItemInfoGetNTbkItem { + s.PresaleDeposit = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetJuPlayEndTime(v int64) *TaobaoTbkItemInfoGetNTbkItem { + s.JuPlayEndTime = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetJuPlayStartTime(v int64) *TaobaoTbkItemInfoGetNTbkItem { + s.JuPlayStartTime = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetPlayInfo(v string) *TaobaoTbkItemInfoGetNTbkItem { + s.PlayInfo = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetTmallPlayActivityEndTime(v int64) *TaobaoTbkItemInfoGetNTbkItem { + s.TmallPlayActivityEndTime = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetTmallPlayActivityStartTime(v int64) *TaobaoTbkItemInfoGetNTbkItem { + s.TmallPlayActivityStartTime = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetJuOnlineStartTime(v string) *TaobaoTbkItemInfoGetNTbkItem { + s.JuOnlineStartTime = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetJuOnlineEndTime(v string) *TaobaoTbkItemInfoGetNTbkItem { + s.JuOnlineEndTime = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetJuPreShowStartTime(v string) *TaobaoTbkItemInfoGetNTbkItem { + s.JuPreShowStartTime = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetJuPreShowEndTime(v string) *TaobaoTbkItemInfoGetNTbkItem { + s.JuPreShowEndTime = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetSalePrice(v string) *TaobaoTbkItemInfoGetNTbkItem { + s.SalePrice = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetKuadianPromotionInfo(v string) *TaobaoTbkItemInfoGetNTbkItem { + s.KuadianPromotionInfo = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetSuperiorBrand(v string) *TaobaoTbkItemInfoGetNTbkItem { + s.SuperiorBrand = &v + return s +} +func (s *TaobaoTbkItemInfoGetNTbkItem) SetHotFlag(v string) *TaobaoTbkItemInfoGetNTbkItem { + s.HotFlag = &v + return s +} diff --git a/service/topsdk/ability371/request/TaobaoTbkCouponGetRequest.go b/service/topsdk/ability371/request/TaobaoTbkCouponGetRequest.go new file mode 100644 index 00000000..0757a0c9 --- /dev/null +++ b/service/topsdk/ability371/request/TaobaoTbkCouponGetRequest.go @@ -0,0 +1,45 @@ +package request + +type TaobaoTbkCouponGetRequest struct { + /* + 带券ID与商品ID的加密串 */ + Me *string `json:"me,omitempty" required:"false" ` + /* + 商品ID */ + ItemId *int64 `json:"item_id,omitempty" required:"false" ` + /* + 券ID */ + ActivityId *string `json:"activity_id,omitempty" required:"false" ` +} + +func (s *TaobaoTbkCouponGetRequest) SetMe(v string) *TaobaoTbkCouponGetRequest { + s.Me = &v + return s +} +func (s *TaobaoTbkCouponGetRequest) SetItemId(v int64) *TaobaoTbkCouponGetRequest { + s.ItemId = &v + return s +} +func (s *TaobaoTbkCouponGetRequest) SetActivityId(v string) *TaobaoTbkCouponGetRequest { + s.ActivityId = &v + return s +} + +func (req *TaobaoTbkCouponGetRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.Me != nil { + paramMap["me"] = *req.Me + } + if req.ItemId != nil { + paramMap["item_id"] = *req.ItemId + } + if req.ActivityId != nil { + paramMap["activity_id"] = *req.ActivityId + } + return paramMap +} + +func (req *TaobaoTbkCouponGetRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability371/request/TaobaoTbkItemInfoGetRequest.go b/service/topsdk/ability371/request/TaobaoTbkItemInfoGetRequest.go new file mode 100644 index 00000000..80b711bf --- /dev/null +++ b/service/topsdk/ability371/request/TaobaoTbkItemInfoGetRequest.go @@ -0,0 +1,45 @@ +package request + +type TaobaoTbkItemInfoGetRequest struct { + /* + 商品ID串,用,分割,最大40个 */ + NumIids *string `json:"num_iids" required:"true" ` + /* + 链接形式:1:PC,2:无线,默认:1 defalutValue��1 */ + Platform *int64 `json:"platform,omitempty" required:"false" ` + /* + ip地址,影响邮费获取,如果不传或者传入不准确,邮费无法精准提供 */ + Ip *string `json:"ip,omitempty" required:"false" ` +} + +func (s *TaobaoTbkItemInfoGetRequest) SetNumIids(v string) *TaobaoTbkItemInfoGetRequest { + s.NumIids = &v + return s +} +func (s *TaobaoTbkItemInfoGetRequest) SetPlatform(v int64) *TaobaoTbkItemInfoGetRequest { + s.Platform = &v + return s +} +func (s *TaobaoTbkItemInfoGetRequest) SetIp(v string) *TaobaoTbkItemInfoGetRequest { + s.Ip = &v + return s +} + +func (req *TaobaoTbkItemInfoGetRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.NumIids != nil { + paramMap["num_iids"] = *req.NumIids + } + if req.Platform != nil { + paramMap["platform"] = *req.Platform + } + if req.Ip != nil { + paramMap["ip"] = *req.Ip + } + return paramMap +} + +func (req *TaobaoTbkItemInfoGetRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability371/response/TaobaoTbkCouponGetResponse.go b/service/topsdk/ability371/response/TaobaoTbkCouponGetResponse.go new file mode 100644 index 00000000..aa04af39 --- /dev/null +++ b/service/topsdk/ability371/response/TaobaoTbkCouponGetResponse.go @@ -0,0 +1,23 @@ +package response + +import ( + "topsdk/ability371/domain" +) + +type TaobaoTbkCouponGetResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + data + */ + Data domain.TaobaoTbkCouponGetMapData `json:"data,omitempty" ` +} diff --git a/service/topsdk/ability371/response/TaobaoTbkItemInfoGetResponse.go b/service/topsdk/ability371/response/TaobaoTbkItemInfoGetResponse.go new file mode 100644 index 00000000..b995acbf --- /dev/null +++ b/service/topsdk/ability371/response/TaobaoTbkItemInfoGetResponse.go @@ -0,0 +1,23 @@ +package response + +import ( + "topsdk/ability371/domain" +) + +type TaobaoTbkItemInfoGetResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + 淘宝客商品 + */ + Results []domain.TaobaoTbkItemInfoGetNTbkItem `json:"results,omitempty" ` +} diff --git a/service/topsdk/ability373/Ability373.go b/service/topsdk/ability373/Ability373.go new file mode 100644 index 00000000..65363476 --- /dev/null +++ b/service/topsdk/ability373/Ability373.go @@ -0,0 +1,38 @@ +package ability373 + +import ( + "errors" + "log" + "topsdk" + "topsdk/ability373/request" + "topsdk/ability373/response" + "topsdk/util" +) + +type Ability373 struct { + Client *topsdk.TopClient +} + +func NewAbility373(client *topsdk.TopClient) *Ability373 { + return &Ability373{client} +} + +/* + 聚划算商品搜索接口 +*/ +func (ability *Ability373) TaobaoJuItemsSearch(req *request.TaobaoJuItemsSearchRequest) (*response.TaobaoJuItemsSearchResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability373 topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.ju.items.search", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoJuItemsSearchResponse{} + if err != nil { + log.Fatal("taobaoJuItemsSearch error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} diff --git a/service/topsdk/ability373/domain/TaobaoJuItemsSearchExtend.go b/service/topsdk/ability373/domain/TaobaoJuItemsSearchExtend.go new file mode 100644 index 00000000..1c5e471c --- /dev/null +++ b/service/topsdk/ability373/domain/TaobaoJuItemsSearchExtend.go @@ -0,0 +1,12 @@ +package domain + +type TaobaoJuItemsSearchExtend struct { + /* + empty */ + Empty *bool `json:"empty,omitempty" ` +} + +func (s *TaobaoJuItemsSearchExtend) SetEmpty(v bool) *TaobaoJuItemsSearchExtend { + s.Empty = &v + return s +} diff --git a/service/topsdk/ability373/domain/TaobaoJuItemsSearchItems.go b/service/topsdk/ability373/domain/TaobaoJuItemsSearchItems.go new file mode 100644 index 00000000..fcbd7b92 --- /dev/null +++ b/service/topsdk/ability373/domain/TaobaoJuItemsSearchItems.go @@ -0,0 +1,164 @@ +package domain + +type TaobaoJuItemsSearchItems struct { + /* + 卖点描述 */ + UspDescList *[]string `json:"usp_desc_list,omitempty" ` + + /* + 淘宝类目id */ + TbFirstCatId *int64 `json:"tb_first_cat_id,omitempty" ` + + /* + 原价 */ + OrigPrice *string `json:"orig_price,omitempty" ` + + /* + itemId */ + ItemId *int64 `json:"item_id,omitempty" ` + + /* + 展示结束时间 */ + ShowEndTime *int64 `json:"show_end_time,omitempty" ` + + /* + pc链接 */ + PcUrl *string `json:"pc_url,omitempty" ` + + /* + 频道id */ + PlatformId *int64 `json:"platform_id,omitempty" ` + + /* + 聚划算id */ + JuId *int64 `json:"ju_id,omitempty" ` + + /* + 无线主图 */ + PicUrlForWL *string `json:"pic_url_for_w_l,omitempty" ` + + /* + 开团时间 */ + OnlineStartTime *int64 `json:"online_start_time,omitempty" ` + + /* + 类目名称 */ + CategoryName *string `json:"category_name,omitempty" ` + + /* + 聚划算价格,单位分 */ + ActPrice *string `json:"act_price,omitempty" ` + + /* + 商品标题 */ + Title *string `json:"title,omitempty" ` + + /* + 无线链接 */ + WapUrl *string `json:"wap_url,omitempty" ` + + /* + 商品卖点 */ + ItemUspList *[]string `json:"item_usp_list,omitempty" ` + + /* + 开始展示时间 */ + ShowStartTime *int64 `json:"show_start_time,omitempty" ` + + /* + 开团结束时间 */ + OnlineEndTime *int64 `json:"online_end_time,omitempty" ` + + /* + pc主图 */ + PicUrlForPC *string `json:"pic_url_for_p_c,omitempty" ` + + /* + 价格卖点 */ + PriceUspList *[]string `json:"price_usp_list,omitempty" ` + + /* + 是否包邮 */ + PayPostage *bool `json:"pay_postage,omitempty" ` +} + +func (s *TaobaoJuItemsSearchItems) SetUspDescList(v []string) *TaobaoJuItemsSearchItems { + s.UspDescList = &v + return s +} +func (s *TaobaoJuItemsSearchItems) SetTbFirstCatId(v int64) *TaobaoJuItemsSearchItems { + s.TbFirstCatId = &v + return s +} +func (s *TaobaoJuItemsSearchItems) SetOrigPrice(v string) *TaobaoJuItemsSearchItems { + s.OrigPrice = &v + return s +} +func (s *TaobaoJuItemsSearchItems) SetItemId(v int64) *TaobaoJuItemsSearchItems { + s.ItemId = &v + return s +} +func (s *TaobaoJuItemsSearchItems) SetShowEndTime(v int64) *TaobaoJuItemsSearchItems { + s.ShowEndTime = &v + return s +} +func (s *TaobaoJuItemsSearchItems) SetPcUrl(v string) *TaobaoJuItemsSearchItems { + s.PcUrl = &v + return s +} +func (s *TaobaoJuItemsSearchItems) SetPlatformId(v int64) *TaobaoJuItemsSearchItems { + s.PlatformId = &v + return s +} +func (s *TaobaoJuItemsSearchItems) SetJuId(v int64) *TaobaoJuItemsSearchItems { + s.JuId = &v + return s +} +func (s *TaobaoJuItemsSearchItems) SetPicUrlForWL(v string) *TaobaoJuItemsSearchItems { + s.PicUrlForWL = &v + return s +} +func (s *TaobaoJuItemsSearchItems) SetOnlineStartTime(v int64) *TaobaoJuItemsSearchItems { + s.OnlineStartTime = &v + return s +} +func (s *TaobaoJuItemsSearchItems) SetCategoryName(v string) *TaobaoJuItemsSearchItems { + s.CategoryName = &v + return s +} +func (s *TaobaoJuItemsSearchItems) SetActPrice(v string) *TaobaoJuItemsSearchItems { + s.ActPrice = &v + return s +} +func (s *TaobaoJuItemsSearchItems) SetTitle(v string) *TaobaoJuItemsSearchItems { + s.Title = &v + return s +} +func (s *TaobaoJuItemsSearchItems) SetWapUrl(v string) *TaobaoJuItemsSearchItems { + s.WapUrl = &v + return s +} +func (s *TaobaoJuItemsSearchItems) SetItemUspList(v []string) *TaobaoJuItemsSearchItems { + s.ItemUspList = &v + return s +} +func (s *TaobaoJuItemsSearchItems) SetShowStartTime(v int64) *TaobaoJuItemsSearchItems { + s.ShowStartTime = &v + return s +} +func (s *TaobaoJuItemsSearchItems) SetOnlineEndTime(v int64) *TaobaoJuItemsSearchItems { + s.OnlineEndTime = &v + return s +} +func (s *TaobaoJuItemsSearchItems) SetPicUrlForPC(v string) *TaobaoJuItemsSearchItems { + s.PicUrlForPC = &v + return s +} +func (s *TaobaoJuItemsSearchItems) SetPriceUspList(v []string) *TaobaoJuItemsSearchItems { + s.PriceUspList = &v + return s +} +func (s *TaobaoJuItemsSearchItems) SetPayPostage(v bool) *TaobaoJuItemsSearchItems { + s.PayPostage = &v + return s +} diff --git a/service/topsdk/ability373/domain/TaobaoJuItemsSearchPaginationResult.go b/service/topsdk/ability373/domain/TaobaoJuItemsSearchPaginationResult.go new file mode 100644 index 00000000..30e2001a --- /dev/null +++ b/service/topsdk/ability373/domain/TaobaoJuItemsSearchPaginationResult.go @@ -0,0 +1,84 @@ +package domain + +type TaobaoJuItemsSearchPaginationResult struct { + /* + 当前页码 */ + CurrentPage *int64 `json:"current_page,omitempty" ` + + /* + 扩展属性 */ + Extend *TaobaoJuItemsSearchExtend `json:"extend,omitempty" ` + + /* + 商品数据 */ + ModelList *[]TaobaoJuItemsSearchItems `json:"model_list,omitempty" ` + + /* + 错误码 */ + MsgCode *string `json:"msg_code,omitempty" ` + + /* + 错误信息 */ + MsgInfo *string `json:"msg_info,omitempty" ` + + /* + 一页大小 */ + PageSize *int64 `json:"page_size,omitempty" ` + + /* + 请求是否成功 */ + Success *bool `json:"success,omitempty" ` + + /* + 商品总数 */ + TotalItem *int64 `json:"total_item,omitempty" ` + + /* + 总页数 */ + TotalPage *int64 `json:"total_page,omitempty" ` + + /* + 埋点信息 */ + TrackParams *TaobaoJuItemsSearchTrackparams `json:"track_params,omitempty" ` +} + +func (s *TaobaoJuItemsSearchPaginationResult) SetCurrentPage(v int64) *TaobaoJuItemsSearchPaginationResult { + s.CurrentPage = &v + return s +} +func (s *TaobaoJuItemsSearchPaginationResult) SetExtend(v TaobaoJuItemsSearchExtend) *TaobaoJuItemsSearchPaginationResult { + s.Extend = &v + return s +} +func (s *TaobaoJuItemsSearchPaginationResult) SetModelList(v []TaobaoJuItemsSearchItems) *TaobaoJuItemsSearchPaginationResult { + s.ModelList = &v + return s +} +func (s *TaobaoJuItemsSearchPaginationResult) SetMsgCode(v string) *TaobaoJuItemsSearchPaginationResult { + s.MsgCode = &v + return s +} +func (s *TaobaoJuItemsSearchPaginationResult) SetMsgInfo(v string) *TaobaoJuItemsSearchPaginationResult { + s.MsgInfo = &v + return s +} +func (s *TaobaoJuItemsSearchPaginationResult) SetPageSize(v int64) *TaobaoJuItemsSearchPaginationResult { + s.PageSize = &v + return s +} +func (s *TaobaoJuItemsSearchPaginationResult) SetSuccess(v bool) *TaobaoJuItemsSearchPaginationResult { + s.Success = &v + return s +} +func (s *TaobaoJuItemsSearchPaginationResult) SetTotalItem(v int64) *TaobaoJuItemsSearchPaginationResult { + s.TotalItem = &v + return s +} +func (s *TaobaoJuItemsSearchPaginationResult) SetTotalPage(v int64) *TaobaoJuItemsSearchPaginationResult { + s.TotalPage = &v + return s +} +func (s *TaobaoJuItemsSearchPaginationResult) SetTrackParams(v TaobaoJuItemsSearchTrackparams) *TaobaoJuItemsSearchPaginationResult { + s.TrackParams = &v + return s +} diff --git a/service/topsdk/ability373/domain/TaobaoJuItemsSearchTopItemQuery.go b/service/topsdk/ability373/domain/TaobaoJuItemsSearchTopItemQuery.go new file mode 100644 index 00000000..23aff297 --- /dev/null +++ b/service/topsdk/ability373/domain/TaobaoJuItemsSearchTopItemQuery.go @@ -0,0 +1,60 @@ +package domain + +type TaobaoJuItemsSearchTopItemQuery struct { + /* + 页码,必传 defalutValue:1 */ + CurrentPage *int64 `json:"current_page,omitempty" ` + + /* + 一页大小,必传 defalutValue:20 */ + PageSize *int64 `json:"page_size,omitempty" ` + + /* + 媒体pid,必传 */ + Pid *string `json:"pid,omitempty" ` + + /* + 是否包邮,可不传 */ + Postage *bool `json:"postage,omitempty" ` + + /* + 状态,预热:1,正在进行中:2,可不传 */ + Status *int64 `json:"status,omitempty" ` + + /* + 淘宝类目id,可不传 */ + TaobaoCategoryId *int64 `json:"taobao_category_id,omitempty" ` + + /* + 搜索关键词,可不传 */ + Word *string `json:"word,omitempty" ` +} + +func (s *TaobaoJuItemsSearchTopItemQuery) SetCurrentPage(v int64) *TaobaoJuItemsSearchTopItemQuery { + s.CurrentPage = &v + return s +} +func (s *TaobaoJuItemsSearchTopItemQuery) SetPageSize(v int64) *TaobaoJuItemsSearchTopItemQuery { + s.PageSize = &v + return s +} +func (s *TaobaoJuItemsSearchTopItemQuery) SetPid(v string) *TaobaoJuItemsSearchTopItemQuery { + s.Pid = &v + return s +} +func (s *TaobaoJuItemsSearchTopItemQuery) SetPostage(v bool) *TaobaoJuItemsSearchTopItemQuery { + s.Postage = &v + return s +} +func (s *TaobaoJuItemsSearchTopItemQuery) SetStatus(v int64) *TaobaoJuItemsSearchTopItemQuery { + s.Status = &v + return s +} +func (s *TaobaoJuItemsSearchTopItemQuery) SetTaobaoCategoryId(v int64) *TaobaoJuItemsSearchTopItemQuery { + s.TaobaoCategoryId = &v + return s +} +func (s *TaobaoJuItemsSearchTopItemQuery) SetWord(v string) *TaobaoJuItemsSearchTopItemQuery { + s.Word = &v + return s +} diff --git a/service/topsdk/ability373/domain/TaobaoJuItemsSearchTrackparams.go b/service/topsdk/ability373/domain/TaobaoJuItemsSearchTrackparams.go new file mode 100644 index 00000000..d9fce6cf --- /dev/null +++ b/service/topsdk/ability373/domain/TaobaoJuItemsSearchTrackparams.go @@ -0,0 +1,12 @@ +package domain + +type TaobaoJuItemsSearchTrackparams struct { + /* + empty */ + Empty *bool `json:"empty,omitempty" ` +} + +func (s *TaobaoJuItemsSearchTrackparams) SetEmpty(v bool) *TaobaoJuItemsSearchTrackparams { + s.Empty = &v + return s +} diff --git a/service/topsdk/ability373/request/TaobaoJuItemsSearchRequest.go b/service/topsdk/ability373/request/TaobaoJuItemsSearchRequest.go new file mode 100644 index 00000000..c9903694 --- /dev/null +++ b/service/topsdk/ability373/request/TaobaoJuItemsSearchRequest.go @@ -0,0 +1,30 @@ +package request + +import ( + "topsdk/ability373/domain" + "topsdk/util" +) + +type TaobaoJuItemsSearchRequest struct { + /* + query */ + ParamTopItemQuery *domain.TaobaoJuItemsSearchTopItemQuery `json:"param_top_item_query,omitempty" required:"false" ` +} + +func (s *TaobaoJuItemsSearchRequest) SetParamTopItemQuery(v domain.TaobaoJuItemsSearchTopItemQuery) *TaobaoJuItemsSearchRequest { + s.ParamTopItemQuery = &v + return s +} + +func (req *TaobaoJuItemsSearchRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.ParamTopItemQuery != nil { + paramMap["param_top_item_query"] = util.ConvertStruct(*req.ParamTopItemQuery) + } + return paramMap +} + +func (req *TaobaoJuItemsSearchRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability373/response/TaobaoJuItemsSearchResponse.go b/service/topsdk/ability373/response/TaobaoJuItemsSearchResponse.go new file mode 100644 index 00000000..5f90f6ac --- /dev/null +++ b/service/topsdk/ability373/response/TaobaoJuItemsSearchResponse.go @@ -0,0 +1,23 @@ +package response + +import ( + "topsdk/ability373/domain" +) + +type TaobaoJuItemsSearchResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + 返回结果 + */ + Result domain.TaobaoJuItemsSearchPaginationResult `json:"result,omitempty" ` +} diff --git a/service/topsdk/ability374/Ability374.go b/service/topsdk/ability374/Ability374.go new file mode 100644 index 00000000..ba07a083 --- /dev/null +++ b/service/topsdk/ability374/Ability374.go @@ -0,0 +1,38 @@ +package ability374 + +import ( + "errors" + "log" + "topsdk" + "topsdk/ability374/request" + "topsdk/ability374/response" + "topsdk/util" +) + +type Ability374 struct { + Client *topsdk.TopClient +} + +func NewAbility374(client *topsdk.TopClient) *Ability374 { + return &Ability374{client} +} + +/* + 淘宝客-推广者-官方活动转链 +*/ +func (ability *Ability374) TaobaoTbkActivityInfoGet(req *request.TaobaoTbkActivityInfoGetRequest) (*response.TaobaoTbkActivityInfoGetResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability374 topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.tbk.activity.info.get", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoTbkActivityInfoGetResponse{} + if err != nil { + log.Fatal("taobaoTbkActivityInfoGet error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} diff --git a/service/topsdk/ability374/domain/TaobaoTbkActivityInfoGetData.go b/service/topsdk/ability374/domain/TaobaoTbkActivityInfoGetData.go new file mode 100644 index 00000000..272e9aca --- /dev/null +++ b/service/topsdk/ability374/domain/TaobaoTbkActivityInfoGetData.go @@ -0,0 +1,76 @@ +package domain + +type TaobaoTbkActivityInfoGetData struct { + /* + 【本地化】微信推广二维码地址 */ + WxQrcodeUrl *string `json:"wx_qrcode_url,omitempty" ` + + /* + 淘客推广长链 */ + ClickUrl *string `json:"click_url,omitempty" ` + + /* + 淘客推广短链 */ + ShortClickUrl *string `json:"short_click_url,omitempty" ` + + /* + 投放平台, 1-PC 2-无线 */ + TerminalType *string `json:"terminal_type,omitempty" ` + + /* + 物料素材下载地址 */ + MaterialOssUrl *string `json:"material_oss_url,omitempty" ` + + /* + 会场名称 */ + PageName *string `json:"page_name,omitempty" ` + + /* + 活动开始时间 */ + PageStartTime *string `json:"page_start_time,omitempty" ` + + /* + 活动结束时间 */ + PageEndTime *string `json:"page_end_time,omitempty" ` + + /* + 【本地化】微信小程序路径 */ + WxMiniprogramPath *string `json:"wx_miniprogram_path,omitempty" ` +} + +func (s *TaobaoTbkActivityInfoGetData) SetWxQrcodeUrl(v string) *TaobaoTbkActivityInfoGetData { + s.WxQrcodeUrl = &v + return s +} +func (s *TaobaoTbkActivityInfoGetData) SetClickUrl(v string) *TaobaoTbkActivityInfoGetData { + s.ClickUrl = &v + return s +} +func (s *TaobaoTbkActivityInfoGetData) SetShortClickUrl(v string) *TaobaoTbkActivityInfoGetData { + s.ShortClickUrl = &v + return s +} +func (s *TaobaoTbkActivityInfoGetData) SetTerminalType(v string) *TaobaoTbkActivityInfoGetData { + s.TerminalType = &v + return s +} +func (s *TaobaoTbkActivityInfoGetData) SetMaterialOssUrl(v string) *TaobaoTbkActivityInfoGetData { + s.MaterialOssUrl = &v + return s +} +func (s *TaobaoTbkActivityInfoGetData) SetPageName(v string) *TaobaoTbkActivityInfoGetData { + s.PageName = &v + return s +} +func (s *TaobaoTbkActivityInfoGetData) SetPageStartTime(v string) *TaobaoTbkActivityInfoGetData { + s.PageStartTime = &v + return s +} +func (s *TaobaoTbkActivityInfoGetData) SetPageEndTime(v string) *TaobaoTbkActivityInfoGetData { + s.PageEndTime = &v + return s +} +func (s *TaobaoTbkActivityInfoGetData) SetWxMiniprogramPath(v string) *TaobaoTbkActivityInfoGetData { + s.WxMiniprogramPath = &v + return s +} diff --git a/service/topsdk/ability374/request/TaobaoTbkActivityInfoGetRequest.go b/service/topsdk/ability374/request/TaobaoTbkActivityInfoGetRequest.go new file mode 100644 index 00000000..59b2577f --- /dev/null +++ b/service/topsdk/ability374/request/TaobaoTbkActivityInfoGetRequest.go @@ -0,0 +1,65 @@ +package request + +type TaobaoTbkActivityInfoGetRequest struct { + /* + 官方活动会场ID,从淘宝客后台“我要推广-活动推广”中获取 */ + ActivityMaterialId *string `json:"activity_material_id" required:"true" ` + /* + mm_xxx_xxx_xxx的第三位 */ + AdzoneId *int64 `json:"adzone_id" required:"true" ` + /* + mm_xxx_xxx_xxx 仅三方分成场景使用 */ + SubPid *string `json:"sub_pid,omitempty" required:"false" ` + /* + 渠道关系id */ + RelationId *int64 `json:"relation_id,omitempty" required:"false" ` + /* + 自定义输入串,英文和数字组成,长度不能大于12个字符,区分不同的推广渠道 */ + UnionId *string `json:"union_id,omitempty" required:"false" ` +} + +func (s *TaobaoTbkActivityInfoGetRequest) SetActivityMaterialId(v string) *TaobaoTbkActivityInfoGetRequest { + s.ActivityMaterialId = &v + return s +} +func (s *TaobaoTbkActivityInfoGetRequest) SetAdzoneId(v int64) *TaobaoTbkActivityInfoGetRequest { + s.AdzoneId = &v + return s +} +func (s *TaobaoTbkActivityInfoGetRequest) SetSubPid(v string) *TaobaoTbkActivityInfoGetRequest { + s.SubPid = &v + return s +} +func (s *TaobaoTbkActivityInfoGetRequest) SetRelationId(v int64) *TaobaoTbkActivityInfoGetRequest { + s.RelationId = &v + return s +} +func (s *TaobaoTbkActivityInfoGetRequest) SetUnionId(v string) *TaobaoTbkActivityInfoGetRequest { + s.UnionId = &v + return s +} + +func (req *TaobaoTbkActivityInfoGetRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.ActivityMaterialId != nil { + paramMap["activity_material_id"] = *req.ActivityMaterialId + } + if req.AdzoneId != nil { + paramMap["adzone_id"] = *req.AdzoneId + } + if req.SubPid != nil { + paramMap["sub_pid"] = *req.SubPid + } + if req.RelationId != nil { + paramMap["relation_id"] = *req.RelationId + } + if req.UnionId != nil { + paramMap["union_id"] = *req.UnionId + } + return paramMap +} + +func (req *TaobaoTbkActivityInfoGetRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability374/response/TaobaoTbkActivityInfoGetResponse.go b/service/topsdk/ability374/response/TaobaoTbkActivityInfoGetResponse.go new file mode 100644 index 00000000..8fd43200 --- /dev/null +++ b/service/topsdk/ability374/response/TaobaoTbkActivityInfoGetResponse.go @@ -0,0 +1,23 @@ +package response + +import ( + "topsdk/ability374/domain" +) + +type TaobaoTbkActivityInfoGetResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + 返回结果对象 + */ + Data domain.TaobaoTbkActivityInfoGetData `json:"data,omitempty" ` +} diff --git a/service/topsdk/ability375/Ability375.go b/service/topsdk/ability375/Ability375.go new file mode 100644 index 00000000..5a33b360 --- /dev/null +++ b/service/topsdk/ability375/Ability375.go @@ -0,0 +1,38 @@ +package ability375 + +import ( + "errors" + "log" + "topsdk" + "topsdk/ability375/request" + "topsdk/ability375/response" + "topsdk/util" +) + +type Ability375 struct { + Client *topsdk.TopClient +} + +func NewAbility375(client *topsdk.TopClient) *Ability375 { + return &Ability375{client} +} + +/* + 淘宝客-公用-淘口令生成 +*/ +func (ability *Ability375) TaobaoTbkTpwdCreate(req *request.TaobaoTbkTpwdCreateRequest) (*response.TaobaoTbkTpwdCreateResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability375 topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.tbk.tpwd.create", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoTbkTpwdCreateResponse{} + if err != nil { + log.Fatal("taobaoTbkTpwdCreate error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} diff --git a/service/topsdk/ability375/domain/TaobaoTbkTpwdCreateMapData.go b/service/topsdk/ability375/domain/TaobaoTbkTpwdCreateMapData.go new file mode 100644 index 00000000..9402b0a8 --- /dev/null +++ b/service/topsdk/ability375/domain/TaobaoTbkTpwdCreateMapData.go @@ -0,0 +1,20 @@ +package domain + +type TaobaoTbkTpwdCreateMapData struct { + /* + 非苹果ios14以上版本的设备(即其他ios版本、Android系统等),可以用此淘口令正常在复制到手淘打开 */ + PasswordSimple *string `json:"password_simple,omitempty" ` + + /* + 针对苹果ios14及以上版本的苹果设备,手淘将按照示例值信息格式读取淘口令(需包含:数字+羊角符+url,识别规则可能根据ios情况变更)。如需更改淘口令内文案、url等内容,请务必先验证更改后的淘口令在手淘可被识别打开! */ + Model *string `json:"model,omitempty" ` +} + +func (s *TaobaoTbkTpwdCreateMapData) SetPasswordSimple(v string) *TaobaoTbkTpwdCreateMapData { + s.PasswordSimple = &v + return s +} +func (s *TaobaoTbkTpwdCreateMapData) SetModel(v string) *TaobaoTbkTpwdCreateMapData { + s.Model = &v + return s +} diff --git a/service/topsdk/ability375/request/TaobaoTbkTpwdCreateRequest.go b/service/topsdk/ability375/request/TaobaoTbkTpwdCreateRequest.go new file mode 100644 index 00000000..45e17403 --- /dev/null +++ b/service/topsdk/ability375/request/TaobaoTbkTpwdCreateRequest.go @@ -0,0 +1,65 @@ +package request + +type TaobaoTbkTpwdCreateRequest struct { + /* + 兼容旧版本api参数,无实际作用 */ + Text *string `json:"text,omitempty" required:"false" ` + /* + 兼容旧版本api参数,无实际作用 */ + Logo *string `json:"logo,omitempty" required:"false" ` + /* + 兼容旧版本api参数,无实际作用 */ + Ext *string `json:"ext,omitempty" required:"false" ` + /* + 兼容旧版本api参数,无实际作用 */ + UserId *string `json:"user_id,omitempty" required:"false" ` + /* + 联盟官方渠道获取的淘客推广链接,请注意,不要随意篡改官方生成的链接,否则可能无法生成淘口令 */ + Url *string `json:"url" required:"true" ` +} + +func (s *TaobaoTbkTpwdCreateRequest) SetText(v string) *TaobaoTbkTpwdCreateRequest { + s.Text = &v + return s +} +func (s *TaobaoTbkTpwdCreateRequest) SetLogo(v string) *TaobaoTbkTpwdCreateRequest { + s.Logo = &v + return s +} +func (s *TaobaoTbkTpwdCreateRequest) SetExt(v string) *TaobaoTbkTpwdCreateRequest { + s.Ext = &v + return s +} +func (s *TaobaoTbkTpwdCreateRequest) SetUserId(v string) *TaobaoTbkTpwdCreateRequest { + s.UserId = &v + return s +} +func (s *TaobaoTbkTpwdCreateRequest) SetUrl(v string) *TaobaoTbkTpwdCreateRequest { + s.Url = &v + return s +} + +func (req *TaobaoTbkTpwdCreateRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.Text != nil { + paramMap["text"] = *req.Text + } + if req.Logo != nil { + paramMap["logo"] = *req.Logo + } + if req.Ext != nil { + paramMap["ext"] = *req.Ext + } + if req.UserId != nil { + paramMap["user_id"] = *req.UserId + } + if req.Url != nil { + paramMap["url"] = *req.Url + } + return paramMap +} + +func (req *TaobaoTbkTpwdCreateRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability375/response/TaobaoTbkTpwdCreateResponse.go b/service/topsdk/ability375/response/TaobaoTbkTpwdCreateResponse.go new file mode 100644 index 00000000..c260a7a0 --- /dev/null +++ b/service/topsdk/ability375/response/TaobaoTbkTpwdCreateResponse.go @@ -0,0 +1,23 @@ +package response + +import ( + "topsdk/ability375/domain" +) + +type TaobaoTbkTpwdCreateResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + 返回结果对象 + */ + Data domain.TaobaoTbkTpwdCreateMapData `json:"data,omitempty" ` +} diff --git a/service/topsdk/ability376/Ability376.go b/service/topsdk/ability376/Ability376.go new file mode 100644 index 00000000..8d712876 --- /dev/null +++ b/service/topsdk/ability376/Ability376.go @@ -0,0 +1,38 @@ +package ability376 + +import ( + "errors" + "log" + "topsdk" + "topsdk/ability376/request" + "topsdk/ability376/response" + "topsdk/util" +) + +type Ability376 struct { + Client *topsdk.TopClient +} + +func NewAbility376(client *topsdk.TopClient) *Ability376 { + return &Ability376{client} +} + +/* + 淘宝客-公用-长链转短链 +*/ +func (ability *Ability376) TaobaoTbkSpreadGet(req *request.TaobaoTbkSpreadGetRequest) (*response.TaobaoTbkSpreadGetResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability376 topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.tbk.spread.get", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoTbkSpreadGetResponse{} + if err != nil { + log.Fatal("taobaoTbkSpreadGet error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} diff --git a/service/topsdk/ability376/domain/TaobaoTbkSpreadGetTbkSpread.go b/service/topsdk/ability376/domain/TaobaoTbkSpreadGetTbkSpread.go new file mode 100644 index 00000000..4e9cb736 --- /dev/null +++ b/service/topsdk/ability376/domain/TaobaoTbkSpreadGetTbkSpread.go @@ -0,0 +1,20 @@ +package domain + +type TaobaoTbkSpreadGetTbkSpread struct { + /* + 传播形式, 目前只支持短链接 */ + Content *string `json:"content,omitempty" ` + + /* + 调用错误信息;由于是批量接口,请重点关注每条请求返回的结果,如果非OK,则说明该结果对应的content不正常,请酌情处理; */ + ErrMsg *string `json:"err_msg,omitempty" ` +} + +func (s *TaobaoTbkSpreadGetTbkSpread) SetContent(v string) *TaobaoTbkSpreadGetTbkSpread { + s.Content = &v + return s +} +func (s *TaobaoTbkSpreadGetTbkSpread) SetErrMsg(v string) *TaobaoTbkSpreadGetTbkSpread { + s.ErrMsg = &v + return s +} diff --git a/service/topsdk/ability376/domain/TaobaoTbkSpreadGetTbkSpreadRequest.go b/service/topsdk/ability376/domain/TaobaoTbkSpreadGetTbkSpreadRequest.go new file mode 100644 index 00000000..3680744f --- /dev/null +++ b/service/topsdk/ability376/domain/TaobaoTbkSpreadGetTbkSpreadRequest.go @@ -0,0 +1,12 @@ +package domain + +type TaobaoTbkSpreadGetTbkSpreadRequest struct { + /* + 原始url, 只支持uland.taobao.com,s.click.taobao.com, ai.taobao.com,temai.taobao.com的域名转换,否则判错 */ + Url *string `json:"url,omitempty" ` +} + +func (s *TaobaoTbkSpreadGetTbkSpreadRequest) SetUrl(v string) *TaobaoTbkSpreadGetTbkSpreadRequest { + s.Url = &v + return s +} diff --git a/service/topsdk/ability376/request/TaobaoTbkSpreadGetRequest.go b/service/topsdk/ability376/request/TaobaoTbkSpreadGetRequest.go new file mode 100644 index 00000000..9b34636d --- /dev/null +++ b/service/topsdk/ability376/request/TaobaoTbkSpreadGetRequest.go @@ -0,0 +1,30 @@ +package request + +import ( + "topsdk/ability376/domain" + "topsdk/util" +) + +type TaobaoTbkSpreadGetRequest struct { + /* + 请求列表,内部包含多个url */ + Requests *[]domain.TaobaoTbkSpreadGetTbkSpreadRequest `json:"requests" required:"true" ` +} + +func (s *TaobaoTbkSpreadGetRequest) SetRequests(v []domain.TaobaoTbkSpreadGetTbkSpreadRequest) *TaobaoTbkSpreadGetRequest { + s.Requests = &v + return s +} + +func (req *TaobaoTbkSpreadGetRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.Requests != nil { + paramMap["requests"] = util.ConvertStructList(*req.Requests) + } + return paramMap +} + +func (req *TaobaoTbkSpreadGetRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability376/response/TaobaoTbkSpreadGetResponse.go b/service/topsdk/ability376/response/TaobaoTbkSpreadGetResponse.go new file mode 100644 index 00000000..7dc4ae1f --- /dev/null +++ b/service/topsdk/ability376/response/TaobaoTbkSpreadGetResponse.go @@ -0,0 +1,27 @@ +package response + +import ( + "topsdk/ability376/domain" +) + +type TaobaoTbkSpreadGetResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + 传播形式对象列表 + */ + Results []domain.TaobaoTbkSpreadGetTbkSpread `json:"results,omitempty" ` + /* + totalResults + */ + TotalResults int64 `json:"total_results,omitempty" ` +} diff --git a/service/topsdk/ability382/Ability382.go b/service/topsdk/ability382/Ability382.go new file mode 100644 index 00000000..65bf8d13 --- /dev/null +++ b/service/topsdk/ability382/Ability382.go @@ -0,0 +1,38 @@ +package ability382 + +import ( + "errors" + "log" + "topsdk" + "topsdk/ability382/request" + "topsdk/ability382/response" + "topsdk/util" +) + +type Ability382 struct { + Client *topsdk.TopClient +} + +func NewAbility382(client *topsdk.TopClient) *Ability382 { + return &Ability382{client} +} + +/* + 淘宝客-推广者-红包领取状态查询 +*/ +func (ability *Ability382) TaobaoTbkDgVegasSendStatus(req *request.TaobaoTbkDgVegasSendStatusRequest) (*response.TaobaoTbkDgVegasSendStatusResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability382 topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.tbk.dg.vegas.send.status", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoTbkDgVegasSendStatusResponse{} + if err != nil { + log.Fatal("taobaoTbkDgVegasSendStatus error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} diff --git a/service/topsdk/ability382/domain/TaobaoTbkDgVegasSendStatusData.go b/service/topsdk/ability382/domain/TaobaoTbkDgVegasSendStatusData.go new file mode 100644 index 00000000..b1e1c668 --- /dev/null +++ b/service/topsdk/ability382/domain/TaobaoTbkDgVegasSendStatusData.go @@ -0,0 +1,12 @@ +package domain + +type TaobaoTbkDgVegasSendStatusData struct { + /* + 返回结果封装对象 */ + ResultList *[]TaobaoTbkDgVegasSendStatusMapData `json:"result_list,omitempty" ` +} + +func (s *TaobaoTbkDgVegasSendStatusData) SetResultList(v []TaobaoTbkDgVegasSendStatusMapData) *TaobaoTbkDgVegasSendStatusData { + s.ResultList = &v + return s +} diff --git a/service/topsdk/ability382/domain/TaobaoTbkDgVegasSendStatusMapData.go b/service/topsdk/ability382/domain/TaobaoTbkDgVegasSendStatusMapData.go new file mode 100644 index 00000000..1b893935 --- /dev/null +++ b/service/topsdk/ability382/domain/TaobaoTbkDgVegasSendStatusMapData.go @@ -0,0 +1,12 @@ +package domain + +type TaobaoTbkDgVegasSendStatusMapData struct { + /* + 若该用户当前无待核销的红包,则返回1,若当前有待核销的红包,则返回0 */ + IsNewUser *string `json:"is_new_user,omitempty" ` +} + +func (s *TaobaoTbkDgVegasSendStatusMapData) SetIsNewUser(v string) *TaobaoTbkDgVegasSendStatusMapData { + s.IsNewUser = &v + return s +} diff --git a/service/topsdk/ability382/request/TaobaoTbkDgVegasSendStatusRequest.go b/service/topsdk/ability382/request/TaobaoTbkDgVegasSendStatusRequest.go new file mode 100644 index 00000000..1de14b2c --- /dev/null +++ b/service/topsdk/ability382/request/TaobaoTbkDgVegasSendStatusRequest.go @@ -0,0 +1,75 @@ +package request + +type TaobaoTbkDgVegasSendStatusRequest struct { + /* + 渠道管理id */ + RelationId *string `json:"relation_id,omitempty" required:"false" ` + /* + 会员运营id */ + SpecialId *string `json:"special_id,omitempty" required:"false" ` + /* + 加密后的值(ALIPAY_ID除外),需用MD5加密,32位小写 */ + DeviceValue *string `json:"device_value,omitempty" required:"false" ` + /* + 入参类型(该模式下返回的结果为模糊匹配结果,和实际情况可能存在误差): 1. IMEI 2. IDFA 3. OAID 4. MOBILE 5. ALIPAY_ID */ + DeviceType *string `json:"device_type,omitempty" required:"false" ` + /* + thor平台业务码, 1:coupon 超红 */ + ThorBizCode *string `json:"thor_biz_code,omitempty" required:"false" ` + /* + 媒体pid */ + Pid *string `json:"pid,omitempty" required:"false" ` +} + +func (s *TaobaoTbkDgVegasSendStatusRequest) SetRelationId(v string) *TaobaoTbkDgVegasSendStatusRequest { + s.RelationId = &v + return s +} +func (s *TaobaoTbkDgVegasSendStatusRequest) SetSpecialId(v string) *TaobaoTbkDgVegasSendStatusRequest { + s.SpecialId = &v + return s +} +func (s *TaobaoTbkDgVegasSendStatusRequest) SetDeviceValue(v string) *TaobaoTbkDgVegasSendStatusRequest { + s.DeviceValue = &v + return s +} +func (s *TaobaoTbkDgVegasSendStatusRequest) SetDeviceType(v string) *TaobaoTbkDgVegasSendStatusRequest { + s.DeviceType = &v + return s +} +func (s *TaobaoTbkDgVegasSendStatusRequest) SetThorBizCode(v string) *TaobaoTbkDgVegasSendStatusRequest { + s.ThorBizCode = &v + return s +} +func (s *TaobaoTbkDgVegasSendStatusRequest) SetPid(v string) *TaobaoTbkDgVegasSendStatusRequest { + s.Pid = &v + return s +} + +func (req *TaobaoTbkDgVegasSendStatusRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.RelationId != nil { + paramMap["relation_id"] = *req.RelationId + } + if req.SpecialId != nil { + paramMap["special_id"] = *req.SpecialId + } + if req.DeviceValue != nil { + paramMap["device_value"] = *req.DeviceValue + } + if req.DeviceType != nil { + paramMap["device_type"] = *req.DeviceType + } + if req.ThorBizCode != nil { + paramMap["thor_biz_code"] = *req.ThorBizCode + } + if req.Pid != nil { + paramMap["pid"] = *req.Pid + } + return paramMap +} + +func (req *TaobaoTbkDgVegasSendStatusRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability382/response/TaobaoTbkDgVegasSendStatusResponse.go b/service/topsdk/ability382/response/TaobaoTbkDgVegasSendStatusResponse.go new file mode 100644 index 00000000..d7356955 --- /dev/null +++ b/service/topsdk/ability382/response/TaobaoTbkDgVegasSendStatusResponse.go @@ -0,0 +1,27 @@ +package response + +import ( + "topsdk/ability382/domain" +) + +type TaobaoTbkDgVegasSendStatusResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + 返回结果描述信息 + */ + ResultMsg string `json:"result_msg,omitempty" ` + /* + 返回结果封装对象 + */ + Data domain.TaobaoTbkDgVegasSendStatusData `json:"data,omitempty" ` +} diff --git a/service/topsdk/ability414/Ability414.go b/service/topsdk/ability414/Ability414.go new file mode 100644 index 00000000..5612f100 --- /dev/null +++ b/service/topsdk/ability414/Ability414.go @@ -0,0 +1,58 @@ +package ability414 + +import ( + "errors" + "log" + "topsdk" + "topsdk/ability414/request" + "topsdk/ability414/response" + "topsdk/util" +) + +type Ability414 struct { + Client *topsdk.TopClient +} + +func NewAbility414(client *topsdk.TopClient) *Ability414 { + return &Ability414{client} +} + +/* + 淘宝客-推广者-维权退款订单查询 +*/ +func (ability *Ability414) TaobaoTbkRelationRefund(req *request.TaobaoTbkRelationRefundRequest) (*response.TaobaoTbkRelationRefundResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability414 topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.tbk.relation.refund", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoTbkRelationRefundResponse{} + if err != nil { + log.Fatal("taobaoTbkRelationRefund error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} + +/* + 淘宝客-推广者-所有订单查询 +*/ +func (ability *Ability414) TaobaoTbkOrderDetailsGet(req *request.TaobaoTbkOrderDetailsGetRequest) (*response.TaobaoTbkOrderDetailsGetResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability414 topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.tbk.order.details.get", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoTbkOrderDetailsGetResponse{} + if err != nil { + log.Fatal("taobaoTbkOrderDetailsGet error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} diff --git a/service/topsdk/ability414/domain/TaobaoTbkOrderDetailsGetOrderPage.go b/service/topsdk/ability414/domain/TaobaoTbkOrderDetailsGetOrderPage.go new file mode 100644 index 00000000..95ceeea4 --- /dev/null +++ b/service/topsdk/ability414/domain/TaobaoTbkOrderDetailsGetOrderPage.go @@ -0,0 +1,52 @@ +package domain + +type TaobaoTbkOrderDetailsGetOrderPage struct { + /* + PublisherOrderDto */ + Results *[]TaobaoTbkOrderDetailsGetPublisherOrderDto `json:"results,omitempty" ` + + /* + 是否还有上一页 */ + HasPre *bool `json:"has_pre,omitempty" ` + + /* + 位点字段,由调用方原样传递 */ + PositionIndex *string `json:"position_index,omitempty" ` + + /* + 是否还有下一页 */ + HasNext *bool `json:"has_next,omitempty" ` + + /* + 页码 */ + PageNo *int64 `json:"page_no,omitempty" ` + + /* + 页大小 */ + PageSize *int64 `json:"page_size,omitempty" ` +} + +func (s *TaobaoTbkOrderDetailsGetOrderPage) SetResults(v []TaobaoTbkOrderDetailsGetPublisherOrderDto) *TaobaoTbkOrderDetailsGetOrderPage { + s.Results = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetOrderPage) SetHasPre(v bool) *TaobaoTbkOrderDetailsGetOrderPage { + s.HasPre = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetOrderPage) SetPositionIndex(v string) *TaobaoTbkOrderDetailsGetOrderPage { + s.PositionIndex = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetOrderPage) SetHasNext(v bool) *TaobaoTbkOrderDetailsGetOrderPage { + s.HasNext = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetOrderPage) SetPageNo(v int64) *TaobaoTbkOrderDetailsGetOrderPage { + s.PageNo = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetOrderPage) SetPageSize(v int64) *TaobaoTbkOrderDetailsGetOrderPage { + s.PageSize = &v + return s +} diff --git a/service/topsdk/ability414/domain/TaobaoTbkOrderDetailsGetPublisherOrderDto.go b/service/topsdk/ability414/domain/TaobaoTbkOrderDetailsGetPublisherOrderDto.go new file mode 100644 index 00000000..a254c29e --- /dev/null +++ b/service/topsdk/ability414/domain/TaobaoTbkOrderDetailsGetPublisherOrderDto.go @@ -0,0 +1,516 @@ +package domain + +type TaobaoTbkOrderDetailsGetPublisherOrderDto struct { + /* + 订单在淘宝拍下付款的时间 */ + TbPaidTime *string `json:"tb_paid_time,omitempty" ` + + /* + 订单付款的时间,该时间同步淘宝,可能会略晚于买家在淘宝的订单创建时间 */ + TkPaidTime *string `json:"tk_paid_time,omitempty" ` + + /* + 买家确认收货的付款金额(不包含运费金额) */ + PayPrice *string `json:"pay_price,omitempty" ` + + /* + 结算预估收入=结算金额*提成。以买家确认收货的付款金额为基数,预估您可能获得的收入。因买家退款、您违规推广等原因,可能与您最终收入不一致。最终收入以月结后您实际收到的为准 */ + PubShareFee *string `json:"pub_share_fee,omitempty" ` + + /* + 买家通过购物车购买的每个商品对应的订单编号,此订单编号并未在淘宝买家后台透出 */ + TradeId *string `json:"trade_id,omitempty" ` + + /* + 二方:佣金收益的第一归属者; 三方:从其他淘宝客佣金中进行分成的推广者 */ + TkOrderRole *int64 `json:"tk_order_role,omitempty" ` + + /* + 订单确认收货后且商家完成佣金支付的时间 */ + TkEarningTime *string `json:"tk_earning_time,omitempty" ` + + /* + 推广位管理下的推广位名称对应的ID,同时也是pid=mm_1_2_3中的“3”这段数字 */ + AdzoneId *int64 `json:"adzone_id,omitempty" ` + + /* + 从结算佣金中分得的收益比率 */ + PubShareRate *string `json:"pub_share_rate,omitempty" ` + + /* + unid(本字段不对外开放) */ + Unid *string `json:"unid,omitempty" ` + + /* + 维权标签,0 含义为非维权 1 含义为维权订单 */ + RefundTag *int64 `json:"refund_tag,omitempty" ` + + /* + 平台给与的补贴比率,如天猫、淘宝、聚划算等 */ + SubsidyRate *string `json:"subsidy_rate,omitempty" ` + + /* + 提成=收入比率*分成比率。指实际获得收益的比率 */ + TkTotalRate *string `json:"tk_total_rate,omitempty" ` + + /* + 商品所属的一级类目名称 */ + ItemCategoryName *string `json:"item_category_name,omitempty" ` + + /* + 掌柜旺旺 */ + SellerNick *string `json:"seller_nick,omitempty" ` + + /* + 推广者的会员id */ + PubId *int64 `json:"pub_id,omitempty" ` + + /* + 推广者赚取佣金后支付给阿里妈妈的技术服务费用的比率 */ + AlimamaRate *string `json:"alimama_rate,omitempty" ` + + /* + 平台出资方,如天猫、淘宝、或聚划算等 */ + SubsidyType *string `json:"subsidy_type,omitempty" ` + + /* + 商品图片 */ + ItemImg *string `json:"item_img,omitempty" ` + + /* + 付款预估收入=付款金额*提成。指买家付款金额为基数,预估您可能获得的收入。因买家退款等原因,可能与结算预估收入不一致 */ + PubSharePreFee *string `json:"pub_share_pre_fee,omitempty" ` + + /* + 买家拍下付款的金额(不包含运费金额) */ + AlipayTotalPrice *string `json:"alipay_total_price,omitempty" ` + + /* + 商品标题 */ + ItemTitle *string `json:"item_title,omitempty" ` + + /* + 媒体管理下的对应ID的自定义名称 */ + SiteName *string `json:"site_name,omitempty" ` + + /* + 商品数量 */ + ItemNum *int64 `json:"item_num,omitempty" ` + + /* + 补贴金额=结算金额*补贴比率 */ + SubsidyFee *string `json:"subsidy_fee,omitempty" ` + + /* + 技术服务费=结算金额*收入比率*技术服务费率。推广者赚取佣金后支付给阿里妈妈的技术服务费用 */ + AlimamaShareFee *string `json:"alimama_share_fee,omitempty" ` + + /* + 买家在淘宝后台显示的订单编号 */ + TradeParentId *string `json:"trade_parent_id,omitempty" ` + + /* + 订单所属平台类型,包括天猫、淘宝、聚划算等 */ + OrderType *string `json:"order_type,omitempty" ` + + /* + 订单创建的时间,该时间同步淘宝,可能会略晚于买家在淘宝的订单创建时间 */ + TkCreateTime *string `json:"tk_create_time,omitempty" ` + + /* + 产品类型 */ + FlowSource *string `json:"flow_source,omitempty" ` + + /* + 成交平台 */ + TerminalType *string `json:"terminal_type,omitempty" ` + + /* + 通过推广链接达到商品、店铺详情页的点击时间 */ + ClickTime *string `json:"click_time,omitempty" ` + + /* + 已拍下:指订单已拍下,但还未付款 已付款:指订单已付款,但还未确认收货 已收货:指订单已确认收货,但商家佣金未支付 已结算:指订单已确认收货,且商家佣金已支付成功 已失效:指订单关闭/订单佣金小于0.01元,订单关闭主要有:1)买家超时未付款; 2)买家付款前,买家/卖家取消了订单;3)订单付款后发起售中退款成功;3:订单结算,11:拍下未付款,12:订单付款, 13:订单失效,14:订单成功 */ + TkStatus *int64 `json:"tk_status,omitempty" ` + + /* + 商品单价 */ + ItemPrice *string `json:"item_price,omitempty" ` + + /* + 商品id */ + ItemId *int64 `json:"item_id,omitempty" ` + + /* + 推广位管理下的自定义推广位名称 */ + AdzoneName *string `json:"adzone_name,omitempty" ` + + /* + 佣金比率 */ + TotalCommissionRate *string `json:"total_commission_rate,omitempty" ` + + /* + 商品链接 */ + ItemLink *string `json:"item_link,omitempty" ` + + /* + 媒体管理下的ID,同时也是pid=mm_1_2_3中的“2”这段数字 */ + SiteId *int64 `json:"site_id,omitempty" ` + + /* + 店铺名称 */ + SellerShopTitle *string `json:"seller_shop_title,omitempty" ` + + /* + 订单结算的佣金比率+平台的补贴比率 */ + IncomeRate *string `json:"income_rate,omitempty" ` + + /* + 佣金金额=结算金额*佣金比率 */ + TotalCommissionFee *string `json:"total_commission_fee,omitempty" ` + + /* + 预估内容专项服务费:内容场景专项技术服务费,内容推广者在内容场景进行推广需要支付给阿里妈妈专项的技术服务费用。专项服务费=付款金额*专项服务费率。 */ + TkCommissionPreFeeForMediaPlatform *string `json:"tk_commission_pre_fee_for_media_platform,omitempty" ` + + /* + 结算内容专项服务费:内容场景专项技术服务费,内容推广者在内容场景进行推广需要支付给阿里妈妈专项的技术服务费用。专项服务费=结算金额*专项服务费率。 */ + TkCommissionFeeForMediaPlatform *string `json:"tk_commission_fee_for_media_platform,omitempty" ` + + /* + 内容专项服务费率:内容场景专项技术服务费率,内容推广者在内容场景进行推广需要按结算金额支付一定比例给阿里妈妈作为内容场景专项技术服务费,用于提供与内容平台实现产品技术对接等服务。 */ + TkCommissionRateForMediaPlatform *string `json:"tk_commission_rate_for_media_platform,omitempty" ` + + /* + 会员运营id */ + SpecialId *int64 `json:"special_id,omitempty" ` + + /* + 渠道关系id */ + RelationId *int64 `json:"relation_id,omitempty" ` + + /* + 预售时期,用户对预售商品支付的定金金额 */ + DepositPrice *string `json:"deposit_price,omitempty" ` + + /* + 预售时期,用户对预售商品支付定金的付款时间 */ + TbDepositTime *string `json:"tb_deposit_time,omitempty" ` + + /* + 预售时期,用户对预售商品支付定金的付款时间,可能略晚于在淘宝付定金时间 */ + TkDepositTime *string `json:"tk_deposit_time,omitempty" ` + + /* + 口碑子订单号 */ + AlscId *string `json:"alsc_id,omitempty" ` + + /* + 口碑父订单号 */ + AlscPid *string `json:"alsc_pid,omitempty" ` + + /* + 服务费信息 */ + ServiceFeeDtoList *[]TaobaoTbkOrderDetailsGetServiceFeeDto `json:"service_fee_dto_list,omitempty" ` + + /* + 激励池对应的rid */ + LxRid *string `json:"lx_rid,omitempty" ` + + /* + 订单是否为激励池订单 1,表征是 0,表征否 */ + IsLx *string `json:"is_lx,omitempty" ` + + /* + 商品二级类目名称 */ + ItemCategoryLevel2Name *string `json:"item_category_level2_name,omitempty" ` + + /* + 商品三级类目名称 */ + ItemCategoryLevel3Name *string `json:"item_category_level3_name,omitempty" ` + + /* + 营销类型:该字段中视订单情况有单个或多个值。 例如:淘礼金(自助充值),特价版客户端染色,特价版客户端锁粉,特价版客户端推广。 */ + MarketingType *string `json:"marketing_type,omitempty" ` + + /* + 订单更新时间 */ + ModifiedTime *string `json:"modified_time,omitempty" ` + + /* + 专用(不对外开放) */ + TalentPid *string `json:"talent_pid,omitempty" ` + + /* + 当前媒体对应契约方的分成比例 */ + TkContractShareRate *string `json:"tk_contract_share_rate,omitempty" ` + + /* + 契约方memberId */ + TkContractMemberId *int64 `json:"tk_contract_member_id,omitempty" ` + + /* + 契约id */ + TkContractId *int64 `json:"tk_contract_id,omitempty" ` + + /* + 买家拍下金额(不包含运费金额) */ + TbGmvTotalPrice *string `json:"tb_gmv_total_price,omitempty" ` +} + +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetTbPaidTime(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.TbPaidTime = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetTkPaidTime(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.TkPaidTime = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetPayPrice(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.PayPrice = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetPubShareFee(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.PubShareFee = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetTradeId(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.TradeId = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetTkOrderRole(v int64) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.TkOrderRole = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetTkEarningTime(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.TkEarningTime = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetAdzoneId(v int64) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.AdzoneId = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetPubShareRate(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.PubShareRate = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetUnid(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.Unid = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetRefundTag(v int64) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.RefundTag = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetSubsidyRate(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.SubsidyRate = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetTkTotalRate(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.TkTotalRate = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetItemCategoryName(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.ItemCategoryName = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetSellerNick(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.SellerNick = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetPubId(v int64) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.PubId = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetAlimamaRate(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.AlimamaRate = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetSubsidyType(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.SubsidyType = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetItemImg(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.ItemImg = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetPubSharePreFee(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.PubSharePreFee = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetAlipayTotalPrice(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.AlipayTotalPrice = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetItemTitle(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.ItemTitle = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetSiteName(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.SiteName = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetItemNum(v int64) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.ItemNum = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetSubsidyFee(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.SubsidyFee = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetAlimamaShareFee(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.AlimamaShareFee = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetTradeParentId(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.TradeParentId = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetOrderType(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.OrderType = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetTkCreateTime(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.TkCreateTime = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetFlowSource(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.FlowSource = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetTerminalType(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.TerminalType = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetClickTime(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.ClickTime = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetTkStatus(v int64) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.TkStatus = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetItemPrice(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.ItemPrice = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetItemId(v int64) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.ItemId = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetAdzoneName(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.AdzoneName = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetTotalCommissionRate(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.TotalCommissionRate = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetItemLink(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.ItemLink = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetSiteId(v int64) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.SiteId = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetSellerShopTitle(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.SellerShopTitle = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetIncomeRate(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.IncomeRate = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetTotalCommissionFee(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.TotalCommissionFee = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetTkCommissionPreFeeForMediaPlatform(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.TkCommissionPreFeeForMediaPlatform = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetTkCommissionFeeForMediaPlatform(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.TkCommissionFeeForMediaPlatform = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetTkCommissionRateForMediaPlatform(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.TkCommissionRateForMediaPlatform = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetSpecialId(v int64) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.SpecialId = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetRelationId(v int64) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.RelationId = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetDepositPrice(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.DepositPrice = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetTbDepositTime(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.TbDepositTime = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetTkDepositTime(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.TkDepositTime = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetAlscId(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.AlscId = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetAlscPid(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.AlscPid = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetServiceFeeDtoList(v []TaobaoTbkOrderDetailsGetServiceFeeDto) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.ServiceFeeDtoList = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetLxRid(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.LxRid = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetIsLx(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.IsLx = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetItemCategoryLevel2Name(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.ItemCategoryLevel2Name = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetItemCategoryLevel3Name(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.ItemCategoryLevel3Name = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetMarketingType(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.MarketingType = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetModifiedTime(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.ModifiedTime = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetTalentPid(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.TalentPid = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetTkContractShareRate(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.TkContractShareRate = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetTkContractMemberId(v int64) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.TkContractMemberId = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetTkContractId(v int64) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.TkContractId = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetPublisherOrderDto) SetTbGmvTotalPrice(v string) *TaobaoTbkOrderDetailsGetPublisherOrderDto { + s.TbGmvTotalPrice = &v + return s +} diff --git a/service/topsdk/ability414/domain/TaobaoTbkOrderDetailsGetServiceFeeDto.go b/service/topsdk/ability414/domain/TaobaoTbkOrderDetailsGetServiceFeeDto.go new file mode 100644 index 00000000..7a38168f --- /dev/null +++ b/service/topsdk/ability414/domain/TaobaoTbkOrderDetailsGetServiceFeeDto.go @@ -0,0 +1,36 @@ +package domain + +type TaobaoTbkOrderDetailsGetServiceFeeDto struct { + /* + 专项服务费来源,122-渠道 */ + TkShareRoleType *int64 `json:"tk_share_role_type,omitempty" ` + + /* + 专项服务费率 */ + ShareRelativeRate *string `json:"share_relative_rate,omitempty" ` + + /* + 结算专项服务费 */ + ShareFee *string `json:"share_fee,omitempty" ` + + /* + 预估专项服务费 */ + SharePreFee *string `json:"share_pre_fee,omitempty" ` +} + +func (s *TaobaoTbkOrderDetailsGetServiceFeeDto) SetTkShareRoleType(v int64) *TaobaoTbkOrderDetailsGetServiceFeeDto { + s.TkShareRoleType = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetServiceFeeDto) SetShareRelativeRate(v string) *TaobaoTbkOrderDetailsGetServiceFeeDto { + s.ShareRelativeRate = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetServiceFeeDto) SetShareFee(v string) *TaobaoTbkOrderDetailsGetServiceFeeDto { + s.ShareFee = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetServiceFeeDto) SetSharePreFee(v string) *TaobaoTbkOrderDetailsGetServiceFeeDto { + s.SharePreFee = &v + return s +} diff --git a/service/topsdk/ability414/domain/TaobaoTbkRelationRefundPageResult.go b/service/topsdk/ability414/domain/TaobaoTbkRelationRefundPageResult.go new file mode 100644 index 00000000..8e8387e5 --- /dev/null +++ b/service/topsdk/ability414/domain/TaobaoTbkRelationRefundPageResult.go @@ -0,0 +1,36 @@ +package domain + +type TaobaoTbkRelationRefundPageResult struct { + /* + pageNo */ + PageNo *string `json:"page_no,omitempty" ` + + /* + pageSize */ + PageSize *string `json:"page_size,omitempty" ` + + /* + 总值 */ + TotalCount *string `json:"total_count,omitempty" ` + + /* + 订单列表 */ + Results *[]TaobaoTbkRelationRefundResult `json:"results,omitempty" ` +} + +func (s *TaobaoTbkRelationRefundPageResult) SetPageNo(v string) *TaobaoTbkRelationRefundPageResult { + s.PageNo = &v + return s +} +func (s *TaobaoTbkRelationRefundPageResult) SetPageSize(v string) *TaobaoTbkRelationRefundPageResult { + s.PageSize = &v + return s +} +func (s *TaobaoTbkRelationRefundPageResult) SetTotalCount(v string) *TaobaoTbkRelationRefundPageResult { + s.TotalCount = &v + return s +} +func (s *TaobaoTbkRelationRefundPageResult) SetResults(v []TaobaoTbkRelationRefundResult) *TaobaoTbkRelationRefundPageResult { + s.Results = &v + return s +} diff --git a/service/topsdk/ability414/domain/TaobaoTbkRelationRefundResult.go b/service/topsdk/ability414/domain/TaobaoTbkRelationRefundResult.go new file mode 100644 index 00000000..a08daba4 --- /dev/null +++ b/service/topsdk/ability414/domain/TaobaoTbkRelationRefundResult.go @@ -0,0 +1,200 @@ +package domain + +import ( + "topsdk/util" +) + +type TaobaoTbkRelationRefundResult struct { + /* + 淘宝订单编号 */ + TbTradeParentId *int64 `json:"tb_trade_parent_id,omitempty" ` + + /* + 会员关系id */ + SpecialId *int64 `json:"special_id,omitempty" ` + + /* + 渠道关系id */ + RelationId *int64 `json:"relation_id,omitempty" ` + + /* + 第三方推广者memberid */ + Tk3rdPubId *int64 `json:"tk3rd_pub_id,omitempty" ` + + /* + 推广者memberid */ + TkPubId *int64 `json:"tk_pub_id,omitempty" ` + + /* + 第三方应该返还的补贴 */ + TkSubsidyFeeRefund3rdPub *string `json:"tk_subsidy_fee_refund3rd_pub,omitempty" ` + + /* + 第三方应该返还的佣金 */ + TkCommissionFeeRefund3rdPub *string `json:"tk_commission_fee_refund3rd_pub,omitempty" ` + + /* + 第二方应该返还的补贴(不包括技术服务费) */ + TkSubsidyFeeRefundPub *string `json:"tk_subsidy_fee_refund_pub,omitempty" ` + + /* + 第二方应该返还的佣金(不包括技术服务费) */ + TkCommissionFeeRefundPub *string `json:"tk_commission_fee_refund_pub,omitempty" ` + + /* + 维权完成时间 */ + TkRefundSuitTime *util.LocalTime `json:"tk_refund_suit_time,omitempty" ` + + /* + 维权创建时间 */ + TkRefundTime *util.LocalTime `json:"tk_refund_time,omitempty" ` + + /* + 订单结算时间 */ + EarningTime *util.LocalTime `json:"earning_time,omitempty" ` + + /* + 订单创建时间 */ + TbTradeCreateTime *util.LocalTime `json:"tb_trade_create_time,omitempty" ` + + /* + 维权创建(淘客结算回执) 4,维权成功(淘客结算回执) 2,维权失败(淘客结算回执) 3,发生多次维权,待处理 11,从淘客处补扣(钱已结给淘客) 等待扣款 12,从淘客处补扣(钱已结给淘客) 扣款成功 13,从卖家处补扣(钱已结给卖家) 等待扣款 14,从卖家处补扣(钱已结给卖家) 扣款成功 15 */ + RefundStatus *int64 `json:"refund_status,omitempty" ` + + /* + 宝贝标题 */ + TbAuctionTitle *string `json:"tb_auction_title,omitempty" ` + + /* + 淘宝子订单编号 */ + TbTradeId *int64 `json:"tb_trade_id,omitempty" ` + + /* + 维权金额 */ + RefundFee *string `json:"refund_fee,omitempty" ` + + /* + 结算金额 */ + TbTradeFinishPrice *string `json:"tb_trade_finish_price,omitempty" ` + + /* + 应返商家金额(二方) */ + TkPubShowReturnFee *string `json:"tk_pub_show_return_fee,omitempty" ` + + /* + 应返商家金额(三方) */ + Tk3rdPubShowReturnFee *string `json:"tk3rd_pub_show_return_fee,omitempty" ` + + /* + 1 表示2方,2表示3方 */ + RefundType *int64 `json:"refund_type,omitempty" ` + + /* + (口碑订单)口碑父订单号 */ + AlscPid *string `json:"alsc_pid,omitempty" ` + + /* + (口碑订单)口碑子订单号 */ + AlscId *string `json:"alsc_id,omitempty" ` + + /* + 更新时间 */ + ModifiedTime *util.LocalTime `json:"modified_time,omitempty" ` +} + +func (s *TaobaoTbkRelationRefundResult) SetTbTradeParentId(v int64) *TaobaoTbkRelationRefundResult { + s.TbTradeParentId = &v + return s +} +func (s *TaobaoTbkRelationRefundResult) SetSpecialId(v int64) *TaobaoTbkRelationRefundResult { + s.SpecialId = &v + return s +} +func (s *TaobaoTbkRelationRefundResult) SetRelationId(v int64) *TaobaoTbkRelationRefundResult { + s.RelationId = &v + return s +} +func (s *TaobaoTbkRelationRefundResult) SetTk3rdPubId(v int64) *TaobaoTbkRelationRefundResult { + s.Tk3rdPubId = &v + return s +} +func (s *TaobaoTbkRelationRefundResult) SetTkPubId(v int64) *TaobaoTbkRelationRefundResult { + s.TkPubId = &v + return s +} +func (s *TaobaoTbkRelationRefundResult) SetTkSubsidyFeeRefund3rdPub(v string) *TaobaoTbkRelationRefundResult { + s.TkSubsidyFeeRefund3rdPub = &v + return s +} +func (s *TaobaoTbkRelationRefundResult) SetTkCommissionFeeRefund3rdPub(v string) *TaobaoTbkRelationRefundResult { + s.TkCommissionFeeRefund3rdPub = &v + return s +} +func (s *TaobaoTbkRelationRefundResult) SetTkSubsidyFeeRefundPub(v string) *TaobaoTbkRelationRefundResult { + s.TkSubsidyFeeRefundPub = &v + return s +} +func (s *TaobaoTbkRelationRefundResult) SetTkCommissionFeeRefundPub(v string) *TaobaoTbkRelationRefundResult { + s.TkCommissionFeeRefundPub = &v + return s +} +func (s *TaobaoTbkRelationRefundResult) SetTkRefundSuitTime(v util.LocalTime) *TaobaoTbkRelationRefundResult { + s.TkRefundSuitTime = &v + return s +} +func (s *TaobaoTbkRelationRefundResult) SetTkRefundTime(v util.LocalTime) *TaobaoTbkRelationRefundResult { + s.TkRefundTime = &v + return s +} +func (s *TaobaoTbkRelationRefundResult) SetEarningTime(v util.LocalTime) *TaobaoTbkRelationRefundResult { + s.EarningTime = &v + return s +} +func (s *TaobaoTbkRelationRefundResult) SetTbTradeCreateTime(v util.LocalTime) *TaobaoTbkRelationRefundResult { + s.TbTradeCreateTime = &v + return s +} +func (s *TaobaoTbkRelationRefundResult) SetRefundStatus(v int64) *TaobaoTbkRelationRefundResult { + s.RefundStatus = &v + return s +} +func (s *TaobaoTbkRelationRefundResult) SetTbAuctionTitle(v string) *TaobaoTbkRelationRefundResult { + s.TbAuctionTitle = &v + return s +} +func (s *TaobaoTbkRelationRefundResult) SetTbTradeId(v int64) *TaobaoTbkRelationRefundResult { + s.TbTradeId = &v + return s +} +func (s *TaobaoTbkRelationRefundResult) SetRefundFee(v string) *TaobaoTbkRelationRefundResult { + s.RefundFee = &v + return s +} +func (s *TaobaoTbkRelationRefundResult) SetTbTradeFinishPrice(v string) *TaobaoTbkRelationRefundResult { + s.TbTradeFinishPrice = &v + return s +} +func (s *TaobaoTbkRelationRefundResult) SetTkPubShowReturnFee(v string) *TaobaoTbkRelationRefundResult { + s.TkPubShowReturnFee = &v + return s +} +func (s *TaobaoTbkRelationRefundResult) SetTk3rdPubShowReturnFee(v string) *TaobaoTbkRelationRefundResult { + s.Tk3rdPubShowReturnFee = &v + return s +} +func (s *TaobaoTbkRelationRefundResult) SetRefundType(v int64) *TaobaoTbkRelationRefundResult { + s.RefundType = &v + return s +} +func (s *TaobaoTbkRelationRefundResult) SetAlscPid(v string) *TaobaoTbkRelationRefundResult { + s.AlscPid = &v + return s +} +func (s *TaobaoTbkRelationRefundResult) SetAlscId(v string) *TaobaoTbkRelationRefundResult { + s.AlscId = &v + return s +} +func (s *TaobaoTbkRelationRefundResult) SetModifiedTime(v util.LocalTime) *TaobaoTbkRelationRefundResult { + s.ModifiedTime = &v + return s +} diff --git a/service/topsdk/ability414/domain/TaobaoTbkRelationRefundRpcResult.go b/service/topsdk/ability414/domain/TaobaoTbkRelationRefundRpcResult.go new file mode 100644 index 00000000..fb3832fa --- /dev/null +++ b/service/topsdk/ability414/domain/TaobaoTbkRelationRefundRpcResult.go @@ -0,0 +1,44 @@ +package domain + +type TaobaoTbkRelationRefundRpcResult struct { + /* + 返回信息 */ + ResultMsg *string `json:"result_msg,omitempty" ` + + /* + 真正的业务数据结构 */ + Data *TaobaoTbkRelationRefundPageResult `json:"data,omitempty" ` + + /* + 接口返回值信息,跟rpc架构保持一致 */ + ResultCode *int64 `json:"result_code,omitempty" ` + + /* + 业务错误信息 */ + BizErrorDesc *string `json:"biz_error_desc,omitempty" ` + + /* + 业务错误码 101, 102,103 */ + BizErrorCode *int64 `json:"biz_error_code,omitempty" ` +} + +func (s *TaobaoTbkRelationRefundRpcResult) SetResultMsg(v string) *TaobaoTbkRelationRefundRpcResult { + s.ResultMsg = &v + return s +} +func (s *TaobaoTbkRelationRefundRpcResult) SetData(v TaobaoTbkRelationRefundPageResult) *TaobaoTbkRelationRefundRpcResult { + s.Data = &v + return s +} +func (s *TaobaoTbkRelationRefundRpcResult) SetResultCode(v int64) *TaobaoTbkRelationRefundRpcResult { + s.ResultCode = &v + return s +} +func (s *TaobaoTbkRelationRefundRpcResult) SetBizErrorDesc(v string) *TaobaoTbkRelationRefundRpcResult { + s.BizErrorDesc = &v + return s +} +func (s *TaobaoTbkRelationRefundRpcResult) SetBizErrorCode(v int64) *TaobaoTbkRelationRefundRpcResult { + s.BizErrorCode = &v + return s +} diff --git a/service/topsdk/ability414/domain/TaobaoTbkRelationRefundTopApiRefundRptOption.go b/service/topsdk/ability414/domain/TaobaoTbkRelationRefundTopApiRefundRptOption.go new file mode 100644 index 00000000..1173a409 --- /dev/null +++ b/service/topsdk/ability414/domain/TaobaoTbkRelationRefundTopApiRefundRptOption.go @@ -0,0 +1,56 @@ +package domain + +import ( + "topsdk/util" +) + +type TaobaoTbkRelationRefundTopApiRefundRptOption struct { + /* + pagesize */ + PageSize *int64 `json:"page_size,omitempty" ` + + /* + 1-维权发起时间,2-订单结算时间(正向订单),3-维权完成时间,4-订单创建时间,5-订单更新时间 */ + SearchType *int64 `json:"search_type,omitempty" ` + + /* + 1 表示2方,2表示3方,0表示不限 */ + RefundType *int64 `json:"refund_type,omitempty" ` + + /* + 开始时间 */ + StartTime *util.LocalTime `json:"start_time,omitempty" ` + + /* + pagenumber */ + PageNo *int64 `json:"page_no,omitempty" ` + + /* + 1代表渠道关系id,2代表会员关系id */ + BizType *int64 `json:"biz_type,omitempty" ` +} + +func (s *TaobaoTbkRelationRefundTopApiRefundRptOption) SetPageSize(v int64) *TaobaoTbkRelationRefundTopApiRefundRptOption { + s.PageSize = &v + return s +} +func (s *TaobaoTbkRelationRefundTopApiRefundRptOption) SetSearchType(v int64) *TaobaoTbkRelationRefundTopApiRefundRptOption { + s.SearchType = &v + return s +} +func (s *TaobaoTbkRelationRefundTopApiRefundRptOption) SetRefundType(v int64) *TaobaoTbkRelationRefundTopApiRefundRptOption { + s.RefundType = &v + return s +} +func (s *TaobaoTbkRelationRefundTopApiRefundRptOption) SetStartTime(v util.LocalTime) *TaobaoTbkRelationRefundTopApiRefundRptOption { + s.StartTime = &v + return s +} +func (s *TaobaoTbkRelationRefundTopApiRefundRptOption) SetPageNo(v int64) *TaobaoTbkRelationRefundTopApiRefundRptOption { + s.PageNo = &v + return s +} +func (s *TaobaoTbkRelationRefundTopApiRefundRptOption) SetBizType(v int64) *TaobaoTbkRelationRefundTopApiRefundRptOption { + s.BizType = &v + return s +} diff --git a/service/topsdk/ability414/request/TaobaoTbkOrderDetailsGetRequest.go b/service/topsdk/ability414/request/TaobaoTbkOrderDetailsGetRequest.go new file mode 100644 index 00000000..1faab742 --- /dev/null +++ b/service/topsdk/ability414/request/TaobaoTbkOrderDetailsGetRequest.go @@ -0,0 +1,115 @@ +package request + +type TaobaoTbkOrderDetailsGetRequest struct { + /* + 查询时间类型,1:按照订单淘客创建时间查询,2:按照订单淘客付款时间查询,3:按照订单淘客结算时间查询,4:按照订单更新时间; defalutValue��1 */ + QueryType *int64 `json:"query_type,omitempty" required:"false" ` + /* + 位点,除第一页之外,都需要传递;前端原样返回。 */ + PositionIndex *string `json:"position_index,omitempty" required:"false" ` + /* + 页大小,默认20,1~100 defalutValue��20 */ + PageSize *int64 `json:"page_size,omitempty" required:"false" ` + /* + 推广者角色类型,2:二方,3:三方,不传,表示所有角色 */ + MemberType *int64 `json:"member_type,omitempty" required:"false" ` + /* + 淘客订单状态,11-拍下未付款,12-付款,13-关闭,14-确认收货,3-结算成功;不传,表示所有状态 */ + TkStatus *int64 `json:"tk_status,omitempty" required:"false" ` + /* + 订单查询结束时间,订单开始时间至订单结束时间,中间时间段日常要求不超过3个小时,但如618、双11、年货节等大促期间预估时间段不可超过20分钟,超过会提示错误,调用时请务必注意时间段的选择,以保证亲能正常调用! */ + EndTime *string `json:"end_time" required:"true" ` + /* + 订单查询开始时间 */ + StartTime *string `json:"start_time" required:"true" ` + /* + 跳转类型,当向前或者向后翻页必须提供,-1: 向前翻页,1:向后翻页 defalutValue��1 */ + JumpType *int64 `json:"jump_type,omitempty" required:"false" ` + /* + 第几页,默认1,1~100 defalutValue��1 */ + PageNo *int64 `json:"page_no,omitempty" required:"false" ` + /* + 场景订单场景类型,1:常规订单,2:渠道订单,3:会员运营订单,默认为1 defalutValue��1 */ + OrderScene *int64 `json:"order_scene,omitempty" required:"false" ` +} + +func (s *TaobaoTbkOrderDetailsGetRequest) SetQueryType(v int64) *TaobaoTbkOrderDetailsGetRequest { + s.QueryType = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetRequest) SetPositionIndex(v string) *TaobaoTbkOrderDetailsGetRequest { + s.PositionIndex = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetRequest) SetPageSize(v int64) *TaobaoTbkOrderDetailsGetRequest { + s.PageSize = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetRequest) SetMemberType(v int64) *TaobaoTbkOrderDetailsGetRequest { + s.MemberType = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetRequest) SetTkStatus(v int64) *TaobaoTbkOrderDetailsGetRequest { + s.TkStatus = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetRequest) SetEndTime(v string) *TaobaoTbkOrderDetailsGetRequest { + s.EndTime = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetRequest) SetStartTime(v string) *TaobaoTbkOrderDetailsGetRequest { + s.StartTime = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetRequest) SetJumpType(v int64) *TaobaoTbkOrderDetailsGetRequest { + s.JumpType = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetRequest) SetPageNo(v int64) *TaobaoTbkOrderDetailsGetRequest { + s.PageNo = &v + return s +} +func (s *TaobaoTbkOrderDetailsGetRequest) SetOrderScene(v int64) *TaobaoTbkOrderDetailsGetRequest { + s.OrderScene = &v + return s +} + +func (req *TaobaoTbkOrderDetailsGetRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.QueryType != nil { + paramMap["query_type"] = *req.QueryType + } + if req.PositionIndex != nil { + paramMap["position_index"] = *req.PositionIndex + } + if req.PageSize != nil { + paramMap["page_size"] = *req.PageSize + } + if req.MemberType != nil { + paramMap["member_type"] = *req.MemberType + } + if req.TkStatus != nil { + paramMap["tk_status"] = *req.TkStatus + } + if req.EndTime != nil { + paramMap["end_time"] = *req.EndTime + } + if req.StartTime != nil { + paramMap["start_time"] = *req.StartTime + } + if req.JumpType != nil { + paramMap["jump_type"] = *req.JumpType + } + if req.PageNo != nil { + paramMap["page_no"] = *req.PageNo + } + if req.OrderScene != nil { + paramMap["order_scene"] = *req.OrderScene + } + return paramMap +} + +func (req *TaobaoTbkOrderDetailsGetRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability414/request/TaobaoTbkRelationRefundRequest.go b/service/topsdk/ability414/request/TaobaoTbkRelationRefundRequest.go new file mode 100644 index 00000000..5df083ea --- /dev/null +++ b/service/topsdk/ability414/request/TaobaoTbkRelationRefundRequest.go @@ -0,0 +1,30 @@ +package request + +import ( + "topsdk/ability414/domain" + "topsdk/util" +) + +type TaobaoTbkRelationRefundRequest struct { + /* + 参数option */ + SearchOption *domain.TaobaoTbkRelationRefundTopApiRefundRptOption `json:"search_option" required:"true" ` +} + +func (s *TaobaoTbkRelationRefundRequest) SetSearchOption(v domain.TaobaoTbkRelationRefundTopApiRefundRptOption) *TaobaoTbkRelationRefundRequest { + s.SearchOption = &v + return s +} + +func (req *TaobaoTbkRelationRefundRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.SearchOption != nil { + paramMap["search_option"] = util.ConvertStruct(*req.SearchOption) + } + return paramMap +} + +func (req *TaobaoTbkRelationRefundRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability414/response/TaobaoTbkOrderDetailsGetResponse.go b/service/topsdk/ability414/response/TaobaoTbkOrderDetailsGetResponse.go new file mode 100644 index 00000000..3b695e98 --- /dev/null +++ b/service/topsdk/ability414/response/TaobaoTbkOrderDetailsGetResponse.go @@ -0,0 +1,23 @@ +package response + +import ( + "topsdk/ability414/domain" +) + +type TaobaoTbkOrderDetailsGetResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + PublisherOrderDto + */ + Data domain.TaobaoTbkOrderDetailsGetOrderPage `json:"data,omitempty" ` +} diff --git a/service/topsdk/ability414/response/TaobaoTbkRelationRefundResponse.go b/service/topsdk/ability414/response/TaobaoTbkRelationRefundResponse.go new file mode 100644 index 00000000..f8c048e8 --- /dev/null +++ b/service/topsdk/ability414/response/TaobaoTbkRelationRefundResponse.go @@ -0,0 +1,23 @@ +package response + +import ( + "topsdk/ability414/domain" +) + +type TaobaoTbkRelationRefundResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + 返回结果封装对象 + */ + Result domain.TaobaoTbkRelationRefundRpcResult `json:"result,omitempty" ` +} diff --git a/service/topsdk/ability417/Ability417.go b/service/topsdk/ability417/Ability417.go new file mode 100644 index 00000000..167f66ed --- /dev/null +++ b/service/topsdk/ability417/Ability417.go @@ -0,0 +1,38 @@ +package ability417 + +import ( + "errors" + "log" + "topsdk" + "topsdk/ability417/request" + "topsdk/ability417/response" + "topsdk/util" +) + +type Ability417 struct { + Client *topsdk.TopClient +} + +func NewAbility417(client *topsdk.TopClient) *Ability417 { + return &Ability417{client} +} + +/* + 淘宝客-推广者-处罚订单查询 +*/ +func (ability *Ability417) TaobaoTbkDgPunishOrderGet(req *request.TaobaoTbkDgPunishOrderGetRequest) (*response.TaobaoTbkDgPunishOrderGetResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability417 topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.tbk.dg.punish.order.get", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoTbkDgPunishOrderGetResponse{} + if err != nil { + log.Fatal("taobaoTbkDgPunishOrderGet error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} diff --git a/service/topsdk/ability417/domain/TaobaoTbkDgPunishOrderGetPageResult.go b/service/topsdk/ability417/domain/TaobaoTbkDgPunishOrderGetPageResult.go new file mode 100644 index 00000000..c8ca9496 --- /dev/null +++ b/service/topsdk/ability417/domain/TaobaoTbkDgPunishOrderGetPageResult.go @@ -0,0 +1,36 @@ +package domain + +type TaobaoTbkDgPunishOrderGetPageResult struct { + /* + 处罚订单列表 */ + Results *[]TaobaoTbkDgPunishOrderGetResult `json:"results,omitempty" ` + + /* + 翻页的pageno */ + PageNo *int64 `json:"page_no,omitempty" ` + + /* + 翻页的pagesie */ + PageSize *int64 `json:"page_size,omitempty" ` + + /* + 一共能查询出来的结果总数 */ + TotalCount *int64 `json:"total_count,omitempty" ` +} + +func (s *TaobaoTbkDgPunishOrderGetPageResult) SetResults(v []TaobaoTbkDgPunishOrderGetResult) *TaobaoTbkDgPunishOrderGetPageResult { + s.Results = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetPageResult) SetPageNo(v int64) *TaobaoTbkDgPunishOrderGetPageResult { + s.PageNo = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetPageResult) SetPageSize(v int64) *TaobaoTbkDgPunishOrderGetPageResult { + s.PageSize = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetPageResult) SetTotalCount(v int64) *TaobaoTbkDgPunishOrderGetPageResult { + s.TotalCount = &v + return s +} diff --git a/service/topsdk/ability417/domain/TaobaoTbkDgPunishOrderGetResult.go b/service/topsdk/ability417/domain/TaobaoTbkDgPunishOrderGetResult.go new file mode 100644 index 00000000..2914388c --- /dev/null +++ b/service/topsdk/ability417/domain/TaobaoTbkDgPunishOrderGetResult.go @@ -0,0 +1,100 @@ +package domain + +type TaobaoTbkDgPunishOrderGetResult struct { + /* + 淘宝联盟unionid(该字段不再支持) */ + UnionId *string `json:"union_id,omitempty" ` + + /* + 会员运营id(该字段不再支持) */ + SpecialId *int64 `json:"special_id,omitempty" ` + + /* + 渠道关系id */ + RelationId *int64 `json:"relation_id,omitempty" ` + + /* + 结算月份 */ + SettleMonth *int64 `json:"settle_month,omitempty" ` + + /* + 处罚状态。0 冻结,1 解冻 */ + PunishStatus *string `json:"punish_status,omitempty" ` + + /* + 处罚类型,目前包括 1.店铺淘宝客 2.订单虚假交易 */ + ViolationType *string `json:"violation_type,omitempty" ` + + /* + 淘客订单创建时间 */ + TkTradeCreateTime *string `json:"tk_trade_create_time,omitempty" ` + + /* + 子订单号 */ + TbTradeId *int64 `json:"tb_trade_id,omitempty" ` + + /* + 父订单号(该字段不再支持) */ + TbTradeParentId *int64 `json:"tb_trade_parent_id,omitempty" ` + + /* + pid里的adzoneid */ + TkAdzoneId *int64 `json:"tk_adzone_id,omitempty" ` + + /* + pid里的siteid */ + TkSiteId *int64 `json:"tk_site_id,omitempty" ` + + /* + pid里的pubid */ + TkPubId *string `json:"tk_pub_id,omitempty" ` +} + +func (s *TaobaoTbkDgPunishOrderGetResult) SetUnionId(v string) *TaobaoTbkDgPunishOrderGetResult { + s.UnionId = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetResult) SetSpecialId(v int64) *TaobaoTbkDgPunishOrderGetResult { + s.SpecialId = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetResult) SetRelationId(v int64) *TaobaoTbkDgPunishOrderGetResult { + s.RelationId = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetResult) SetSettleMonth(v int64) *TaobaoTbkDgPunishOrderGetResult { + s.SettleMonth = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetResult) SetPunishStatus(v string) *TaobaoTbkDgPunishOrderGetResult { + s.PunishStatus = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetResult) SetViolationType(v string) *TaobaoTbkDgPunishOrderGetResult { + s.ViolationType = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetResult) SetTkTradeCreateTime(v string) *TaobaoTbkDgPunishOrderGetResult { + s.TkTradeCreateTime = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetResult) SetTbTradeId(v int64) *TaobaoTbkDgPunishOrderGetResult { + s.TbTradeId = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetResult) SetTbTradeParentId(v int64) *TaobaoTbkDgPunishOrderGetResult { + s.TbTradeParentId = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetResult) SetTkAdzoneId(v int64) *TaobaoTbkDgPunishOrderGetResult { + s.TkAdzoneId = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetResult) SetTkSiteId(v int64) *TaobaoTbkDgPunishOrderGetResult { + s.TkSiteId = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetResult) SetTkPubId(v string) *TaobaoTbkDgPunishOrderGetResult { + s.TkPubId = &v + return s +} diff --git a/service/topsdk/ability417/domain/TaobaoTbkDgPunishOrderGetRpcResult.go b/service/topsdk/ability417/domain/TaobaoTbkDgPunishOrderGetRpcResult.go new file mode 100644 index 00000000..d258c5df --- /dev/null +++ b/service/topsdk/ability417/domain/TaobaoTbkDgPunishOrderGetRpcResult.go @@ -0,0 +1,44 @@ +package domain + +type TaobaoTbkDgPunishOrderGetRpcResult struct { + /* + 结果 */ + Data *TaobaoTbkDgPunishOrderGetPageResult `json:"data,omitempty" ` + + /* + 业务出错的描述 */ + BizErrorDesc *string `json:"biz_error_desc,omitempty" ` + + /* + 业务出错的状态码 */ + BizErrorCode *int64 `json:"biz_error_code,omitempty" ` + + /* + 执行结果 */ + ResultMsg *string `json:"result_msg,omitempty" ` + + /* + 执行结果状态码 */ + ResultCode *int64 `json:"result_code,omitempty" ` +} + +func (s *TaobaoTbkDgPunishOrderGetRpcResult) SetData(v TaobaoTbkDgPunishOrderGetPageResult) *TaobaoTbkDgPunishOrderGetRpcResult { + s.Data = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetRpcResult) SetBizErrorDesc(v string) *TaobaoTbkDgPunishOrderGetRpcResult { + s.BizErrorDesc = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetRpcResult) SetBizErrorCode(v int64) *TaobaoTbkDgPunishOrderGetRpcResult { + s.BizErrorCode = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetRpcResult) SetResultMsg(v string) *TaobaoTbkDgPunishOrderGetRpcResult { + s.ResultMsg = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetRpcResult) SetResultCode(v int64) *TaobaoTbkDgPunishOrderGetRpcResult { + s.ResultCode = &v + return s +} diff --git a/service/topsdk/ability417/domain/TaobaoTbkDgPunishOrderGetTopApiAfOrderOption.go b/service/topsdk/ability417/domain/TaobaoTbkDgPunishOrderGetTopApiAfOrderOption.go new file mode 100644 index 00000000..355d1bee --- /dev/null +++ b/service/topsdk/ability417/domain/TaobaoTbkDgPunishOrderGetTopApiAfOrderOption.go @@ -0,0 +1,104 @@ +package domain + +import ( + "topsdk/util" +) + +type TaobaoTbkDgPunishOrderGetTopApiAfOrderOption struct { + /* + 渠道关系id */ + RelationId *int64 `json:"relation_id,omitempty" ` + + /* + 子订单号 */ + TbTradeId *int64 `json:"tb_trade_id,omitempty" ` + + /* + 此参数不再使用,请勿入参 */ + TbTradeParentId *int64 `json:"tb_trade_parent_id,omitempty" ` + + /* + pagesize */ + PageSize *int64 `json:"page_size,omitempty" ` + + /* + pageNo */ + PageNo *int64 `json:"page_no,omitempty" ` + + /* + 查询时间跨度,不超过30天,单位是天 */ + Span *int64 `json:"span,omitempty" ` + + /* + 查询开始时间,以taoke订单创建时间开始 */ + StartTime *util.LocalTime `json:"start_time,omitempty" ` + + /* + 此参数不再使用,请勿入参 */ + SpecialId *int64 `json:"special_id,omitempty" ` + + /* + pid中的第三段,adzoneId */ + AdzoneId *int64 `json:"adzone_id,omitempty" ` + + /* + pid中的第二段,siteId */ + SiteId *int64 `json:"site_id,omitempty" ` + + /* + 此参数不再使用,请勿入参 */ + ViolationType *int64 `json:"violation_type,omitempty" ` + + /* + 此参数不再使用,请勿入参 */ + PunishStatus *int64 `json:"punish_status,omitempty" ` +} + +func (s *TaobaoTbkDgPunishOrderGetTopApiAfOrderOption) SetRelationId(v int64) *TaobaoTbkDgPunishOrderGetTopApiAfOrderOption { + s.RelationId = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetTopApiAfOrderOption) SetTbTradeId(v int64) *TaobaoTbkDgPunishOrderGetTopApiAfOrderOption { + s.TbTradeId = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetTopApiAfOrderOption) SetTbTradeParentId(v int64) *TaobaoTbkDgPunishOrderGetTopApiAfOrderOption { + s.TbTradeParentId = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetTopApiAfOrderOption) SetPageSize(v int64) *TaobaoTbkDgPunishOrderGetTopApiAfOrderOption { + s.PageSize = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetTopApiAfOrderOption) SetPageNo(v int64) *TaobaoTbkDgPunishOrderGetTopApiAfOrderOption { + s.PageNo = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetTopApiAfOrderOption) SetSpan(v int64) *TaobaoTbkDgPunishOrderGetTopApiAfOrderOption { + s.Span = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetTopApiAfOrderOption) SetStartTime(v util.LocalTime) *TaobaoTbkDgPunishOrderGetTopApiAfOrderOption { + s.StartTime = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetTopApiAfOrderOption) SetSpecialId(v int64) *TaobaoTbkDgPunishOrderGetTopApiAfOrderOption { + s.SpecialId = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetTopApiAfOrderOption) SetAdzoneId(v int64) *TaobaoTbkDgPunishOrderGetTopApiAfOrderOption { + s.AdzoneId = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetTopApiAfOrderOption) SetSiteId(v int64) *TaobaoTbkDgPunishOrderGetTopApiAfOrderOption { + s.SiteId = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetTopApiAfOrderOption) SetViolationType(v int64) *TaobaoTbkDgPunishOrderGetTopApiAfOrderOption { + s.ViolationType = &v + return s +} +func (s *TaobaoTbkDgPunishOrderGetTopApiAfOrderOption) SetPunishStatus(v int64) *TaobaoTbkDgPunishOrderGetTopApiAfOrderOption { + s.PunishStatus = &v + return s +} diff --git a/service/topsdk/ability417/request/TaobaoTbkDgPunishOrderGetRequest.go b/service/topsdk/ability417/request/TaobaoTbkDgPunishOrderGetRequest.go new file mode 100644 index 00000000..0fd741f0 --- /dev/null +++ b/service/topsdk/ability417/request/TaobaoTbkDgPunishOrderGetRequest.go @@ -0,0 +1,30 @@ +package request + +import ( + "topsdk/ability417/domain" + "topsdk/util" +) + +type TaobaoTbkDgPunishOrderGetRequest struct { + /* + 入参的对象 */ + AfOrderOption *domain.TaobaoTbkDgPunishOrderGetTopApiAfOrderOption `json:"af_order_option,omitempty" required:"false" ` +} + +func (s *TaobaoTbkDgPunishOrderGetRequest) SetAfOrderOption(v domain.TaobaoTbkDgPunishOrderGetTopApiAfOrderOption) *TaobaoTbkDgPunishOrderGetRequest { + s.AfOrderOption = &v + return s +} + +func (req *TaobaoTbkDgPunishOrderGetRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.AfOrderOption != nil { + paramMap["af_order_option"] = util.ConvertStruct(*req.AfOrderOption) + } + return paramMap +} + +func (req *TaobaoTbkDgPunishOrderGetRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability417/response/TaobaoTbkDgPunishOrderGetResponse.go b/service/topsdk/ability417/response/TaobaoTbkDgPunishOrderGetResponse.go new file mode 100644 index 00000000..d6f4c073 --- /dev/null +++ b/service/topsdk/ability417/response/TaobaoTbkDgPunishOrderGetResponse.go @@ -0,0 +1,23 @@ +package response + +import ( + "topsdk/ability417/domain" +) + +type TaobaoTbkDgPunishOrderGetResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + 查询的对象 + */ + Result domain.TaobaoTbkDgPunishOrderGetRpcResult `json:"result,omitempty" ` +} diff --git a/service/topsdk/ability425/Ability425.go b/service/topsdk/ability425/Ability425.go new file mode 100644 index 00000000..fd1889ba --- /dev/null +++ b/service/topsdk/ability425/Ability425.go @@ -0,0 +1,78 @@ +package ability425 + +import ( + "errors" + "log" + "topsdk" + "topsdk/ability425/request" + "topsdk/ability425/response" + "topsdk/util" +) + +type Ability425 struct { + Client *topsdk.TopClient +} + +func NewAbility425(client *topsdk.TopClient) *Ability425 { + return &Ability425{client} +} + +/* + 淘宝客-公用-私域用户邀请码生成 +*/ +func (ability *Ability425) TaobaoTbkScInvitecodeGet(req *request.TaobaoTbkScInvitecodeGetRequest, session string) (*response.TaobaoTbkScInvitecodeGetResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability425 topClient is nil") + } + var jsonStr, err = ability.Client.ExecuteWithSession("taobao.tbk.sc.invitecode.get", req.ToMap(), req.ToFileMap(), session) + var respStruct = response.TaobaoTbkScInvitecodeGetResponse{} + if err != nil { + log.Fatal("taobaoTbkScInvitecodeGet error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} + +/* + 淘宝客-公用-私域用户备案 +*/ +func (ability *Ability425) TaobaoTbkScPublisherInfoSave(req *request.TaobaoTbkScPublisherInfoSaveRequest, session string) (*response.TaobaoTbkScPublisherInfoSaveResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability425 topClient is nil") + } + var jsonStr, err = ability.Client.ExecuteWithSession("taobao.tbk.sc.publisher.info.save", req.ToMap(), req.ToFileMap(), session) + var respStruct = response.TaobaoTbkScPublisherInfoSaveResponse{} + if err != nil { + log.Fatal("taobaoTbkScPublisherInfoSave error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} + +/* + 淘宝客-公用-私域用户备案信息查询 +*/ +func (ability *Ability425) TaobaoTbkScPublisherInfoGet(req *request.TaobaoTbkScPublisherInfoGetRequest, session string) (*response.TaobaoTbkScPublisherInfoGetResponse, error) { + if ability.Client == nil { + return nil, errors.New("Ability425 topClient is nil") + } + var jsonStr, err = ability.Client.ExecuteWithSession("taobao.tbk.sc.publisher.info.get", req.ToMap(), req.ToFileMap(), session) + var respStruct = response.TaobaoTbkScPublisherInfoGetResponse{} + if err != nil { + log.Fatal("taobaoTbkScPublisherInfoGet error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} diff --git a/service/topsdk/ability425/domain/TaobaoTbkScInvitecodeGetData.go b/service/topsdk/ability425/domain/TaobaoTbkScInvitecodeGetData.go new file mode 100644 index 00000000..ebe7d2e9 --- /dev/null +++ b/service/topsdk/ability425/domain/TaobaoTbkScInvitecodeGetData.go @@ -0,0 +1,12 @@ +package domain + +type TaobaoTbkScInvitecodeGetData struct { + /* + 邀请码 */ + InviterCode *string `json:"inviter_code,omitempty" ` +} + +func (s *TaobaoTbkScInvitecodeGetData) SetInviterCode(v string) *TaobaoTbkScInvitecodeGetData { + s.InviterCode = &v + return s +} diff --git a/service/topsdk/ability425/domain/TaobaoTbkScPublisherInfoGetData.go b/service/topsdk/ability425/domain/TaobaoTbkScPublisherInfoGetData.go new file mode 100644 index 00000000..ba5688c8 --- /dev/null +++ b/service/topsdk/ability425/domain/TaobaoTbkScPublisherInfoGetData.go @@ -0,0 +1,28 @@ +package domain + +type TaobaoTbkScPublisherInfoGetData struct { + /* + 共享字段 - 总记录数 */ + TotalCount *int64 `json:"total_count,omitempty" ` + + /* + 共享字段 - 渠道或会员列表 */ + InviterList *[]TaobaoTbkScPublisherInfoGetMapData `json:"inviter_list,omitempty" ` + + /* + 渠道专属pidList */ + RootPidChannelList *[]string `json:"root_pid_channel_list,omitempty" ` +} + +func (s *TaobaoTbkScPublisherInfoGetData) SetTotalCount(v int64) *TaobaoTbkScPublisherInfoGetData { + s.TotalCount = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetData) SetInviterList(v []TaobaoTbkScPublisherInfoGetMapData) *TaobaoTbkScPublisherInfoGetData { + s.InviterList = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetData) SetRootPidChannelList(v []string) *TaobaoTbkScPublisherInfoGetData { + s.RootPidChannelList = &v + return s +} diff --git a/service/topsdk/ability425/domain/TaobaoTbkScPublisherInfoGetMapData.go b/service/topsdk/ability425/domain/TaobaoTbkScPublisherInfoGetMapData.go new file mode 100644 index 00000000..82737252 --- /dev/null +++ b/service/topsdk/ability425/domain/TaobaoTbkScPublisherInfoGetMapData.go @@ -0,0 +1,128 @@ +package domain + +import ( + "topsdk/util" +) + +type TaobaoTbkScPublisherInfoGetMapData struct { + /* + 共享字段 - 备案场景:common(通用备案),etao(一淘备案),minietao(一淘小程序备案),offlineShop(线下门店备案),offlinePerson(线下个人备案) */ + RelationApp *string `json:"relation_app,omitempty" ` + + /* + 共享字段 - 备案日期 */ + CreateDate *util.LocalTime `json:"create_date,omitempty" ` + + /* + 渠道独有 - 渠道昵称 */ + AccountName *string `json:"account_name,omitempty" ` + + /* + 渠道独有 - 渠道姓名 */ + RealName *string `json:"real_name,omitempty" ` + + /* + 渠道独有 - 渠道关系ID */ + RelationId *int64 `json:"relation_id,omitempty" ` + + /* + 渠道独有 - 线下场景信息,1 - 门店,2- 学校,3 - 工厂,4 - 其他 */ + OfflineScene *string `json:"offline_scene,omitempty" ` + + /* + 渠道独有 - 线上场景信息,1 - 微信群,2- QQ群,3 - 其他 */ + OnlineScene *string `json:"online_scene,omitempty" ` + + /* + 渠道独有 - 媒体侧渠道备注信息 */ + Note *string `json:"note,omitempty" ` + + /* + 共享字段 - 渠道/会员专属pid */ + RootPid *string `json:"root_pid,omitempty" ` + + /* + 共享字段 - 渠道/会员原始身份信息 */ + Rtag *string `json:"rtag,omitempty" ` + + /* + 线下备案专属信息 */ + OfflineInfo *TaobaoTbkScPublisherInfoGetRegisterInfoDto `json:"offline_info,omitempty" ` + + /* + 会员独有 - 会员运营ID */ + SpecialId *int64 `json:"special_id,omitempty" ` + + /* + 渠道独有 - 处罚状态 */ + PunishStatus *string `json:"punish_status,omitempty" ` + + /* + 淘宝客外部用户标记,如自身系统账户ID;微信ID等 */ + ExternalId *string `json:"external_id,omitempty" ` + + /* + 1-微信、2-微博、3-抖音、4-快手、5-QQ,0-其他 */ + ExternalType *string `json:"external_type,omitempty" ` +} + +func (s *TaobaoTbkScPublisherInfoGetMapData) SetRelationApp(v string) *TaobaoTbkScPublisherInfoGetMapData { + s.RelationApp = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetMapData) SetCreateDate(v util.LocalTime) *TaobaoTbkScPublisherInfoGetMapData { + s.CreateDate = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetMapData) SetAccountName(v string) *TaobaoTbkScPublisherInfoGetMapData { + s.AccountName = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetMapData) SetRealName(v string) *TaobaoTbkScPublisherInfoGetMapData { + s.RealName = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetMapData) SetRelationId(v int64) *TaobaoTbkScPublisherInfoGetMapData { + s.RelationId = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetMapData) SetOfflineScene(v string) *TaobaoTbkScPublisherInfoGetMapData { + s.OfflineScene = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetMapData) SetOnlineScene(v string) *TaobaoTbkScPublisherInfoGetMapData { + s.OnlineScene = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetMapData) SetNote(v string) *TaobaoTbkScPublisherInfoGetMapData { + s.Note = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetMapData) SetRootPid(v string) *TaobaoTbkScPublisherInfoGetMapData { + s.RootPid = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetMapData) SetRtag(v string) *TaobaoTbkScPublisherInfoGetMapData { + s.Rtag = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetMapData) SetOfflineInfo(v TaobaoTbkScPublisherInfoGetRegisterInfoDto) *TaobaoTbkScPublisherInfoGetMapData { + s.OfflineInfo = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetMapData) SetSpecialId(v int64) *TaobaoTbkScPublisherInfoGetMapData { + s.SpecialId = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetMapData) SetPunishStatus(v string) *TaobaoTbkScPublisherInfoGetMapData { + s.PunishStatus = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetMapData) SetExternalId(v string) *TaobaoTbkScPublisherInfoGetMapData { + s.ExternalId = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetMapData) SetExternalType(v string) *TaobaoTbkScPublisherInfoGetMapData { + s.ExternalType = &v + return s +} diff --git a/service/topsdk/ability425/domain/TaobaoTbkScPublisherInfoGetRegisterInfoDto.go b/service/topsdk/ability425/domain/TaobaoTbkScPublisherInfoGetRegisterInfoDto.go new file mode 100644 index 00000000..ad7ea808 --- /dev/null +++ b/service/topsdk/ability425/domain/TaobaoTbkScPublisherInfoGetRegisterInfoDto.go @@ -0,0 +1,68 @@ +package domain + +type TaobaoTbkScPublisherInfoGetRegisterInfoDto struct { + /* + 渠道独有 -店铺名称 */ + ShopName *string `json:"shop_name,omitempty" ` + + /* + 渠道独有 -店铺类型 */ + ShopType *string `json:"shop_type,omitempty" ` + + /* + 渠道独有 -手机号码 */ + PhoneNumber *string `json:"phone_number,omitempty" ` + + /* + 渠道独有 -详细地址 */ + DetailAddress *string `json:"detail_address,omitempty" ` + + /* + 渠道独有 -地区 */ + Location *string `json:"location,omitempty" ` + + /* + 渠道独有 -证件类型 */ + ShopCertifyType *string `json:"shop_certify_type,omitempty" ` + + /* + 渠道独有 -对应的证件证件类型编号 */ + CertifyNumber *string `json:"certify_number,omitempty" ` + + /* + 渠道独有 -经营类型 */ + Career *string `json:"career,omitempty" ` +} + +func (s *TaobaoTbkScPublisherInfoGetRegisterInfoDto) SetShopName(v string) *TaobaoTbkScPublisherInfoGetRegisterInfoDto { + s.ShopName = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetRegisterInfoDto) SetShopType(v string) *TaobaoTbkScPublisherInfoGetRegisterInfoDto { + s.ShopType = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetRegisterInfoDto) SetPhoneNumber(v string) *TaobaoTbkScPublisherInfoGetRegisterInfoDto { + s.PhoneNumber = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetRegisterInfoDto) SetDetailAddress(v string) *TaobaoTbkScPublisherInfoGetRegisterInfoDto { + s.DetailAddress = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetRegisterInfoDto) SetLocation(v string) *TaobaoTbkScPublisherInfoGetRegisterInfoDto { + s.Location = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetRegisterInfoDto) SetShopCertifyType(v string) *TaobaoTbkScPublisherInfoGetRegisterInfoDto { + s.ShopCertifyType = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetRegisterInfoDto) SetCertifyNumber(v string) *TaobaoTbkScPublisherInfoGetRegisterInfoDto { + s.CertifyNumber = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetRegisterInfoDto) SetCareer(v string) *TaobaoTbkScPublisherInfoGetRegisterInfoDto { + s.Career = &v + return s +} diff --git a/service/topsdk/ability425/domain/TaobaoTbkScPublisherInfoSaveData.go b/service/topsdk/ability425/domain/TaobaoTbkScPublisherInfoSaveData.go new file mode 100644 index 00000000..d6638f87 --- /dev/null +++ b/service/topsdk/ability425/domain/TaobaoTbkScPublisherInfoSaveData.go @@ -0,0 +1,36 @@ +package domain + +type TaobaoTbkScPublisherInfoSaveData struct { + /* + 渠道关系ID */ + RelationId *int64 `json:"relation_id,omitempty" ` + + /* + 渠道昵称 */ + AccountName *string `json:"account_name,omitempty" ` + + /* + 会员运营ID */ + SpecialId *int64 `json:"special_id,omitempty" ` + + /* + 如果重复绑定会提示:”重复绑定渠道“或”重复绑定粉丝“ */ + Desc *string `json:"desc,omitempty" ` +} + +func (s *TaobaoTbkScPublisherInfoSaveData) SetRelationId(v int64) *TaobaoTbkScPublisherInfoSaveData { + s.RelationId = &v + return s +} +func (s *TaobaoTbkScPublisherInfoSaveData) SetAccountName(v string) *TaobaoTbkScPublisherInfoSaveData { + s.AccountName = &v + return s +} +func (s *TaobaoTbkScPublisherInfoSaveData) SetSpecialId(v int64) *TaobaoTbkScPublisherInfoSaveData { + s.SpecialId = &v + return s +} +func (s *TaobaoTbkScPublisherInfoSaveData) SetDesc(v string) *TaobaoTbkScPublisherInfoSaveData { + s.Desc = &v + return s +} diff --git a/service/topsdk/ability425/request/TaobaoTbkScInvitecodeGetRequest.go b/service/topsdk/ability425/request/TaobaoTbkScInvitecodeGetRequest.go new file mode 100644 index 00000000..babeee7d --- /dev/null +++ b/service/topsdk/ability425/request/TaobaoTbkScInvitecodeGetRequest.go @@ -0,0 +1,45 @@ +package request + +type TaobaoTbkScInvitecodeGetRequest struct { + /* + 渠道关系ID */ + RelationId *int64 `json:"relation_id,omitempty" required:"false" ` + /* + 渠道推广的物料类型 */ + RelationApp *string `json:"relation_app" required:"true" ` + /* + 邀请码类型,1 - 渠道邀请,2 - 渠道裂变,3 -会员邀请 */ + CodeType *int64 `json:"code_type" required:"true" ` +} + +func (s *TaobaoTbkScInvitecodeGetRequest) SetRelationId(v int64) *TaobaoTbkScInvitecodeGetRequest { + s.RelationId = &v + return s +} +func (s *TaobaoTbkScInvitecodeGetRequest) SetRelationApp(v string) *TaobaoTbkScInvitecodeGetRequest { + s.RelationApp = &v + return s +} +func (s *TaobaoTbkScInvitecodeGetRequest) SetCodeType(v int64) *TaobaoTbkScInvitecodeGetRequest { + s.CodeType = &v + return s +} + +func (req *TaobaoTbkScInvitecodeGetRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.RelationId != nil { + paramMap["relation_id"] = *req.RelationId + } + if req.RelationApp != nil { + paramMap["relation_app"] = *req.RelationApp + } + if req.CodeType != nil { + paramMap["code_type"] = *req.CodeType + } + return paramMap +} + +func (req *TaobaoTbkScInvitecodeGetRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability425/request/TaobaoTbkScPublisherInfoGetRequest.go b/service/topsdk/ability425/request/TaobaoTbkScPublisherInfoGetRequest.go new file mode 100644 index 00000000..878bde33 --- /dev/null +++ b/service/topsdk/ability425/request/TaobaoTbkScPublisherInfoGetRequest.go @@ -0,0 +1,95 @@ +package request + +type TaobaoTbkScPublisherInfoGetRequest struct { + /* + 渠道独占 - 渠道关系ID */ + RelationId *int64 `json:"relation_id,omitempty" required:"false" ` + /* + 第几页 defalutValue��1 */ + PageNo *int64 `json:"page_no,omitempty" required:"false" ` + /* + 每页大小 defalutValue��10 */ + PageSize *int64 `json:"page_size,omitempty" required:"false" ` + /* + 类型,必选 1:渠道信息;2:会员信息 */ + InfoType *int64 `json:"info_type" required:"true" ` + /* + 备案的场景:common(通用备案),etao(一淘备案),minietao(一淘小程序备案),offlineShop(线下门店备案),offlinePerson(线下个人备案)。如不填默认common。查询会员信息只需填写common即可 */ + RelationApp *string `json:"relation_app" required:"true" ` + /* + 会员独占 - 会员运营ID */ + SpecialId *string `json:"special_id,omitempty" required:"false" ` + /* + 淘宝客外部用户标记,如自身系统账户ID;微信ID等 */ + ExternalId *string `json:"external_id,omitempty" required:"false" ` + /* + 1-微信、2-微博、3-抖音、4-快手、5-QQ,0-其他;默认为0 defalutValue��0 */ + ExternalType *int64 `json:"external_type,omitempty" required:"false" ` +} + +func (s *TaobaoTbkScPublisherInfoGetRequest) SetRelationId(v int64) *TaobaoTbkScPublisherInfoGetRequest { + s.RelationId = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetRequest) SetPageNo(v int64) *TaobaoTbkScPublisherInfoGetRequest { + s.PageNo = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetRequest) SetPageSize(v int64) *TaobaoTbkScPublisherInfoGetRequest { + s.PageSize = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetRequest) SetInfoType(v int64) *TaobaoTbkScPublisherInfoGetRequest { + s.InfoType = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetRequest) SetRelationApp(v string) *TaobaoTbkScPublisherInfoGetRequest { + s.RelationApp = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetRequest) SetSpecialId(v string) *TaobaoTbkScPublisherInfoGetRequest { + s.SpecialId = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetRequest) SetExternalId(v string) *TaobaoTbkScPublisherInfoGetRequest { + s.ExternalId = &v + return s +} +func (s *TaobaoTbkScPublisherInfoGetRequest) SetExternalType(v int64) *TaobaoTbkScPublisherInfoGetRequest { + s.ExternalType = &v + return s +} + +func (req *TaobaoTbkScPublisherInfoGetRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.RelationId != nil { + paramMap["relation_id"] = *req.RelationId + } + if req.PageNo != nil { + paramMap["page_no"] = *req.PageNo + } + if req.PageSize != nil { + paramMap["page_size"] = *req.PageSize + } + if req.InfoType != nil { + paramMap["info_type"] = *req.InfoType + } + if req.RelationApp != nil { + paramMap["relation_app"] = *req.RelationApp + } + if req.SpecialId != nil { + paramMap["special_id"] = *req.SpecialId + } + if req.ExternalId != nil { + paramMap["external_id"] = *req.ExternalId + } + if req.ExternalType != nil { + paramMap["external_type"] = *req.ExternalType + } + return paramMap +} + +func (req *TaobaoTbkScPublisherInfoGetRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability425/request/TaobaoTbkScPublisherInfoSaveRequest.go b/service/topsdk/ability425/request/TaobaoTbkScPublisherInfoSaveRequest.go new file mode 100644 index 00000000..4b02ff7d --- /dev/null +++ b/service/topsdk/ability425/request/TaobaoTbkScPublisherInfoSaveRequest.go @@ -0,0 +1,85 @@ +package request + +type TaobaoTbkScPublisherInfoSaveRequest struct { + /* + 渠道备案 - 来源,取链接的来源 */ + RelationFrom *string `json:"relation_from,omitempty" required:"false" ` + /* + 渠道备案 - 线下场景信息,1 - 门店,2- 学校,3 - 工厂,4 - 其他 */ + OfflineScene *string `json:"offline_scene,omitempty" required:"false" ` + /* + 渠道备案 - 线上场景信息,1 - 微信群,2- QQ群,3 - 其他 */ + OnlineScene *string `json:"online_scene,omitempty" required:"false" ` + /* + 淘宝客邀请渠道或会员的邀请码 */ + InviterCode *string `json:"inviter_code" required:"true" ` + /* + 类型,必选 默认为1: */ + InfoType *int64 `json:"info_type" required:"true" ` + /* + 媒体侧渠道备注 */ + Note *string `json:"note,omitempty" required:"false" ` + /* + 线下备案注册信息,字段包含: 电话号码(phoneNumber,必填),省(province,必填),市(city,必填),区县街道(location,必填),详细地址(detailAddress,必填),经营类型(career,线下个人必填),店铺类型(shopType,线下店铺必填),店铺名称(shopName,线下店铺必填),店铺证书类型(shopCertifyType,线下店铺选填),店铺证书编号(certifyNumber,线下店铺选填) */ + RegisterInfo *string `json:"register_info,omitempty" required:"false" ` +} + +func (s *TaobaoTbkScPublisherInfoSaveRequest) SetRelationFrom(v string) *TaobaoTbkScPublisherInfoSaveRequest { + s.RelationFrom = &v + return s +} +func (s *TaobaoTbkScPublisherInfoSaveRequest) SetOfflineScene(v string) *TaobaoTbkScPublisherInfoSaveRequest { + s.OfflineScene = &v + return s +} +func (s *TaobaoTbkScPublisherInfoSaveRequest) SetOnlineScene(v string) *TaobaoTbkScPublisherInfoSaveRequest { + s.OnlineScene = &v + return s +} +func (s *TaobaoTbkScPublisherInfoSaveRequest) SetInviterCode(v string) *TaobaoTbkScPublisherInfoSaveRequest { + s.InviterCode = &v + return s +} +func (s *TaobaoTbkScPublisherInfoSaveRequest) SetInfoType(v int64) *TaobaoTbkScPublisherInfoSaveRequest { + s.InfoType = &v + return s +} +func (s *TaobaoTbkScPublisherInfoSaveRequest) SetNote(v string) *TaobaoTbkScPublisherInfoSaveRequest { + s.Note = &v + return s +} +func (s *TaobaoTbkScPublisherInfoSaveRequest) SetRegisterInfo(v string) *TaobaoTbkScPublisherInfoSaveRequest { + s.RegisterInfo = &v + return s +} + +func (req *TaobaoTbkScPublisherInfoSaveRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.RelationFrom != nil { + paramMap["relation_from"] = *req.RelationFrom + } + if req.OfflineScene != nil { + paramMap["offline_scene"] = *req.OfflineScene + } + if req.OnlineScene != nil { + paramMap["online_scene"] = *req.OnlineScene + } + if req.InviterCode != nil { + paramMap["inviter_code"] = *req.InviterCode + } + if req.InfoType != nil { + paramMap["info_type"] = *req.InfoType + } + if req.Note != nil { + paramMap["note"] = *req.Note + } + if req.RegisterInfo != nil { + paramMap["register_info"] = *req.RegisterInfo + } + return paramMap +} + +func (req *TaobaoTbkScPublisherInfoSaveRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/ability425/response/TaobaoTbkScInvitecodeGetResponse.go b/service/topsdk/ability425/response/TaobaoTbkScInvitecodeGetResponse.go new file mode 100644 index 00000000..7d67098a --- /dev/null +++ b/service/topsdk/ability425/response/TaobaoTbkScInvitecodeGetResponse.go @@ -0,0 +1,23 @@ +package response + +import ( + "topsdk/ability425/domain" +) + +type TaobaoTbkScInvitecodeGetResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + data + */ + Data domain.TaobaoTbkScInvitecodeGetData `json:"data,omitempty" ` +} diff --git a/service/topsdk/ability425/response/TaobaoTbkScPublisherInfoGetResponse.go b/service/topsdk/ability425/response/TaobaoTbkScPublisherInfoGetResponse.go new file mode 100644 index 00000000..748c977a --- /dev/null +++ b/service/topsdk/ability425/response/TaobaoTbkScPublisherInfoGetResponse.go @@ -0,0 +1,23 @@ +package response + +import ( + "topsdk/ability425/domain" +) + +type TaobaoTbkScPublisherInfoGetResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + data + */ + Data domain.TaobaoTbkScPublisherInfoGetData `json:"data,omitempty" ` +} diff --git a/service/topsdk/ability425/response/TaobaoTbkScPublisherInfoSaveResponse.go b/service/topsdk/ability425/response/TaobaoTbkScPublisherInfoSaveResponse.go new file mode 100644 index 00000000..8031c68e --- /dev/null +++ b/service/topsdk/ability425/response/TaobaoTbkScPublisherInfoSaveResponse.go @@ -0,0 +1,23 @@ +package response + +import ( + "topsdk/ability425/domain" +) + +type TaobaoTbkScPublisherInfoSaveResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + data + */ + Data domain.TaobaoTbkScPublisherInfoSaveData `json:"data,omitempty" ` +} diff --git a/service/topsdk/defaultability/Defaultability.go b/service/topsdk/defaultability/Defaultability.go new file mode 100644 index 00000000..1b38b94d --- /dev/null +++ b/service/topsdk/defaultability/Defaultability.go @@ -0,0 +1,78 @@ +package defaultability + +import ( + "errors" + "log" + "topsdk" + "topsdk/defaultability/request" + "topsdk/defaultability/response" + "topsdk/util" +) + +type Defaultability struct { + Client *topsdk.TopClient +} + +func NewDefaultability(client *topsdk.TopClient) *Defaultability { + return &Defaultability{client} +} + +/* + 淘宝客-推广者-淘口令预警及拦截查询 +*/ +func (ability *Defaultability) TaobaoTbkDgTpwdRiskReport(req *request.TaobaoTbkDgTpwdRiskReportRequest) (*response.TaobaoTbkDgTpwdRiskReportResponse, error) { + if ability.Client == nil { + return nil, errors.New("Defaultability topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.tbk.dg.tpwd.risk.report", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoTbkDgTpwdRiskReportResponse{} + if err != nil { + log.Fatal("taobaoTbkDgTpwdRiskReport error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} + +/* + 淘宝客-服务商-淘口令预警及拦截查询 +*/ +func (ability *Defaultability) TaobaoTbkScTpwdRiskReport(req *request.TaobaoTbkScTpwdRiskReportRequest, session string) (*response.TaobaoTbkScTpwdRiskReportResponse, error) { + if ability.Client == nil { + return nil, errors.New("Defaultability topClient is nil") + } + var jsonStr, err = ability.Client.ExecuteWithSession("taobao.tbk.sc.tpwd.risk.report", req.ToMap(), req.ToFileMap(), session) + var respStruct = response.TaobaoTbkScTpwdRiskReportResponse{} + if err != nil { + log.Fatal("taobaoTbkScTpwdRiskReport error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} + +/* + 淘宝客-推广者-裂变淘礼金创建 +*/ +func (ability *Defaultability) TaobaoTbkDgVegasLbtljCreate(req *request.TaobaoTbkDgVegasLbtljCreateRequest) (*response.TaobaoTbkDgVegasLbtljCreateResponse, error) { + if ability.Client == nil { + return nil, errors.New("Defaultability topClient is nil") + } + var jsonStr, err = ability.Client.Execute("taobao.tbk.dg.vegas.lbtlj.create", req.ToMap(), req.ToFileMap()) + var respStruct = response.TaobaoTbkDgVegasLbtljCreateResponse{} + if err != nil { + log.Fatal("taobaoTbkDgVegasLbtljCreate error", err) + return &respStruct, err + } + err = util.HandleJsonResponse(jsonStr, &respStruct) + if respStruct.Body == "" || len(respStruct.Body) == 0 { + respStruct.Body = jsonStr + } + return &respStruct, err +} diff --git a/service/topsdk/defaultability/domain/TaobaoTbkDgTpwdRiskReportDataMap.go b/service/topsdk/defaultability/domain/TaobaoTbkDgTpwdRiskReportDataMap.go new file mode 100644 index 00000000..dd0d0190 --- /dev/null +++ b/service/topsdk/defaultability/domain/TaobaoTbkDgTpwdRiskReportDataMap.go @@ -0,0 +1,28 @@ +package domain + +type TaobaoTbkDgTpwdRiskReportDataMap struct { + /* + 当入参不传pid的时候返回,表示账号关联的pid */ + Pid *string `json:"pid,omitempty" ` + + /* + 当入参传入pid的时候返回,表示pid关联的relationId */ + Rid *string `json:"rid,omitempty" ` + + /* + 0表示预警,1表示拦截,如果名单中同一个淘客同时有拦截和预警信息,以拦截为准 */ + Status *string `json:"status,omitempty" ` +} + +func (s *TaobaoTbkDgTpwdRiskReportDataMap) SetPid(v string) *TaobaoTbkDgTpwdRiskReportDataMap { + s.Pid = &v + return s +} +func (s *TaobaoTbkDgTpwdRiskReportDataMap) SetRid(v string) *TaobaoTbkDgTpwdRiskReportDataMap { + s.Rid = &v + return s +} +func (s *TaobaoTbkDgTpwdRiskReportDataMap) SetStatus(v string) *TaobaoTbkDgTpwdRiskReportDataMap { + s.Status = &v + return s +} diff --git a/service/topsdk/defaultability/domain/TaobaoTbkDgTpwdRiskReportResult.go b/service/topsdk/defaultability/domain/TaobaoTbkDgTpwdRiskReportResult.go new file mode 100644 index 00000000..e2b419d8 --- /dev/null +++ b/service/topsdk/defaultability/domain/TaobaoTbkDgTpwdRiskReportResult.go @@ -0,0 +1,12 @@ +package domain + +type TaobaoTbkDgTpwdRiskReportResult struct { + /* + x */ + StatusList *[]TaobaoTbkDgTpwdRiskReportDataMap `json:"status_list,omitempty" ` +} + +func (s *TaobaoTbkDgTpwdRiskReportResult) SetStatusList(v []TaobaoTbkDgTpwdRiskReportDataMap) *TaobaoTbkDgTpwdRiskReportResult { + s.StatusList = &v + return s +} diff --git a/service/topsdk/defaultability/domain/TaobaoTbkDgVegasLbtljCreateResult.go b/service/topsdk/defaultability/domain/TaobaoTbkDgVegasLbtljCreateResult.go new file mode 100644 index 00000000..314e9fbb --- /dev/null +++ b/service/topsdk/defaultability/domain/TaobaoTbkDgVegasLbtljCreateResult.go @@ -0,0 +1,36 @@ +package domain + +type TaobaoTbkDgVegasLbtljCreateResult struct { + /* + model */ + Model *TaobaoTbkDgVegasLbtljCreateTaskInstanceCreateResult `json:"model,omitempty" ` + + /* + msgCode */ + MsgCode *string `json:"msg_code,omitempty" ` + + /* + msgInfo */ + MsgInfo *string `json:"msg_info,omitempty" ` + + /* + 是否成功 */ + Success *bool `json:"success,omitempty" ` +} + +func (s *TaobaoTbkDgVegasLbtljCreateResult) SetModel(v TaobaoTbkDgVegasLbtljCreateTaskInstanceCreateResult) *TaobaoTbkDgVegasLbtljCreateResult { + s.Model = &v + return s +} +func (s *TaobaoTbkDgVegasLbtljCreateResult) SetMsgCode(v string) *TaobaoTbkDgVegasLbtljCreateResult { + s.MsgCode = &v + return s +} +func (s *TaobaoTbkDgVegasLbtljCreateResult) SetMsgInfo(v string) *TaobaoTbkDgVegasLbtljCreateResult { + s.MsgInfo = &v + return s +} +func (s *TaobaoTbkDgVegasLbtljCreateResult) SetSuccess(v bool) *TaobaoTbkDgVegasLbtljCreateResult { + s.Success = &v + return s +} diff --git a/service/topsdk/defaultability/domain/TaobaoTbkDgVegasLbtljCreateTaskInstanceCreateResult.go b/service/topsdk/defaultability/domain/TaobaoTbkDgVegasLbtljCreateTaskInstanceCreateResult.go new file mode 100644 index 00000000..94aab1ba --- /dev/null +++ b/service/topsdk/defaultability/domain/TaobaoTbkDgVegasLbtljCreateTaskInstanceCreateResult.go @@ -0,0 +1,36 @@ +package domain + +type TaobaoTbkDgVegasLbtljCreateTaskInstanceCreateResult struct { + /* + 直领淘礼金id */ + RightsId *string `json:"rights_id,omitempty" ` + + /* + 发放url */ + SendUrl *string `json:"send_url,omitempty" ` + + /* + 裂变淘礼金id */ + TaskRightsId *string `json:"task_rights_id,omitempty" ` + + /* + 裂变任务id */ + TaskId *string `json:"task_id,omitempty" ` +} + +func (s *TaobaoTbkDgVegasLbtljCreateTaskInstanceCreateResult) SetRightsId(v string) *TaobaoTbkDgVegasLbtljCreateTaskInstanceCreateResult { + s.RightsId = &v + return s +} +func (s *TaobaoTbkDgVegasLbtljCreateTaskInstanceCreateResult) SetSendUrl(v string) *TaobaoTbkDgVegasLbtljCreateTaskInstanceCreateResult { + s.SendUrl = &v + return s +} +func (s *TaobaoTbkDgVegasLbtljCreateTaskInstanceCreateResult) SetTaskRightsId(v string) *TaobaoTbkDgVegasLbtljCreateTaskInstanceCreateResult { + s.TaskRightsId = &v + return s +} +func (s *TaobaoTbkDgVegasLbtljCreateTaskInstanceCreateResult) SetTaskId(v string) *TaobaoTbkDgVegasLbtljCreateTaskInstanceCreateResult { + s.TaskId = &v + return s +} diff --git a/service/topsdk/defaultability/domain/TaobaoTbkScTpwdRiskReportDataMap.go b/service/topsdk/defaultability/domain/TaobaoTbkScTpwdRiskReportDataMap.go new file mode 100644 index 00000000..0c13f64a --- /dev/null +++ b/service/topsdk/defaultability/domain/TaobaoTbkScTpwdRiskReportDataMap.go @@ -0,0 +1,28 @@ +package domain + +type TaobaoTbkScTpwdRiskReportDataMap struct { + /* + 当入参不传pid的时候返回,表示授权账号关联的pid */ + Pid *string `json:"pid,omitempty" ` + + /* + 当入参传入pid的时候返回,表示pid关联的relationId */ + Rid *string `json:"rid,omitempty" ` + + /* + 0表示预警,1表示拦截,如果名单中同一个淘客同时有拦截和预警信息,以拦截为准 */ + Status *string `json:"status,omitempty" ` +} + +func (s *TaobaoTbkScTpwdRiskReportDataMap) SetPid(v string) *TaobaoTbkScTpwdRiskReportDataMap { + s.Pid = &v + return s +} +func (s *TaobaoTbkScTpwdRiskReportDataMap) SetRid(v string) *TaobaoTbkScTpwdRiskReportDataMap { + s.Rid = &v + return s +} +func (s *TaobaoTbkScTpwdRiskReportDataMap) SetStatus(v string) *TaobaoTbkScTpwdRiskReportDataMap { + s.Status = &v + return s +} diff --git a/service/topsdk/defaultability/domain/TaobaoTbkScTpwdRiskReportResult.go b/service/topsdk/defaultability/domain/TaobaoTbkScTpwdRiskReportResult.go new file mode 100644 index 00000000..e1ed8e2c --- /dev/null +++ b/service/topsdk/defaultability/domain/TaobaoTbkScTpwdRiskReportResult.go @@ -0,0 +1,12 @@ +package domain + +type TaobaoTbkScTpwdRiskReportResult struct { + /* + x */ + StatusList *[]TaobaoTbkScTpwdRiskReportDataMap `json:"status_list,omitempty" ` +} + +func (s *TaobaoTbkScTpwdRiskReportResult) SetStatusList(v []TaobaoTbkScTpwdRiskReportDataMap) *TaobaoTbkScTpwdRiskReportResult { + s.StatusList = &v + return s +} diff --git a/service/topsdk/defaultability/request/TaobaoTbkDgTpwdRiskReportRequest.go b/service/topsdk/defaultability/request/TaobaoTbkDgTpwdRiskReportRequest.go new file mode 100644 index 00000000..30d161ec --- /dev/null +++ b/service/topsdk/defaultability/request/TaobaoTbkDgTpwdRiskReportRequest.go @@ -0,0 +1,45 @@ +package request + +type TaobaoTbkDgTpwdRiskReportRequest struct { + /* + 如有pid,则查询pid下的relationid名单;如没有pid,则查询appkey关联userid下的pid名单 */ + Pid *string `json:"pid,omitempty" required:"false" ` + /* + 分页参数 */ + Offset *int32 `json:"offset" required:"true" ` + /* + 分页参数,一次最多不能超过1000 */ + Limit *int32 `json:"limit" required:"true" ` +} + +func (s *TaobaoTbkDgTpwdRiskReportRequest) SetPid(v string) *TaobaoTbkDgTpwdRiskReportRequest { + s.Pid = &v + return s +} +func (s *TaobaoTbkDgTpwdRiskReportRequest) SetOffset(v int32) *TaobaoTbkDgTpwdRiskReportRequest { + s.Offset = &v + return s +} +func (s *TaobaoTbkDgTpwdRiskReportRequest) SetLimit(v int32) *TaobaoTbkDgTpwdRiskReportRequest { + s.Limit = &v + return s +} + +func (req *TaobaoTbkDgTpwdRiskReportRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.Pid != nil { + paramMap["pid"] = *req.Pid + } + if req.Offset != nil { + paramMap["offset"] = *req.Offset + } + if req.Limit != nil { + paramMap["limit"] = *req.Limit + } + return paramMap +} + +func (req *TaobaoTbkDgTpwdRiskReportRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/defaultability/request/TaobaoTbkDgVegasLbtljCreateRequest.go b/service/topsdk/defaultability/request/TaobaoTbkDgVegasLbtljCreateRequest.go new file mode 100644 index 00000000..4a892e81 --- /dev/null +++ b/service/topsdk/defaultability/request/TaobaoTbkDgVegasLbtljCreateRequest.go @@ -0,0 +1,199 @@ +package request + +import ( + "topsdk/util" +) + +type TaobaoTbkDgVegasLbtljCreateRequest struct { + /* + 妈妈广告位Id */ + AdzoneId *int64 `json:"adzone_id" required:"true" ` + /* + 安全等级,0:适用于常规淘礼金投放场景;1:更高安全级别,适用于淘礼金面额偏大等安全性较高的淘礼金投放场景,可能导致更多用户拦截。security_switch为true,此字段不填写时,使用0作为默认安全级别。如果security_switch为false,不进行安全判断。 defalutValue��0 */ + SecurityLevel *int64 `json:"security_level,omitempty" required:"false" ` + /* + 使用开始日期。相对时间,无需填写,以用户领取时间作为使用开始时间。绝对时间,格式 yyyy-MM-dd,例如,2019-01-29,表示从2019-01-29 00:00:00 开始 */ + UseStartTime *string `json:"use_start_time,omitempty" required:"false" ` + /* + 结束日期的模式,1:相对时间,2:绝对时间 */ + UseEndTimeMode *int64 `json:"use_end_time_mode" required:"true" ` + /* + 使用结束日期。如果是结束时间模式为相对时间,时间格式为1-7直接的整数, 例如,1(相对领取时间1天); 如果是绝对时间,格式为yyyy-MM-dd,例如,2019-01-29,表示到2019-01-29 23:59:59结束 */ + UseEndTime *string `json:"use_end_time" required:"true" ` + /* + 裂变任务领取截止时间 */ + AcceptEndTime *util.LocalTime `json:"accept_end_time" required:"true" ` + /* + 裂变任务领取开始时间 */ + AcceptStartTime *util.LocalTime `json:"accept_start_time" required:"true" ` + /* + 单个淘礼金面额,支持两位小数,单位元 */ + RightsPerFace *string `json:"rights_per_face" required:"true" ` + /* + 安全开关,若不进行安全校验,可能放大您的资损风险,请谨慎选择 defalutValue��true */ + SecuritySwitch *bool `json:"security_switch,omitempty" required:"false" ` + /* + 单用户累计中奖次数上限 defalutValue��1 */ + UserTotalWinNumLimit *int64 `json:"user_total_win_num_limit,omitempty" required:"false" ` + /* + 淘礼金名称,最大10个字符 */ + Name *string `json:"name,omitempty" required:"false" ` + /* + 淘礼金总个数 */ + RightsNum *int64 `json:"rights_num" required:"true" ` + /* + 宝贝ID */ + ItemId *int64 `json:"item_id" required:"true" ` + /* + CPS佣金类型 defalutValue��MKT */ + CampaignType *string `json:"campaign_type,omitempty" required:"false" ` + /* + 裂变淘礼金总个数 */ + TaskRightsNum *int64 `json:"task_rights_num" required:"true" ` + /* + 裂变单个淘礼金面额,支持两位小数,单位元 */ + TaskRightsPerFace *string `json:"task_rights_per_face" required:"true" ` + /* + 裂变淘礼金邀请人数 */ + InviteNum *int64 `json:"invite_num" required:"true" ` + /* + 裂变淘礼金邀请时长;单位:分钟;最大120分钟 */ + InviteTimeLimit *int64 `json:"invite_time_limit" required:"true" ` +} + +func (s *TaobaoTbkDgVegasLbtljCreateRequest) SetAdzoneId(v int64) *TaobaoTbkDgVegasLbtljCreateRequest { + s.AdzoneId = &v + return s +} +func (s *TaobaoTbkDgVegasLbtljCreateRequest) SetSecurityLevel(v int64) *TaobaoTbkDgVegasLbtljCreateRequest { + s.SecurityLevel = &v + return s +} +func (s *TaobaoTbkDgVegasLbtljCreateRequest) SetUseStartTime(v string) *TaobaoTbkDgVegasLbtljCreateRequest { + s.UseStartTime = &v + return s +} +func (s *TaobaoTbkDgVegasLbtljCreateRequest) SetUseEndTimeMode(v int64) *TaobaoTbkDgVegasLbtljCreateRequest { + s.UseEndTimeMode = &v + return s +} +func (s *TaobaoTbkDgVegasLbtljCreateRequest) SetUseEndTime(v string) *TaobaoTbkDgVegasLbtljCreateRequest { + s.UseEndTime = &v + return s +} +func (s *TaobaoTbkDgVegasLbtljCreateRequest) SetAcceptEndTime(v util.LocalTime) *TaobaoTbkDgVegasLbtljCreateRequest { + s.AcceptEndTime = &v + return s +} +func (s *TaobaoTbkDgVegasLbtljCreateRequest) SetAcceptStartTime(v util.LocalTime) *TaobaoTbkDgVegasLbtljCreateRequest { + s.AcceptStartTime = &v + return s +} +func (s *TaobaoTbkDgVegasLbtljCreateRequest) SetRightsPerFace(v string) *TaobaoTbkDgVegasLbtljCreateRequest { + s.RightsPerFace = &v + return s +} +func (s *TaobaoTbkDgVegasLbtljCreateRequest) SetSecuritySwitch(v bool) *TaobaoTbkDgVegasLbtljCreateRequest { + s.SecuritySwitch = &v + return s +} +func (s *TaobaoTbkDgVegasLbtljCreateRequest) SetUserTotalWinNumLimit(v int64) *TaobaoTbkDgVegasLbtljCreateRequest { + s.UserTotalWinNumLimit = &v + return s +} +func (s *TaobaoTbkDgVegasLbtljCreateRequest) SetName(v string) *TaobaoTbkDgVegasLbtljCreateRequest { + s.Name = &v + return s +} +func (s *TaobaoTbkDgVegasLbtljCreateRequest) SetRightsNum(v int64) *TaobaoTbkDgVegasLbtljCreateRequest { + s.RightsNum = &v + return s +} +func (s *TaobaoTbkDgVegasLbtljCreateRequest) SetItemId(v int64) *TaobaoTbkDgVegasLbtljCreateRequest { + s.ItemId = &v + return s +} +func (s *TaobaoTbkDgVegasLbtljCreateRequest) SetCampaignType(v string) *TaobaoTbkDgVegasLbtljCreateRequest { + s.CampaignType = &v + return s +} +func (s *TaobaoTbkDgVegasLbtljCreateRequest) SetTaskRightsNum(v int64) *TaobaoTbkDgVegasLbtljCreateRequest { + s.TaskRightsNum = &v + return s +} +func (s *TaobaoTbkDgVegasLbtljCreateRequest) SetTaskRightsPerFace(v string) *TaobaoTbkDgVegasLbtljCreateRequest { + s.TaskRightsPerFace = &v + return s +} +func (s *TaobaoTbkDgVegasLbtljCreateRequest) SetInviteNum(v int64) *TaobaoTbkDgVegasLbtljCreateRequest { + s.InviteNum = &v + return s +} +func (s *TaobaoTbkDgVegasLbtljCreateRequest) SetInviteTimeLimit(v int64) *TaobaoTbkDgVegasLbtljCreateRequest { + s.InviteTimeLimit = &v + return s +} + +func (req *TaobaoTbkDgVegasLbtljCreateRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.AdzoneId != nil { + paramMap["adzone_id"] = *req.AdzoneId + } + if req.SecurityLevel != nil { + paramMap["security_level"] = *req.SecurityLevel + } + if req.UseStartTime != nil { + paramMap["use_start_time"] = *req.UseStartTime + } + if req.UseEndTimeMode != nil { + paramMap["use_end_time_mode"] = *req.UseEndTimeMode + } + if req.UseEndTime != nil { + paramMap["use_end_time"] = *req.UseEndTime + } + if req.AcceptEndTime != nil { + paramMap["accept_end_time"] = *req.AcceptEndTime + } + if req.AcceptStartTime != nil { + paramMap["accept_start_time"] = *req.AcceptStartTime + } + if req.RightsPerFace != nil { + paramMap["rights_per_face"] = *req.RightsPerFace + } + if req.SecuritySwitch != nil { + paramMap["security_switch"] = *req.SecuritySwitch + } + if req.UserTotalWinNumLimit != nil { + paramMap["user_total_win_num_limit"] = *req.UserTotalWinNumLimit + } + if req.Name != nil { + paramMap["name"] = *req.Name + } + if req.RightsNum != nil { + paramMap["rights_num"] = *req.RightsNum + } + if req.ItemId != nil { + paramMap["item_id"] = *req.ItemId + } + if req.CampaignType != nil { + paramMap["campaign_type"] = *req.CampaignType + } + if req.TaskRightsNum != nil { + paramMap["task_rights_num"] = *req.TaskRightsNum + } + if req.TaskRightsPerFace != nil { + paramMap["task_rights_per_face"] = *req.TaskRightsPerFace + } + if req.InviteNum != nil { + paramMap["invite_num"] = *req.InviteNum + } + if req.InviteTimeLimit != nil { + paramMap["invite_time_limit"] = *req.InviteTimeLimit + } + return paramMap +} + +func (req *TaobaoTbkDgVegasLbtljCreateRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/defaultability/request/TaobaoTbkScTpwdRiskReportRequest.go b/service/topsdk/defaultability/request/TaobaoTbkScTpwdRiskReportRequest.go new file mode 100644 index 00000000..7a594bbb --- /dev/null +++ b/service/topsdk/defaultability/request/TaobaoTbkScTpwdRiskReportRequest.go @@ -0,0 +1,45 @@ +package request + +type TaobaoTbkScTpwdRiskReportRequest struct { + /* + 如有pid,则查询pid下的relationid名单;如没有pid,则查询授权userid下的pid名单 */ + Pid *string `json:"pid,omitempty" required:"false" ` + /* + 分页参数 */ + Offset *int32 `json:"offset" required:"true" ` + /* + 分页参数,一次最多不能超过1000 */ + Limit *int32 `json:"limit" required:"true" ` +} + +func (s *TaobaoTbkScTpwdRiskReportRequest) SetPid(v string) *TaobaoTbkScTpwdRiskReportRequest { + s.Pid = &v + return s +} +func (s *TaobaoTbkScTpwdRiskReportRequest) SetOffset(v int32) *TaobaoTbkScTpwdRiskReportRequest { + s.Offset = &v + return s +} +func (s *TaobaoTbkScTpwdRiskReportRequest) SetLimit(v int32) *TaobaoTbkScTpwdRiskReportRequest { + s.Limit = &v + return s +} + +func (req *TaobaoTbkScTpwdRiskReportRequest) ToMap() map[string]interface{} { + paramMap := make(map[string]interface{}) + if req.Pid != nil { + paramMap["pid"] = *req.Pid + } + if req.Offset != nil { + paramMap["offset"] = *req.Offset + } + if req.Limit != nil { + paramMap["limit"] = *req.Limit + } + return paramMap +} + +func (req *TaobaoTbkScTpwdRiskReportRequest) ToFileMap() map[string]interface{} { + fileMap := make(map[string]interface{}) + return fileMap +} diff --git a/service/topsdk/defaultability/response/TaobaoTbkDgTpwdRiskReportResponse.go b/service/topsdk/defaultability/response/TaobaoTbkDgTpwdRiskReportResponse.go new file mode 100644 index 00000000..ed76d860 --- /dev/null +++ b/service/topsdk/defaultability/response/TaobaoTbkDgTpwdRiskReportResponse.go @@ -0,0 +1,23 @@ +package response + +import ( + "topsdk/defaultability/domain" +) + +type TaobaoTbkDgTpwdRiskReportResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + 无 + */ + Result domain.TaobaoTbkDgTpwdRiskReportResult `json:"result,omitempty" ` +} diff --git a/service/topsdk/defaultability/response/TaobaoTbkDgVegasLbtljCreateResponse.go b/service/topsdk/defaultability/response/TaobaoTbkDgVegasLbtljCreateResponse.go new file mode 100644 index 00000000..82b76dc6 --- /dev/null +++ b/service/topsdk/defaultability/response/TaobaoTbkDgVegasLbtljCreateResponse.go @@ -0,0 +1,23 @@ +package response + +import ( + "topsdk/defaultability/domain" +) + +type TaobaoTbkDgVegasLbtljCreateResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + 接口返回model + */ + Result domain.TaobaoTbkDgVegasLbtljCreateResult `json:"result,omitempty" ` +} diff --git a/service/topsdk/defaultability/response/TaobaoTbkScTpwdRiskReportResponse.go b/service/topsdk/defaultability/response/TaobaoTbkScTpwdRiskReportResponse.go new file mode 100644 index 00000000..f83f939e --- /dev/null +++ b/service/topsdk/defaultability/response/TaobaoTbkScTpwdRiskReportResponse.go @@ -0,0 +1,23 @@ +package response + +import ( + "topsdk/defaultability/domain" +) + +type TaobaoTbkScTpwdRiskReportResponse struct { + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` + + /* + System body + */ + Body string + + /* + 无 + */ + Result domain.TaobaoTbkScTpwdRiskReportResult `json:"result,omitempty" ` +} diff --git a/service/topsdk/go.mod b/service/topsdk/go.mod new file mode 100644 index 00000000..e9002f4c --- /dev/null +++ b/service/topsdk/go.mod @@ -0,0 +1,3 @@ +module topsdk + +go 1.16 diff --git a/service/topsdk/topclient.go b/service/topsdk/topclient.go new file mode 100644 index 00000000..d03c4222 --- /dev/null +++ b/service/topsdk/topclient.go @@ -0,0 +1,146 @@ +package topsdk + +import ( + "bytes" + "fmt" + "io" + "io/ioutil" + "log" + "mime/multipart" + "net/http" + "net/url" + "strings" + "time" + "topsdk/util" +) + +type TopClient struct { + AppKey string + AppSecret string + ServerUrl string + Format string + SignMethod string + ConnectTimeout int64 + ReadTimeout int64 + Version string + Simplify bool +} + +func NewDefaultTopClient(AppKey string, AppSecret string, ServerUrl string, connectTimeount int64, readTimeout int64) TopClient { + return TopClient{ + AppKey: AppKey, + AppSecret: AppSecret, + ServerUrl: ServerUrl, + Format: "json", + SignMethod: "hmac-sha256", + ConnectTimeout: connectTimeount, + ReadTimeout: readTimeout, + Version: "2.0", + Simplify: true, + } +} + +func (client *TopClient) ExecuteWithSession(method string, data map[string]interface{}, fileData map[string]interface{}, session string) (string, error) { + var publicParam = make(map[string]interface{}) + publicParam["method"] = method + publicParam["app_key"] = client.AppKey + publicParam["timestamp"] = time.Now().Format("2006-01-02 15:04:05") + publicParam["v"] = client.Version + publicParam["sign_method"] = client.SignMethod + publicParam["format"] = client.Format + publicParam["simplify"] = client.Simplify + publicParam["partner_id"] = "new_go_sdk" + if session != "" { + publicParam["session"] = session + } + sign := util.GetSign(publicParam, data, client.AppSecret) + // 构建url + serverUrl, _ := url.Parse(client.ServerUrl) + urlValues := url.Values{} + urlValues.Add("sign", sign) + for k, v := range publicParam { + urlValues.Add(k, fmt.Sprint(v)) + } + serverUrl.RawQuery = urlValues.Encode() + urlPath := serverUrl.String() + // 构建body + if fileData != nil && len(fileData) > 0 { + return doPostWithFile(urlPath, data, fileData, client.ConnectTimeout) + } else { + return doPost(urlPath, data, client.ConnectTimeout) + } + +} + +func doPost(urlPath string, data map[string]interface{}, timeout int64) (string, error) { + bodyParam := url.Values{} + for k, v := range data { + bodyParam.Add(k, fmt.Sprint(v)) + } + httpClient := http.Client{ + Timeout: time.Duration(timeout) * time.Millisecond, + } + resp, err := httpClient.Post(urlPath, "application/x-www-form-urlencoded", strings.NewReader(bodyParam.Encode())) + if resp != nil { + defer resp.Body.Close() + } + if err != nil { + log.Fatal("http.PostForm error", err) + return "", err + } + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + log.Fatalln("ioutil.ReadAll", err) + return "", err + } + return string(body), nil +} + +func doPostWithFile(urlPath string, data map[string]interface{}, fileData map[string]interface{}, timeout int64) (string, error) { + bodyBuf := &bytes.Buffer{} + writer := multipart.NewWriter(bodyBuf) + for k, v := range data { + err := writer.WriteField(k, fmt.Sprint(v)) + if err != nil { + return "", err + } + } + for k, v := range fileData { + value, ok := v.([]byte) + if ok { + fileWriter, err := writer.CreateFormFile(k, "file") + if err != nil { + return "", err + } + _, err = io.Copy(fileWriter, bytes.NewReader(value)) + if err != nil { + return "", err + } + } + } + + err := writer.Close() + if err != nil { + return "", err + } + + httpClient := http.Client{ + Timeout: time.Duration(timeout) * time.Millisecond, + } + resp, err := httpClient.Post(urlPath, writer.FormDataContentType(), bodyBuf) + if err != nil { + log.Fatal("http.PostForm error", err) + return "", err + } + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + log.Fatalln("ioutil.ReadAll", err) + return "", err + } + return string(body), nil +} + +func (client *TopClient) Execute(method string, data map[string]interface{}, fileData map[string]interface{}) (string, error) { + return client.ExecuteWithSession(method, data, fileData, "") +} diff --git a/service/topsdk/util/TopApiRequestError.go b/service/topsdk/util/TopApiRequestError.go new file mode 100644 index 00000000..c98f4052 --- /dev/null +++ b/service/topsdk/util/TopApiRequestError.go @@ -0,0 +1,34 @@ +package util + +import "fmt" + +type TopApiRequestError struct { + /* + System code + */ + TopCode int `json:"code,omitempty" ` + + /* + System error message + */ + Msg string `json:"msg,omitempty" ` + + /* + System sub code + */ + SubCode string `json:"sub_code,omitempty" ` + + /* + System sub message + */ + SubMsg string `json:"sub_msg,omitempty" ` + + /* + System request id + */ + RequestId string `json:"request_id,omitempty" ` +} + +func (e *TopApiRequestError) Error() string { + return fmt.Sprintf("code: %d, msg: %s, sub_code: %s, sub_msg: %s ,request_id: %s", e.TopCode, e.Msg, e.SubCode, e.SubMsg, e.RequestId) +} diff --git a/service/topsdk/util/util.go b/service/topsdk/util/util.go new file mode 100644 index 00000000..e161222e --- /dev/null +++ b/service/topsdk/util/util.go @@ -0,0 +1,114 @@ +package util + +import ( + "crypto/hmac" + "crypto/sha256" + "encoding/hex" + "encoding/json" + "fmt" + "sort" + "strings" + "time" +) + +type LocalTime time.Time + +const ( + TimeFormat = "2006-01-02 15:04:05" +) + +func (t *LocalTime) UnmarshalJSON(data []byte) (err error) { + // 空值不进行解析 + if len(data) == 2 { + *t = LocalTime(time.Time{}) + return + } + now, err := time.ParseInLocation(`"`+TimeFormat+`"`, string(data), time.Local) + *t = LocalTime(now) + return +} + +func (t LocalTime) MarshalJSON() ([]byte, error) { + b := make([]byte, 0, len(TimeFormat)+2) + b = append(b, '"') + b = time.Time(t).AppendFormat(b, TimeFormat) + b = append(b, '"') + return b, nil +} + +func (t LocalTime) String() string { + return time.Time(t).Format(TimeFormat) +} + +func UnmarshalJSON(data []byte, v interface{}) (err error) { + return json.Unmarshal(data, v) +} + +func ConvertStructList(data interface{}) string { + if data == nil { + return "[]" + } + jsonStr, _ := json.Marshal(data) + return string(jsonStr) +} + +func ConvertStruct(data interface{}) string { + if data == nil { + return "{}" + } + jsonStr, _ := json.Marshal(data) + return string(jsonStr) +} + +func ConvertBasicList(data interface{}) string { + if data == nil { + return "[]" + } + return strings.Replace(strings.Trim(fmt.Sprint(data), "[]"), " ", ",", -1) +} + +func HandleJsonResponse(jsonStr string, v interface{}) (err error) { + + if strings.Contains(jsonStr[0:20], "error_response") { + err := &TopApiRequestError{} + jsonStr = jsonStr[18 : len(jsonStr)-1] + err2 := json.Unmarshal([]byte(jsonStr), err) + if err2 != nil { + return err2 + } + return err + } + return json.Unmarshal([]byte(jsonStr), v) +} + +func GetSign(publicParam map[string]interface{}, data map[string]interface{}, secret string) string { + var allParamMap = make(map[string]interface{}) + for k, v := range data { + allParamMap[k] = v + } + for k, v := range publicParam { + allParamMap[k] = v + } + var keyList []string + for k := range allParamMap { + keyList = append(keyList, k) + } + sort.Strings(keyList) + var signStr = "" + for _, key := range keyList { + value := allParamMap[key] + signStr = signStr + fmt.Sprintf("%v%v", key, value) + //if(value != ""){ + // signStr = signStr + fmt.Sprintf("%v%v", key, value) + //} + } + fmt.Println(signStr) + sign := strings.ToUpper(hmacSha256(signStr, secret)) + return sign +} + +func hmacSha256(data string, secret string) string { + h := hmac.New(sha256.New, []byte(secret)) + h.Write([]byte(data)) + return hex.EncodeToString(h.Sum(nil)) +} diff --git a/service/wechatminiprogram/app.go b/service/wechatminiprogram/app.go index c7d7c0bf..f3e67470 100644 --- a/service/wechatminiprogram/app.go +++ b/service/wechatminiprogram/app.go @@ -1,46 +1,45 @@ package wechatminiprogram import ( + "dtapps/dta/library/utils/gohttp" + "dtapps/dta/library/utils/gomongo" + "dtapps/dta/library/utils/goredis" "encoding/json" "errors" - "fmt" - "github.com/dtapps/go-library/utils/gohttp" - "github.com/go-redis/redis/v8" - "go.mongodb.org/mongo-driver/mongo" - "go.uber.org/zap" - "gorm.io/gorm" "net/http" ) // App 微信小程序服务 type App struct { - AppId string // 小程序唯一凭证,即 AppID - AppSecret string // 小程序唯一凭证密钥,即 AppSecret - AccessToken string // 接口调用凭证 - JsapiTicket string // 签名凭证 - ZapLog *zap.Logger // 日志服务 - Db *gorm.DB // 关系数据库服务 - RDb *redis.Client // 缓存数据库服务 - MDb *mongo.Client // 非关系数据库服务 + AppId string // 小程序唯一凭证,即 AppID + AppSecret string // 小程序唯一凭证密钥,即 AppSecret + AccessToken string // 接口调用凭证 + JsapiTicket string // 签名凭证 + Redis goredis.App // 缓存数据库服务 + Mongo gomongo.App // 日志数据库 } +const ( + WECHAT_API_URL = "https://api.weixin.qq.com" + WECHAT_MP_URL = "https://mp.weixin.qq.com" + CGIUrl = WECHAT_API_URL + "/cgi-bin" + UnionUrl = WECHAT_API_URL + "/union" +) + +// 请求 func (app *App) request(url string, params map[string]interface{}, method string) (resp gohttp.Response, err error) { switch method { case http.MethodGet: get, err := gohttp.Get(url, params) // 日志 - if app.ZapLog != nil { - app.ZapLog.Sugar().Info(fmt.Sprintf("wechatminiprogram %s %s %s", url, get.Header, get.Body)) - } + go app.mongoLog(url, params, method, get) return get, err case http.MethodPost: // 请求参数 paramsStr, err := json.Marshal(params) postJson, err := gohttp.PostJson(url, paramsStr) // 日志 - if app.ZapLog != nil { - app.ZapLog.Sugar().Info(fmt.Sprintf("wechatminiprogram %s %s %s", url, postJson.Header, postJson.Body)) - } + go app.mongoLog(url, params, method, postJson) return postJson, err default: return resp, errors.New("请求类型不支持") diff --git a/service/wechatminiprogram/cgi-bin.getcallbackip.go b/service/wechatminiprogram/cgi-bin.getcallbackip.go index ab29f6ee..c380b73a 100644 --- a/service/wechatminiprogram/cgi-bin.getcallbackip.go +++ b/service/wechatminiprogram/cgi-bin.getcallbackip.go @@ -1,9 +1,9 @@ package wechatminiprogram import ( + "dtapps/dta/library/utils/gohttp" "encoding/json" "fmt" - "github.com/dtapps/go-library/utils/gohttp" "net/http" ) @@ -26,6 +26,7 @@ func NewGetCallBackIpResult(result GetCallBackIpResponse, body []byte, http goht // callback IP即微信调用开发者服务器所使用的出口IP。 // https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_the_WeChat_server_IP_address.html#2.%20%E8%8E%B7%E5%8F%96%E5%BE%AE%E4%BF%A1callback%20IP%E5%9C%B0%E5%9D%80 func (app *App) GetCallBackIp() *GetCallBackIpResult { + app.AccessToken = app.GetAccessToken() // 请求 request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=%s", app.AccessToken), map[string]interface{}{}, http.MethodGet) // 定义 diff --git a/service/wechatminiprogram/cgi-bin.message.subscribe.send.go b/service/wechatminiprogram/cgi-bin.message.subscribe.send.go index 633cdac7..b560eb9d 100644 --- a/service/wechatminiprogram/cgi-bin.message.subscribe.send.go +++ b/service/wechatminiprogram/cgi-bin.message.subscribe.send.go @@ -1,9 +1,9 @@ package wechatminiprogram import ( + "dtapps/dta/library/utils/gohttp" "encoding/json" "fmt" - "github.com/dtapps/go-library/utils/gohttp" "net/http" ) @@ -26,6 +26,7 @@ func NewSubscribeMessageSendResult(result SubscribeMessageSendResponse, body []b // SubscribeMessageSend 发送订阅消息 // https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html func (app *App) SubscribeMessageSend(notMustParams ...Params) *SubscribeMessageSendResult { + app.AccessToken = app.GetAccessToken() // 参数 params := app.NewParamsWith(notMustParams...) // 请求 diff --git a/service/wechatminiprogram/cgi-bin.token.db.go b/service/wechatminiprogram/cgi-bin.token.db.go deleted file mode 100644 index 09a739e7..00000000 --- a/service/wechatminiprogram/cgi-bin.token.db.go +++ /dev/null @@ -1,47 +0,0 @@ -package wechatminiprogram - -import ( - "github.com/dtapps/go-library/utils/gotime" - "time" -) - -type WechatAccessTokenDbModel struct { - ID int64 `json:"id"` - AppID string `json:"app_id"` - AppSecret string `json:"app_secret"` - AccessToken string `json:"access_token"` - ExpiresIn int `json:"expires_in"` - ExpiresTime string `json:"expires_time"` - CreateTime time.Time `gorm:"autoCreateTime" json:"-"` -} - -func (m *WechatAccessTokenDbModel) TableName() string { - return "wechat_access_token" -} - -func (app *App) wechatAccessTokenModelTake() (result WechatAccessTokenDbModel) { - app.Db.Where("app_id = ?", app.AppId).Where("expires_time > ?", gotime.Current().Format()).Take(&result) - return result -} - -func (app *App) GetAccessTokenDb() string { - wat := app.wechatAccessTokenModelTake() - if wat.AccessToken != "" { - return wat.AccessToken - } else { - token := app.AuthGetAccessToken() - if token.Result.AccessToken == "" { - return "" - } else { - // 创建 - app.Db.Create(&WechatAccessTokenDbModel{ - AppID: app.AppId, - AppSecret: app.AppSecret, - AccessToken: token.Result.AccessToken, - ExpiresIn: token.Result.ExpiresIn, - ExpiresTime: gotime.Current().AfterSeconds(7000).Format(), - }) - return token.Result.AccessToken - } - } -} diff --git a/service/wechatminiprogram/cgi-bin.token.go b/service/wechatminiprogram/cgi-bin.token.go index caf3473e..1f17133c 100644 --- a/service/wechatminiprogram/cgi-bin.token.go +++ b/service/wechatminiprogram/cgi-bin.token.go @@ -1,38 +1,38 @@ package wechatminiprogram import ( + "dtapps/dta/library/utils/gohttp" "encoding/json" "fmt" - "github.com/dtapps/go-library/utils/gohttp" "net/http" ) -type AuthGetAccessTokenResponse struct { +type CgiBinTokenResponse struct { AccessToken string `json:"access_token"` // 获取到的凭证 ExpiresIn int `json:"expires_in"` // 凭证有效时间,单位:秒。目前是7200秒之内的值 Errcode int `json:"errcode"` // 错误码 Errmsg string `json:"errmsg"` // 错误信息 } -type AuthGetAccessTokenResult struct { - Result AuthGetAccessTokenResponse // 结果 - Body []byte // 内容 - Http gohttp.Response // 请求 - Err error // 错误 +type CgiBinTokenResult struct { + Result CgiBinTokenResponse // 结果 + Body []byte // 内容 + Http gohttp.Response // 请求 + Err error // 错误 } -func NewAuthGetAccessTokenResult(result AuthGetAccessTokenResponse, body []byte, http gohttp.Response, err error) *AuthGetAccessTokenResult { - return &AuthGetAccessTokenResult{Result: result, Body: body, Http: http, Err: err} +func NewCgiBinTokenResult(result CgiBinTokenResponse, body []byte, http gohttp.Response, err error) *CgiBinTokenResult { + return &CgiBinTokenResult{Result: result, Body: body, Http: http, Err: err} } -// AuthGetAccessToken +// CgiBinToken // 接口调用凭证 // https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html -func (app *App) AuthGetAccessToken() *AuthGetAccessTokenResult { +func (app *App) CgiBinToken() *CgiBinTokenResult { // 请求 request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", app.AppId, app.AppSecret), map[string]interface{}{}, http.MethodGet) // 定义 - var response AuthGetAccessTokenResponse + var response CgiBinTokenResponse err = json.Unmarshal(request.Body, &response) - return NewAuthGetAccessTokenResult(response, request.Body, request, err) + return NewCgiBinTokenResult(response, request.Body, request, err) } diff --git a/service/wechatminiprogram/cgi-bin.token.monitor.go b/service/wechatminiprogram/cgi-bin.token.monitor.go index 7643ac3b..06ad1f77 100644 --- a/service/wechatminiprogram/cgi-bin.token.monitor.go +++ b/service/wechatminiprogram/cgi-bin.token.monitor.go @@ -1,38 +1,20 @@ package wechatminiprogram import ( + "context" "errors" + "time" ) -var ( - QdTypeDb = "DB" - QdTypeRdb = "redis" -) - -func (app *App) AuthGetAccessTokenMonitor(qdType string) (string, error) { - switch qdType { - case QdTypeDb: - if app.Db == nil { - return "", errors.New("驱动没有初始化") - } - app.AccessToken = app.GetAccessTokenDb() - result := app.GetCallBackIp() - if len(result.Result.IpList) <= 0 { - return app.GetAccessTokenDb(), nil - } - return app.AccessToken, nil - case QdTypeRdb: - if app.RDb == nil { - return "", errors.New("驱动没有初始化") - } - app.AccessToken = app.GetAccessTokenRDb() - result := app.GetCallBackIp() - if len(result.Result.IpList) <= 0 { - return app.GetAccessTokenRDb(), nil - } - return app.AccessToken, nil - default: - return "", errors.New("驱动类型不在范围内") +func (app *App) GetAccessTokenMonitor() (string, error) { + if app.Redis.Db == nil { + return "", errors.New("驱动没有初始化") + } + result := app.GetCallBackIp() + if len(result.Result.IpList) <= 0 { + token := app.CgiBinToken() + app.Redis.Db.Set(context.Background(), app.getAccessTokenCacheKeyName(), token.Result.AccessToken, time.Second*7000) + return token.Result.AccessToken, nil } - return "", nil + return app.AccessToken, nil } diff --git a/service/wechatminiprogram/cgi-bin.token.rdb.go b/service/wechatminiprogram/cgi-bin.token.rdb.go index 5e1af3e8..1532a585 100644 --- a/service/wechatminiprogram/cgi-bin.token.rdb.go +++ b/service/wechatminiprogram/cgi-bin.token.rdb.go @@ -2,19 +2,21 @@ package wechatminiprogram import ( "fmt" - "github.com/dtapps/go-library/utils/goredis" "time" ) -func (app *App) GetAccessTokenRDb() string { - cacheName := fmt.Sprintf("wechat_access_token:%v", app.AppId) - redis := goredis.App{ - Rdb: app.RDb, +func (app *App) GetAccessToken() string { + if app.Redis.Db == nil { + return "" } - newCache := redis.NewSimpleStringCache(redis.NewStringOperation(), time.Second*7000) + newCache := app.Redis.NewSimpleStringCache(app.Redis.NewStringOperation(), time.Second*7000) newCache.DBGetter = func() string { - token := app.AuthGetAccessToken() + token := app.CgiBinToken() return token.Result.AccessToken } - return newCache.GetCache(cacheName) + return newCache.GetCache(app.getAccessTokenCacheKeyName()) +} + +func (app *App) getAccessTokenCacheKeyName() string { + return fmt.Sprintf("wechat_access_token:%v", app.AppId) } diff --git a/service/wechatminiprogram/cgi-bin.wxaapp.createwxaqrcode.go b/service/wechatminiprogram/cgi-bin.wxaapp.createwxaqrcode.go index c2a332c6..fa9974bb 100644 --- a/service/wechatminiprogram/cgi-bin.wxaapp.createwxaqrcode.go +++ b/service/wechatminiprogram/cgi-bin.wxaapp.createwxaqrcode.go @@ -1,9 +1,9 @@ package wechatminiprogram import ( + "dtapps/dta/library/utils/gohttp" "encoding/json" "fmt" - "github.com/dtapps/go-library/utils/gohttp" "net/http" ) @@ -28,6 +28,7 @@ func NewCgiBinWxaAppCreateWxaQrCodeResult(result CgiBinWxaAppCreateWxaQrCodeResp // CgiBinWxaAppCreateWxaQrCode 获取小程序二维码,适用于需要的码数量较少的业务场景。通过该接口生成的小程序码,永久有效,有数量限制 // https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.createQRCode.html func (app *App) CgiBinWxaAppCreateWxaQrCode(notMustParams ...Params) *CgiBinWxaAppCreateWxaQrCodeResult { + app.AccessToken = app.GetAccessToken() // 参数 params := app.NewParamsWith(notMustParams...) // 请求 diff --git a/service/wechatminiprogram/go.mod b/service/wechatminiprogram/go.mod deleted file mode 100644 index 8ed13c7a..00000000 --- a/service/wechatminiprogram/go.mod +++ /dev/null @@ -1,35 +0,0 @@ -module github.com/dtapps/go-library/service/wechatminiprogram - -go 1.18 - -require ( - github.com/dtapps/go-library/utils/gohttp v0.0.0-20220320064127-7d7f1f882cd8 - github.com/dtapps/go-library/utils/goredis v0.0.0-20220320040709-ad8a5f0e9e40 - github.com/dtapps/go-library/utils/gotime v0.0.0-20220320040709-ad8a5f0e9e40 - go.mongodb.org/mongo-driver v1.8.4 - go.uber.org/zap v1.21.0 - gorm.io/gorm v1.23.3 -) - -require ( - github.com/dtapps/go-library/utils/goheader v0.0.0-20220320040709-ad8a5f0e9e40 // indirect - github.com/dtapps/go-library/utils/gorequest v0.0.0-20220320040709-ad8a5f0e9e40 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/go-redis/redis/v8 v8.11.5 // indirect - github.com/go-stack/stack v1.8.0 // indirect - github.com/golang/snappy v0.0.1 // indirect - github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jinzhu/now v1.1.4 // indirect - github.com/klauspost/compress v1.13.6 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.0.2 // indirect - github.com/xdg-go/stringprep v1.0.2 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f // indirect - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/text v0.3.6 // indirect -) diff --git a/service/wechatminiprogram/mongodb.go b/service/wechatminiprogram/mongodb.go new file mode 100644 index 00000000..7592398f --- /dev/null +++ b/service/wechatminiprogram/mongodb.go @@ -0,0 +1,47 @@ +package wechatminiprogram + +import ( + "dtapps/dta/library/utils/gohttp" + "encoding/json" + "gitee.com/dtapps/go-library/utils/gotime" +) + +// 日志 +type mongoZap struct { + Url string `json:"url" bson:"url"` + Params interface{} `json:"params" bson:"params"` + Method string `json:"method" bson:"method"` + Header interface{} `json:"header" bson:"header"` + Status string `json:"status" bson:"status"` + StatusCode int `json:"status_code" bson:"status_code"` + Body interface{} `json:"body" bson:"body"` + ContentLength int64 `json:"content_length" bson:"content_length"` + CreateTime string `json:"create_time" bson:"create_time"` +} + +func (m *mongoZap) Database() string { + return "zap_logs" +} + +func (m *mongoZap) TableName() string { + return "wechatminiprogram_" + gotime.Current().SetFormat("200601") +} + +func (app *App) mongoLog(url string, params map[string]interface{}, method string, request gohttp.Response) { + if app.Mongo.Db == nil { + return + } + var body map[string]interface{} + _ = json.Unmarshal(request.Body, &body) + app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{ + Url: url, + Params: params, + Method: method, + Header: request.Header, + Status: request.Status, + StatusCode: request.StatusCode, + Body: body, + ContentLength: request.ContentLength, + CreateTime: gotime.Current().Format(), + }) +} diff --git a/service/wechatminiprogram/save_img.go b/service/wechatminiprogram/save_img.go index 72d80cd4..37253042 100644 --- a/service/wechatminiprogram/save_img.go +++ b/service/wechatminiprogram/save_img.go @@ -1,7 +1,8 @@ package wechatminiprogram import ( - "github.com/dtapps/go-library/utils/gohttp" + "dtapps/dta/library/utils/gohttp" + "log" "os" ) @@ -22,7 +23,9 @@ func (app *App) SaveImg(resp gohttp.Response, dir, saveName string) SaveImgRespo outputFileName = outputFileName + ".png" } here: + log.Println(dir + outputFileName) f, err := os.OpenFile(dir+outputFileName, os.O_CREATE|os.O_RDWR, 0666) + log.Println(err) if err != nil { os.Mkdir(dir, 0755) goto here diff --git a/service/wechatminiprogram/sns.jscode2session.go b/service/wechatminiprogram/sns.jscode2session.go index 0646103e..0f2af950 100644 --- a/service/wechatminiprogram/sns.jscode2session.go +++ b/service/wechatminiprogram/sns.jscode2session.go @@ -1,13 +1,13 @@ package wechatminiprogram import ( + "dtapps/dta/library/utils/gohttp" "encoding/json" "fmt" - "github.com/dtapps/go-library/utils/gohttp" "net/http" ) -type AuthCode2SessionResponse struct { +type SnsJsCode2sessionResponse struct { OpenId string `json:"openid"` // 用户唯一标识 SessionKey string `json:"session_key"` // 会话密钥 Unionid string `json:"unionid"` // 用户在开放平台的唯一标识符,若当前小程序已绑定到微信开放平台帐号下会返回 @@ -15,22 +15,22 @@ type AuthCode2SessionResponse struct { Errmsg string `json:"errmsg"` // 错误信息 } -type AuthCode2SessionResult struct { - Result AuthCode2SessionResponse // 结果 - Body []byte // 内容 - Http gohttp.Response // 请求 - Err error // 错误 +type SnsJsCode2sessionResult struct { + Result SnsJsCode2sessionResponse // 结果 + Body []byte // 内容 + Http gohttp.Response // 请求 + Err error // 错误 } -func NewAuthCode2SessionResult(result AuthCode2SessionResponse, body []byte, http gohttp.Response, err error) *AuthCode2SessionResult { - return &AuthCode2SessionResult{Result: result, Body: body, Http: http, Err: err} +func NewSnsJsCode2sessionResult(result SnsJsCode2sessionResponse, body []byte, http gohttp.Response, err error) *SnsJsCode2sessionResult { + return &SnsJsCode2sessionResult{Result: result, Body: body, Http: http, Err: err} } -func (app *App) AuthCode2Session(jsCode string) *AuthCode2SessionResult { +func (app *App) SnsJsCode2session(jsCode string) *SnsJsCode2sessionResult { // 请求 request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code", app.AppId, app.AppSecret, jsCode), map[string]interface{}{}, http.MethodGet) // 定义 - var response AuthCode2SessionResponse + var response SnsJsCode2sessionResponse err = json.Unmarshal(request.Body, &response) - return NewAuthCode2SessionResult(response, request.Body, request, err) + return NewSnsJsCode2sessionResult(response, request.Body, request, err) } diff --git a/service/wechatminiprogram/user_info.go b/service/wechatminiprogram/user_info.go index 8d15e172..c7c8cdc0 100644 --- a/service/wechatminiprogram/user_info.go +++ b/service/wechatminiprogram/user_info.go @@ -6,6 +6,7 @@ import ( "encoding/base64" "encoding/json" "errors" + "strings" ) type UserInfo struct { @@ -72,3 +73,7 @@ func (app *App) UserInfo(param UserInfo) *UserInfoResult { } return NewUserInfoResult(response, err) } + +func (u *UserInfoResponse) UserInfoAvatarUrlReal() string { + return strings.Replace(u.AvatarUrl, "/132", "/0", -1) +} diff --git a/service/wechatminiprogram/wxa.business.getliveinfo.go b/service/wechatminiprogram/wxa.business.getliveinfo.go index 59c9190d..a417b613 100644 --- a/service/wechatminiprogram/wxa.business.getliveinfo.go +++ b/service/wechatminiprogram/wxa.business.getliveinfo.go @@ -1,9 +1,9 @@ package wechatminiprogram import ( + "dtapps/dta/library/utils/gohttp" "encoding/json" "fmt" - "github.com/dtapps/go-library/utils/gohttp" "net/http" ) @@ -57,6 +57,7 @@ func NewBusinessGetLiveInfoResult(result BusinessGetLiveInfoResponse, body []byt // 调用此接口获取直播间列表及直播间信息 // https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/industry/liveplayer/studio-api.html func (app *App) BusinessGetLiveInfo(notMustParams ...Params) *BusinessGetLiveInfoResult { + app.AccessToken = app.GetAccessToken() // 参数 params := app.NewParamsWith(notMustParams...) // 请求 diff --git a/service/wechatminiprogram/wxa.business.getuserphonenumber.go b/service/wechatminiprogram/wxa.business.getuserphonenumber.go new file mode 100644 index 00000000..580e8716 --- /dev/null +++ b/service/wechatminiprogram/wxa.business.getuserphonenumber.go @@ -0,0 +1,47 @@ +package wechatminiprogram + +import ( + "encoding/json" + "fmt" + "net/http" +) + +type WxaBusinessGetUserPhoneNumberResponse struct { + Errcode int `json:"errcode"` + Errmsg string `json:"errmsg"` + PhoneInfo struct { + PhoneNumber string `json:"phoneNumber"` // 用户绑定的手机号(国外手机号会有区号) + PurePhoneNumber string `json:"purePhoneNumber"` // 没有区号的手机号 + CountryCode int `json:"countryCode"` // 区号 + Watermark struct { + Timestamp int `json:"timestamp"` // 用户获取手机号操作的时间戳 + Appid string `json:"appid"` // 小程序appid + } `json:"watermark"` + } `json:"phone_info"` +} + +type WxaBusinessGetUserPhoneNumberResult struct { + Result WxaBusinessGetUserPhoneNumberResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewWxaBusinessGetUserPhoneNumberResult(result WxaBusinessGetUserPhoneNumberResponse, body []byte, err error) *WxaBusinessGetUserPhoneNumberResult { + return &WxaBusinessGetUserPhoneNumberResult{Result: result, Body: body, Err: err} +} + +// WxaBusinessGetUserPhoneNumber code换取用户手机号。 每个code只能使用一次,code的有效期为5min +// https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/phonenumber/phonenumber.getPhoneNumber.html +func (app *App) WxaBusinessGetUserPhoneNumber(code string) *WxaBusinessGetUserPhoneNumberResult { + app.AccessToken = app.GetAccessToken() + // 参数 + param := NewParams() + param.Set("code", code) + params := app.NewParamsWith(param) + // 请求 + request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=%s", app.AccessToken), params, http.MethodPost) + // 定义 + var response WxaBusinessGetUserPhoneNumberResponse + err = json.Unmarshal(request.Body, &response) + return NewWxaBusinessGetUserPhoneNumberResult(response, request.Body, err) +} diff --git a/service/wechatminiprogram/wxa.generate_urllink.go b/service/wechatminiprogram/wxa.generate_urllink.go index a1a0bc63..6a9c6d72 100644 --- a/service/wechatminiprogram/wxa.generate_urllink.go +++ b/service/wechatminiprogram/wxa.generate_urllink.go @@ -1,9 +1,9 @@ package wechatminiprogram import ( + "dtapps/dta/library/utils/gohttp" "encoding/json" "fmt" - "github.com/dtapps/go-library/utils/gohttp" "net/http" ) @@ -27,6 +27,7 @@ func NewWxaGenerateUrlLinkResult(result WxaGenerateUrlLinkResponse, body []byte, // WxaGenerateUrlLink 获取小程序 URL Link,适用于短信、邮件、网页、微信内等拉起小程序的业务场景。通过该接口,可以选择生成到期失效和永久有效的小程序链接,有数量限制,目前仅针对国内非个人主体的小程序开放 // https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/url-link/urllink.generate.html func (app *App) WxaGenerateUrlLink(notMustParams ...Params) *WxaGenerateUrlLinkResult { + app.AccessToken = app.GetAccessToken() // 参数 params := app.NewParamsWith(notMustParams...) // 请求 diff --git a/service/wechatminiprogram/wxa.generatescheme.go b/service/wechatminiprogram/wxa.generatescheme.go index 5394ff01..2bfa47f3 100644 --- a/service/wechatminiprogram/wxa.generatescheme.go +++ b/service/wechatminiprogram/wxa.generatescheme.go @@ -1,9 +1,9 @@ package wechatminiprogram import ( + "dtapps/dta/library/utils/gohttp" "encoding/json" "fmt" - "github.com/dtapps/go-library/utils/gohttp" "net/http" ) @@ -27,6 +27,7 @@ func NewWxaGenerateSchemeResult(result WxaGenerateSchemeResponse, body []byte, h // WxaGenerateScheme 获取小程序 scheme 码,适用于短信、邮件、外部网页、微信内等拉起小程序的业务场景。通过该接口,可以选择生成到期失效和永久有效的小程序码,有数量限制,目前仅针对国内非个人主体的小程序开放 // https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/url-scheme/urlscheme.generate.html func (app *App) WxaGenerateScheme(notMustParams ...Params) *WxaGenerateSchemeResult { + app.AccessToken = app.GetAccessToken() // 参数 params := app.NewParamsWith(notMustParams...) // 请求 diff --git a/service/wechatminiprogram/wxa.getwxacode.go b/service/wechatminiprogram/wxa.getwxacode.go index 4a3be01f..6a4f1fee 100644 --- a/service/wechatminiprogram/wxa.getwxacode.go +++ b/service/wechatminiprogram/wxa.getwxacode.go @@ -1,9 +1,9 @@ package wechatminiprogram import ( + "dtapps/dta/library/utils/gohttp" "encoding/json" "fmt" - "github.com/dtapps/go-library/utils/gohttp" "net/http" ) @@ -28,6 +28,7 @@ func NewWxaGetWxaCodeResult(result WxaGetWxaCodeResponse, body []byte, http goht // WxaGetWxaCode 获取小程序码,适用于需要的码数量较少的业务场景。通过该接口生成的小程序码,永久有效,有数量限制 // https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.get.html func (app *App) WxaGetWxaCode(notMustParams ...Params) *WxaGetWxaCodeResult { + app.AccessToken = app.GetAccessToken() // 参数 params := app.NewParamsWith(notMustParams...) // 请求 diff --git a/service/wechatminiprogram/wxa.getwxacodeunlimit.go b/service/wechatminiprogram/wxa.getwxacodeunlimit.go index 4cfbb0cf..5adeda48 100644 --- a/service/wechatminiprogram/wxa.getwxacodeunlimit.go +++ b/service/wechatminiprogram/wxa.getwxacodeunlimit.go @@ -1,9 +1,9 @@ package wechatminiprogram import ( + "dtapps/dta/library/utils/gohttp" "encoding/json" "fmt" - "github.com/dtapps/go-library/utils/gohttp" "net/http" ) @@ -28,6 +28,7 @@ func NewWxaGetWxaCodeUnLimitResult(result WxaGetWxaCodeUnLimitResponse, body []b // WxaGetWxaCodeUnLimit 获取小程序码,适用于需要的码数量极多的业务场景。通过该接口生成的小程序码,永久有效,数量暂无限制 // https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.getUnlimited.html func (app *App) WxaGetWxaCodeUnLimit(notMustParams ...Params) *WxaGetWxaCodeUnLimitResult { + app.AccessToken = app.GetAccessToken() // 参数 params := app.NewParamsWith(notMustParams...) // 请求 diff --git a/service/wechatminiprogram/wxa.query_urllink.go b/service/wechatminiprogram/wxa.query_urllink.go index 1a862f72..64b1f2c2 100644 --- a/service/wechatminiprogram/wxa.query_urllink.go +++ b/service/wechatminiprogram/wxa.query_urllink.go @@ -1,9 +1,9 @@ package wechatminiprogram import ( + "dtapps/dta/library/utils/gohttp" "encoding/json" "fmt" - "github.com/dtapps/go-library/utils/gohttp" "net/http" ) @@ -45,6 +45,7 @@ func NewWxaQueryUrlLinkResult(result WxaQueryUrlLinkResponse, body []byte, http // WxaQueryUrlLink 查询小程序 url_link 配置,及长期有效 quota // https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/url-link/urllink.query.html func (app *App) WxaQueryUrlLink(urlLink string) *WxaQueryUrlLinkResult { + app.AccessToken = app.GetAccessToken() // 参数 param := NewParams() param.Set("url_link", urlLink) diff --git a/service/wechatminiprogram/wxa.queryscheme.go b/service/wechatminiprogram/wxa.queryscheme.go index e54b16f5..1ef0fff7 100644 --- a/service/wechatminiprogram/wxa.queryscheme.go +++ b/service/wechatminiprogram/wxa.queryscheme.go @@ -1,9 +1,9 @@ package wechatminiprogram import ( + "dtapps/dta/library/utils/gohttp" "encoding/json" "fmt" - "github.com/dtapps/go-library/utils/gohttp" "net/http" ) @@ -38,6 +38,7 @@ func NewWxaQuerySchemeResult(result WxaQuerySchemeResponse, body []byte, http go // WxaQueryScheme 查询小程序 scheme 码,及长期有效 quota // https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/url-scheme/urlscheme.query.html func (app *App) WxaQueryScheme(notMustParams ...Params) *WxaQuerySchemeResult { + app.AccessToken = app.GetAccessToken() // 参数 params := app.NewParamsWith(notMustParams...) // 请求 diff --git a/service/wechatoffice/app.go b/service/wechatoffice/app.go index feaf6c5b..fd6c4ddb 100644 --- a/service/wechatoffice/app.go +++ b/service/wechatoffice/app.go @@ -1,59 +1,39 @@ package wechatoffice import ( - "bytes" + "dtapps/dta/library/utils/gohttp" + "dtapps/dta/library/utils/gomongo" + "dtapps/dta/library/utils/goredis" "encoding/json" - "fmt" - "github.com/go-redis/redis/v8" - "go.mongodb.org/mongo-driver/mongo" - "go.uber.org/zap" - "gorm.io/gorm" - "io/ioutil" + "errors" "net/http" ) // App 微信公众号服务 type App struct { - AppId string // 小程序唯一凭证,即 AppID - AppSecret string // 小程序唯一凭证密钥,即 AppSecret - AccessToken string // 接口调用凭证 - JsapiTicket string // 签名凭证 - ZapLog *zap.Logger // 日志服务 - Db *gorm.DB // 关系数据库服务 - RDb *redis.Client // 缓存数据库服务 - MDb *mongo.Client // 非关系数据库服务 + AppId string // 小程序唯一凭证,即 AppID + AppSecret string // 小程序唯一凭证密钥,即 AppSecret + AccessToken string // 接口调用凭证 + JsapiTicket string // 签名凭证 + Redis goredis.App // 缓存数据库服务 + Mongo gomongo.App // 日志数据库 } func (app *App) request(url string, params map[string]interface{}, method string) (resp []byte, err error) { - // 请求参数 - marshal, _ := json.Marshal(params) - var req *http.Request - req, err = http.NewRequest(method, url, bytes.NewReader(marshal)) - if err != nil { - return nil, err + switch method { + case http.MethodGet: + get, err := gohttp.Get(url, params) + // 日志 + go app.mongoLog(url, params, method, get) + return get.Body, err + case http.MethodPost: + // 请求参数 + paramsStr, err := json.Marshal(params) + postJson, err := gohttp.PostJson(url, paramsStr) + // 日志 + go app.mongoLog(url, params, method, postJson) + return postJson.Body, err + default: + return nil, errors.New("请求类型不支持") } - - httpClient := &http.Client{} - var response *http.Response - response, err = httpClient.Do(req) - - if err != nil { - return nil, err - } - - // 处理成功 - defer response.Body.Close() - resp, err = ioutil.ReadAll(response.Body) - - // 日志 - if app.ZapLog != nil { - app.ZapLog.Sugar().Info(fmt.Sprintf("%s %s", url, resp)) - } - - // 检查请求错误 - if response.StatusCode == 200 { - return resp, err - } - - return nil, err } diff --git a/service/wechatoffice/cgi-bin.ticket.getticket.go b/service/wechatoffice/cgi-bin.ticket.getticket.go new file mode 100644 index 00000000..7084e2de --- /dev/null +++ b/service/wechatoffice/cgi-bin.ticket.getticket.go @@ -0,0 +1,36 @@ +package wechatoffice + +import ( + "encoding/json" + "fmt" + "net/http" +) + +type CgiBinTicketGetTicketResponse struct { + Errcode int `json:"errcode"` // 错误码 + Errmsg string `json:"errmsg"` // 错误信息 + Ticket string `json:"ticket"` + ExpiresIn int `json:"expires_in"` +} + +type CgiBinTicketGetTicketResult struct { + Result CgiBinTicketGetTicketResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewCgiBinTicketGetTicketResult(result CgiBinTicketGetTicketResponse, body []byte, err error) *CgiBinTicketGetTicketResult { + return &CgiBinTicketGetTicketResult{Result: result, Body: body, Err: err} +} + +// CgiBinTicketGetTicket 获取api_ticket +// https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html +func (app *App) CgiBinTicketGetTicket(Type string) *CgiBinTicketGetTicketResult { + app.AccessToken = app.GetAccessToken() + // request + body, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=%s", app.AccessToken, Type), map[string]interface{}{}, http.MethodGet) + // 定义 + var response CgiBinTicketGetTicketResponse + err = json.Unmarshal(body, &response) + return NewCgiBinTicketGetTicketResult(response, body, err) +} diff --git a/service/wechatoffice/cgi-bin.ticket.getticket.monitor.go b/service/wechatoffice/cgi-bin.ticket.getticket.monitor.go new file mode 100644 index 00000000..2fe840f0 --- /dev/null +++ b/service/wechatoffice/cgi-bin.ticket.getticket.monitor.go @@ -0,0 +1,22 @@ +package wechatoffice + +import ( + "context" + "errors" + "time" +) + +// GetJsapiTicketMonitor 监控api_ticket +func (app *App) GetJsapiTicketMonitor() (string, error) { + if app.Redis.Db == nil { + return "", errors.New("驱动没有初始化") + } + result := app.DebugCgiBinTicketCheck() + if result.Result.Errcode == 0 { + return app.JsapiTicket, nil + } + app.AccessToken = app.GetAccessToken() + token := app.CgiBinTicketGetTicket("jsapi") + app.Redis.Db.Set(context.Background(), app.getJsapiTicketCacheKeyName(), token.Result.Ticket, time.Second*7000) + return token.Result.Ticket, nil +} diff --git a/service/wechatoffice/cgi-bin.ticket.getticket.rdb.go b/service/wechatoffice/cgi-bin.ticket.getticket.rdb.go new file mode 100644 index 00000000..c67dd99e --- /dev/null +++ b/service/wechatoffice/cgi-bin.ticket.getticket.rdb.go @@ -0,0 +1,23 @@ +package wechatoffice + +import ( + "fmt" + "time" +) + +// GetJsapiTicket 获取api_ticket +func (app *App) GetJsapiTicket() string { + if app.Redis.Db == nil { + return app.JsapiTicket + } + newCache := app.Redis.NewSimpleStringCache(app.Redis.NewStringOperation(), time.Second*7000) + newCache.DBGetter = func() string { + token := app.CgiBinTicketGetTicket("jsapi") + return token.Result.Ticket + } + return newCache.GetCache(app.getJsapiTicketCacheKeyName()) +} + +func (app *App) getJsapiTicketCacheKeyName() string { + return fmt.Sprintf("wechat_jsapi_ticket:%v", app.AppId) +} diff --git a/service/wechatoffice/cgi-bin.token.db.go b/service/wechatoffice/cgi-bin.token.db.go deleted file mode 100644 index 3dd47312..00000000 --- a/service/wechatoffice/cgi-bin.token.db.go +++ /dev/null @@ -1,47 +0,0 @@ -package wechatoffice - -import ( - "github.com/dtapps/go-library/utils/gotime" - "time" -) - -type WechatAccessTokenDbModel struct { - ID int64 `json:"id"` - AppID string `json:"app_id"` - AppSecret string `json:"app_secret"` - AccessToken string `json:"access_token"` - ExpiresIn int `json:"expires_in"` - ExpiresTime string `json:"expires_time"` - CreateTime time.Time `gorm:"autoCreateTime" json:"-"` -} - -func (m *WechatAccessTokenDbModel) TableName() string { - return "wechat_access_token" -} - -func (app *App) wechatAccessTokenModelTake() (result WechatAccessTokenDbModel) { - app.Db.Where("app_id = ?", app.AppId).Where("expires_time > ?", gotime.Current().Format()).Take(&result) - return result -} - -func (app *App) GetAccessTokenDb() string { - wat := app.wechatAccessTokenModelTake() - if wat.AccessToken != "" { - return wat.AccessToken - } else { - token := app.AuthGetAccessToken() - if token.Result.AccessToken == "" { - return "" - } else { - // 创建 - app.Db.Create(&WechatAccessTokenDbModel{ - AppID: app.AppId, - AppSecret: app.AppSecret, - AccessToken: token.Result.AccessToken, - ExpiresIn: token.Result.ExpiresIn, - ExpiresTime: gotime.Current().AfterSeconds(7000).Format(), - }) - return token.Result.AccessToken - } - } -} diff --git a/service/wechatoffice/cgi-bin.token.go b/service/wechatoffice/cgi-bin.token.go index d026f643..1c695785 100644 --- a/service/wechatoffice/cgi-bin.token.go +++ b/service/wechatoffice/cgi-bin.token.go @@ -6,31 +6,31 @@ import ( "net/http" ) -type AuthGetAccessTokenResponse struct { +type CgiBinTokenResponse struct { AccessToken string `json:"access_token"` // 获取到的凭证 ExpiresIn int `json:"expires_in"` // 凭证有效时间,单位:秒。目前是7200秒之内的值 Errcode int `json:"errcode"` // 错误码 Errmsg string `json:"errmsg"` // 错误信息 } -type AuthGetAccessTokenResult struct { - Result AuthGetAccessTokenResponse // 结果 - Body []byte // 内容 - Err error // 错误 +type CgiBinTokenResult struct { + Result CgiBinTokenResponse // 结果 + Body []byte // 内容 + Err error // 错误 } -func NewAuthGetAccessTokenResult(result AuthGetAccessTokenResponse, body []byte, err error) *AuthGetAccessTokenResult { - return &AuthGetAccessTokenResult{Result: result, Body: body, Err: err} +func NewCgiBinTokenResult(result CgiBinTokenResponse, body []byte, err error) *CgiBinTokenResult { + return &CgiBinTokenResult{Result: result, Body: body, Err: err} } -// AuthGetAccessToken +// CgiBinToken // 接口调用凭证 // https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html -func (app *App) AuthGetAccessToken() *AuthGetAccessTokenResult { +func (app *App) CgiBinToken() *CgiBinTokenResult { // request body, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", app.AppId, app.AppSecret), map[string]interface{}{}, http.MethodGet) // 定义 - var response AuthGetAccessTokenResponse + var response CgiBinTokenResponse err = json.Unmarshal(body, &response) - return NewAuthGetAccessTokenResult(response, body, err) + return NewCgiBinTokenResult(response, body, err) } diff --git a/service/wechatoffice/cgi-bin.token.monitor.go b/service/wechatoffice/cgi-bin.token.monitor.go index 6520bcff..24e79cf3 100644 --- a/service/wechatoffice/cgi-bin.token.monitor.go +++ b/service/wechatoffice/cgi-bin.token.monitor.go @@ -1,38 +1,20 @@ package wechatoffice import ( + "context" "errors" + "time" ) -var ( - QdTypeDb = "DB" - QdTypeRdb = "redis" -) - -func (app *App) AuthGetAccessTokenMonitor(qdType string) (string, error) { - switch qdType { - case QdTypeDb: - if app.Db == nil { - return "", errors.New("驱动没有初始化") - } - app.AccessToken = app.GetAccessTokenDb() - result := app.GetCallBackIp() - if len(result.Result.IpList) <= 0 { - return app.GetAccessTokenDb(), nil - } - return app.AccessToken, nil - case QdTypeRdb: - if app.RDb == nil { - return "", errors.New("驱动没有初始化") - } - app.AccessToken = app.GetAccessTokenRDb() - result := app.GetCallBackIp() - if len(result.Result.IpList) <= 0 { - return app.GetAccessTokenRDb(), nil - } +func (app *App) GetAccessTokenMonitor() (string, error) { + if app.Redis.Db == nil { + return "", errors.New("驱动没有初始化") + } + result := app.GetCallBackIp() + if len(result.Result.IpList) > 0 { return app.AccessToken, nil - default: - return "", errors.New("驱动类型不在范围内") } - return "", nil + token := app.CgiBinToken() + app.Redis.Db.Set(context.Background(), app.getAccessTokenCacheKeyName(), token.Result.AccessToken, time.Second*7000) + return token.Result.AccessToken, nil } diff --git a/service/wechatoffice/cgi-bin.token.rdb.go b/service/wechatoffice/cgi-bin.token.rdb.go index 3ebb5acf..e3a82738 100644 --- a/service/wechatoffice/cgi-bin.token.rdb.go +++ b/service/wechatoffice/cgi-bin.token.rdb.go @@ -2,19 +2,21 @@ package wechatoffice import ( "fmt" - "github.com/dtapps/go-library/utils/goredis" "time" ) -func (app *App) GetAccessTokenRDb() string { - cacheName := fmt.Sprintf("wechat_access_token:%v", app.AppId) - redis := goredis.App{ - Rdb: app.RDb, +func (app *App) GetAccessToken() string { + if app.Redis.Db == nil { + return app.AccessToken } - newCache := redis.NewSimpleStringCache(redis.NewStringOperation(), time.Second*7000) + newCache := app.Redis.NewSimpleStringCache(app.Redis.NewStringOperation(), time.Second*7000) newCache.DBGetter = func() string { - token := app.AuthGetAccessToken() + token := app.CgiBinToken() return token.Result.AccessToken } - return newCache.GetCache(cacheName) + return newCache.GetCache(app.getAccessTokenCacheKeyName()) +} + +func (app *App) getAccessTokenCacheKeyName() string { + return fmt.Sprintf("wechat_access_token:%v", app.AppId) } diff --git a/service/wechatoffice/cgi-bin.user.get.go b/service/wechatoffice/cgi-bin.user.get.go new file mode 100644 index 00000000..ba14a5d0 --- /dev/null +++ b/service/wechatoffice/cgi-bin.user.get.go @@ -0,0 +1,38 @@ +package wechatoffice + +import ( + "encoding/json" + "fmt" + "net/http" +) + +type CgiBinUserGetResponse struct { + Total int `json:"total"` + Count int `json:"count"` + Data struct { + Openid []string `json:"openid"` + } `json:"data"` + NextOpenid string `json:"next_openid"` +} + +type CgiBinUserGetResult struct { + Result CgiBinUserGetResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewCgiBinUserGetResult(result CgiBinUserGetResponse, body []byte, err error) *CgiBinUserGetResult { + return &CgiBinUserGetResult{Result: result, Body: body, Err: err} +} + +// CgiBinUserGet 获取用户列表 +// https://developers.weixin.qq.com/doc/offiaccount/User_Management/Getting_a_User_List.html +func (app *App) CgiBinUserGet(nextOpenid string) *CgiBinUserGetResult { + app.AccessToken = app.GetAccessToken() + // 请求 + body, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/user/get?access_token=%s&next_openid=%s", app.AccessToken, nextOpenid), map[string]interface{}{}, http.MethodGet) + // 定义 + var response CgiBinUserGetResponse + err = json.Unmarshal(body, &response) + return NewCgiBinUserGetResult(response, body, err) +} diff --git a/service/wechatoffice/cgi-bin.user.info.go b/service/wechatoffice/cgi-bin.user.info.go new file mode 100644 index 00000000..9580bf9c --- /dev/null +++ b/service/wechatoffice/cgi-bin.user.info.go @@ -0,0 +1,48 @@ +package wechatoffice + +import ( + "encoding/json" + "fmt" + "net/http" +) + +type CgiBinUserInfoResponse struct { + Subscribe int `json:"subscribe"` // 用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息 + Openid string `json:"openid"` // 用户的标识,对当前公众号唯一 + Language string `json:"language"` // 用户的语言,简体中文为zh_CN + SubscribeTime int `json:"subscribe_time"` // 用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间 + Unionid string `json:"unionid"` // 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段 + Remark string `json:"remark"` // 公众号运营者对粉丝的备注,公众号运营者可在微信公众平台用户管理界面对粉丝添加备注 + Groupid int `json:"groupid"` // 用户所在的分组ID(兼容旧的用户分组接口) + TagidList []interface{} `json:"tagid_list"` // 用户被打上的标签ID列表 + SubscribeScene string `json:"subscribe_scene"` // 返回用户关注的渠道来源,ADD_SCENE_SEARCH 公众号搜索,ADD_SCENE_ACCOUNT_MIGRATION 公众号迁移,ADD_SCENE_PROFILE_CARD 名片分享,ADD_SCENE_QR_CODE 扫描二维码,ADD_SCENE_PROFILE_LINK 图文页内名称点击,ADD_SCENE_PROFILE_ITEM 图文页右上角菜单,ADD_SCENE_PAID 支付后关注,ADD_SCENE_WECHAT_ADVERTISEMENT 微信广告,ADD_SCENE_REPRINT 他人转载 ,ADD_SCENE_LIVESTREAM 视频号直播,ADD_SCENE_CHANNELS 视频号 , ADD_SCENE_OTHERS 其他 + QrScene int `json:"qr_scene"` // 二维码扫码场景(开发者自定义) + QrSceneStr string `json:"qr_scene_str"` // 二维码扫码场景描述(开发者自定义) + Nickname string `json:"nickname"` // 用户昵称 + Sex int `json:"sex"` // 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知 + Province string `json:"province"` // 用户个人资料填写的省份 + City string `json:"city"` // 普通用户个人资料填写的城市 + Country string `json:"country"` // 国家,如中国为CN + Headimgurl string `json:"headimgurl"` // 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效 +} +type CgiBinUserInfoResult struct { + Result CgiBinUserInfoResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewCgiBinUserInfoResult(result CgiBinUserInfoResponse, body []byte, err error) *CgiBinUserInfoResult { + return &CgiBinUserInfoResult{Result: result, Body: body, Err: err} +} + +// CgiBinUserInfo 获取用户基本信息(UnionID机制) +// https://developers.weixin.qq.com/doc/offiaccount/User_Management/Get_users_basic_information_UnionID.html#UinonId +func (app *App) CgiBinUserInfo(openid string) *CgiBinUserInfoResult { + app.AccessToken = app.GetAccessToken() + // 请求 + body, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/user/info?access_token=%s&openid=%s&lang=zh_CN", app.AccessToken, openid), map[string]interface{}{}, http.MethodGet) + // 定义 + var response CgiBinUserInfoResponse + err = json.Unmarshal(body, &response) + return NewCgiBinUserInfoResult(response, body, err) +} diff --git a/service/wechatoffice/debug.cgi-bin.ticket.check.go b/service/wechatoffice/debug.cgi-bin.ticket.check.go new file mode 100644 index 00000000..c72f3129 --- /dev/null +++ b/service/wechatoffice/debug.cgi-bin.ticket.check.go @@ -0,0 +1,34 @@ +package wechatoffice + +import ( + "encoding/json" + "fmt" + "net/http" +) + +type DebugCgiBinTicketCheckResponse struct { + Errcode int `json:"errcode"` + Errmsg string `json:"errmsg"` +} + +type DebugCgiBinTicketCheckResult struct { + Result DebugCgiBinTicketCheckResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewDebugCgiBinTicketCheckResult(result DebugCgiBinTicketCheckResponse, body []byte, err error) *DebugCgiBinTicketCheckResult { + return &DebugCgiBinTicketCheckResult{Result: result, Body: body, Err: err} +} + +// DebugCgiBinTicketCheck 判断ticket是否合法 +// https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign +func (app *App) DebugCgiBinTicketCheck() *DebugCgiBinTicketCheckResult { + app.JsapiTicket = app.GetJsapiTicket() + // 请求 + body, err := app.request(fmt.Sprintf("https://mp.weixin.qq.com/debug/cgi-bin/ticket/check?ticket=%s", app.JsapiTicket), map[string]interface{}{}, http.MethodGet) + // 定义 + var response DebugCgiBinTicketCheckResponse + err = json.Unmarshal(body, &response) + return NewDebugCgiBinTicketCheckResult(response, body, err) +} diff --git a/service/wechatoffice/getcallbackip.go b/service/wechatoffice/getcallbackip.go index 64277ebb..64002375 100644 --- a/service/wechatoffice/getcallbackip.go +++ b/service/wechatoffice/getcallbackip.go @@ -24,6 +24,7 @@ func NewGetCallBackIpResult(result GetCallBackIpResponse, body []byte, err error // callback IP即微信调用开发者服务器所使用的出口IP。 // https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_the_WeChat_server_IP_address.html#2.%20%E8%8E%B7%E5%8F%96%E5%BE%AE%E4%BF%A1callback%20IP%E5%9C%B0%E5%9D%80 func (app *App) GetCallBackIp() *GetCallBackIpResult { + app.AccessToken = app.GetAccessToken() // 请求 body, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=%s", app.AccessToken), map[string]interface{}{}, http.MethodGet) // 定义 diff --git a/service/wechatoffice/getticket.db.go b/service/wechatoffice/getticket.db.go deleted file mode 100644 index 5b4ec15c..00000000 --- a/service/wechatoffice/getticket.db.go +++ /dev/null @@ -1,48 +0,0 @@ -package wechatoffice - -import ( - "github.com/dtapps/go-library/utils/gotime" - "time" -) - -type WechatJsapiTicketDbModel struct { - ID int64 `json:"id"` - AppID string `json:"app_id"` - AppSecret string `json:"app_secret"` - Ticket string `json:"ticket"` - ExpiresIn int `json:"expires_in"` - ExpiresTime string `json:"expires_time"` - CreateTime time.Time `gorm:"autoCreateTime" json:"-"` -} - -func (m *WechatJsapiTicketDbModel) TableName() string { - return "wechat_jsapi_ticket" -} - -func (app *App) wechatJsapiTicketModelTake() (result WechatJsapiTicketDbModel) { - app.Db.Where("app_id = ?", app.AppId).Where("expires_time > ?", gotime.Current().Format()).Take(&result) - return result -} - -// GetJsapiTicketDb 获取api_ticket -func (app *App) GetJsapiTicketDb() string { - wat := app.wechatJsapiTicketModelTake() - if wat.Ticket != "" { - return wat.Ticket - } else { - token := app.GetTicket(app.GetAccessTokenDb(), "jsapi") - if token.Result.Ticket == "" { - return "" - } else { - // 创建 - app.Db.Create(&WechatJsapiTicketDbModel{ - AppID: app.AppId, - AppSecret: app.AppSecret, - Ticket: token.Result.Ticket, - ExpiresIn: token.Result.ExpiresIn, - ExpiresTime: gotime.Current().AfterSeconds(7000).Format(), - }) - return token.Result.Ticket - } - } -} diff --git a/service/wechatoffice/getticket.go b/service/wechatoffice/getticket.go deleted file mode 100644 index 92f69c4d..00000000 --- a/service/wechatoffice/getticket.go +++ /dev/null @@ -1,35 +0,0 @@ -package wechatoffice - -import ( - "encoding/json" - "fmt" - "net/http" -) - -type GetTicketRespons struct { - Errcode int `json:"errcode"` // 错误码 - Errmsg string `json:"errmsg"` // 错误信息 - Ticket string `json:"ticket"` - ExpiresIn int `json:"expires_in"` -} - -type GetTicketResult struct { - Result GetTicketRespons // 结果 - Body []byte // 内容 - Err error // 错误 -} - -func NewGetTicketResult(result GetTicketRespons, body []byte, err error) *GetTicketResult { - return &GetTicketResult{Result: result, Body: body, Err: err} -} - -// GetTicket 获取api_ticket -// https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html -func (app *App) GetTicket(accessToken, Type string) *GetTicketResult { - // request - body, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=%s", accessToken, Type), map[string]interface{}{}, http.MethodGet) - // 定义 - var response GetTicketRespons - err = json.Unmarshal(body, &response) - return NewGetTicketResult(response, body, err) -} diff --git a/service/wechatoffice/getticket.monitor.go b/service/wechatoffice/getticket.monitor.go deleted file mode 100644 index 57acf665..00000000 --- a/service/wechatoffice/getticket.monitor.go +++ /dev/null @@ -1,23 +0,0 @@ -package wechatoffice - -import "errors" - -// AuthGetJsapiTicketMonitor 监控api_ticket -func (app *App) AuthGetJsapiTicketMonitor(qdType string) (string, error) { - switch qdType { - case QdTypeDb: - if app.Db == nil { - return "", errors.New("驱动没有初始化") - } - app.AccessToken = app.GetAccessTokenDb() - return app.GetJsapiTicketDb(), nil - case QdTypeRdb: - if app.RDb == nil { - return "", errors.New("驱动没有初始化") - } - app.AccessToken = app.GetAccessTokenRDb() - return app.GetJsapiTicketRDb(), nil - default: - return "", errors.New("驱动类型不在范围内") - } -} diff --git a/service/wechatoffice/getticket.rdb.go b/service/wechatoffice/getticket.rdb.go deleted file mode 100644 index 309fac9e..00000000 --- a/service/wechatoffice/getticket.rdb.go +++ /dev/null @@ -1,21 +0,0 @@ -package wechatoffice - -import ( - "fmt" - "github.com/dtapps/go-library/utils/goredis" - "time" -) - -// GetJsapiTicketRDb 获取api_ticket -func (app *App) GetJsapiTicketRDb() string { - cacheName := fmt.Sprintf("wechat_jsapi_ticket:%v", app.AppId) - redis := goredis.App{ - Rdb: app.RDb, - } - newCache := redis.NewSimpleStringCache(redis.NewStringOperation(), time.Second*7000) - newCache.DBGetter = func() string { - token := app.GetTicket(app.GetAccessTokenRDb(), "jsapi") - return token.Result.Ticket - } - return newCache.GetCache(cacheName) -} diff --git a/service/wechatoffice/go.mod b/service/wechatoffice/go.mod deleted file mode 100644 index 7eb1db8e..00000000 --- a/service/wechatoffice/go.mod +++ /dev/null @@ -1,33 +0,0 @@ -module github.com/dtapps/go-library/service/wechatoffice - -go 1.18 - -require ( - github.com/dtapps/go-library/utils/gorandom v0.0.0-20220320040709-ad8a5f0e9e40 - github.com/dtapps/go-library/utils/goredis v0.0.0-20220320040709-ad8a5f0e9e40 - github.com/dtapps/go-library/utils/gotime v0.0.0-20220320040709-ad8a5f0e9e40 - github.com/go-redis/redis/v8 v8.11.5 - go.mongodb.org/mongo-driver v1.8.4 - go.uber.org/zap v1.21.0 - gorm.io/gorm v1.23.3 -) - -require ( - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/go-stack/stack v1.8.0 // indirect - github.com/golang/snappy v0.0.1 // indirect - github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jinzhu/now v1.1.4 // indirect - github.com/klauspost/compress v1.13.6 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.0.2 // indirect - github.com/xdg-go/stringprep v1.0.2 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f // indirect - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/text v0.3.6 // indirect -) diff --git a/service/wechatoffice/message.template.send.go b/service/wechatoffice/message.template.send.go index 06e0cc61..2d262860 100644 --- a/service/wechatoffice/message.template.send.go +++ b/service/wechatoffice/message.template.send.go @@ -25,6 +25,7 @@ func NewMessageTemplateSendResult(result MessageTemplateSendResponse, body []byt // MessageTemplateSend 模板消息 // https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html func (app *App) MessageTemplateSend(notMustParams ...Params) *MessageTemplateSendResult { + app.AccessToken = app.GetAccessToken() // 参数 params := app.NewParamsWith(notMustParams...) // 请求 diff --git a/service/wechatoffice/mongodb.go b/service/wechatoffice/mongodb.go new file mode 100644 index 00000000..f9617656 --- /dev/null +++ b/service/wechatoffice/mongodb.go @@ -0,0 +1,47 @@ +package wechatoffice + +import ( + "dtapps/dta/library/utils/gohttp" + "encoding/json" + "gitee.com/dtapps/go-library/utils/gotime" +) + +// 日志 +type mongoZap struct { + Url string `json:"url" bson:"url"` + Params interface{} `json:"params" bson:"params"` + Method string `json:"method" bson:"method"` + Header interface{} `json:"header" bson:"header"` + Status string `json:"status" bson:"status"` + StatusCode int `json:"status_code" bson:"status_code"` + Body interface{} `json:"body" bson:"body"` + ContentLength int64 `json:"content_length" bson:"content_length"` + CreateTime string `json:"create_time" bson:"create_time"` +} + +func (m *mongoZap) Database() string { + return "zap_logs" +} + +func (m *mongoZap) TableName() string { + return "wechatoffice_" + gotime.Current().SetFormat("200601") +} + +func (app *App) mongoLog(url string, params map[string]interface{}, method string, request gohttp.Response) { + if app.Mongo.Db == nil { + return + } + var body map[string]interface{} + _ = json.Unmarshal(request.Body, &body) + app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{ + Url: url, + Params: params, + Method: method, + Header: request.Header, + Status: request.Status, + StatusCode: request.StatusCode, + Body: body, + ContentLength: request.ContentLength, + CreateTime: gotime.Current().Format(), + }) +} diff --git a/service/wechatoffice/share.go b/service/wechatoffice/share.go index 137f71b6..623d502a 100644 --- a/service/wechatoffice/share.go +++ b/service/wechatoffice/share.go @@ -3,7 +3,7 @@ package wechatoffice import ( "crypto/sha1" "fmt" - "github.com/dtapps/go-library/utils/gorandom" + "gitee.com/dtapps/go-library/utils/gorandom" "io" "time" ) @@ -27,6 +27,8 @@ func NewShareResult(result ShareResponse, err error) *ShareResult { } func (app *App) Share(url string) *ShareResult { + app.AccessToken = app.GetAccessToken() + app.JsapiTicket = app.GetJsapiTicket() var response ShareResponse response.AppId = app.AppId response.NonceStr = gorandom.Alphanumeric(32) diff --git a/service/wechatoffice/auth.code2_session.go b/service/wechatoffice/sns.jscode2session.go similarity index 56% rename from service/wechatoffice/auth.code2_session.go rename to service/wechatoffice/sns.jscode2session.go index 15c85021..4e372011 100644 --- a/service/wechatoffice/auth.code2_session.go +++ b/service/wechatoffice/sns.jscode2session.go @@ -6,7 +6,7 @@ import ( "net/http" ) -type AuthCode2SessionResponse struct { +type SnsJsCode2sessionResponse struct { OpenId string `json:"openid"` // 用户唯一标识 SessionKey string `json:"session_key"` // 会话密钥 Unionid string `json:"unionid"` // 用户在开放平台的唯一标识符,若当前小程序已绑定到微信开放平台帐号下会返回 @@ -14,21 +14,21 @@ type AuthCode2SessionResponse struct { Errmsg string `json:"errmsg"` // 错误信息 } -type AuthCode2SessionResult struct { - Result AuthCode2SessionResponse // 结果 - Body []byte // 内容 - Err error // 错误 +type SnsJsCode2sessionResult struct { + Result SnsJsCode2sessionResponse // 结果 + Body []byte // 内容 + Err error // 错误 } -func NewAuthCode2SessionResult(result AuthCode2SessionResponse, body []byte, err error) *AuthCode2SessionResult { - return &AuthCode2SessionResult{Result: result, Body: body, Err: err} +func NewSnsJsCode2sessionResult(result SnsJsCode2sessionResponse, body []byte, err error) *SnsJsCode2sessionResult { + return &SnsJsCode2sessionResult{Result: result, Body: body, Err: err} } -func (app *App) AuthCode2Session(jsCode string) *AuthCode2SessionResult { +func (app *App) SnsJsCode2session(jsCode string) *SnsJsCode2sessionResult { // 请求 body, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code", app.AppId, app.AppSecret, jsCode), map[string]interface{}{}, http.MethodGet) // 定义 - var response AuthCode2SessionResponse + var response SnsJsCode2sessionResponse err = json.Unmarshal(body, &response) - return NewAuthCode2SessionResult(response, body, err) + return NewSnsJsCode2sessionResult(response, body, err) } diff --git a/service/wechatoffice/sns.oauth2.access_token.go b/service/wechatoffice/sns.oauth2.access_token.go index 64bbfea3..3a06d2b9 100644 --- a/service/wechatoffice/sns.oauth2.access_token.go +++ b/service/wechatoffice/sns.oauth2.access_token.go @@ -6,7 +6,7 @@ import ( "net/http" ) -type Oauth2AccessTokenResponse struct { +type SnsOauth2AccessTokenResponse struct { AccessToken string `json:"access_token"` // 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同 ExpiresIn int `json:"expires_in"` // access_token接口调用凭证超时时间,单位(秒) RefreshToken string `json:"refresh_token"` // 用户刷新access_token @@ -14,23 +14,23 @@ type Oauth2AccessTokenResponse struct { Scope string `json:"scope"` // 用户授权的作用域,使用逗号(,)分隔 } -type Oauth2AccessTokenResult struct { - Result Oauth2AccessTokenResponse // 结果 - Body []byte // 内容 - Err error // 错误 +type SnsOauth2AccessTokenResult struct { + Result SnsOauth2AccessTokenResponse // 结果 + Body []byte // 内容 + Err error // 错误 } -func NewOauth2AccessTokenResult(result Oauth2AccessTokenResponse, body []byte, err error) *Oauth2AccessTokenResult { - return &Oauth2AccessTokenResult{Result: result, Body: body, Err: err} +func NewSnsOauth2AccessTokenResult(result SnsOauth2AccessTokenResponse, body []byte, err error) *SnsOauth2AccessTokenResult { + return &SnsOauth2AccessTokenResult{Result: result, Body: body, Err: err} } -// Oauth2AccessToken 通过code换取网页授权access_token +// SnsOauth2AccessToken 通过code换取网页授权access_token // https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html#0 -func (app *App) Oauth2AccessToken(code string) *Oauth2AccessTokenResult { +func (app *App) SnsOauth2AccessToken(code string) *SnsOauth2AccessTokenResult { // 请求 body, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code", app.AppId, app.AppSecret, code), map[string]interface{}{}, http.MethodGet) // 定义 - var response Oauth2AccessTokenResponse + var response SnsOauth2AccessTokenResponse err = json.Unmarshal(body, &response) - return NewOauth2AccessTokenResult(response, body, err) + return NewSnsOauth2AccessTokenResult(response, body, err) } diff --git a/service/wechatopen b/service/wechatopen new file mode 160000 index 00000000..7d3f9e33 --- /dev/null +++ b/service/wechatopen @@ -0,0 +1 @@ +Subproject commit 7d3f9e33ee862f8acd65a4cb8ecffb56c4b860a2 diff --git a/service/wechatpayapiv2/app.go b/service/wechatpayapiv2/app.go new file mode 100644 index 00000000..44236a83 --- /dev/null +++ b/service/wechatpayapiv2/app.go @@ -0,0 +1,38 @@ +package wechatpayapiv2 + +import ( + "crypto/tls" + "dtapps/dta/library/utils/gohttp" + "dtapps/dta/library/utils/gomongo" + "dtapps/dta/library/utils/gopostgresql" +) + +// App 微信支付服务 +type App struct { + AppId string // 小程序或者公众号唯一凭证 + AppSecret string // 小程序或者公众号唯一凭证密钥 + MchId string // 微信支付的商户id + MchKey string // 私钥 + CertString string + KeyString string + Pgsql gopostgresql.App // 日志数据库 + Mongo gomongo.App // 日志数据库 +} + +func (app *App) request(url string, param Params, cert *tls.Certificate) (resp gohttp.Response, err error) { + // 参数 + reader, err := param.MarshalXML() + if err != nil { + return gohttp.Response{}, err + } + // 请求 + postJson, err := gohttp.PostCert(url, reader, cert) + // 日志 + go app.mongoLog(url, param, postJson) + return postJson, err +} + +func (app *App) P12ToPem() (*tls.Certificate, error) { + pemCert, err := tls.X509KeyPair([]byte(app.CertString), []byte(app.KeyString)) + return &pemCert, err +} diff --git a/service/wechatpayapiv2/mmpaymkttransfers.gettransferinfo.go b/service/wechatpayapiv2/mmpaymkttransfers.gettransferinfo.go new file mode 100644 index 00000000..8be44d6a --- /dev/null +++ b/service/wechatpayapiv2/mmpaymkttransfers.gettransferinfo.go @@ -0,0 +1,59 @@ +package wechatpayapiv2 + +import ( + "dtapps/dta/library/utils/gohttp" + "encoding/xml" + "gitee.com/dtapps/go-library/utils/gorandom" +) + +type TransfersQueryResponse struct { + ReturnCode string `json:"return_code" xml:"return_code"` // 返回状态码 + ReturnMsg string `json:"return_msg,omitempty" xml:"return_msg,omitempty"` // 返回信息 + ResultCode string `json:"result_code" xml:"result_code"` // 业务结果 + ErrCode string `json:"err_code,omitempty" xml:"err_code,omitempty"` // 错误代码 + ErrCodeDes string `json:"err_code_des,omitempty" xml:"err_code_des,omitempty"` // 错误代码描述 + PartnerTradeNo string `json:"partner_trade_no" xml:"partner_trade_no"` // 商户单号 + Appid string `json:"appid" xml:"appid"` // Appid + MchId string `json:"mch_id" xml:"mch_id"` // 商户号 + DetailId string `json:"detail_id" xml:"detail_id"` // 付款单号 + Status string `json:"status" xml:"status"` // 转账状态 + Reason string `json:"reason,omitempty" xml:"reason,omitempty"` // 失败原因 + Openid string `json:"openid" xml:"openid"` // 收款用户openid + TransferName string `json:"transfer_name,omitempty" xml:"transfer_name,omitempty"` // 收款用户姓名 + PaymentAmount string `json:"payment_amount" xml:"payment_amount"` // 付款金额 + TransferTime string `json:"transfer_time" xml:"transfer_time"` // 转账时间 + PaymentTime string `json:"payment_time" xml:"payment_time"` // 付款成功时间 + Desc string `json:"desc" xml:"desc"` // 付款备注 +} + +type TransfersQueryResult struct { + Result TransfersQueryResponse // 结果 + Body []byte // 内容 + Http gohttp.Response // 请求 + Err error // 错误 +} + +func NewTransfersQueryResult(result TransfersQueryResponse, body []byte, http gohttp.Response, err error) *TransfersQueryResult { + return &TransfersQueryResult{Result: result, Body: body, Http: http, Err: err} +} + +// TransfersQuery +// 付款到零钱 - 查询付款 +// https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_3 +func (app *App) TransfersQuery(partnerTradeNo string) *TransfersQueryResult { + cert, err := app.P12ToPem() + // 参数 + params := NewParams() + params.Set("appid", app.AppId) + params.Set("mch_id", app.MchId) + params.Set("nonce_str", gorandom.Alphanumeric(32)) + params.Set("partner_trade_no", partnerTradeNo) + // 签名 + params.Set("sign", app.getMd5Sign(params)) + // 请求 + request, err := app.request("https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo", params, cert) + // 定义 + var response TransfersQueryResponse + err = xml.Unmarshal(request.Body, &response) + return NewTransfersQueryResult(response, request.Body, request, err) +} diff --git a/service/wechatpayapiv2/mmpaymkttransfers.promotion.transfers.go b/service/wechatpayapiv2/mmpaymkttransfers.promotion.transfers.go new file mode 100644 index 00000000..feb50004 --- /dev/null +++ b/service/wechatpayapiv2/mmpaymkttransfers.promotion.transfers.go @@ -0,0 +1,58 @@ +package wechatpayapiv2 + +import ( + "dtapps/dta/library/utils/gohttp" + "encoding/xml" + "gitee.com/dtapps/go-library/utils/gorandom" +) + +type TransfersResponse struct { + ReturnCode string `json:"return_code" xml:"return_code"` // 返回状态码 + ReturnMsg string `json:"return_msg,omitempty" xml:"return_msg,omitempty"` // 返回信息 + MchAppid string `json:"mch_appid" xml:"mch_appid"` // 商户appid + Mchid string `json:"mchid" xml:"mchid"` // 商户号 + DeviceInfo string `json:"device_info,omitempty" xml:"device_info,omitempty"` // 设备号 + NonceStr string `json:"nonce_str" xml:"nonce_str"` // 随机字符串 + ResultCode string `json:"result_code" xml:"result_code"` // 业务结果 + ErrCode string `json:"err_code,omitempty" xml:"err_code,omitempty"` // 错误代码 + ErrCodeDes string `json:"err_code_des,omitempty" xml:"err_code_des,omitempty"` // 错误代码描述 + PartnerTradeNo string `json:"partner_trade_no" xml:"partner_trade_no"` // 商户订单号 + PaymentNo string `json:"payment_no" xml:"payment_no"` // 微信付款单号 + PaymentTime string `json:"payment_time" xml:"payment_time"` // 付款成功时间 +} + +type TransfersResult struct { + Result TransfersResponse // 结果 + Body []byte // 内容 + Http gohttp.Response // 请求 + Err error // 错误 +} + +func NewTransfersResult(result TransfersResponse, body []byte, http gohttp.Response, err error) *TransfersResult { + return &TransfersResult{Result: result, Body: body, Http: http, Err: err} +} + +// Transfers +// 付款到零钱 - 付款 +// https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2 +func (app *App) Transfers(partnerTradeNo, openid string, amount int64, desc string) *TransfersResult { + cert, err := app.P12ToPem() + // 参数 + params := NewParams() + params.Set("mch_appid", app.AppId) + params.Set("mchid", app.MchId) + params.Set("nonce_str", gorandom.Alphanumeric(32)) + params.Set("partner_trade_no", partnerTradeNo) + params.Set("openid", openid) + params.Set("check_name", "NO_CHECK") + params.Set("amount", amount) + params.Set("desc", desc) + // 签名 + params.Set("sign", app.getMd5Sign(params)) + // 请求 + request, err := app.request("https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers", params, cert) + // 定义 + var response TransfersResponse + err = xml.Unmarshal(request.Body, &response) + return NewTransfersResult(response, request.Body, request, err) +} diff --git a/service/wechatpayapiv2/mongodb.go b/service/wechatpayapiv2/mongodb.go new file mode 100644 index 00000000..a5a5ff9a --- /dev/null +++ b/service/wechatpayapiv2/mongodb.go @@ -0,0 +1,45 @@ +package wechatpayapiv2 + +import ( + "dtapps/dta/library/utils/gohttp" + "gitee.com/dtapps/go-library/utils/gotime" + "net/http" +) + +// 日志 +type mongoZap struct { + Url string `json:"url" bson:"url"` + Params interface{} `json:"params" bson:"params"` + Method string `json:"method" bson:"method"` + Header interface{} `json:"header" bson:"header"` + Status string `json:"status" bson:"status"` + StatusCode int `json:"status_code" bson:"status_code"` + Body interface{} `json:"body" bson:"body"` + ContentLength int64 `json:"content_length" bson:"content_length"` + CreateTime string `json:"create_time" bson:"create_time"` +} + +func (m *mongoZap) Database() string { + return "zap_logs" +} + +func (m *mongoZap) TableName() string { + return "wechatpayapiv2_" + gotime.Current().SetFormat("200601") +} + +func (app *App) mongoLog(url string, params map[string]interface{}, request gohttp.Response) { + if app.Mongo.Db == nil { + return + } + app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{ + Url: url, + Params: params, + Method: http.MethodPost, + Header: request.Header, + Status: request.Status, + StatusCode: request.StatusCode, + Body: string(request.Body), + ContentLength: request.ContentLength, + CreateTime: gotime.Current().Format(), + }) +} diff --git a/service/wechatpayapiv2/params.go b/service/wechatpayapiv2/params.go new file mode 100644 index 00000000..58194903 --- /dev/null +++ b/service/wechatpayapiv2/params.go @@ -0,0 +1,72 @@ +package wechatpayapiv2 + +import ( + "bytes" + "encoding/xml" + "fmt" + "io" +) + +// Params 请求参数 +type Params map[string]interface{} + +func NewParams() Params { + p := make(Params) + return p +} + +func (app *App) NewParamsWith(params ...Params) Params { + p := make(Params) + for _, v := range params { + p.SetParams(v) + } + return p +} + +func (p Params) Set(key string, value interface{}) { + p[key] = value +} + +func (p Params) SetParams(params Params) { + for key, value := range params { + p[key] = value + } +} + +func (p Params) MarshalXML() (reader io.Reader, err error) { + buffer := bytes.NewBuffer(make([]byte, 0)) + + if _, err = io.WriteString(buffer, ""); err != nil { + return + } + + for k, v := range p { + switch { + case k == "detail": + if _, err = io.WriteString(buffer, ""); err != nil { + return + } + default: + if _, err = io.WriteString(buffer, "<"+k+">"); err != nil { + return + } + if err = xml.EscapeText(buffer, []byte(fmt.Sprintf("%v", v))); err != nil { + return + } + if _, err = io.WriteString(buffer, ""); err != nil { + return + } + } + } + + if _, err = io.WriteString(buffer, ""); err != nil { + return + } + return buffer, nil +} diff --git a/service/wechatpayapiv2/sign.go b/service/wechatpayapiv2/sign.go new file mode 100644 index 00000000..579e0220 --- /dev/null +++ b/service/wechatpayapiv2/sign.go @@ -0,0 +1,45 @@ +package wechatpayapiv2 + +import ( + "bytes" + "fmt" + "gitee.com/dtapps/go-library/utils/gomd5" + "sort" + "strings" +) + +// 支付字符串拼接 +func (app *App) getSortString(m map[string]interface{}) string { + var buf bytes.Buffer + keys := make([]string, 0, len(m)) + for k := range m { + keys = append(keys, k) + } + sort.Strings(keys) + for _, k := range keys { + vs := m[k] + if vs == "" { + continue + } + if buf.Len() > 0 { + buf.WriteByte('&') + } + buf.WriteString(k) + buf.WriteByte('=') + buf.WriteString(fmt.Sprintf("%v", vs)) + } + return buf.String() +} + +// 获取签名 +func (app *App) getMd5Sign(paramMap map[string]interface{}) string { + sortString := app.getSortString(paramMap) + sign := gomd5.Md5(sortString + "&key=" + app.MchKey) + return strings.ToUpper(sign) +} + +// 验证签名 +func (app *App) checkMd5Sign(rspMap map[string]interface{}, sign string) bool { + calculateSign := app.getMd5Sign(rspMap) + return calculateSign == sign +} diff --git a/service/wechatpayapiv3/app.go b/service/wechatpayapiv3/app.go index 2b47a7f5..3261c7a6 100644 --- a/service/wechatpayapiv3/app.go +++ b/service/wechatpayapiv3/app.go @@ -1,92 +1,59 @@ package wechatpayapiv3 import ( - "bytes" + "dtapps/dta/library/utils/goheader" + "dtapps/dta/library/utils/gohttp" + "dtapps/dta/library/utils/gomongo" "encoding/json" - "fmt" - "github.com/dtapps/go-library/utils/gorequest" - "github.com/go-redis/redis/v8" - "go.mongodb.org/mongo-driver/mongo" - "go.uber.org/zap" - "gorm.io/gorm" - "io/ioutil" + "errors" "net/http" ) // App 微信支付服务 type App struct { - AppId string // 小程序或者公众号唯一凭证 - AppSecret string // 小程序或者公众号唯一凭证密钥 - MchId string // 微信支付的商户id - AesKey string // 私钥 - ApiV3 string // API v3密钥 - PrivateSerialNo string // 私钥证书号 - MchPrivateKey string // 商户私有证书内容 apiclient_key.pem - ZapLog *zap.Logger // 日志服务 - Db *gorm.DB // 关系数据库服务 - RDb *redis.Client // 缓存数据库服务 - MDb *mongo.Client // 非关系数据库服务 + AppId string // 小程序或者公众号唯一凭证 + AppSecret string // 小程序或者公众号唯一凭证密钥 + MchId string // 微信支付的商户id + AesKey string // 私钥 + ApiV3 string // API v3密钥 + PrivateSerialNo string // 私钥证书号 + MchPrivateKey string // 商户私有证书内容 apiclient_key.pem + Mongo gomongo.App // 日志数据库 } -// ErrResp 错误返回 -type ErrResp struct { - Code string `json:"code"` - Message string `json:"message"` - Detail struct { - Field string `json:"field,omitempty"` - Value interface{} `json:"value"` - Issue string `json:"issue,omitempty"` - Location string `json:"location"` - } `json:"detail"` -} - -func (app *App) request(url string, params map[string]interface{}, method string) (resp []byte, result ErrResp, err error) { +func (app *App) request(url string, params map[string]interface{}, method string, commonParams bool) (resp gohttp.Response, err error) { // 公共参数 if method == http.MethodPost { - if url != "https://api.mch.weixin.qq.com/v3/refund/domestic/refunds" { + if commonParams == true { params["appid"] = app.AppId params["mchid"] = app.MchId } } authorization, err := app.authorization(method, params, url) - marshal, _ := json.Marshal(params) - var req *http.Request - req, err = http.NewRequest(method, url, bytes.NewReader(marshal)) - if err != nil { - return nil, result, err - } - req.Header.Add("Authorization", "WECHATPAY2-SHA256-RSA2048 "+authorization) - req.Header.Add("User-Agent", gorequest.GetRandomUserAgent()) - req.Header.Add("Content-Type", "application/json") - req.Header.Add("Accept", "application/json") - req.Header.Add("Accept-Language", "zh-CN") - - httpClient := &http.Client{} - var response *http.Response - response, err = httpClient.Do(req) - if err != nil { - return nil, result, err + return gohttp.Response{}, err } - // 处理成功 - defer response.Body.Close() - resp, err = ioutil.ReadAll(response.Body) - // 检查错误 - err = json.Unmarshal(resp, &result) - if err != nil { - return nil, result, err - } - - // 日志 - if app.ZapLog != nil { - app.ZapLog.Sugar().Info(fmt.Sprintf("%s %s", url, resp)) + headers := goheader.NewHeaders() + headers.Set("Authorization", "WECHATPAY2-SHA256-RSA2048 "+authorization) + headers.Set("Accept", "application/json") + headers.Set("Accept-Language", "zh-CN") + + switch method { + case http.MethodGet: + // 请求 + getJson, err := gohttp.GetJsonHeader(url, params, headers) + // 日志 + go app.mongoLog(url, params, method, getJson) + return getJson, err + case http.MethodPost: + // 请求参数 + paramsStr, err := json.Marshal(params) + postJson, err := gohttp.PostJsonHeader(url, paramsStr, headers) + // 日志 + go app.mongoLog(url, params, method, postJson) + return postJson, err + default: + return resp, errors.New("请求类型不支持") } - - // 检查请求错误 - if response.StatusCode == 200 { - return resp, result, err - } - - return nil, result, err } diff --git a/service/wechatpayapiv3/go.mod b/service/wechatpayapiv3/go.mod deleted file mode 100644 index 7d01a98d..00000000 --- a/service/wechatpayapiv3/go.mod +++ /dev/null @@ -1,32 +0,0 @@ -module github.com/dtapps/go-library/service/wechatpayapiv3 - -go 1.18 - -require ( - github.com/dtapps/go-library/utils/gorandom v0.0.0-20220320040709-ad8a5f0e9e40 - github.com/dtapps/go-library/utils/gorequest v0.0.0-20220320040709-ad8a5f0e9e40 - github.com/go-redis/redis/v8 v8.11.5 - go.mongodb.org/mongo-driver v1.8.4 - go.uber.org/zap v1.21.0 - gorm.io/gorm v1.23.3 -) - -require ( - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/go-stack/stack v1.8.0 // indirect - github.com/golang/snappy v0.0.1 // indirect - github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jinzhu/now v1.1.4 // indirect - github.com/klauspost/compress v1.13.6 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.0.2 // indirect - github.com/xdg-go/stringprep v1.0.2 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f // indirect - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/text v0.3.6 // indirect -) diff --git a/service/wechatpayapiv3/mongodb.go b/service/wechatpayapiv3/mongodb.go new file mode 100644 index 00000000..911e86ed --- /dev/null +++ b/service/wechatpayapiv3/mongodb.go @@ -0,0 +1,47 @@ +package wechatpayapiv3 + +import ( + "dtapps/dta/library/utils/gohttp" + "encoding/json" + "gitee.com/dtapps/go-library/utils/gotime" +) + +// 日志 +type mongoZap struct { + Url string `json:"url" bson:"url"` + Params interface{} `json:"params" bson:"params"` + Method string `json:"method" bson:"method"` + Header interface{} `json:"header" bson:"header"` + Status string `json:"status" bson:"status"` + StatusCode int `json:"status_code" bson:"status_code"` + Body interface{} `json:"body" bson:"body"` + ContentLength int64 `json:"content_length" bson:"content_length"` + CreateTime string `json:"create_time" bson:"create_time"` +} + +func (m *mongoZap) Database() string { + return "zap_logs" +} + +func (m *mongoZap) TableName() string { + return "wechatpayapiv3_" + gotime.Current().SetFormat("200601") +} + +func (app *App) mongoLog(url string, params map[string]interface{}, method string, request gohttp.Response) { + if app.Mongo.Db == nil { + return + } + var body map[string]interface{} + _ = json.Unmarshal(request.Body, &body) + app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{ + Url: url, + Params: params, + Method: method, + Header: request.Header, + Status: request.Status, + StatusCode: request.StatusCode, + Body: body, + ContentLength: request.ContentLength, + CreateTime: gotime.Current().Format(), + }) +} diff --git a/service/wechatpayapiv3/params.go b/service/wechatpayapiv3/params.go index 27c596a3..1a17a802 100644 --- a/service/wechatpayapiv3/params.go +++ b/service/wechatpayapiv3/params.go @@ -16,7 +16,7 @@ func (app *App) NewParamsWith(params ...Params) Params { return p } -func (p Params) Set(key string, value interface{}) { +func (p Params) Set(key string, value any) { p[key] = value } diff --git a/service/wechatpayapiv3/pay.jsapi.go b/service/wechatpayapiv3/pay.jsapi.go index 94daccaf..47205416 100644 --- a/service/wechatpayapiv3/pay.jsapi.go +++ b/service/wechatpayapiv3/pay.jsapi.go @@ -2,7 +2,7 @@ package wechatpayapiv3 import ( "fmt" - "github.com/dtapps/go-library/utils/gorandom" + "gitee.com/dtapps/go-library/utils/gorandom" "time" ) diff --git a/service/wechatpayapiv3/pay.transactions.id.go b/service/wechatpayapiv3/pay.transactions.id.go index 093fcd3c..8411c60c 100644 --- a/service/wechatpayapiv3/pay.transactions.id.go +++ b/service/wechatpayapiv3/pay.transactions.id.go @@ -1,16 +1,13 @@ package wechatpayapiv3 import ( + "dtapps/dta/library/utils/gohttp" "encoding/json" "fmt" + "net/http" ) -type PayTransactionsId struct { - TransactionId string `json:"transaction_id"` -} - -// PayTransactionsIdResult 返回参数 -type PayTransactionsIdResult struct { +type PayTransactionsIdResponse struct { Appid string `json:"appid"` Mchid string `json:"mchid"` OutTradeNo string `json:"out_trade_no"` @@ -54,16 +51,26 @@ type PayTransactionsIdResult struct { } } -// PayTransactionsId 微信支付订单号查询 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_2.shtml -func (app *App) PayTransactionsId(param PayTransactionsId) (resp PayTransactionsIdResult, result ErrResp, err error) { +type PayTransactionsIdResult struct { + Result PayTransactionsIdResponse // 结果 + Body []byte // 内容 + Http gohttp.Response // 请求 + Err error // 错误 +} - body, result, err := app.request(fmt.Sprintf("https://api.mch.weixin.qq.com/v3/pay/transactions/id/%s?mchid=%s", param.TransactionId, app.MchId), map[string]interface{}{}, "GET") +func NewPayTransactionsIdResult(result PayTransactionsIdResponse, body []byte, http gohttp.Response, err error) *PayTransactionsIdResult { + return &PayTransactionsIdResult{Result: result, Body: body, Http: http, Err: err} +} +// PayTransactionsId 微信支付订单号查询 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_2.shtml +func (app *App) PayTransactionsId(transactionId string) *PayTransactionsIdResult { + // 请求 + request, err := app.request(fmt.Sprintf("https://api.mch.weixin.qq.com/v3/pay/transactions/id/%s?mchid=%s", transactionId, app.MchId), map[string]interface{}{}, http.MethodGet, true) if err != nil { - return - } - if err = json.Unmarshal(body, &resp); err != nil { - return + return NewPayTransactionsIdResult(PayTransactionsIdResponse{}, request.Body, request, err) } - return + // 定义 + var response PayTransactionsIdResponse + err = json.Unmarshal(request.Body, &response) + return NewPayTransactionsIdResult(response, request.Body, request, err) } diff --git a/service/wechatpayapiv3/pay.transactions.jsapi.go b/service/wechatpayapiv3/pay.transactions.jsapi.go index 09fca6fd..40095343 100644 --- a/service/wechatpayapiv3/pay.transactions.jsapi.go +++ b/service/wechatpayapiv3/pay.transactions.jsapi.go @@ -1,96 +1,37 @@ package wechatpayapiv3 import ( + "dtapps/dta/library/utils/gohttp" "encoding/json" - "time" + "net/http" ) -// PayTransactionsJsapi 入参 -type PayTransactionsJsapi struct { - Description string `json:"description"` //【是】商品描述 - OutTradeNo string `json:"out_trade_no"` //【是】商户订单号 - TimeExpire time.Time `json:"time_expire,omitempty"` //【否】交易结束时间 - Attach string `json:"attach,omitempty"` //【否】附加数据 - NotifyUrl string `json:"notify_url"` //【是】通知地址 - GoodsTag string `json:"goods_tag,omitempty"` //【否】订单优惠标记 - Amount *PayTransactionsJsapiAmount `json:"amount"` //【是】订单金额 - Payer *PayTransactionsJsapiPayer `json:"payer"` //【是】支付者 - Detail *PayTransactionsJsapiDetail `json:"detail,omitempty"` //【否】优惠功能 - SceneInfo *PayTransactionsJsapiSceneInfo `json:"scene_info,omitempty"` //【否】场景信息 - SettleInfo *PayTransactionsJsapiSettleInfo `json:"settle_info,omitempty"` //【否】结算信息 -} - -// PayTransactionsJsapiAmount 订单金额 -type PayTransactionsJsapiAmount struct { - Total int `json:"total"` //【是】总金额 - Currency string `json:"currency,omitempty"` //【否】货币类型 -} - -// PayTransactionsJsapiPayer 支付者 -type PayTransactionsJsapiPayer struct { - Openid string `json:"openid"` //【是】用户标识 -} - -// PayTransactionsJsapiDetail 优惠功能 -type PayTransactionsJsapiDetail struct { - CostPrice int `json:"cost_price,omitempty"` //【否】订单原价 - InvoiceId string `json:"invoice_id,omitempty"` //【否】商品小票ID - GoodsDetail []PayTransactionsJsapiDetailGoodsDetail `json:"goods_detail,omitempty"` //【否】单品列表 -} - -// PayTransactionsJsapiDetailGoodsDetail 单品列表 -type PayTransactionsJsapiDetailGoodsDetail struct { - MerchantGoodsId string `json:"merchant_goods_id"` //【是】商户侧商品编码 - WechatpayGoodsId string `json:"wechatpay_goods_id,omitempty"` //【否】微信侧商品编码 - GoodsName string `json:"goods_name,omitempty"` //【否】商品名称 - Quantity int `json:"quantity"` //【是】商品数量 - UnitPrice int `json:"unit_price"` //【是】商品单价 -} - -// PayTransactionsJsapiSceneInfo 场景信息 -type PayTransactionsJsapiSceneInfo struct { - PayerClientIp string `json:"payer_client_ip"` //【是】用户终端IP - DeviceId string `json:"device_id,omitempty"` //【否】商户端设备号 - StoreInfo *PayTransactionsJsapiSceneInfoStoreInfo `json:"store_info,omitempty"` //【否】商户门店信息 -} - -// PayTransactionsJsapiSceneInfoStoreInfo 商户门店信息 -type PayTransactionsJsapiSceneInfoStoreInfo struct { - Id string `json:"id"` //【是】门店编号 - Name string `json:"name,omitempty"` //【否】门店名称 - AreaCode string `json:"area_code,omitempty"` //【否】地区编码 - Address string `json:"address,omitempty"` //【否】详细地址 +type PayTransactionsJsapiResponse struct { + PrepayId string `json:"prepay_id"` } -// PayTransactionsJsapiSettleInfo 结算信息 -type PayTransactionsJsapiSettleInfo struct { - ProfitSharing bool `json:"profit_sharing,omitempty"` //【否】是否指定分账 +type PayTransactionsJsapiResult struct { + Result PayTransactionsJsapiResponse // 结果 + Body []byte // 内容 + Http gohttp.Response // 请求 + Err error // 错误 } -// PayTransactionsJsapiResult 返回参数 -type PayTransactionsJsapiResult struct { - PrepayId string `json:"prepay_id"` +func NewPayTransactionsJsapiResult(result PayTransactionsJsapiResponse, body []byte, http gohttp.Response, err error) *PayTransactionsJsapiResult { + return &PayTransactionsJsapiResult{Result: result, Body: body, Http: http, Err: err} } // PayTransactionsJsapi 小程序 JSAPI下单 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_1.shtml -func (app *App) PayTransactionsJsapi(param PayTransactionsJsapi) (resp PayTransactionsJsapiResult, result ErrResp, err error) { - - // api params - params := map[string]interface{}{} - b, _ := json.Marshal(¶m) - var m map[string]interface{} - _ = json.Unmarshal(b, &m) - for k, v := range m { - params[k] = v - } - - body, result, err := app.request("https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi", params, "POST") - +func (app *App) PayTransactionsJsapi(notMustParams ...Params) *PayTransactionsJsapiResult { + // 参数 + params := app.NewParamsWith(notMustParams...) + // 请求 + request, err := app.request("https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi", params, http.MethodPost, true) if err != nil { - return - } - if err = json.Unmarshal(body, &resp); err != nil { - return + return NewPayTransactionsJsapiResult(PayTransactionsJsapiResponse{}, request.Body, request, err) } - return + // 定义 + var response PayTransactionsJsapiResponse + err = json.Unmarshal(request.Body, &response) + return NewPayTransactionsJsapiResult(response, request.Body, request, err) } diff --git a/service/wechatpayapiv3/pay.transactions.out-trade-no.close.go b/service/wechatpayapiv3/pay.transactions.out-trade-no.close.go index 1dbb5acb..4b1d5b46 100644 --- a/service/wechatpayapiv3/pay.transactions.out-trade-no.close.go +++ b/service/wechatpayapiv3/pay.transactions.out-trade-no.close.go @@ -1,19 +1,27 @@ package wechatpayapiv3 import ( + "dtapps/dta/library/utils/gohttp" "fmt" "net/http" ) +type PayTransactionsOutTradeNoCloseResult struct { + Body []byte // 内容 + Http gohttp.Response // 请求 + Err error // 错误 +} + +func NewPayTransactionsOutTradeNoCloseResult(body []byte, http gohttp.Response, err error) *PayTransactionsOutTradeNoCloseResult { + return &PayTransactionsOutTradeNoCloseResult{Body: body, Http: http, Err: err} +} + // PayTransactionsOutTradeNoClose 关闭订单API https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_3.shtml -func (app *App) PayTransactionsOutTradeNoClose(OutTradeNo string) (result ErrResp, err error) { +func (app *App) PayTransactionsOutTradeNoClose(OutTradeNo string) *PayTransactionsOutTradeNoCloseResult { // 参数 params := NewParams() params["mchid"] = app.MchId // 请求 - _, result, err = app.request(fmt.Sprintf("https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/%s/close", OutTradeNo), params, http.MethodPost) - if err != nil { - return - } - return + request, err := app.request(fmt.Sprintf("https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/%s/close", OutTradeNo), params, http.MethodPost, false) + return NewPayTransactionsOutTradeNoCloseResult(request.Body, request, err) } diff --git a/service/wechatpayapiv3/pay.transactions.out-trade-no.go b/service/wechatpayapiv3/pay.transactions.out-trade-no.go index ae4fc38a..90be4009 100644 --- a/service/wechatpayapiv3/pay.transactions.out-trade-no.go +++ b/service/wechatpayapiv3/pay.transactions.out-trade-no.go @@ -1,16 +1,13 @@ package wechatpayapiv3 import ( + "dtapps/dta/library/utils/gohttp" "encoding/json" "fmt" + "net/http" ) -type PayTransactionsOutTradeNo struct { - OutTradeNo string `json:"out_trade_no"` -} - -// PayTransactionsOutTradeNoResult 返回参数 -type PayTransactionsOutTradeNoResult struct { +type PayTransactionsOutTradeNoResponse struct { Appid string `json:"appid"` Mchid string `json:"mchid"` OutTradeNo string `json:"out_trade_no"` @@ -54,16 +51,26 @@ type PayTransactionsOutTradeNoResult struct { } } -// PayTransactionsOutTradeNo 商户订单号查询 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_2.shtml -func (app *App) PayTransactionsOutTradeNo(param PayTransactionsOutTradeNo) (resp PayTransactionsOutTradeNoResult, result ErrResp, err error) { +type PayTransactionsOutTradeNoResult struct { + Result PayTransactionsOutTradeNoResponse // 结果 + Body []byte // 内容 + Http gohttp.Response // 请求 + Err error // 错误 +} - body, result, err := app.request(fmt.Sprintf("https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/%s?mchid=%s", param.OutTradeNo, app.MchId), map[string]interface{}{}, "GET") +func NewPayTransactionsOutTradeNoResult(result PayTransactionsOutTradeNoResponse, body []byte, http gohttp.Response, err error) *PayTransactionsOutTradeNoResult { + return &PayTransactionsOutTradeNoResult{Result: result, Body: body, Http: http, Err: err} +} +// PayTransactionsOutTradeNo 商户订单号查询 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_2.shtml +func (app *App) PayTransactionsOutTradeNo(outTradeNo string) *PayTransactionsOutTradeNoResult { + // 请求 + request, err := app.request(fmt.Sprintf("https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/%s?mchid=%s", outTradeNo, app.MchId), map[string]interface{}{}, http.MethodGet, true) if err != nil { - return - } - if err = json.Unmarshal(body, &resp); err != nil { - return + return NewPayTransactionsOutTradeNoResult(PayTransactionsOutTradeNoResponse{}, request.Body, request, err) } - return + // 定义 + var response PayTransactionsOutTradeNoResponse + err = json.Unmarshal(request.Body, &response) + return NewPayTransactionsOutTradeNoResult(response, request.Body, request, err) } diff --git a/service/wechatpayapiv3/refund.domestic.refunds.go b/service/wechatpayapiv3/refund.domestic.refunds.go index 5b1dfd92..2968f74d 100644 --- a/service/wechatpayapiv3/refund.domestic.refunds.go +++ b/service/wechatpayapiv3/refund.domestic.refunds.go @@ -1,11 +1,12 @@ package wechatpayapiv3 import ( + "dtapps/dta/library/utils/gohttp" "encoding/json" "net/http" ) -type RefundDomesticRefundsResult struct { +type RefundDomesticRefundsResponse struct { RefundId string `json:"refund_id"` // 微信支付退款单号 OutRefundNo string `json:"out_refund_no"` // 商户退款单号 TransactionId string `json:"transaction_id"` // 微信支付订单号 @@ -47,20 +48,28 @@ type RefundDomesticRefundsResult struct { } `json:"promotion_detail,omitempty"` // 优惠退款信息 } -// RefundDomesticRefunds 申请退款API https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_26.shtml -func (app *App) RefundDomesticRefunds(notMustParams ...Params) (resp RefundDomesticRefundsResult, result ErrResp, err error) { +type RefundDomesticRefundsResult struct { + Result RefundDomesticRefundsResponse // 结果 + Body []byte // 内容 + Http gohttp.Response // 请求 + Err error // 错误 +} + +func NewRefundDomesticRefundsResult(result RefundDomesticRefundsResponse, body []byte, http gohttp.Response, err error) *RefundDomesticRefundsResult { + return &RefundDomesticRefundsResult{Result: result, Body: body, Http: http, Err: err} +} +// RefundDomesticRefunds 申请退款API https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_26.shtml +func (app *App) RefundDomesticRefunds(notMustParams ...Params) *RefundDomesticRefundsResult { // 参数 params := app.NewParamsWith(notMustParams...) - // 请求 - body, result, err := app.request("https://api.mch.weixin.qq.com/v3/refund/domestic/refunds", params, http.MethodPost) - + request, err := app.request("https://api.mch.weixin.qq.com/v3/refund/domestic/refunds", params, http.MethodPost, false) if err != nil { - return - } - if err = json.Unmarshal(body, &resp); err != nil { - return + return NewRefundDomesticRefundsResult(RefundDomesticRefundsResponse{}, request.Body, request, err) } - return + // 定义 + var response RefundDomesticRefundsResponse + err = json.Unmarshal(request.Body, &response) + return NewRefundDomesticRefundsResult(response, request.Body, request, err) } diff --git a/service/wechatpayapiv3/refund.domestic.refunds.out_refund_no.go b/service/wechatpayapiv3/refund.domestic.refunds.out_refund_no.go index c5f6a62f..a239750f 100644 --- a/service/wechatpayapiv3/refund.domestic.refunds.out_refund_no.go +++ b/service/wechatpayapiv3/refund.domestic.refunds.out_refund_no.go @@ -1,11 +1,13 @@ package wechatpayapiv3 import ( + "dtapps/dta/library/utils/gohttp" "encoding/json" "fmt" + "net/http" ) -type RefundDomesticRefundsOutRefundNoResult struct { +type RefundDomesticRefundsOutRefundNoResponse struct { RefundId string `json:"refund_id"` // 微信支付退款单号 OutRefundNo string `json:"out_refund_no"` // 商户退款单号 TransactionId string `json:"transaction_id"` // 微信支付订单号 @@ -47,16 +49,26 @@ type RefundDomesticRefundsOutRefundNoResult struct { } `json:"promotion_detail,omitempty"` // 优惠退款信息 } -// RefundDomesticRefundsOutRefundNo 查询单笔退款API https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_5_10.shtml -func (app *App) RefundDomesticRefundsOutRefundNo(OutRefundNo string) (resp RefundDomesticRefundsOutRefundNoResult, result ErrResp, err error) { +type RefundDomesticRefundsOutRefundNoResult struct { + Result RefundDomesticRefundsOutRefundNoResponse // 结果 + Body []byte // 内容 + Http gohttp.Response // 请求 + Err error // 错误 +} - body, result, err := app.request(fmt.Sprintf("https://api.mch.weixin.qq.com/v3/refund/domestic/refunds/%s", OutRefundNo), map[string]interface{}{}, "GET") +func NewRefundDomesticRefundsOutRefundNoResult(result RefundDomesticRefundsOutRefundNoResponse, body []byte, http gohttp.Response, err error) *RefundDomesticRefundsOutRefundNoResult { + return &RefundDomesticRefundsOutRefundNoResult{Result: result, Body: body, Http: http, Err: err} +} +// RefundDomesticRefundsOutRefundNo 查询单笔退款API https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_5_10.shtml +func (app *App) RefundDomesticRefundsOutRefundNo(outRefundNo string) *RefundDomesticRefundsOutRefundNoResult { + // 请求 + request, err := app.request(fmt.Sprintf("https://api.mch.weixin.qq.com/v3/refund/domestic/refunds/%s", outRefundNo), map[string]interface{}{}, http.MethodGet, true) if err != nil { - return - } - if err = json.Unmarshal(body, &resp); err != nil { - return + return NewRefundDomesticRefundsOutRefundNoResult(RefundDomesticRefundsOutRefundNoResponse{}, request.Body, request, err) } - return + // 定义 + var response RefundDomesticRefundsOutRefundNoResponse + err = json.Unmarshal(request.Body, &response) + return NewRefundDomesticRefundsOutRefundNoResult(response, request.Body, request, err) } diff --git a/service/wechatpayapiv3/sign.go b/service/wechatpayapiv3/sign.go index 2bcc9006..86740891 100644 --- a/service/wechatpayapiv3/sign.go +++ b/service/wechatpayapiv3/sign.go @@ -13,7 +13,7 @@ import ( "encoding/pem" "errors" "fmt" - "github.com/dtapps/go-library/utils/gorandom" + "gitee.com/dtapps/go-library/utils/gorandom" "net/url" "time" ) diff --git a/service/wechatqy/app.go b/service/wechatqy/app.go index dc791f8f..1b964ddf 100644 --- a/service/wechatqy/app.go +++ b/service/wechatqy/app.go @@ -1,21 +1,15 @@ package wechatqy import ( + "dtapps/dta/library/utils/gohttp" + "dtapps/dta/library/utils/gomongo" "encoding/json" - "fmt" - "github.com/dtapps/go-library/utils/gohttp" - "github.com/go-redis/redis/v8" - "go.mongodb.org/mongo-driver/mongo" - "go.uber.org/zap" - "gorm.io/gorm" + "net/http" ) type App struct { - Key string - ZapLog *zap.Logger // 日志服务 - Db *gorm.DB // 关系数据库服务 - RDb *redis.Client // 缓存数据库服务 - MDb *mongo.Client // 非关系数据库服务 + Key string + Mongo gomongo.App // 日志数据库 } func (app *App) request(url string, params map[string]interface{}) (body []byte, err error) { @@ -24,8 +18,6 @@ func (app *App) request(url string, params map[string]interface{}) (body []byte, // 请求 postJson, err := gohttp.PostJson(url, paramsStr) // 日志 - if app.ZapLog != nil { - app.ZapLog.Sugar().Info(fmt.Sprintf("%s %s %s", url, postJson.Header, postJson.Body)) - } + go app.mongoLog(url, params, http.MethodPost, postJson) return postJson.Body, err } diff --git a/service/wechatqy/go.mod b/service/wechatqy/go.mod deleted file mode 100644 index c380105a..00000000 --- a/service/wechatqy/go.mod +++ /dev/null @@ -1,31 +0,0 @@ -module github.com/dtapps/go-library/service/wechatqy - -go 1.18 - -require ( - github.com/dtapps/go-library/utils/gohttp v0.0.0-20220320040709-ad8a5f0e9e40 - github.com/go-redis/redis/v8 v8.11.5 - go.mongodb.org/mongo-driver v1.8.4 - go.uber.org/zap v1.21.0 - gorm.io/gorm v1.23.3 -) - -require ( - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/go-stack/stack v1.8.0 // indirect - github.com/golang/snappy v0.0.1 // indirect - github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jinzhu/now v1.1.4 // indirect - github.com/klauspost/compress v1.13.6 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.0.2 // indirect - github.com/xdg-go/stringprep v1.0.2 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f // indirect - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/text v0.3.6 // indirect -) diff --git a/service/wechatqy/mongodb.go b/service/wechatqy/mongodb.go new file mode 100644 index 00000000..06b1ba2e --- /dev/null +++ b/service/wechatqy/mongodb.go @@ -0,0 +1,47 @@ +package wechatqy + +import ( + "dtapps/dta/library/utils/gohttp" + "encoding/json" + "gitee.com/dtapps/go-library/utils/gotime" +) + +// 日志 +type mongoZap struct { + Url string `json:"url" bson:"url"` + Params interface{} `json:"params" bson:"params"` + Method string `json:"method" bson:"method"` + Header interface{} `json:"header" bson:"header"` + Status string `json:"status" bson:"status"` + StatusCode int `json:"status_code" bson:"status_code"` + Body interface{} `json:"body" bson:"body"` + ContentLength int64 `json:"content_length" bson:"content_length"` + CreateTime string `json:"create_time" bson:"create_time"` +} + +func (m *mongoZap) Database() string { + return "zap_logs" +} + +func (m *mongoZap) TableName() string { + return "wechatqy_" + gotime.Current().SetFormat("200601") +} + +func (app *App) mongoLog(url string, params map[string]interface{}, method string, request gohttp.Response) { + if app.Mongo.Db == nil { + return + } + var body map[string]interface{} + _ = json.Unmarshal(request.Body, &body) + app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{ + Url: url, + Params: params, + Method: method, + Header: request.Header, + Status: request.Status, + StatusCode: request.StatusCode, + Body: body, + ContentLength: request.ContentLength, + CreateTime: gotime.Current().Format(), + }) +} diff --git a/service/wechatqy/webhook.send.go b/service/wechatqy/webhook.send.go index 12c1492c..32d3f948 100644 --- a/service/wechatqy/webhook.send.go +++ b/service/wechatqy/webhook.send.go @@ -23,7 +23,7 @@ func NewWebhookSendResult(result WebhookSendResponse, body []byte, err error) *W return &WebhookSendResult{Result: result, Body: body, Err: err} } -// WebhookSend https://work.weixin.qq.com/api/doc/90000/90136/91770 +// WebhookSend https://developer.work.weixin.qq.com/document/path/90372 func (app *App) WebhookSend(notMustParams ...Params) *WebhookSendResult { // 参数 params := app.NewParamsWith(notMustParams...) diff --git a/service/wechatunion/app.go b/service/wechatunion/app.go index a1359cd6..5daaacef 100644 --- a/service/wechatunion/app.go +++ b/service/wechatunion/app.go @@ -1,44 +1,42 @@ package wechatunion import ( + "dtapps/dta/library/utils/gohttp" + "dtapps/dta/library/utils/gomongo" + "dtapps/dta/library/utils/goredis" "encoding/json" "errors" - "fmt" - "github.com/dtapps/go-library/utils/gohttp" - "github.com/go-redis/redis/v8" - "go.mongodb.org/mongo-driver/mongo" - "go.uber.org/zap" - "gorm.io/gorm" "net/http" ) +// App 微信小程序联盟 type App struct { - AppId string // 小程序唯一凭证,即 AppID - AppSecret string // 小程序唯一凭证密钥,即 AppSecret - AccessToken string // 接口调用凭证 - ZapLog *zap.Logger // 日志服务 - Db *gorm.DB // 关系数据库服务 - RDb *redis.Client // 缓存数据库服务 - MDb *mongo.Client // 非关系数据库服务 + AppId string // 小程序唯一凭证,即 AppID + AppSecret string // 小程序唯一凭证密钥,即 AppSecret + AccessToken string // 接口调用凭证 + Pid string // 推广位PID + Redis goredis.App // 缓存数据库服务 + Mongo gomongo.App // 日志数据库 } +const ( + UnionUrl = "https://api.weixin.qq.com/union" +) + +// 请求 func (app *App) request(url string, params map[string]interface{}, method string) (resp []byte, err error) { switch method { case http.MethodGet: get, err := gohttp.Get(url, params) // 日志 - if app.ZapLog != nil { - app.ZapLog.Sugar().Info(fmt.Sprintf("wechatunion %s %s %s", url, get.Header, get.Body)) - } + go app.mongoLog(url, params, method, get) return get.Body, err case http.MethodPost: // 请求参数 paramsStr, err := json.Marshal(params) postJson, err := gohttp.PostJson(url, paramsStr) // 日志 - if app.ZapLog != nil { - app.ZapLog.Sugar().Info(fmt.Sprintf("wechatunion %s %s %s", url, postJson.Header, postJson.Body)) - } + go app.mongoLog(url, params, method, postJson) return postJson.Body, err default: return nil, errors.New("请求类型不支持") diff --git a/service/wechatunion/cgi-bin.token.db.go b/service/wechatunion/cgi-bin.token.db.go deleted file mode 100644 index a1d9818a..00000000 --- a/service/wechatunion/cgi-bin.token.db.go +++ /dev/null @@ -1,47 +0,0 @@ -package wechatunion - -import ( - "github.com/dtapps/go-library/utils/gotime" - "time" -) - -type WechatAccessTokenDbModel struct { - ID int64 `json:"id"` - AppID string `json:"app_id"` - AppSecret string `json:"app_secret"` - AccessToken string `json:"access_token"` - ExpiresIn int `json:"expires_in"` - ExpiresTime string `json:"expires_time"` - CreateTime time.Time `gorm:"autoCreateTime" json:"-"` -} - -func (m *WechatAccessTokenDbModel) TableName() string { - return "wechat_access_token" -} - -func (app *App) wechatAccessTokenModelTake() (result WechatAccessTokenDbModel) { - app.Db.Where("app_id = ?", app.AppId).Where("expires_time > ?", gotime.Current().Format()).Take(&result) - return result -} - -func (app *App) GetAccessTokenDb() string { - wat := app.wechatAccessTokenModelTake() - if wat.AccessToken != "" { - return wat.AccessToken - } else { - token := app.AuthGetAccessToken() - if token.Result.AccessToken == "" { - return "" - } else { - // 创建 - app.Db.Create(&WechatAccessTokenDbModel{ - AppID: app.AppId, - AppSecret: app.AppSecret, - AccessToken: token.Result.AccessToken, - ExpiresIn: token.Result.ExpiresIn, - ExpiresTime: gotime.Current().AfterSeconds(7000).Format(), - }) - return token.Result.AccessToken - } - } -} diff --git a/service/wechatunion/cgi-bin.token.monitor.go b/service/wechatunion/cgi-bin.token.monitor.go index 4ee435e4..72145ce7 100644 --- a/service/wechatunion/cgi-bin.token.monitor.go +++ b/service/wechatunion/cgi-bin.token.monitor.go @@ -1,38 +1,20 @@ package wechatunion import ( + "context" "errors" + "time" ) -var ( - QdTypeDb = "DB" - QdTypeRdb = "redis" -) - -func (app *App) AuthGetAccessTokenMonitor(qdType string) (string, error) { - switch qdType { - case QdTypeDb: - if app.Db == nil { - return "", errors.New("驱动没有初始化") - } - app.AccessToken = app.GetAccessTokenDb() - result := app.GetCallBackIp() - if len(result.Result.IpList) <= 0 { - return app.GetAccessTokenDb(), nil - } - return app.AccessToken, nil - case QdTypeRdb: - if app.RDb == nil { - return "", errors.New("驱动没有初始化") - } - app.AccessToken = app.GetAccessTokenRDb() - result := app.GetCallBackIp() - if len(result.Result.IpList) <= 0 { - return app.GetAccessTokenRDb(), nil - } - return app.AccessToken, nil - default: - return "", errors.New("驱动类型不在范围内") +func (app *App) GetAccessTokenMonitor() (string, error) { + if app.Redis.Db == nil { + return "", errors.New("驱动没有初始化") + } + result := app.GetCallBackIp() + if len(result.Result.IpList) <= 0 { + token := app.CgiBinToken() + app.Redis.Db.Set(context.Background(), app.getAccessTokenCacheKeyName(), token.Result.AccessToken, time.Second*7000) + return token.Result.AccessToken, nil } - return "", nil + return app.AccessToken, nil } diff --git a/service/wechatunion/cgi-bin.token.rdb.go b/service/wechatunion/cgi-bin.token.rdb.go index 411af6fd..bde3a26a 100644 --- a/service/wechatunion/cgi-bin.token.rdb.go +++ b/service/wechatunion/cgi-bin.token.rdb.go @@ -2,19 +2,21 @@ package wechatunion import ( "fmt" - "github.com/dtapps/go-library/utils/goredis" "time" ) -func (app *App) GetAccessTokenRDb() string { - cacheName := fmt.Sprintf("wechat_access_token:%v", app.AppId) - redis := goredis.App{ - Rdb: app.RDb, +func (app *App) GetAccessToken() string { + if app.Redis.Db == nil { + return app.AccessToken } - newCache := redis.NewSimpleStringCache(redis.NewStringOperation(), time.Second*7000) + newCache := app.Redis.NewSimpleStringCache(app.Redis.NewStringOperation(), time.Second*7000) newCache.DBGetter = func() string { - token := app.AuthGetAccessToken() + token := app.CgiBinToken() return token.Result.AccessToken } - return newCache.GetCache(cacheName) + return newCache.GetCache(app.getAccessTokenCacheKeyName()) +} + +func (app *App) getAccessTokenCacheKeyName() string { + return fmt.Sprintf("wechat_access_token:%v", app.AppId) } diff --git a/service/wechatunion/cgi_bin.token.go b/service/wechatunion/cgi_bin.token.go index 39d81035..a0ae3bdf 100644 --- a/service/wechatunion/cgi_bin.token.go +++ b/service/wechatunion/cgi_bin.token.go @@ -6,31 +6,31 @@ import ( "net/http" ) -type AuthGetAccessTokenResponse struct { +type CgiBinTokenResponse struct { AccessToken string `json:"access_token"` // 获取到的凭证 ExpiresIn int `json:"expires_in"` // 凭证有效时间,单位:秒。目前是7200秒之内的值 Errcode int `json:"errcode"` // 错误码 Errmsg string `json:"errmsg"` // 错误信息 } -type AuthGetAccessTokenResult struct { - Result AuthGetAccessTokenResponse // 结果 - Byte []byte // 内容 - Err error // 错误 +type CgiBinTokenResult struct { + Result CgiBinTokenResponse // 结果 + Byte []byte // 内容 + Err error // 错误 } -func NewAuthGetAccessTokenResult(result AuthGetAccessTokenResponse, byte []byte, err error) *AuthGetAccessTokenResult { - return &AuthGetAccessTokenResult{Result: result, Byte: byte, Err: err} +func NewCgiBinTokenResult(result CgiBinTokenResponse, byte []byte, err error) *CgiBinTokenResult { + return &CgiBinTokenResult{Result: result, Byte: byte, Err: err} } -// AuthGetAccessToken +// CgiBinToken // 接口调用凭证 // https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html -func (app *App) AuthGetAccessToken() *AuthGetAccessTokenResult { +func (app *App) CgiBinToken() *CgiBinTokenResult { // 请求 body, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", app.AppId, app.AppSecret), map[string]interface{}{}, http.MethodGet) // 定义 - var response AuthGetAccessTokenResponse + var response CgiBinTokenResponse err = json.Unmarshal(body, &response) - return NewAuthGetAccessTokenResult(response, body, err) + return NewCgiBinTokenResult(response, body, err) } diff --git a/service/wechatunion/getcallbackip.go b/service/wechatunion/getcallbackip.go index b2721998..6cdc10f6 100644 --- a/service/wechatunion/getcallbackip.go +++ b/service/wechatunion/getcallbackip.go @@ -23,6 +23,7 @@ func NewGetCallBackIpResult(result GetCallBackIpResponse, byte []byte, err error // callback IP即微信调用开发者服务器所使用的出口IP。 // https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_the_WeChat_server_IP_address.html#2.%20%E8%8E%B7%E5%8F%96%E5%BE%AE%E4%BF%A1callback%20IP%E5%9C%B0%E5%9D%80 func (app *App) GetCallBackIp() *GetCallBackIpResult { + app.AccessToken = app.GetAccessToken() // 请求 body, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=%s", app.AccessToken), map[string]interface{}{}, "GET") // 定义 diff --git a/service/wechatunion/go.mod b/service/wechatunion/go.mod deleted file mode 100644 index 07de7cef..00000000 --- a/service/wechatunion/go.mod +++ /dev/null @@ -1,33 +0,0 @@ -module github.com/dtapps/go-library/service/wechatunion - -go 1.18 - -require ( - github.com/dtapps/go-library/utils/gohttp v0.0.0-20220320040709-ad8a5f0e9e40 - github.com/dtapps/go-library/utils/goredis v0.0.0-20220320040709-ad8a5f0e9e40 - github.com/dtapps/go-library/utils/gotime v0.0.0-20220320040709-ad8a5f0e9e40 - go.mongodb.org/mongo-driver v1.8.4 - go.uber.org/zap v1.21.0 - gorm.io/gorm v1.23.3 -) - -require ( - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/go-redis/redis/v8 v8.11.5 // indirect - github.com/go-stack/stack v1.8.0 // indirect - github.com/golang/snappy v0.0.1 // indirect - github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jinzhu/now v1.1.4 // indirect - github.com/klauspost/compress v1.13.6 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.0.2 // indirect - github.com/xdg-go/stringprep v1.0.2 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f // indirect - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/text v0.3.6 // indirect -) diff --git a/service/wechatunion/mongodb.go b/service/wechatunion/mongodb.go new file mode 100644 index 00000000..4d33d85e --- /dev/null +++ b/service/wechatunion/mongodb.go @@ -0,0 +1,47 @@ +package wechatunion + +import ( + "dtapps/dta/library/utils/gohttp" + "encoding/json" + "gitee.com/dtapps/go-library/utils/gotime" +) + +// 日志 +type mongoZap struct { + Url string `json:"url" bson:"url"` + Params interface{} `json:"params" bson:"params"` + Method string `json:"method" bson:"method"` + Header interface{} `json:"header" bson:"header"` + Status string `json:"status" bson:"status"` + StatusCode int `json:"status_code" bson:"status_code"` + Body interface{} `json:"body" bson:"body"` + ContentLength int64 `json:"content_length" bson:"content_length"` + CreateTime string `json:"create_time" bson:"create_time"` +} + +func (m *mongoZap) Database() string { + return "zap_logs" +} + +func (m *mongoZap) TableName() string { + return "wechatunion_" + gotime.Current().SetFormat("200601") +} + +func (app *App) mongoLog(url string, params map[string]interface{}, method string, request gohttp.Response) { + if app.Mongo.Db == nil { + return + } + var body map[string]interface{} + _ = json.Unmarshal(request.Body, &body) + app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{ + Url: url, + Params: params, + Method: method, + Header: request.Header, + Status: request.Status, + StatusCode: request.StatusCode, + Body: body, + ContentLength: request.ContentLength, + CreateTime: gotime.Current().Format(), + }) +} diff --git a/service/wechatunion/promoter.order.info.go b/service/wechatunion/promoter.order.info.go new file mode 100644 index 00000000..7a866208 --- /dev/null +++ b/service/wechatunion/promoter.order.info.go @@ -0,0 +1,71 @@ +package wechatunion + +import ( + "encoding/json" + "fmt" + "net/http" +) + +type PromoterOrderInfoResponse struct { + Errcode int `json:"errcode"` // 错误码 + Errmsg string `json:"errmsg"` // 错误信息 + OrderList []struct { + OrderId string `json:"orderId"` // 订单ID + PayTime int64 `json:"payTime"` // 支付时间戳,单位为s + ConfirmReceiptTime int `json:"confirmReceiptTime"` // 确认收货时间戳,单位为s,没有时为0 + ShopName string `json:"shopName"` // 店铺名称 + ShopAppid string `json:"shopAppid"` // 店铺 Appid + ProductList []struct { + ProductId string `json:"productId"` // 商品SPU ID + SkuId string `json:"skuId"` // sku ID + Title string `json:"title"` // 商品名称 + ThumbImg string `json:"thumbImg"` // 商品缩略图 url + Price string `json:"price"` // 商品成交总价,前带单位 ¥ + ProductCnt int `json:"productCnt"` // 成交数量 + Ratio int64 `json:"ratio"` // 分佣比例,单位为万分之一 + CommissionStatus string `json:"commissionStatus"` // 分佣状态 + CommissionStatusUpdateTime string `json:"commissionStatusUpdateTime"` // 分佣状态更新时间戳,单位为s + ProfitShardingSucTime string `json:"profitShardingSucTime"` // 结算时间,当分佣状态为已结算才有值,单位为s + Commission string `json:"commission"` // 分佣金额,前带单位 ¥ + EstimatedCommission int `json:"estimatedCommission"` // 预估分佣金额,单位为分 + CategoryStr string `json:"categoryStr"` // 类目名称,多个用英文逗号分隔 + PromotionInfo struct { + PromotionSourcePid string `json:"promotionSourcePid"` // 推广位 id + PromotionSourceName string `json:"promotionSourceName"` // 推广位名称 + } `json:"promotionInfo"` // 推广信息 + CustomizeInfo string `json:"customizeInfo"` // 自定义信息 + } `json:"productList"` // 商品列表 + CustomUserId string `json:"customUserId"` // 自定义用户参数 + UserNickName string `json:"userNickName"` // 用户昵称 + OrderPrice string `json:"orderPrice"` // 支付金额,单位为分 + } `json:"orderList"` +} + +type PromoterOrderInfoResult struct { + Result PromoterOrderInfoResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewPromoterOrderInfoResult(result PromoterOrderInfoResponse, body []byte, err error) *PromoterOrderInfoResult { + return &PromoterOrderInfoResult{Result: result, Body: body, Err: err} +} + +// PromoterOrderInfo 根据订单ID查询订单详情 +// https://developers.weixin.qq.com/doc/ministore/union/access-guidelines/promoter/api/order/order-info.html#_1-%E6%A0%B9%E6%8D%AE%E8%AE%A2%E5%8D%95ID%E6%9F%A5%E8%AF%A2%E8%AE%A2%E5%8D%95%E8%AF%A6%E6%83%85 +func (app *App) PromoterOrderInfo(orderId ...string) *PromoterOrderInfoResult { + app.AccessToken = app.GetAccessToken() + // 参数 + params := app.NewParamsWith() + var orderIdList []any + for _, v := range orderId { + orderIdList = append(orderIdList, v) + } + params.Set("orderIdList", orderIdList) + // 请求 + body, err := app.request(UnionUrl+fmt.Sprintf("/promoter/order/info?access_token=%s", app.AccessToken), params, http.MethodPost) + // 定义 + var response PromoterOrderInfoResponse + err = json.Unmarshal(body, &response) + return NewPromoterOrderInfoResult(response, body, err) +} diff --git a/service/wechatunion/promoter.order.search.go b/service/wechatunion/promoter.order.search.go new file mode 100644 index 00000000..a6a806ad --- /dev/null +++ b/service/wechatunion/promoter.order.search.go @@ -0,0 +1,68 @@ +package wechatunion + +import ( + "encoding/json" + "fmt" + "net/http" +) + +type PromoterOrderSearchResponse struct { + Errcode int `json:"errcode"` // 错误码 + Errmsg string `json:"errmsg"` // 错误信息 + OrderList []struct { + OrderId string `json:"orderId"` // 订单ID + PayTime int64 `json:"payTime"` // 支付时间戳,单位为s + ConfirmReceiptTime int `json:"confirmReceiptTime"` // 确认收货时间戳,单位为s,没有时为0 + ShopName string `json:"shopName"` // 店铺名称 + ShopAppid string `json:"shopAppid"` // 店铺 Appid + ProductList []struct { + ProductId string `json:"productId"` // 商品SPU ID + SkuId string `json:"skuId"` // sku ID + Title string `json:"title"` // 商品名称 + ThumbImg string `json:"thumbImg"` // 商品缩略图 url + Price string `json:"price"` // 商品成交总价,前带单位 ¥ + ProductCnt int `json:"productCnt"` // 成交数量 + Ratio int64 `json:"ratio"` // 分佣比例,单位为万分之一 + CommissionStatus string `json:"commissionStatus"` // 分佣状态 + CommissionStatusUpdateTime string `json:"commissionStatusUpdateTime"` // 分佣状态更新时间戳,单位为s + ProfitShardingSucTime string `json:"profitShardingSucTime"` // 结算时间,当分佣状态为已结算才有值,单位为s + Commission string `json:"commission"` // 分佣金额,前带单位 ¥ + EstimatedCommission int `json:"estimatedCommission"` // 预估分佣金额,单位为分 + CategoryStr string `json:"categoryStr"` // 类目名称,多个用英文逗号分隔 + PromotionInfo struct { + PromotionSourcePid string `json:"promotionSourcePid"` // 推广位 id + PromotionSourceName string `json:"promotionSourceName"` // 推广位名称 + } `json:"promotionInfo"` // 推广信息 + CustomizeInfo string `json:"customizeInfo"` // 自定义信息 + } `json:"productList"` // 商品列表 + CustomUserId string `json:"customUserId"` // 自定义用户参数 + UserNickName string `json:"userNickName"` // 用户昵称 + OrderPrice string `json:"orderPrice"` // 支付金额,单位为分 + } `json:"orderList"` // 订单列表 + PageSize int `json:"pageSize"` // 分页大小 + TotalNum int `json:"totalNum"` // 订单总数 +} + +type PromoterOrderSearchResult struct { + Result PromoterOrderSearchResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewPromoterOrderSearchResult(result PromoterOrderSearchResponse, body []byte, err error) *PromoterOrderSearchResult { + return &PromoterOrderSearchResult{Result: result, Body: body, Err: err} +} + +// PromoterOrderSearch 根据订单支付时间、订单分佣状态拉取订单详情 +// https://developers.weixin.qq.com/doc/ministore/union/access-guidelines/promoter/api/order/order-info.html#_2-%E6%A0%B9%E6%8D%AE%E8%AE%A2%E5%8D%95%E6%94%AF%E4%BB%98%E6%97%B6%E9%97%B4%E3%80%81%E8%AE%A2%E5%8D%95%E5%88%86%E4%BD%A3%E7%8A%B6%E6%80%81%E6%8B%89%E5%8F%96%E8%AE%A2%E5%8D%95%E8%AF%A6%E6%83%85 +func (app *App) PromoterOrderSearch(notMustParams ...Params) *PromoterOrderSearchResult { + app.AccessToken = app.GetAccessToken() + // 参数 + params := app.NewParamsWith(notMustParams...) + // 请求 + body, err := app.request(UnionUrl+fmt.Sprintf("/promoter/order/search?access_token=%s", app.AccessToken), params, http.MethodGet) + // 定义 + var response PromoterOrderSearchResponse + err = json.Unmarshal(body, &response) + return NewPromoterOrderSearchResult(response, body, err) +} diff --git a/service/wechatunion/promoter.product.category.go b/service/wechatunion/promoter.product.category.go index 520988a9..373d8581 100644 --- a/service/wechatunion/promoter.product.category.go +++ b/service/wechatunion/promoter.product.category.go @@ -1,11 +1,12 @@ package wechatunion import ( + "encoding/json" "fmt" "net/http" ) -type PromoterProductCategoryResult struct { +type PromoterProductCategoryResponse struct { Errcode int `json:"errcode"` // 错误码 Errmsg string `json:"errmsg"` // 错误信息 ProductCats []struct { @@ -14,12 +15,27 @@ type PromoterProductCategoryResult struct { } `json:"productCats"` // 类目数据 } -// PromoterProductCategory -// 获取联盟商品类目列表及类目ID -// 通过该接口获取联盟商品的一级类目列表以及类目ID,可用于筛选联盟商品 -// https://developers.weixin.qq.com/doc/ministore/union/access-guidelines/promoter/api/product/category.html -func (app *App) PromoterProductCategory() (body []byte, err error) { +type PromoterProductCategoryResult struct { + Result PromoterProductCategoryResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewPromoterProductCategoryResult(result PromoterProductCategoryResponse, body []byte, err error) *PromoterProductCategoryResult { + return &PromoterProductCategoryResult{Result: result, Body: body, Err: err} +} + +// PromoterProductCategory 获取联盟商品类目列表及类目ID +// https://developers.weixin.qq.com/doc/ministore/union/access-guidelines/promoter/api/product/category.html#_1-%E8%8E%B7%E5%8F%96%E8%81%94%E7%9B%9F%E5%95%86%E5%93%81%E7%B1%BB%E7%9B%AE%E5%88%97%E8%A1%A8%E5%8F%8A%E7%B1%BB%E7%9B%AEID +func (app *App) PromoterProductCategory() *PromoterProductCategoryResult { + app.AccessToken = app.GetAccessToken() // 请求 - body, err = app.request(fmt.Sprintf("https://api.weixin.qq.com/union/promoter/product/category?access_token=%s", app.AccessToken), map[string]interface{}{}, http.MethodGet) - return body, err + body, err := app.request(UnionUrl+fmt.Sprintf("/promoter/product/category?access_token=%s", app.AccessToken), map[string]interface{}{}, http.MethodGet) + if err != nil { + return NewPromoterProductCategoryResult(PromoterProductCategoryResponse{}, body, err) + } + // 定义 + var response PromoterProductCategoryResponse + err = json.Unmarshal(body, &response) + return NewPromoterProductCategoryResult(response, body, err) } diff --git a/service/wechatunion/promoter.product.generate.go b/service/wechatunion/promoter.product.generate.go index 25bc7d8b..82929d74 100644 --- a/service/wechatunion/promoter.product.generate.go +++ b/service/wechatunion/promoter.product.generate.go @@ -1,11 +1,12 @@ package wechatunion import ( + "encoding/json" "fmt" "net/http" ) -type PromoterProductGenerateResult struct { +type PromoterProductGenerateResponse struct { Errcode int `json:"errcode"` // 错误码 Errmsg string `json:"errmsg"` // 错误信息 List []struct { @@ -24,6 +25,7 @@ type PromoterProductGenerateResult struct { TotalStockNum int `json:"totalStockNum"` // 商品库存 } `json:"productInfo"` // 商品相关信息 ShareInfo struct { + Username string `json:"username"` // 推广商品的小程序原始id AppId string `json:"appId"` // 推广商品的小程序AppID Path string `json:"path"` // 推广商品的小程序Path CouponPath string `json:"couponPath"` // 推广商品的带券小程序Path @@ -33,18 +35,33 @@ type PromoterProductGenerateResult struct { CouponPromotionUrl string `json:"couponPromotionUrl"` // 推广商品带券短链 PromotionWording string `json:"promotionWording"` // 推广商品文案 CouponPromotionWording string `json:"couponPromotionWording"` // 推广商品带券文案 + PromotionTag string `json:"promotionTag"` // 推广商品tag + CouponPromotionTag string `json:"couponPromotionTag"` // 推广商品带券tag } `json:"shareInfo"` // 推广相关信息 } `json:"list"` } -// PromoterProductGenerate -// 获取商品推广素材 -// 通过该接口获取商品的推广素材,包括店铺appID、商品详情页Path、推广文案及推广短链、商品图片等 -// https://developers.weixin.qq.com/doc/ministore/union/access-guidelines/promoter/api/product/category.html -func (app *App) PromoterProductGenerate(notMustParams ...Params) (body []byte, err error) { +type PromoterProductGenerateResult struct { + Result PromoterProductGenerateResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewPromoterProductGenerateResult(result PromoterProductGenerateResponse, body []byte, err error) *PromoterProductGenerateResult { + return &PromoterProductGenerateResult{Result: result, Body: body, Err: err} +} + +// PromoterProductGenerate 获取商品推广素材 +// https://developers.weixin.qq.com/doc/ministore/union/access-guidelines/promoter/api/product/category.html#_4-%E8%8E%B7%E5%8F%96%E5%95%86%E5%93%81%E6%8E%A8%E5%B9%BF%E7%B4%A0%E6%9D%90 +func (app *App) PromoterProductGenerate(notMustParams ...Params) *PromoterProductGenerateResult { + app.AccessToken = app.GetAccessToken() // 参数 params := app.NewParamsWith(notMustParams...) + params.Set("pid", app.Pid) // 请求 - body, err = app.request(fmt.Sprintf("https://api.weixin.qq.com/union/promoter/product/generate?access_token=%s", app.AccessToken), params, http.MethodPost) - return body, err + body, err := app.request(UnionUrl+fmt.Sprintf("/promoter/product/generate?access_token=%s", app.AccessToken), params, http.MethodPost) + // 定义 + var response PromoterProductGenerateResponse + err = json.Unmarshal(body, &response) + return NewPromoterProductGenerateResult(response, body, err) } diff --git a/service/wechatunion/promoter.product.list.go b/service/wechatunion/promoter.product.list.go index e3f49037..b0c30df5 100644 --- a/service/wechatunion/promoter.product.list.go +++ b/service/wechatunion/promoter.product.list.go @@ -1,11 +1,12 @@ package wechatunion import ( + "encoding/json" "fmt" "net/http" ) -type PromoterProductListResult struct { +type PromoterProductListResponse struct { Errcode int `json:"errcode"` // 错误码 Errmsg string `json:"errmsg"` // 错误信息 Msg string `json:"msg"` // 错误信息 @@ -29,10 +30,11 @@ type PromoterProductListResult struct { DetailImg []string `json:"detailImg"` // 商品详情图片 } `json:"detail"` // 商品详细数据 Param []interface{} `json:"param"` // 商品参数 - MinPrice int `json:"minPrice"` // 商品最低价格,单位分 - TotalStockNum int `json:"totalStockNum"` // 总库存 + MinPrice int64 `json:"minPrice"` // 商品最低价格,单位分 + TotalStockNum int64 `json:"totalStockNum"` // 总库存 + TotalSoldNum int64 `json:"totalSoldNum"` // 累计销量 TotalOrderNum int `json:"totalOrderNum"` // 累计订单量 - DiscountPrice int `json:"discountPrice"` // 商品券后价 + DiscountPrice int64 `json:"discountPrice"` // 商品券后价 } `json:"info"` // 商品具体信息 Skus []struct { SkuId string `json:"skuId"` // 商品SKU ID @@ -47,9 +49,9 @@ type PromoterProductListResult struct { } `json:"skus"` // 商品SKU } `json:"product"` // 商品数据 LeagueExInfo struct { - HasCommission int `json:"hasCommission"` // 是否有佣金,1/0 - CommissionRatio int `json:"commissionRatio"` // 佣金比例,万分之一 - CommissionValue int `json:"commissionValue"` // 佣金金额,单位分 + HasCommission int `json:"hasCommission"` // 是否有佣金,1/0 + CommissionRatio int64 `json:"commissionRatio"` // 佣金比例,万分之一 + CommissionValue int64 `json:"commissionValue"` // 佣金金额,单位分 } `json:"leagueExInfo"` // 联盟佣金相关数据 ShopInfo struct { Name string `json:"name"` // 小商店名称 @@ -104,8 +106,8 @@ type PromoterProductListResult struct { ProductCnt string `json:"productCnt"` // 商品数 ProductPrice string `json:"productPrice"` // 商品金额 } `json:"discountCondition"` // 指定商品 id - DiscountNum int `json:"discountNum,omitempty"` // 折扣数,如 5.1 折 为 5.1 * 1000 - DiscountFee int64 `json:"discountFee,omitempty"` // 直减金额,单位为分 + DiscountNum int `json:"discountNum,omitempty"` // 折扣数,如 5.1 折 为 5.1 * 1000 + DiscountFee string `json:"discountFee,omitempty"` // 直减金额,单位为分 } `json:"discountInfo"` // 券面额 ValidInfo struct { ValidType int `json:"validType"` // 有效期类型,1 为商品指定时间区间,2 为生效天数 @@ -123,14 +125,26 @@ type PromoterProductListResult struct { } `json:"productList"` // 商品列表数据 } -// PromoterProductList -// 查询全量商品 -// 支持开发者根据多种筛选条件获取可供推广的商品列表及详情,筛选条件包括商品关键词(名称、店铺、spuID)、商品累计销量、商品价格、商品佣金、佣金比例、是否含有联盟券、配送方式、发货地区等 -// https://developers.weixin.qq.com/doc/ministore/union/access-guidelines/promoter/api/product/category.html -func (app *App) PromoterProductList(notMustParams ...Params) (body []byte, err error) { +type PromoterProductListResult struct { + Result PromoterProductListResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewPromoterProductListResult(result PromoterProductListResponse, body []byte, err error) *PromoterProductListResult { + return &PromoterProductListResult{Result: result, Body: body, Err: err} +} + +// PromoterProductList 查询全量商品 +// https://developers.weixin.qq.com/doc/ministore/union/access-guidelines/promoter/api/product/category.html#_2-%E6%9F%A5%E8%AF%A2%E5%85%A8%E9%87%8F%E5%95%86%E5%93%81 +func (app *App) PromoterProductList(notMustParams ...Params) *PromoterProductListResult { + app.AccessToken = app.GetAccessToken() // 参数 params := app.NewParamsWith(notMustParams...) // 请求 - body, err = app.request(fmt.Sprintf("https://api.weixin.qq.com/union/promoter/product/list?access_token=%s", app.AccessToken), params, http.MethodGet) - return body, err + body, err := app.request(UnionUrl+fmt.Sprintf("/promoter/product/list?access_token=%s", app.AccessToken), params, http.MethodGet) + // 定义 + var response PromoterProductListResponse + err = json.Unmarshal(body, &response) + return NewPromoterProductListResult(response, body, err) } diff --git a/service/wechatunion/promoter.product.select.go b/service/wechatunion/promoter.product.select.go index 9f3edb6a..0b3fd467 100644 --- a/service/wechatunion/promoter.product.select.go +++ b/service/wechatunion/promoter.product.select.go @@ -1,14 +1,15 @@ package wechatunion import ( + "encoding/json" "fmt" "net/http" ) -type PromoterProductSelectResult struct { +type PromoterProductSelectResponse struct { Errcode int `json:"errcode"` // 错误码 Errmsg string `json:"errmsg"` // 错误信息 - Total int `json:"total"` // 商品总数 + Total int64 `json:"total"` // 商品总数 ProductList []struct { ProductId string `json:"productId"` // 商品SPU ID Product struct { @@ -123,14 +124,28 @@ type PromoterProductSelectResult struct { } `json:"productList"` // 商品列表数据 } +type PromoterProductSelectResult struct { + Result PromoterProductSelectResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewPromoterProductSelectResult(result PromoterProductSelectResponse, body []byte, err error) *PromoterProductSelectResult { + return &PromoterProductSelectResult{Result: result, Body: body, Err: err} +} + // PromoterProductSelect // 查询联盟精选商品 // 支持开发者根据多种筛选条件获取联盟精选的商品列表及详情,筛选条件包括商品价格、商品佣金、商品累计销量、佣金比例、是否含有联盟券、配送方式、发货地区 // https://developers.weixin.qq.com/doc/ministore/union/access-guidelines/promoter/api/product/category.html#3.%E6%9F%A5%E8%AF%A2%E8%81%94%E7%9B%9F%E7%B2%BE%E9%80%89%E5%95%86%E5%93%81 -func (app *App) PromoterProductSelect(notMustParams ...Params) (body []byte, err error) { +func (app *App) PromoterProductSelect(notMustParams ...Params) *PromoterProductSelectResult { + app.AccessToken = app.GetAccessToken() // 参数 params := app.NewParamsWith(notMustParams...) // 请求 - body, err = app.request(fmt.Sprintf("https://api.weixin.qq.com/union/promoter/product/select?access_token=%s", app.AccessToken), params, http.MethodGet) - return body, err + body, err := app.request(UnionUrl+fmt.Sprintf("/promoter/product/select?access_token=%s", app.AccessToken), params, http.MethodGet) + // 定义 + var response PromoterProductSelectResponse + err = json.Unmarshal(body, &response) + return NewPromoterProductSelectResult(response, body, err) } diff --git a/service/wechatunion/promoter.promotion.add.go b/service/wechatunion/promoter.promotion.add.go new file mode 100644 index 00000000..0846562a --- /dev/null +++ b/service/wechatunion/promoter.promotion.add.go @@ -0,0 +1,38 @@ +package wechatunion + +import ( + "encoding/json" + "fmt" + "net/http" +) + +type PromotionAddResponse struct { + Errcode int `json:"errcode"` // 错误码 + Errmsg string `json:"errmsg"` // 错误信息 + Pid string `json:"pid"` // 推广位ID,PID +} + +type PromotionAddResult struct { + Result PromotionAddResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewPromotionAddResult(result PromotionAddResponse, body []byte, err error) *PromotionAddResult { + return &PromotionAddResult{Result: result, Body: body, Err: err} +} + +// PromotionAdd 添加推广位 +// https://developers.weixin.qq.com/doc/ministore/union/access-guidelines/promoter/api/promotion.html#_1-%E6%B7%BB%E5%8A%A0%E6%8E%A8%E5%B9%BF%E4%BD%8D +func (app *App) PromotionAdd(promotionSourceName string) *PromotionAddResult { + app.AccessToken = app.GetAccessToken() + // 参数 + params := NewParams() + params.Set("promotionSourceName", promotionSourceName) // 推广位名称 + // 请求 + body, err := app.request(UnionUrl+fmt.Sprintf("/promoter/promotion/add?access_token%s", app.AccessToken), params, http.MethodPost) + // 定义 + var response PromotionAddResponse + err = json.Unmarshal(body, &response) + return NewPromotionAddResult(response, body, err) +} diff --git a/service/wechatunion/promoter.promotion.del.go b/service/wechatunion/promoter.promotion.del.go new file mode 100644 index 00000000..67ce4672 --- /dev/null +++ b/service/wechatunion/promoter.promotion.del.go @@ -0,0 +1,38 @@ +package wechatunion + +import ( + "encoding/json" + "fmt" + "net/http" +) + +type PromotionDelResponse struct { + Errcode int `json:"errcode"` // 错误码 + Errmsg string `json:"errmsg"` // 错误信息 +} + +type PromotionDelResult struct { + Result PromotionDelResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewPromotionDelResult(result PromotionDelResponse, body []byte, err error) *PromotionDelResult { + return &PromotionDelResult{Result: result, Body: body, Err: err} +} + +// PromotionDel 删除某个推广位 +// https://developers.weixin.qq.com/doc/ministore/union/access-guidelines/promoter/api/promotion.html#_3-%E7%BC%96%E8%BE%91%E6%8E%A8%E5%B9%BF%E4%BD%8D +func (app *App) PromotionDel(promotionSourcePid, promotionSourceName string) *PromotionDelResult { + app.AccessToken = app.GetAccessToken() + // 参数 + params := NewParams() + params.Set("promotionSourcePid", promotionSourcePid) // 推广位PID + params.Set("promotionSourceName", promotionSourceName) // 推广位名称 + // 请求 + body, err := app.request(UnionUrl+fmt.Sprintf("/promoter/promotion/del?access_token%s", app.AccessToken), params, http.MethodPost) + // 定义 + var response PromotionDelResponse + err = json.Unmarshal(body, &response) + return NewPromotionDelResult(response, body, err) +} diff --git a/service/wechatunion/promoter.promotion.list.go b/service/wechatunion/promoter.promotion.list.go new file mode 100644 index 00000000..200628c1 --- /dev/null +++ b/service/wechatunion/promoter.promotion.list.go @@ -0,0 +1,46 @@ +package wechatunion + +import ( + "encoding/json" + "fmt" + "net/http" +) + +type PromotionListResponse struct { + Errcode int `json:"errcode"` // 错误码 + Errmsg string `json:"errmsg"` // 错误信息 + PromotionSourceList []struct { + PromotionSourceName string `json:"promotionSourceName"` // 推广位名称 + PromotionSourcePid string `json:"promotionSourcePid"` // 推广位ID,PID + Status string `json:"status"` // 状态 + PidId string `json:"pidId"` + } `json:"promotionSourceList"` // 推广位数据 + Total int `json:"total"` // 推广位总数 + PromotionMaxCnt int `json:"promotionMaxCnt"` // 允许创建的推广位最大数量 +} + +type PromotionListResult struct { + Result PromotionListResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewPromotionListResult(result PromotionListResponse, body []byte, err error) *PromotionListResult { + return &PromotionListResult{Result: result, Body: body, Err: err} +} + +// PromotionList 获取推广位列表 +// https://developers.weixin.qq.com/doc/ministore/union/access-guidelines/promoter/api/promotion.html#_4-%E8%8E%B7%E5%8F%96%E6%8E%A8%E5%B9%BF%E4%BD%8D%E5%88%97%E8%A1%A8 +func (app *App) PromotionList(start int, limit int) *PromotionListResult { + app.AccessToken = app.GetAccessToken() + // 参数 + params := NewParams() + params.Set("start", start) // 偏移 + params.Set("limit", limit) // 每页条数 + // 请求 + body, err := app.request(UnionUrl+fmt.Sprintf("/promoter/promotion/list?access_token%s", app.AccessToken), params, http.MethodGet) + // 定义 + var response PromotionListResponse + err = json.Unmarshal(body, &response) + return NewPromotionListResult(response, body, err) +} diff --git a/service/wechatunion/promoter.promotion.upd.go b/service/wechatunion/promoter.promotion.upd.go new file mode 100644 index 00000000..012422aa --- /dev/null +++ b/service/wechatunion/promoter.promotion.upd.go @@ -0,0 +1,36 @@ +package wechatunion + +import ( + "encoding/json" + "fmt" + "net/http" +) + +type PromotionUpdResponse struct { + Errcode int `json:"errcode"` // 错误码 + Errmsg string `json:"errmsg"` // 错误信息 +} + +type PromotionUpdResult struct { + Result PromotionUpdResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewPromotionUpdResult(result PromotionUpdResponse, body []byte, err error) *PromotionUpdResult { + return &PromotionUpdResult{Result: result, Body: body, Err: err} +} + +// PromotionUpd 编辑推广位 +// https://developers.weixin.qq.com/doc/ministore/union/access-guidelines/promoter/api/promotion.html#_3-%E7%BC%96%E8%BE%91%E6%8E%A8%E5%B9%BF%E4%BD%8D +func (app *App) PromotionUpd(notMustParams ...Params) *PromotionUpdResult { + app.AccessToken = app.GetAccessToken() + // 参数 + params := app.NewParamsWith(notMustParams...) + // 请求 + body, err := app.request(UnionUrl+fmt.Sprintf("/promoter/promotion/upd?access_token%s", app.AccessToken), params, http.MethodPost) + // 定义 + var response PromotionUpdResponse + err = json.Unmarshal(body, &response) + return NewPromotionUpdResult(response, body, err) +} diff --git a/service/wechatunion/promotion.go b/service/wechatunion/promotion.go deleted file mode 100644 index 7e56d599..00000000 --- a/service/wechatunion/promotion.go +++ /dev/null @@ -1,164 +0,0 @@ -package wechatunion - -import ( - "encoding/json" - "errors" - "fmt" - "net/http" -) - -type PromotionAddResult struct { - Errcode int `json:"errcode"` - Errmsg string `json:"errmsg"` - Pid string `json:"pid"` // 推广位ID,PID -} - -// PromotionAdd 添加推广位 https://developers.weixin.qq.com/doc/ministore/union/access-guidelines/promoter/api/promotion.html -func (app *App) PromotionAdd(promotionSourceName string) (result PromotionAddResult, err error) { - - if len(app.AccessToken) <= 0 { - return result, errors.New("调用凭证异常") - } - - if len(promotionSourceName) > 20 { - return result, errors.New(fmt.Sprintf("推广位名称(最长20个字,名称不可重复):%d", len(promotionSourceName))) - } - - // request - body, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/union/promoter/promotion/add?access_token%s", app.AccessToken), map[string]interface{}{ - "promotionSourceName": promotionSourceName, - }, http.MethodPost) - if err != nil { - return result, err - } - err = json.Unmarshal(body, &result) - if err != nil { - return result, err - } - if result.Errcode == 14005 { - return result, errors.New(fmt.Sprintf("推广位数量达到上限:%s", err)) - } - if result.Errcode == 14007 { - return result, errors.New(fmt.Sprintf("推广位名称重复:%s", err)) - } - return result, err -} - -type PromotionDel struct { - PromotionSourcePid string `json:"promotionSourcePid"` // 推广位PID - PromotionSourceName string `json:"promotionSourceName"` // 推广位名称 -} - -type PromotionDelResult struct { - Errcode int `json:"errcode"` - Errmsg string `json:"errmsg"` -} - -// PromotionDel 删除某个推广位 https://developers.weixin.qq.com/doc/ministore/union/access-guidelines/promoter/api/promotion.html -func (app *App) PromotionDel(param PromotionDel) (result PromotionDelResult, err error) { - - if len(app.AccessToken) <= 0 { - return result, errors.New("调用凭证异常") - } - - // api params - params := map[string]interface{}{} - b, _ := json.Marshal(¶m) - var m map[string]interface{} - _ = json.Unmarshal(b, &m) - for k, v := range m { - params[k] = v - } - - // request - body, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/union/promoter/promotion/del?access_token%s", app.AccessToken), params, http.MethodPost) - if err != nil { - return result, err - } - err = json.Unmarshal(body, &result) - if err != nil { - return result, err - } - return result, err - -} - -type PromotionUpd struct { - PreviousPromotionInfo struct { - PromotionSourcePid string `json:"promotionSourcePid"` // 要修改的推广位PID - PromotionSourceName string `json:"promotionSourceName"` // 修改前名称 - } `json:"previousPromotionInfo"` - PromotionInfo struct { - PromotionSourceName string `json:"promotionSourceName"` // 修改后名称 - } `json:"promotionInfo"` -} - -type PromotionUpdResult struct { - Errcode int `json:"errcode"` - Errmsg string `json:"errmsg"` -} - -// PromotionUpd 修改指定的推广位名称 https://developers.weixin.qq.com/doc/ministore/union/access-guidelines/promoter/api/promotion.html -func (app *App) PromotionUpd(param PromotionUpd) (result PromotionUpdResult, err error) { - - if len(app.AccessToken) <= 0 { - return result, errors.New("调用凭证异常") - } - - // api params - params := map[string]interface{}{} - b, _ := json.Marshal(¶m) - var m map[string]interface{} - _ = json.Unmarshal(b, &m) - for k, v := range m { - params[k] = v - } - - // request - body, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/union/promoter/promotion/upd?access_token%s", app.AccessToken), params, http.MethodPost) - if err != nil { - return result, err - } - err = json.Unmarshal(body, &result) - if err != nil { - return result, err - } - return result, err - -} - -type PromotionListResult struct { - Errcode int `json:"errcode"` - Errmsg string `json:"errmsg"` - PromotionSourceList []struct { - PromotionSourceName string `json:"promotionSourceName"` // 推广位名称 - PromotionSourcePid string `json:"promotionSourcePid"` // 推广位ID,PID - Status string `json:"status"` // 状态 - PidId string `json:"pidId"` - } `json:"promotionSourceList"` // 推广位数据 - Total int `json:"total"` // 推广位总数 - PromotionMaxCnt int `json:"promotionMaxCnt"` // 允许创建的推广位最大数量 -} - -// PromotionList 获取推广位列表 https://developers.weixin.qq.com/doc/ministore/union/access-guidelines/promoter/api/promotion.html -func (app *App) PromotionList(start int, limit int) (result PromotionListResult, err error) { - - if len(app.AccessToken) <= 0 { - return result, errors.New("调用凭证异常") - } - - // request - body, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/union/promoter/promotion/list?access_token%s", app.AccessToken), map[string]interface{}{ - "start": start, // 偏移 - "limit": limit, // 每页条数 - }, http.MethodGet) - if err != nil { - return result, err - } - err = json.Unmarshal(body, &result) - if err != nil { - return result, err - } - return result, err - -} diff --git a/service/wikeyun/app.go b/service/wikeyun/app.go index 2f494765..553f747b 100644 --- a/service/wikeyun/app.go +++ b/service/wikeyun/app.go @@ -1,12 +1,10 @@ package wikeyun import ( + "dtapps/dta/library/utils/gohttp" + "dtapps/dta/library/utils/gomongo" "fmt" - "github.com/dtapps/go-library/utils/gohttp" - "github.com/go-redis/redis/v8" - "go.mongodb.org/mongo-driver/mongo" - "go.uber.org/zap" - "gorm.io/gorm" + "net/http" ) type App struct { @@ -14,10 +12,7 @@ type App struct { AppKey int AppSecret string ClientIP string - ZapLog *zap.Logger // 日志服务 - Db *gorm.DB // 关系数据库服务 - RDb *redis.Client // 缓存数据库服务 - MDb *mongo.Client // 非关系数据库服务 + Mongo gomongo.App // 日志数据库 } func (app *App) request(url string, params map[string]interface{}) (resp []byte, err error) { @@ -27,8 +22,6 @@ func (app *App) request(url string, params map[string]interface{}) (resp []byte, requestUrl := fmt.Sprintf("%s?app_key=%d×tamp=%s&client=%s&format=%s&v=%s&sign=%s", url, app.AppKey, sign.Timestamp, sign.Client, sign.Format, sign.V, sign.Sign) postForm, err := gohttp.PostForm(requestUrl, params) // 日志 - if app.ZapLog != nil { - app.ZapLog.Sugar().Info(fmt.Sprintf("%s %s %s", url, postForm.Header, postForm.Body)) - } + go app.mongoLog(url, params, http.MethodPost, postForm) return postForm.Body, err } diff --git a/service/wikeyun/go.mod b/service/wikeyun/go.mod deleted file mode 100644 index 5a33f4cd..00000000 --- a/service/wikeyun/go.mod +++ /dev/null @@ -1,33 +0,0 @@ -module github.com/dtapps/go-library/service/wikeyun - -go 1.18 - -require ( - github.com/dtapps/go-library/utils/gohttp v0.0.0-20220320064127-7d7f1f882cd8 - github.com/go-redis/redis/v8 v8.11.5 - go.mongodb.org/mongo-driver v1.8.4 - go.uber.org/zap v1.21.0 - gorm.io/gorm v1.23.3 -) - -require ( - github.com/dtapps/go-library/utils/goheader v0.0.0-20220320040709-ad8a5f0e9e40 // indirect - github.com/dtapps/go-library/utils/gorequest v0.0.0-20220320040709-ad8a5f0e9e40 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/go-stack/stack v1.8.0 // indirect - github.com/golang/snappy v0.0.1 // indirect - github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jinzhu/now v1.1.4 // indirect - github.com/klauspost/compress v1.13.6 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.0.2 // indirect - github.com/xdg-go/stringprep v1.0.2 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f // indirect - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/text v0.3.6 // indirect -) diff --git a/service/wikeyun/mongodb.go b/service/wikeyun/mongodb.go new file mode 100644 index 00000000..e98b814f --- /dev/null +++ b/service/wikeyun/mongodb.go @@ -0,0 +1,47 @@ +package wikeyun + +import ( + "dtapps/dta/library/utils/gohttp" + "encoding/json" + "gitee.com/dtapps/go-library/utils/gotime" +) + +// 日志 +type mongoZap struct { + Url string `json:"url" bson:"url"` + Params interface{} `json:"params" bson:"params"` + Method string `json:"method" bson:"method"` + Header interface{} `json:"header" bson:"header"` + Status string `json:"status" bson:"status"` + StatusCode int `json:"status_code" bson:"status_code"` + Body interface{} `json:"body" bson:"body"` + ContentLength int64 `json:"content_length" bson:"content_length"` + CreateTime string `json:"create_time" bson:"create_time"` +} + +func (m *mongoZap) Database() string { + return "zap_logs" +} + +func (m *mongoZap) TableName() string { + return "wikeyun_" + gotime.Current().SetFormat("200601") +} + +func (app *App) mongoLog(url string, params map[string]interface{}, method string, request gohttp.Response) { + if app.Mongo.Db == nil { + return + } + var body map[string]interface{} + _ = json.Unmarshal(request.Body, &body) + app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{ + Url: url, + Params: params, + Method: method, + Header: request.Header, + Status: request.Status, + StatusCode: request.StatusCode, + Body: body, + ContentLength: request.ContentLength, + CreateTime: gotime.Current().Format(), + }) +} diff --git a/service/wikeyun/oil.go b/service/wikeyun/oil.go deleted file mode 100644 index 3ab7772b..00000000 --- a/service/wikeyun/oil.go +++ /dev/null @@ -1,55 +0,0 @@ -package wikeyun - -// OilCardAdd 添加充值卡 -func (app *App) OilCardAdd(notMustParams ...Params) (body []byte, err error) { - // 参数 - params := app.NewParamsWith(notMustParams...) - // 请求 - body, err = app.request("https://router.wikeyun.cn/rest/Oil/addCard", params) - return body, err -} - -// OilCardEdit 编辑充值卡 -func (app *App) OilCardEdit(notMustParams ...Params) (body []byte, err error) { - // 参数 - params := app.NewParamsWith(notMustParams...) - // 请求 - body, err = app.request("https://router.wikeyun.cn/rest/Oil/editCard", params) - return body, err -} - -// OilCardDel 油卡删除 -func (app *App) OilCardDel(notMustParams ...Params) (body []byte, err error) { - // 参数 - params := app.NewParamsWith(notMustParams...) - // 请求 - body, err = app.request("https://router.wikeyun.cn/rest/Oil/delCard", params) - return body, err -} - -// OilCardInfo 油卡详情 -func (app *App) OilCardInfo(notMustParams ...Params) (body []byte, err error) { - // 参数 - params := app.NewParamsWith(notMustParams...) - // 请求 - body, err = app.request("https://router.wikeyun.cn/rest/Oil/cardInfo", params) - return body, err -} - -// OilOrderPush 充值下单 -func (app *App) OilOrderPush(notMustParams ...Params) (body []byte, err error) { - // 参数 - params := app.NewParamsWith(notMustParams...) - // 请求 - body, err = app.request("https://router.wikeyun.cn/rest/Oil/pushOrder", params) - return body, err -} - -// OilOrderQuery 订单查询 -func (app *App) OilOrderQuery(notMustParams ...Params) (body []byte, err error) { - // 参数 - params := app.NewParamsWith(notMustParams...) - // 请求 - body, err = app.request("https://router.wikeyun.cn/rest/Oil/query", params) - return body, err -} diff --git a/service/wikeyun/power.go b/service/wikeyun/power.go deleted file mode 100644 index 1b3f5975..00000000 --- a/service/wikeyun/power.go +++ /dev/null @@ -1,94 +0,0 @@ -package wikeyun - -type PowerAddCardResult struct { - Code string `json:"code"` - Msg string `json:"msg"` - Time string `json:"time"` - Data struct { - CardNum string `json:"card_num"` - StoreId string `json:"store_id"` - CreateTime int `json:"create_time"` - Type int `json:"type"` // 缴费单位 - CmsUid int `json:"cms_uid"` - Province string `json:"province"` // 缴费省份 - City string `json:"city"` // 缴费城市 - Id string `json:"id"` // 缴费卡编号 - } `json:"data"` -} - -// PowerAddCard 添加充值卡 -func (app *App) PowerAddCard(notMustParams ...Params) (body []byte, err error) { - // 参数 - params := app.NewParamsWith(notMustParams...) - // 请求 - body, err = app.request("https://router.wikeyun.cn/rest/Power/addCard", params) - return body, err -} - -// PowerEditCard 编辑充值卡 -func (app *App) PowerEditCard(notMustParams ...Params) (body []byte, err error) { - // 参数 - params := app.NewParamsWith(notMustParams...) - // 请求 - body, err = app.request("https://router.wikeyun.cn/rest/Power/editCard", params) - return body, err -} - -// PowerDelCard 充值卡删除 -func (app *App) PowerDelCard(notMustParams ...Params) (body []byte, err error) { - // 参数 - params := app.NewParamsWith(notMustParams...) - // 请求 - body, err = app.request("https://router.wikeyun.cn/rest/Power/delCard", params) - return body, err -} - -// PowerCardInfo 充值卡详情 -func (app *App) PowerCardInfo(notMustParams ...Params) (body []byte, err error) { - // 参数 - params := app.NewParamsWith(notMustParams...) - // 请求 - body, err = app.request("https://router.wikeyun.cn/rest/Power/cardInfo", params) - return body, err -} - -type PowerPushOrderResult struct { - Code string `json:"code"` - Msg string `json:"msg"` - Time string `json:"time"` - Data struct { - OrderNumber string `json:"order_number"` - } `json:"data"` -} - -// PowerPushOrder 充值下单 -func (app *App) PowerPushOrder(notMustParams ...Params) (body []byte, err error) { - // 参数 - params := app.NewParamsWith(notMustParams...) - // 请求 - body, err = app.request("https://router.wikeyun.cn/rest/Power/pushOrder", params) - return body, err -} - -type PowerQueryResult struct { - Code string `json:"code"` - Msg string `json:"msg"` - Time string `json:"time"` - Data struct { - OrderNumber string `json:"order_number"` // 订单号 - OrderNo string `json:"order_no"` // 订单号 - CardId string `json:"card_id"` // 卡编号 - Amount int `json:"amount"` // 充值金额 - CostPrice string `json:"cost_price"` // 成本价 - Fanli string `json:"fanli"` // 平台返利 - Status int `json:"status"` // 交易结果(0 待支付 1 已付充值中 2充值成功 3充值失败需要退款 4退款成功 6 待充值 7 已匹配) - } `json:"data"` -} - -func (app *App) PowerQuery(notMustParams ...Params) (body []byte, err error) { - // 参数 - params := app.NewParamsWith(notMustParams...) - // 请求 - body, err = app.request("https://router.wikeyun.cn/rest/Power/query", params) - return body, err -} diff --git a/service/wikeyun/recharge.go b/service/wikeyun/recharge.go deleted file mode 100644 index ea82f218..00000000 --- a/service/wikeyun/recharge.go +++ /dev/null @@ -1 +0,0 @@ -package wikeyun diff --git a/service/wikeyun/recharge.push_order.go b/service/wikeyun/recharge.push_order.go deleted file mode 100644 index c326b1a9..00000000 --- a/service/wikeyun/recharge.push_order.go +++ /dev/null @@ -1,43 +0,0 @@ -package wikeyun - -import ( - "encoding/json" - "errors" -) - -// RechargePpushOrderRequest 请求参数 -type RechargePpushOrderRequest struct { - StoreId string `json:"store_id"` // 铺ID - Mobile string `json:"mobile"` // 充值号码 - OrderNo string `json:"order_no"` // 充值订单号 - Money int `json:"money"` // 充值金额(100,200) - RechargeTyp int `json:"recharge_typ"` // 是 1快充 0慢充 - NotifyUrl string `json:"notify_url"` // 异步回调地址(POST) - Change int `json:"change,omitempty"` // 失败更换渠道充值 0 否 1是 - Source int `json:"source,omitempty"` // 是否强制渠道 传source字段则可以强制某渠道,强制快充走94折则,source传6 -} - -// RechargePpushOrderResponse 返回参数 -type RechargePpushOrderResponse struct { - Code string `json:"code"` - Msg string `json:"msg"` - Data struct { - OrderNumber string `json:"order_number"` - } `json:"data"` -} - -// RechargePushOrder 充值请求业务参数 -func (app *App) RechargePushOrder(notMustParams ...Params) (result RechargePpushOrderResponse, err error) { - // 参数 - params := app.NewParamsWith(notMustParams...) - // 请求 - body, err := app.request("https://router.wikeyun.cn/rest/Recharge/pushOrder", params) - if err != nil { - return result, errors.New(err.Error()) - } - err = json.Unmarshal(body, &result) - if err != nil { - return result, errors.New(err.Error()) - } - return result, nil -} diff --git a/service/wikeyun/recharge.query.go b/service/wikeyun/recharge.query.go deleted file mode 100644 index 56ce20fc..00000000 --- a/service/wikeyun/recharge.query.go +++ /dev/null @@ -1,35 +0,0 @@ -package wikeyun - -import ( - "encoding/json" - "errors" -) - -// RechargeQueryResponse 返回参数 -type RechargeQueryResponse struct { - Code string `json:"code"` - Msg string `json:"msg"` - Data struct { - OrderNumber string `json:"order_number"` - Status int `json:"status"` - Mobile string `json:"mobile"` - Amount int `json:"amount"` - OrderNo string `json:"order_no"` - } `json:"data"` -} - -// RechargeQuery 查询接口 -func (app *App) RechargeQuery(orderNumber string) (result RechargeQueryResponse, err error) { - // 请求 - body, err := app.request("https://router.wikeyun.cn/rest/Recharge/query", map[string]interface{}{ - "order_number": orderNumber, // 官方订单号 - }) - if err != nil { - return result, errors.New(err.Error()) - } - err = json.Unmarshal(body, &result) - if err != nil { - return result, errors.New(err.Error()) - } - return result, nil -} diff --git a/service/wikeyun/rest.oil.add_card.go b/service/wikeyun/rest.oil.add_card.go new file mode 100644 index 00000000..7058d18e --- /dev/null +++ b/service/wikeyun/rest.oil.add_card.go @@ -0,0 +1,10 @@ +package wikeyun + +// RestOilCardAdd 添加充值卡 +func (app *App) RestOilCardAdd(notMustParams ...Params) (body []byte, err error) { + // 参数 + params := app.NewParamsWith(notMustParams...) + // 请求 + body, err = app.request("https://router.wikeyun.cn/rest/Oil/addCard", params) + return body, err +} diff --git a/service/wikeyun/rest.oil.card_info.go b/service/wikeyun/rest.oil.card_info.go new file mode 100644 index 00000000..69d29c68 --- /dev/null +++ b/service/wikeyun/rest.oil.card_info.go @@ -0,0 +1,10 @@ +package wikeyun + +// RestOilCardInfo 油卡详情 +func (app *App) RestOilCardInfo(notMustParams ...Params) (body []byte, err error) { + // 参数 + params := app.NewParamsWith(notMustParams...) + // 请求 + body, err = app.request("https://router.wikeyun.cn/rest/Oil/cardInfo", params) + return body, err +} diff --git a/service/wikeyun/rest.oil.del_card.go b/service/wikeyun/rest.oil.del_card.go new file mode 100644 index 00000000..55356196 --- /dev/null +++ b/service/wikeyun/rest.oil.del_card.go @@ -0,0 +1,10 @@ +package wikeyun + +// RestOilCardDel 油卡删除 +func (app *App) RestOilCardDel(notMustParams ...Params) (body []byte, err error) { + // 参数 + params := app.NewParamsWith(notMustParams...) + // 请求 + body, err = app.request("https://router.wikeyun.cn/rest/Oil/delCard", params) + return body, err +} diff --git a/service/wikeyun/rest.oil.push_order.go b/service/wikeyun/rest.oil.push_order.go new file mode 100644 index 00000000..e03ed530 --- /dev/null +++ b/service/wikeyun/rest.oil.push_order.go @@ -0,0 +1,10 @@ +package wikeyun + +// RestOilOrderPush 充值下单 +func (app *App) RestOilOrderPush(notMustParams ...Params) (body []byte, err error) { + // 参数 + params := app.NewParamsWith(notMustParams...) + // 请求 + body, err = app.request("https://router.wikeyun.cn/rest/Oil/pushOrder", params) + return body, err +} diff --git a/service/wikeyun/rest.oil.query.go b/service/wikeyun/rest.oil.query.go new file mode 100644 index 00000000..a75a44fc --- /dev/null +++ b/service/wikeyun/rest.oil.query.go @@ -0,0 +1,10 @@ +package wikeyun + +// RestOilOrderQuery 订单查询 +func (app *App) RestOilOrderQuery(notMustParams ...Params) (body []byte, err error) { + // 参数 + params := app.NewParamsWith(notMustParams...) + // 请求 + body, err = app.request("https://router.wikeyun.cn/rest/Oil/query", params) + return body, err +} diff --git a/service/wikeyun/rest.oiledit_card.go b/service/wikeyun/rest.oiledit_card.go new file mode 100644 index 00000000..48ac8ac8 --- /dev/null +++ b/service/wikeyun/rest.oiledit_card.go @@ -0,0 +1,10 @@ +package wikeyun + +// RestOilCardEdit 编辑充值卡 +func (app *App) RestOilCardEdit(notMustParams ...Params) (body []byte, err error) { + // 参数 + params := app.NewParamsWith(notMustParams...) + // 请求 + body, err = app.request("https://router.wikeyun.cn/rest/Oil/editCard", params) + return body, err +} diff --git a/service/wikeyun/rest.power.add_card.go b/service/wikeyun/rest.power.add_card.go new file mode 100644 index 00000000..50925f32 --- /dev/null +++ b/service/wikeyun/rest.power.add_card.go @@ -0,0 +1,41 @@ +package wikeyun + +import "encoding/json" + +type RestPowerAddCardResponse struct { + Code string `json:"code"` + Msg string `json:"msg"` + Time string `json:"time"` + Data struct { + CardNum string `json:"card_num"` + StoreId string `json:"store_id"` + CreateTime int `json:"create_time"` + Type int `json:"type"` // 缴费单位 + CmsUid int `json:"cms_uid"` + Province string `json:"province"` // 缴费省份 + City string `json:"city"` // 缴费城市 + Id string `json:"id"` // 缴费卡编号 + } `json:"data"` +} + +type RestPowerAddCardResult struct { + Result RestPowerAddCardResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewRestPowerAddCardResult(result RestPowerAddCardResponse, body []byte, err error) *RestPowerAddCardResult { + return &RestPowerAddCardResult{Result: result, Body: body, Err: err} +} + +// RestPowerAddCard 添加充值卡 +func (app *App) RestPowerAddCard(notMustParams ...Params) *RestPowerAddCardResult { + // 参数 + params := app.NewParamsWith(notMustParams...) + // 请求 + body, err := app.request("https://router.wikeyun.cn/rest/Power/addCard", params) + // 定义 + var response RestPowerAddCardResponse + err = json.Unmarshal(body, &response) + return NewRestPowerAddCardResult(response, body, err) +} diff --git a/service/wikeyun/rest.power.card_info.go b/service/wikeyun/rest.power.card_info.go new file mode 100644 index 00000000..a3dc1ba6 --- /dev/null +++ b/service/wikeyun/rest.power.card_info.go @@ -0,0 +1,10 @@ +package wikeyun + +// PowerCardInfo 充值卡详情 +func (app *App) PowerCardInfo(notMustParams ...Params) (body []byte, err error) { + // 参数 + params := app.NewParamsWith(notMustParams...) + // 请求 + body, err = app.request("https://router.wikeyun.cn/rest/Power/cardInfo", params) + return body, err +} diff --git a/service/wikeyun/rest.power.del_card.go b/service/wikeyun/rest.power.del_card.go new file mode 100644 index 00000000..a14c2d2d --- /dev/null +++ b/service/wikeyun/rest.power.del_card.go @@ -0,0 +1,12 @@ +package wikeyun + +// RestPowerDelCard 充值卡删除 +func (app *App) RestPowerDelCard(cardId string) (body []byte, err error) { + // 参数 + param := NewParams() + param.Set("card_id", cardId) + params := app.NewParamsWith(param) + // 请求 + body, err = app.request("https://router.wikeyun.cn/rest/Power/delCard", params) + return body, err +} diff --git a/service/wikeyun/rest.power.edit_card.go b/service/wikeyun/rest.power.edit_card.go new file mode 100644 index 00000000..f0dd52d6 --- /dev/null +++ b/service/wikeyun/rest.power.edit_card.go @@ -0,0 +1,10 @@ +package wikeyun + +// RestPowerEditCard 编辑充值卡 +func (app *App) RestPowerEditCard(notMustParams ...Params) (body []byte, err error) { + // 参数 + params := app.NewParamsWith(notMustParams...) + // 请求 + body, err = app.request("https://router.wikeyun.cn/rest/Power/editCard", params) + return body, err +} diff --git a/service/wikeyun/rest.power.push_order.go b/service/wikeyun/rest.power.push_order.go new file mode 100644 index 00000000..43f5bd16 --- /dev/null +++ b/service/wikeyun/rest.power.push_order.go @@ -0,0 +1,34 @@ +package wikeyun + +import "encoding/json" + +type RestPowerPushOrderResponse struct { + Code string `json:"code"` + Msg string `json:"msg"` + Time string `json:"time"` + Data struct { + OrderNumber string `json:"order_number"` + } `json:"data"` +} + +type RestPowerPushOrderResult struct { + Result RestPowerPushOrderResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewRestPowerPushOrderResult(result RestPowerPushOrderResponse, body []byte, err error) *RestPowerPushOrderResult { + return &RestPowerPushOrderResult{Result: result, Body: body, Err: err} +} + +// RestPowerPushOrder 充值下单 +func (app *App) RestPowerPushOrder(notMustParams ...Params) *RestPowerPushOrderResult { + // 参数 + params := app.NewParamsWith(notMustParams...) + // 请求 + body, err := app.request("https://router.wikeyun.cn/rest/Power/pushOrder", params) + // 定义 + var response RestPowerPushOrderResponse + err = json.Unmarshal(body, &response) + return NewRestPowerPushOrderResult(response, body, err) +} diff --git a/service/wikeyun/rest.power.query.go b/service/wikeyun/rest.power.query.go new file mode 100644 index 00000000..be4c8659 --- /dev/null +++ b/service/wikeyun/rest.power.query.go @@ -0,0 +1,42 @@ +package wikeyun + +import "encoding/json" + +type RestPowerQueryResponse struct { + Code string `json:"code"` + Msg string `json:"msg"` + Time string `json:"time"` + Data struct { + OrderNumber string `json:"order_number"` + OrderNo string `json:"order_no"` + CardId string `json:"card_id"` + Amount int `json:"amount"` + CostPrice string `json:"cost_price"` + Fanli string `json:"fanli"` + Status int `json:"status"` + ArrivedAmount int64 `json:"arrived_amount"` + } `json:"data"` +} + +type RestPowerQueryResult struct { + Result RestPowerQueryResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewRestPowerQueryResult(result RestPowerQueryResponse, body []byte, err error) *RestPowerQueryResult { + return &RestPowerQueryResult{Result: result, Body: body, Err: err} +} + +func (app *App) RestPowerQuery(orderNumber string) *RestPowerQueryResult { + // 参数 + param := NewParams() + param.Set("order_number", orderNumber) // 官方订单号 + params := app.NewParamsWith(param) + // 请求 + body, err := app.request("https://router.wikeyun.cn/rest/Power/query", params) + // 定义 + var response RestPowerQueryResponse + err = json.Unmarshal(body, &response) + return NewRestPowerQueryResult(response, body, err) +} diff --git a/service/wikeyun/rest.recharge.push_order.go b/service/wikeyun/rest.recharge.push_order.go new file mode 100644 index 00000000..42486c0b --- /dev/null +++ b/service/wikeyun/rest.recharge.push_order.go @@ -0,0 +1,35 @@ +package wikeyun + +import ( + "encoding/json" +) + +type RestRechargePushOrderResponse struct { + Code string `json:"code"` + Msg string `json:"msg"` + Data struct { + OrderNumber string `json:"order_number"` + } `json:"data"` +} + +type RestRechargePushOrderResult struct { + Result RestRechargePushOrderResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewRestRechargePushOrderResult(result RestRechargePushOrderResponse, body []byte, err error) *RestRechargePushOrderResult { + return &RestRechargePushOrderResult{Result: result, Body: body, Err: err} +} + +// RestRechargePushOrder 充值请求业务参数 +func (app *App) RestRechargePushOrder(notMustParams ...Params) *RestRechargePushOrderResult { + // 参数 + params := app.NewParamsWith(notMustParams...) + // 请求 + body, err := app.request("https://router.wikeyun.cn/rest/Recharge/pushOrder", params) + // 定义 + var response RestRechargePushOrderResponse + err = json.Unmarshal(body, &response) + return NewRestRechargePushOrderResult(response, body, err) +} diff --git a/service/wikeyun/rest.recharge.query.go b/service/wikeyun/rest.recharge.query.go new file mode 100644 index 00000000..f789d884 --- /dev/null +++ b/service/wikeyun/rest.recharge.query.go @@ -0,0 +1,45 @@ +package wikeyun + +import ( + "encoding/json" +) + +type RestRechargeQueryResponse struct { + Code string `json:"code"` + Msg string `json:"msg"` + Time string `json:"time"` + Data struct { + OrderNumber string `json:"order_number"` + OrderNo string `json:"order_no"` + Mobile string `json:"mobile"` + Amount int `json:"amount"` + CostPrice string `json:"cost_price"` + Fanli string `json:"fanli"` + Status int `json:"status"` + OrgOrderNumber string `json:"org_order_number"` + } `json:"data"` +} + +type RestRechargeQueryResult struct { + Result RestRechargeQueryResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewRestRechargeQueryResult(result RestRechargeQueryResponse, body []byte, err error) *RestRechargeQueryResult { + return &RestRechargeQueryResult{Result: result, Body: body, Err: err} +} + +// RestRechargeQuery 查询接口 +func (app *App) RestRechargeQuery(orderNumber string) *RestRechargeQueryResult { + // 参数 + param := NewParams() + param.Set("order_number", orderNumber) // 官方订单号 + params := app.NewParamsWith(param) + // 请求 + body, err := app.request("https://router.wikeyun.cn/rest/Recharge/query", params) + // 定义 + var response RestRechargeQueryResponse + err = json.Unmarshal(body, &response) + return NewRestRechargeQueryResult(response, body, err) +} diff --git a/service/wikeyun/rest.user.query.go b/service/wikeyun/rest.user.query.go new file mode 100644 index 00000000..6a148e9a --- /dev/null +++ b/service/wikeyun/rest.user.query.go @@ -0,0 +1,34 @@ +package wikeyun + +import ( + "encoding/json" +) + +type RestUserQueryResponse struct { + Code string `json:"code"` + Msg string `json:"msg"` + Data struct { + Money string `json:"money"` + ID int `json:"id"` + } `json:"data"` +} + +type RestUserQueryResult struct { + Result RestUserQueryResponse // 结果 + Body []byte // 内容 + Err error // 错误 +} + +func NewRestUserQueryResult(result RestUserQueryResponse, body []byte, err error) *RestUserQueryResult { + return &RestUserQueryResult{Result: result, Body: body, Err: err} +} + +// RestUserQuery 查询余额接口 +func (app *App) RestUserQuery() *RestUserQueryResult { + // 请求 + body, err := app.request("https://router.wikeyun.cn/rest/User/query", map[string]interface{}{}) + // 定义 + var response RestUserQueryResponse + err = json.Unmarshal(body, &response) + return NewRestUserQueryResult(response, body, err) +} diff --git a/service/wikeyun/user.go b/service/wikeyun/user.go deleted file mode 100644 index 2a066127..00000000 --- a/service/wikeyun/user.go +++ /dev/null @@ -1,30 +0,0 @@ -package wikeyun - -import ( - "encoding/json" - "errors" -) - -// UserQueryResponse 返回参数 -type UserQueryResponse struct { - Code string `json:"code"` - Msg string `json:"msg"` - Data struct { - Money string `json:"money"` - ID int `json:"id"` - } `json:"data"` -} - -// UserQuery 查询余额接口 -func (app *App) UserQuery() (result UserQueryResponse, err error) { - // 请求 - body, err := app.request("https://router.wikeyun.cn/rest/User/query", map[string]interface{}{}) - if err != nil { - return result, errors.New(err.Error()) - } - err = json.Unmarshal(body, &result) - if err != nil { - return result, errors.New(err.Error()) - } - return result, nil -} diff --git a/utils/go.mod b/utils/go.mod deleted file mode 100644 index b9263374..00000000 --- a/utils/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/dtapps/go-library/utils - -go 1.18 diff --git a/utils/goaes/go.mod b/utils/goaes/go.mod deleted file mode 100644 index a92dd37e..00000000 --- a/utils/goaes/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/dtapps/go-library/utils/goaes - -go 1.18 diff --git a/utils/goaes/goaes.go b/utils/goaes/goaes.go deleted file mode 100644 index 3692ec2e..00000000 --- a/utils/goaes/goaes.go +++ /dev/null @@ -1,57 +0,0 @@ -package goaes - -import ( - "bytes" - "crypto/aes" - "crypto/cipher" - "encoding/base64" -) - -// Encrypt 加密 aes_128_cbc -func Encrypt(encryptStr string, key []byte, iv string) (string, error) { - encryptBytes := []byte(encryptStr) - block, err := aes.NewCipher(key) - if err != nil { - return "", err - } - - blockSize := block.BlockSize() - encryptBytes = pkcs5Padding(encryptBytes, blockSize) - - blockMode := cipher.NewCBCEncrypter(block, []byte(iv)) - encrypted := make([]byte, len(encryptBytes)) - blockMode.CryptBlocks(encrypted, encryptBytes) - return base64.URLEncoding.EncodeToString(encrypted), nil -} - -// Decrypt 解密 -func Decrypt(decryptStr string, key []byte, iv string) (string, error) { - decryptBytes, err := base64.URLEncoding.DecodeString(decryptStr) - if err != nil { - return "", err - } - - block, err := aes.NewCipher(key) - if err != nil { - return "", err - } - - blockMode := cipher.NewCBCDecrypter(block, []byte(iv)) - decrypted := make([]byte, len(decryptBytes)) - - blockMode.CryptBlocks(decrypted, decryptBytes) - decrypted = pkcs5UnPadding(decrypted) - return string(decrypted), nil -} - -func pkcs5Padding(cipherText []byte, blockSize int) []byte { - padding := blockSize - len(cipherText)%blockSize - padText := bytes.Repeat([]byte{byte(padding)}, padding) - return append(cipherText, padText...) -} - -func pkcs5UnPadding(decrypted []byte) []byte { - length := len(decrypted) - unPadding := int(decrypted[length-1]) - return decrypted[:(length - unPadding)] -} diff --git a/utils/goarray/go.mod b/utils/goarray/go.mod deleted file mode 100644 index 8518b46d..00000000 --- a/utils/goarray/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/dtapps/go-library/utils/goarray - -go 1.18 diff --git a/utils/goarray/goarray.go b/utils/goarray/goarray.go deleted file mode 100644 index 41f2c2ed..00000000 --- a/utils/goarray/goarray.go +++ /dev/null @@ -1,17 +0,0 @@ -package goarray - -func Grouping() { - -} - -func TurnString(ss []string) (s string) { - sl := len(ss) - for k, v := range ss { - if k+1 == sl { - s = s + v - } else { - s = s + v + "," - } - } - return s -} diff --git a/utils/gobase64/go.mod b/utils/gobase64/go.mod deleted file mode 100644 index 6b8f8d52..00000000 --- a/utils/gobase64/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/dtapps/go-library/utils/gobase64 - -go 1.18 diff --git a/utils/gobase64/gobase64.go b/utils/gobase64/gobase64.go index 961e93d4..13dc9459 100644 --- a/utils/gobase64/gobase64.go +++ b/utils/gobase64/gobase64.go @@ -1,6 +1,9 @@ package gobase64 -import "encoding/base64" +import ( + "dtapps/dta/library/utils/gophp" + "encoding/base64" +) // Encode base64编码 func Encode(input string) string { @@ -15,3 +18,17 @@ func Decode(input string) string { } return string(decodeString) } + +// EncodeUrl Base64安全URL编码 +func EncodeUrl(input string) string { + return gophp.Rtrim(gophp.Strtr(base64.StdEncoding.EncodeToString([]byte(input)), "+/", "-_"), "=") +} + +// DecodeUrl Base64安全URL解码 +func DecodeUrl(input string) string { + decodeString, err := base64.StdEncoding.DecodeString(gophp.StrPad(gophp.Strtr(input, "-_", "+/"), len(input)/4, "=")) + if err != nil { + return "" + } + return string(decodeString) +} diff --git a/utils/godecimal/go.mod b/utils/godecimal/go.mod deleted file mode 100644 index fdc6c7f5..00000000 --- a/utils/godecimal/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/dtapps/go-library/utils/godecimal - -go 1.18 diff --git a/utils/godecimal/godecimal.go b/utils/godecimal/godecimal.go index 331a5bb2..19dafd55 100644 --- a/utils/godecimal/godecimal.go +++ b/utils/godecimal/godecimal.go @@ -1,6 +1,7 @@ package godecimal import ( + "dtapps/dta/library/utils/gostring" "fmt" "math" "strconv" @@ -17,3 +18,93 @@ func Round(f float64, n int) float64 { n10 := math.Pow10(n) return math.Trunc((f+0.5/n10)*n10) / n10 } + +// RoundYInt64 四舍五入 +func RoundYInt64(y int64, n int) float64 { + return Round(float64(y/100), n) +} + +// RoundYString 四舍五入 +func RoundYString(y string, n int) float64 { + return Round(gostring.ToFloat64(y)/100, n) +} + +// PddCouponAmount 优惠券金额 +func PddCouponAmount(y int64) float64 { + return Round(float64(y)/100, 2) +} + +// PddCouponProportion 拼多多佣金比率 +func PddCouponProportion(y int64) float64 { + return Round(float64(y)/10, 2) +} + +// PddGoodsOriginalPrice 拼多多商品原价 +func PddGoodsOriginalPrice(y int64) float64 { + return Round(float64(y)/100, 2) +} + +// PddGoodsPrice 拼多多商品券后价 +func PddGoodsPrice(y, x float64) float64 { + return Round(y-x, 2) +} + +// PddCommission 拼多多佣金 +func PddCommission(y, x float64) float64 { + return Round((y*x)/100, 2) +} + +// TbCouponAmount 淘宝优惠券金额 +func TbCouponAmount(y int64) float64 { + return Round(float64(y), 2) +} + +// TbCouponProportion 淘宝佣金比率 +func TbCouponProportion(y string) float64 { + return Round(gostring.ToFloat64(y)/100, 2) +} + +// TbGoodsOriginalPrice 淘宝商品原价 +func TbGoodsOriginalPrice(y string) float64 { + return Round(gostring.ToFloat64(y), 2) +} + +// TbGoodsPrice 淘宝商品券后价 +func TbGoodsPrice(y, x float64) float64 { + return Round(y-x, 2) +} + +// TbCommission 淘宝佣金 +func TbCommission(y, x float64) float64 { + return Round((y*x)/100, 2) +} + +// WmCouponAmount 小商店优惠券金额 +func WmCouponAmount(y string) float64 { + return Round(gostring.ToFloat64(y)/100, 2) +} + +// WmCouponProportion 小商店佣金比率 +func WmCouponProportion(y int64) float64 { + return Round(float64(y)/100, 2) +} + +// WmCommission 小商店佣金 +func WmCommission(y int64) float64 { + return Round(float64(y)/100, 2) +} + +// WmGoodsOriginalPrice 小商店商品原价 +func WmGoodsOriginalPrice(y int64) float64 { + return Round(float64(y)/100, 2) +} + +// WmGoodsPrice 小商店商品券后价 +func WmGoodsPrice(y int64) float64 { + return Round(float64(y)/100, 2) +} + +// JdCommission 京东佣金 +func JdCommission(y, x float64) float64 { + return Round((y*x)/100, 2) +} diff --git a/utils/godmail/go.mod b/utils/godmail/go.mod deleted file mode 100644 index f25e486a..00000000 --- a/utils/godmail/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/dtapps/go-library/utils/godmail - -go 1.18 - -require gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df - -require gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect diff --git a/utils/godmail/go.sum b/utils/godmail/go.sum deleted file mode 100644 index b530e335..00000000 --- a/utils/godmail/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= -gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= -gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE= -gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw= diff --git a/utils/goenv/go.mod b/utils/goenv/go.mod deleted file mode 100644 index 7b9b9b6f..00000000 --- a/utils/goenv/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/dtapps/go-library/utils/goenv - -go 1.18 - -require github.com/dtapps/go-library/utils/gostring v0.0.0-20220320040709-ad8a5f0e9e40 diff --git a/utils/goenv/goenv.go b/utils/goenv/goenv.go deleted file mode 100644 index daaef4af..00000000 --- a/utils/goenv/goenv.go +++ /dev/null @@ -1,22 +0,0 @@ -package goenv - -import ( - "github.com/dtapps/go-library/utils/gostring" - "os" -) - -func GetEnvDefault(key, defVal string) string { - val, ok := os.LookupEnv(key) - if ok { - return val - } - return defVal -} - -func GetEnvDefaultInt(key string, defVal int) int { - val, ok := os.LookupEnv(key) - if ok { - return gostring.ToInt(val) - } - return defVal -} diff --git a/utils/gofiles/go.mod b/utils/gofiles/go.mod deleted file mode 100644 index c2c26c88..00000000 --- a/utils/gofiles/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/dtapps/go-library/utils/gofiles - -go 1.18 diff --git a/utils/gofiles/gofiles.go b/utils/gofiles/gofiles.go index b4e5332d..4d191395 100644 --- a/utils/gofiles/gofiles.go +++ b/utils/gofiles/gofiles.go @@ -1,7 +1,9 @@ package gofiles import ( + "fmt" "log" + "math" "os" ) @@ -41,16 +43,10 @@ func ExistFile(pathName string) (bool, error) { return false, err } -// ExistFiles 判断文件夹是否存在 -func ExistFiles(path string) (bool, error) { +// CheckNotExist 判断文件夹是否存在 +func CheckNotExist(path string) bool { _, err := os.Stat(path) - if err == nil { - return true, nil - } - if os.IsNotExist(err) { - return false, nil - } - return false, err + return os.IsNotExist(err) } // CreateFile 创建文件 @@ -94,8 +90,96 @@ func CreateDir(path string) error { if !dirExist { err := os.Mkdir(path, os.ModePerm) if err != nil { - log.Printf("创建[%s]目录失败: %s\n", path, err) + log.Printf("创建[%s]目录失败: %s\n", path) } } return err } + +// FileSize calculates the file size and generate user-friendly string. +func FileSize(s uint64) string { + sizes := []string{"B", "KB", "MB", "GB", "TB", "PB", "EB"} + return humanateBytes(s, 1024, sizes) +} +func humanateBytes(s uint64, base float64, sizes []string) string { + if s < 10 { + return fmt.Sprintf("%d B", s) + } + e := math.Floor(logn(float64(s), base)) + suffix := sizes[int(e)] + val := float64(s) / math.Pow(base, math.Floor(e)) + f := "%.0f" + if val < 10 { + f = "%.1f" + } + + return fmt.Sprintf(f+" %s", val, suffix) +} + +func logn(n, b float64) float64 { + return math.Log(n) / math.Log(b) +} + +// CheckPermission 检查文件是否有权限 +func CheckPermission(src string) bool { + _, err := os.Stat(src) + + return os.IsPermission(err) +} + +// IsNotExistMkDir create a directory if it does not exist +func IsNotExistMkDir(src string) error { + if notExist := CheckNotExist(src); notExist == true { + if err := MkDir(src); err != nil { + return err + } + } + + return nil +} + +// MkDir 创建一个目录 +func MkDir(src string) error { + err := os.MkdirAll(src, os.ModePerm) + if err != nil { + return err + } + + return nil +} + +// Open 根据特定模式的文件 +func Open(name string, flag int, perm os.FileMode) (*os.File, error) { + f, err := os.OpenFile(name, flag, perm) + if err != nil { + return nil, err + } + + return f, nil +} + +// MustOpen 试图打开文件 +func MustOpen(fileName, filePath string) (*os.File, error) { + dir, err := os.Getwd() + if err != nil { + return nil, fmt.Errorf("os.Getwd err: %v", err) + } + + src := dir + "/" + filePath + perm := CheckPermission(src) + if perm == true { + return nil, fmt.Errorf("file.CheckPermission Permission denied src: %s", src) + } + + err = IsNotExistMkDir(src) + if err != nil { + return nil, fmt.Errorf("file.IsNotExistMkDir src: %s, err: %v", src, err) + } + + f, err := Open(src+fileName, os.O_APPEND|os.O_CREATE|os.O_RDWR, 0644) + if err != nil { + return nil, fmt.Errorf("fail to OpenFile :%v", err) + } + + return f, nil +} diff --git a/utils/gofloat/go.mod b/utils/gofloat/go.mod deleted file mode 100644 index dae94fe8..00000000 --- a/utils/gofloat/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/dtapps/go-library/utils/gofloat - -go 1.18 diff --git a/utils/gofloat/gofloat.go b/utils/gofloat/gofloat.go deleted file mode 100644 index 1d7585a0..00000000 --- a/utils/gofloat/gofloat.go +++ /dev/null @@ -1,13 +0,0 @@ -package float - -import "math" - -// ToInt64 将float64转成精确的int64 -func ToInt64(num float64, retain int) int64 { - return int64(num * math.Pow10(retain)) -} - -// ToFloat64 精准float64 -func ToFloat64(num float64, retain int) float64 { - return num * math.Pow10(retain) -} diff --git a/utils/goget/go.mod b/utils/goget/go.mod deleted file mode 100644 index 662d80bf..00000000 --- a/utils/goget/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/dtapps/go-library/utils/goget - -go 1.18 diff --git a/utils/goget/goget.go b/utils/goget/goget.go deleted file mode 100644 index 1436d96f..00000000 --- a/utils/goget/goget.go +++ /dev/null @@ -1,15 +0,0 @@ -package goget - -func GetDefault(key, defVal any) any { - if key != nil { - return key - } - return defVal -} - -func GetStringDefault(key, defVal string) string { - if key != "" { - return key - } - return defVal -} diff --git a/utils/goheader/go.mod b/utils/goheader/go.mod deleted file mode 100644 index 7cc79a33..00000000 --- a/utils/goheader/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/dtapps/go-library/utils/goheader - -go 1.18 diff --git a/utils/gohttp/go.mod b/utils/gohttp/go.mod deleted file mode 100644 index ca6c9107..00000000 --- a/utils/gohttp/go.mod +++ /dev/null @@ -1,8 +0,0 @@ -module github.com/dtapps/go-library/utils/gohttp - -go 1.18 - -require ( - github.com/dtapps/go-library/utils/goheader v0.0.0-20220320040709-ad8a5f0e9e40 - github.com/dtapps/go-library/utils/gorequest v0.0.0-20220320040709-ad8a5f0e9e40 -) diff --git a/utils/gohttp/gohttp.go b/utils/gohttp/gohttp.go index f72f6532..898b74af 100644 --- a/utils/gohttp/gohttp.go +++ b/utils/gohttp/gohttp.go @@ -2,11 +2,13 @@ package gohttp import ( "bytes" + "crypto/tls" + "dtapps/dta/library/utils/goheader" + "dtapps/dta/library/utils/gorequest" "encoding/json" "errors" "fmt" - "github.com/dtapps/go-library/utils/goheader" - "github.com/dtapps/go-library/utils/gorequest" + "io" "io/ioutil" "net/http" "net/url" @@ -163,6 +165,34 @@ func PostJson(targetUrl string, paramsStr []byte) (httpResponse Response, err er return httpResponse, err } +func PostXml(targetUrl string, paramsStr []byte) (httpResponse Response, err error) { + // 创建请求 + req, _ := http.NewRequest(http.MethodPost, targetUrl, bytes.NewReader(paramsStr)) + // 设置请求头 + req.Header.Set("User-Agent", gorequest.GetRandomUserAgent()) + // 创建 http 客户端 + client := &http.Client{} + // 发送请求 + resp, err := client.Do(req) + if err != nil { + // 格式化返回错误 + return httpResponse, errors.New(fmt.Sprintf("请求出错 %s", err)) + } + // 最后关闭连接 + defer resp.Body.Close() + // 读取内容 + respBody, err := ioutil.ReadAll(resp.Body) + if err != nil { + return httpResponse, errors.New(fmt.Sprintf("解析内容出错 %s", err)) + } + httpResponse.Status = resp.Status + httpResponse.StatusCode = resp.StatusCode + httpResponse.Header = resp.Header + httpResponse.Body = respBody + httpResponse.ContentLength = resp.ContentLength + return httpResponse, err +} + func PostJsonHeader(targetUrl string, paramsStr []byte, headers goheader.Headers) (httpResponse Response, err error) { // 创建请求 req, _ := http.NewRequest(http.MethodPost, targetUrl, bytes.NewBuffer(paramsStr)) @@ -195,6 +225,45 @@ func PostJsonHeader(targetUrl string, paramsStr []byte, headers goheader.Headers return httpResponse, err } +func PostCert(targetUrl string, params io.Reader, p12Cert *tls.Certificate) (httpResponse Response, err error) { + if p12Cert == nil { + return httpResponse, errors.New("need p12Cert") + } + transport := &http.Transport{ + TLSClientConfig: &tls.Config{ + Certificates: []tls.Certificate{*p12Cert}, + }, + DisableCompression: true, + } + // 创建请求 + req, _ := http.NewRequest(http.MethodPost, targetUrl, params) + // 设置请求头 + req.Header.Set("User-Agent", gorequest.GetRandomUserAgent()) + // 创建 http 客户端 + client := &http.Client{ + Transport: transport, + } + // 发送请求 + resp, err := client.Do(req) + if err != nil { + // 格式化返回错误 + return httpResponse, errors.New(fmt.Sprintf("请求出错 %s", err)) + } + // 最后关闭连接 + defer resp.Body.Close() + // 读取内容 + respBody, err := ioutil.ReadAll(resp.Body) + if err != nil { + return httpResponse, errors.New(fmt.Sprintf("解析内容出错 %s", err)) + } + httpResponse.Status = resp.Status + httpResponse.StatusCode = resp.StatusCode + httpResponse.Header = resp.Header + httpResponse.Body = respBody + httpResponse.ContentLength = resp.ContentLength + return httpResponse, err +} + func getString(i interface{}) string { switch v := i.(type) { case string: diff --git a/utils/goint/go.mod b/utils/goint/go.mod deleted file mode 100644 index 32196b9c..00000000 --- a/utils/goint/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/dtapps/go-library/utils/goint - -go 1.18 diff --git a/utils/goint/goint.go b/utils/goint/goint.go deleted file mode 100644 index 2cc1f290..00000000 --- a/utils/goint/goint.go +++ /dev/null @@ -1,16 +0,0 @@ -package goint - -import ( - "math" - "strconv" -) - -// ToString int到string -func ToString(n int) string { - return strconv.Itoa(n) -} - -// ToFloat64 int到float64 -func ToFloat64(n int) float64 { - return float64(n) / math.Pow10(0) -} diff --git a/utils/goint64/go.mod b/utils/goint64/go.mod deleted file mode 100644 index f810e89d..00000000 --- a/utils/goint64/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/dtapps/go-library/utils/goint64 - -go 1.18 diff --git a/utils/goint64/goint64.go b/utils/goint64/goint64.go deleted file mode 100644 index 20fe1aac..00000000 --- a/utils/goint64/goint64.go +++ /dev/null @@ -1,23 +0,0 @@ -package goint64 - -import "math" - -// ToFloat64 int64到float64 -func ToFloat64(n int64) float64 { - return float64(n) / math.Pow10(0) -} - -// ToUnwrap 将int64恢复成正常的float64 -func ToUnwrap(num int64, retain int) float64 { - return float64(num) / math.Pow10(retain) -} - -// ToUnwrapToInt64 精准int64 -func ToUnwrapToInt64(num int64, retain int) int64 { - return int64(ToUnwrap(num, retain)) -} - -// ToFloat64NewWiFi 返回float64 -func ToFloat64NewWiFi(num int64) float64 { - return float64(num / 100) -} diff --git a/utils/goip/go.mod b/utils/goip/go.mod deleted file mode 100644 index 7b3e9ff7..00000000 --- a/utils/goip/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/dtapps/go-library/utils/goip - -go 1.18 - -require github.com/dtapps/go-library/utils/gohttp v0.0.0-20220320040709-ad8a5f0e9e40 diff --git a/utils/goip/goip.go b/utils/goip/goip.go deleted file mode 100644 index 61ed801f..00000000 --- a/utils/goip/goip.go +++ /dev/null @@ -1,73 +0,0 @@ -package goip - -import ( - "encoding/json" - "github.com/dtapps/go-library/utils/gohttp" - "log" - "net" -) - -// GetInsideIp 内网ip -func GetInsideIp() string { - conn, err := net.Dial("udp", "8.8.8.8:80") - if err != nil { - log.Fatal(err) - } - defer conn.Close() - - localAddr := conn.LocalAddr().(*net.UDPAddr) - return localAddr.IP.String() -} - -var respGetOutsideIp struct { - Ip string `json:"ip"` -} - -// GetOutsideIp 外网ip -func GetOutsideIp() string { - get, _ := gohttp.Get("https://api.dtapp.net/ip", map[string]interface{}{}) - _ = json.Unmarshal(get.Body, &respGetOutsideIp) - if respGetOutsideIp.Ip != "" { - return respGetOutsideIp.Ip - } - return "0.0.0.0" -} - -func GetOutboundIP() string { - conn, err := net.Dial("udp", "8.8.8.8:80") - if err != nil { - log.Fatal(err) - } - defer conn.Close() - - localAddr := conn.LocalAddr().(*net.UDPAddr) - return localAddr.IP.String() -} - -// Ips 获取全部网卡的全部IP -func Ips() (map[string]string, error) { - - ips := make(map[string]string) - - //返回 interface 结构体对象的列表,包含了全部网卡信息 - interfaces, err := net.Interfaces() - if err != nil { - return nil, err - } - - //遍历全部网卡 - for _, i := range interfaces { - - // Addrs() 方法返回一个网卡上全部的IP列表 - address, err := i.Addrs() - if err != nil { - return nil, err - } - - //遍历一个网卡上全部的IP列表,组合为一个字符串,放入对应网卡名称的map中 - for _, v := range address { - ips[i.Name] += v.String() + " " - } - } - return ips, nil -} diff --git a/utils/gojson/go.mod b/utils/gojson/go.mod deleted file mode 100644 index 3315f93f..00000000 --- a/utils/gojson/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/dtapps/go-library/utils/gojson - -go 1.18 diff --git a/utils/gojson/gojson.go b/utils/gojson/gojson.go deleted file mode 100644 index a1e046bd..00000000 --- a/utils/gojson/gojson.go +++ /dev/null @@ -1,47 +0,0 @@ -package gojson - -import "encoding/json" - -func Encode(v interface{}) (string, error) { - bytes, err := json.Marshal(v) - if err != nil { - return "", err - } - return string(bytes), nil -} - -func MarshalToString(msg interface{}) (string, error) { - j, e := json.Marshal(msg) - if e != nil { - return "", e - } - return string(j), nil -} - -func JsonDecode(data string) (map[string]interface{}, error) { - var dat map[string]interface{} - err := json.Unmarshal([]byte(data), &dat) - return dat, err -} - -func JsonDecodeNoError(data string) map[string]interface{} { - var dat map[string]interface{} - _ = json.Unmarshal([]byte(data), &dat) - return dat -} - -func JsonEncode(data interface{}) (string, error) { - jsons, err := json.Marshal(data) - return string(jsons), err -} - -func JsonEncodeNoError(data interface{}) string { - jsons, _ := json.Marshal(data) - return string(jsons) -} - -func JsonDecodesNoError(data string) []string { - var dat []string - _ = json.Unmarshal([]byte(data), &dat) - return dat -} diff --git a/utils/goless/go.mod b/utils/goless/go.mod deleted file mode 100644 index 6eedad86..00000000 --- a/utils/goless/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/dtapps/go-library/utils/goless - -go 1.18 diff --git a/utils/golock/go.mod b/utils/golock/go.mod deleted file mode 100644 index 965e634b..00000000 --- a/utils/golock/go.mod +++ /dev/null @@ -1,12 +0,0 @@ -module github.com/dtapps/go-library/utils/golock - -go 1.18 - -require ( - github.com/go-redis/redis/v8 v8.11.5 -) - -require ( - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect -) diff --git a/utils/golock/lock.go b/utils/golock/lock.go index 24cc3835..a70e17ef 100644 --- a/utils/golock/lock.go +++ b/utils/golock/lock.go @@ -2,8 +2,8 @@ package golock import ( "context" - "github.com/dtapps/go-library/utils/goredis" - "github.com/dtapps/go-library/utils/gouuid" + "dtapps/dta/global" + "gitee.com/dtapps/go-library/utils/gouuid" "github.com/go-redis/redis/v8" "time" ) @@ -12,7 +12,6 @@ type lock struct { key string expiration time.Duration requestId string - Db goredis.App } func NewLock(key string, expiration time.Duration) *lock { @@ -27,7 +26,7 @@ func (lk *lock) Get() bool { defer cancel() - ok, err := lk.Db.Db.SetNX(cxt, lk.key, lk.requestId, lk.expiration).Result() + ok, err := global.GvaRedis.Db.SetNX(cxt, lk.key, lk.requestId, lk.expiration).Result() if err != nil { @@ -54,6 +53,6 @@ func (lk *lock) Release() error { script := redis.NewScript(luaScript) - _, err := script.Run(cxt, lk.Db.Db, []string{lk.key}, lk.requestId).Result() + _, err := script.Run(cxt, global.GvaRedis.Db, []string{lk.key}, lk.requestId).Result() return err } diff --git a/utils/golog/go.mod b/utils/golog/go.mod deleted file mode 100644 index 7fd57c33..00000000 --- a/utils/golog/go.mod +++ /dev/null @@ -1,15 +0,0 @@ -module github.com/dtapps/go-library/utils/golog - -go 1.18 - -require ( - github.com/natefinch/lumberjack v2.0.0+incompatible - go.uber.org/zap v1.21.0 -) - -require ( - github.com/BurntSushi/toml v1.0.0 // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect -) diff --git a/utils/gomac/go.mod b/utils/gomac/go.mod deleted file mode 100644 index 85219b32..00000000 --- a/utils/gomac/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/dtapps/go-library/utils/gomac - -go 1.18 diff --git a/utils/gomac/gomac.go b/utils/gomac/gomac.go deleted file mode 100644 index 64e5ecb0..00000000 --- a/utils/gomac/gomac.go +++ /dev/null @@ -1,21 +0,0 @@ -package gomac - -import ( - "net" -) - -func GetMacAddrs() (macAddrs []string) { - netInterfaces, err := net.Interfaces() - if err != nil { - return macAddrs - } - for _, netInterface := range netInterfaces { - macAddr := netInterface.HardwareAddr.String() - if len(macAddr) == 0 { - continue - } - - macAddrs = append(macAddrs, macAddr) - } - return macAddrs -} diff --git a/utils/gomd5/go.mod b/utils/gomd5/go.mod deleted file mode 100644 index ce16132e..00000000 --- a/utils/gomd5/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/dtapps/go-library/utils/gomd5 - -go 1.18 diff --git a/utils/gomd5/gomd5.go b/utils/gomd5/gomd5.go deleted file mode 100644 index 96fbc485..00000000 --- a/utils/gomd5/gomd5.go +++ /dev/null @@ -1,49 +0,0 @@ -package gomd5 - -import ( - "crypto/md5" - "encoding/hex" - "fmt" - "io" - "strings" -) - -func Php(str string) string { - h := md5.New() - io.WriteString(h, str) - return fmt.Sprintf("%x", h.Sum(nil)) -} - -func Md5(str string) string { - s := md5.New() - s.Write([]byte(str)) - return hex.EncodeToString(s.Sum(nil)) -} - -// ToUpper md5加密后转大写 -func ToUpper(str string) string { - h := md5.New() - h.Write([]byte(str)) - cipherStr := h.Sum(nil) - return strings.ToUpper(hex.EncodeToString(cipherStr)) -} - -// ToLower md5加密后转小写 -func ToLower(str string) string { - h := md5.New() - h.Write([]byte(str)) - cipherStr := h.Sum(nil) - return strings.ToLower(hex.EncodeToString(cipherStr)) -} - -// GetMD5Encode 返回一个32位md5加密后的字符串 -func GetMD5Encode(data string) string { - h := md5.New() - h.Write([]byte(data)) - return hex.EncodeToString(h.Sum(nil)) -} - -// Get16MD5Encode 返回一个16位md5加密后的字符串 -func Get16MD5Encode(data string) string { - return GetMD5Encode(data)[8:24] -} diff --git a/utils/gomongo/go.mod b/utils/gomongo/go.mod deleted file mode 100644 index 3e9aaa43..00000000 --- a/utils/gomongo/go.mod +++ /dev/null @@ -1,19 +0,0 @@ -module github.com/dtapps/go-library/utils/gomongo - -go 1.18 - -require go.mongodb.org/mongo-driver v1.8.4 - -require ( - github.com/go-stack/stack v1.8.0 // indirect - github.com/golang/snappy v0.0.1 // indirect - github.com/klauspost/compress v1.13.6 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.0.2 // indirect - github.com/xdg-go/stringprep v1.0.2 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f // indirect - golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e // indirect - golang.org/x/text v0.3.5 // indirect -) diff --git a/utils/gomysql/app.go b/utils/gomysql/app.go index 18b8775c..631d5686 100644 --- a/utils/gomysql/app.go +++ b/utils/gomysql/app.go @@ -2,15 +2,61 @@ package gomysql import ( "fmt" + "github.com/sirupsen/logrus" "gorm.io/driver/mysql" "gorm.io/gorm" + "gorm.io/gorm/logger" "log" + "os" + "path" "time" ) type App struct { - Db *gorm.DB - Dns string // 地址 + Db *gorm.DB // 驱动 + Dns string // 地址 + Log bool // 日志 +} + +type writer struct{} + +func (w writer) Printf(format string, args ...interface{}) { + + now := time.Now() + logFilePath := "" + if dir, err := os.Getwd(); err == nil { + logFilePath = dir + "/logs/mysql" + } + if err := os.MkdirAll(logFilePath, 0777); err != nil { + fmt.Println(err.Error()) + } + logFileName := "gorm." + now.Format("2006-01-02") + ".log" + + // 日志文件 + fileName := path.Join(logFilePath, logFileName) + if _, err := os.Stat(fileName); err != nil { + if _, err := os.Create(fileName); err != nil { + fmt.Println(err.Error()) + } + } + // 写入文件 + src, err := os.OpenFile(fileName, os.O_APPEND|os.O_WRONLY, os.ModeAppend) + if err != nil { + fmt.Println("err", err) + } + + // 实例化 + l := logrus.New() + + // 设置输出 + l.Out = src + + // 设置日志格式 JSONFormatter=json TextFormatter=text + l.SetFormatter(&logrus.JSONFormatter{ + TimestampFormat: "2006-01-02 15:04:05", + }) + + l.Println(args...) } func (app *App) InitClient() { @@ -19,7 +65,21 @@ func (app *App) InitClient() { var err error - app.Db, err = gorm.Open(mysql.Open(app.Dns), &gorm.Config{}) + if app.Log == true { + app.Db, err = gorm.Open(mysql.Open(app.Dns), &gorm.Config{ + Logger: logger.New( + writer{}, + logger.Config{ + SlowThreshold: time.Second, // 慢 SQL 阈值 + LogLevel: logger.Info, // 日志级别 + IgnoreRecordNotFoundError: true, // 忽略ErrRecordNotFound(记录未找到)错误 + Colorful: false, // 禁用彩色打印 + }, + ), + }) + } else { + app.Db, err = gorm.Open(mysql.Open(app.Dns), &gorm.Config{}) + } if err != nil { panic(fmt.Sprintf("连接数据库失败:%v", err)) diff --git a/utils/gomysql/go.mod b/utils/gomysql/go.mod deleted file mode 100644 index d183d943..00000000 --- a/utils/gomysql/go.mod +++ /dev/null @@ -1,14 +0,0 @@ -module github.com/dtapps/go-library/utils/gomysql - -go 1.18 - -require ( - gorm.io/driver/mysql v1.3.2 - gorm.io/gorm v1.23.3 -) - -require ( - github.com/go-sql-driver/mysql v1.6.0 // indirect - github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jinzhu/now v1.1.4 // indirect -) diff --git a/utils/goparams/go.mod b/utils/goparams/go.mod deleted file mode 100644 index 7c5e2e1e..00000000 --- a/utils/goparams/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/dtapps/go-library/utils/goparams - -go 1.18 - -require github.com/nilorg/sdk v0.0.0-20210429091026-95b6cdc95c84 diff --git a/utils/gophp/go.mod b/utils/gophp/go.mod deleted file mode 100644 index 6e275804..00000000 --- a/utils/gophp/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/dtapps/go-library/utils/gophp - -go 1.18 diff --git a/utils/gophp/gophp.go b/utils/gophp/gophp.go index 834ff7be..da479101 100644 --- a/utils/gophp/gophp.go +++ b/utils/gophp/gophp.go @@ -1,13 +1,122 @@ package gophp -import "github.com/dtapps/go-library/utils/gophp/serialize" +import ( + "gitee.com/dtapps/go-library/utils/gophp/serialize" + "strconv" + "strings" + "unicode" +) // Serialize 序列 -func Serialize(value interface{}) ([]byte, error) { +func Serialize(value any) ([]byte, error) { return serialize.Marshal(value) } // Unserialize 反序列 -func Unserialize(data []byte) (interface{}, error) { +func Unserialize(data []byte) (any, error) { return serialize.UnMarshal(data) } + +func BaseConvert(number string, frombase, tobase int) (string, error) { + i, err := strconv.ParseInt(number, frombase, 0) + if err != nil { + return "", err + } + return strconv.FormatInt(i, tobase), nil +} + +// ArrayColumn array_column() +func ArrayColumn(input map[string]map[string]any, columnKey string) []any { + columns := make([]any, 0, len(input)) + for _, val := range input { + if v, ok := val[columnKey]; ok { + columns = append(columns, v) + } + } + return columns +} + +// Strtr strtr() +// +// If the parameter length is 1, type is: map[string]string +// Strtr("baab", map[string]string{"ab": "01"}) will return "ba01" +// If the parameter length is 2, type is: string, string +// Strtr("baab", "ab", "01") will return "1001", a => 0; b => 1. +func Strtr(haystack string, params ...interface{}) string { + ac := len(params) + if ac == 1 { + pairs := params[0].(map[string]string) + length := len(pairs) + if length == 0 { + return haystack + } + oldnew := make([]string, length*2) + for o, n := range pairs { + if o == "" { + return haystack + } + oldnew = append(oldnew, o, n) + } + return strings.NewReplacer(oldnew...).Replace(haystack) + } else if ac == 2 { + from := params[0].(string) + to := params[1].(string) + trlen, lt := len(from), len(to) + if trlen > lt { + trlen = lt + } + if trlen == 0 { + return haystack + } + + str := make([]uint8, len(haystack)) + var xlat [256]uint8 + var i int + var j uint8 + if trlen == 1 { + for i = 0; i < len(haystack); i++ { + if haystack[i] == from[0] { + str[i] = to[0] + } else { + str[i] = haystack[i] + } + } + return string(str) + } + // trlen != 1 + for { + xlat[j] = j + if j++; j == 0 { + break + } + } + for i = 0; i < trlen; i++ { + xlat[from[i]] = to[i] + } + for i = 0; i < len(haystack); i++ { + str[i] = xlat[haystack[i]] + } + return string(str) + } + + return haystack +} +func Rtrim(str string, characterMask ...string) string { + if len(characterMask) == 0 { + return strings.TrimRightFunc(str, unicode.IsSpace) + } + return strings.TrimRight(str, characterMask[0]) +} +func StrPad(input string, padLength int, padString string) string { + output := padString + + for padLength > len(output) { + output += output + } + + if len(input) >= padLength { + return input + } + + return output[:padLength-len(input)] + input +} diff --git a/utils/goless/goless.go b/utils/gophp/serialize/less.go similarity index 84% rename from utils/goless/goless.go rename to utils/gophp/serialize/less.go index d765d20a..d4cb9120 100644 --- a/utils/goless/goless.go +++ b/utils/gophp/serialize/less.go @@ -1,11 +1,11 @@ -package goless +package serialize import ( "reflect" "strings" ) -func NumericalValue(value reflect.Value) (float64, bool) { +func numericalValue(value reflect.Value) (float64, bool) { switch value.Type().Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: return float64(value.Int()), true @@ -21,9 +21,9 @@ func NumericalValue(value reflect.Value) (float64, bool) { } } -func LessValue(a, b reflect.Value) bool { - aValue, aNumerical := NumericalValue(a) - bValue, bNumerical := NumericalValue(b) +func lessValue(a, b reflect.Value) bool { + aValue, aNumerical := numericalValue(a) + bValue, bNumerical := numericalValue(b) if aNumerical && bNumerical { return aValue < bValue diff --git a/utils/gophp/serialize/serialize.go b/utils/gophp/serialize/serialize.go index 5015c1f8..48f2b327 100644 --- a/utils/gophp/serialize/serialize.go +++ b/utils/gophp/serialize/serialize.go @@ -3,8 +3,7 @@ package serialize import ( "bytes" "fmt" - "github.com/dtapps/go-library/utils/goless" - "github.com/dtapps/go-library/utils/gostring" + "gitee.com/dtapps/go-library/utils/gostring" "reflect" "sort" ) @@ -71,7 +70,7 @@ func MarshalMap(value interface{}) ([]byte, error) { s := reflect.ValueOf(value) mapKeys := s.MapKeys() sort.Slice(mapKeys, func(i, j int) bool { - return goless.LessValue(mapKeys[i], mapKeys[j]) + return lessValue(mapKeys[i], mapKeys[j]) }) var buffer bytes.Buffer for _, mapKey := range mapKeys { diff --git a/utils/gophp/serialize/unserialize.go b/utils/gophp/serialize/unserialize.go index 56894f81..f9ba8743 100644 --- a/utils/gophp/serialize/unserialize.go +++ b/utils/gophp/serialize/unserialize.go @@ -3,7 +3,7 @@ package serialize import ( "bytes" "fmt" - "github.com/dtapps/go-library/utils/gostring" + "gitee.com/dtapps/go-library/utils/gostring" "strconv" ) diff --git a/utils/gopostgresql/app.go b/utils/gopostgresql/app.go index a77be3eb..c51ee238 100644 --- a/utils/gopostgresql/app.go +++ b/utils/gopostgresql/app.go @@ -2,25 +2,91 @@ package gopostgresql import ( "fmt" + "github.com/sirupsen/logrus" "gorm.io/driver/postgres" "gorm.io/gorm" + "gorm.io/gorm/logger" + "os" + "path" + "time" ) type App struct { - Db *gorm.DB - Dns string + Db *gorm.DB // 驱动 + Dns string // 地址 + Log bool // 日志 +} + +type writer struct{} + +func (w writer) Printf(format string, args ...interface{}) { + + now := time.Now() + logFilePath := "" + if dir, err := os.Getwd(); err == nil { + logFilePath = dir + "/logs/postgresql" + } + if err := os.MkdirAll(logFilePath, 0777); err != nil { + fmt.Println(err.Error()) + } + logFileName := "gorm." + now.Format("2006-01-02") + ".log" + + // 日志文件 + fileName := path.Join(logFilePath, logFileName) + if _, err := os.Stat(fileName); err != nil { + if _, err := os.Create(fileName); err != nil { + fmt.Println(err.Error()) + } + } + // 写入文件 + src, err := os.OpenFile(fileName, os.O_APPEND|os.O_WRONLY, os.ModeAppend) + if err != nil { + fmt.Println("err", err) + } + + // 实例化 + l := logrus.New() + + // 设置输出 + l.Out = src + + // 设置日志格式 JSONFormatter=json TextFormatter=text + l.SetFormatter(&logrus.JSONFormatter{ + TimestampFormat: "2006-01-02 15:04:05", + }) + + l.Println(args...) } func (app *App) InitClient() { var err error - app.Db, err = gorm.Open(postgres.Open(app.Dns), &gorm.Config{}) + if app.Log == true { + app.Db, err = gorm.Open(postgres.Open(app.Dns), &gorm.Config{ + Logger: logger.New( + writer{}, + logger.Config{ + SlowThreshold: time.Second, // 慢 SQL 阈值 + LogLevel: logger.Info, // 日志级别 + IgnoreRecordNotFoundError: true, // 忽略ErrRecordNotFound(记录未找到)错误 + Colorful: false, // 禁用彩色打印 + }, + ), + }) + } else { + app.Db, err = gorm.Open(postgres.Open(app.Dns), &gorm.Config{}) + } + if err != nil { panic(fmt.Sprintf("连接数据库失败:%v", err)) } - _, err = app.Db.DB() + sqlDB, err := app.Db.DB() if err != nil { panic(fmt.Sprintf("连接数据库服务器失败:%v", err)) } + sqlDB.SetMaxIdleConns(10) // 设置空闲连接池中连接的最大数量 + sqlDB.SetMaxOpenConns(100) // 设置打开数据库连接的最大数量。 + sqlDB.SetConnMaxLifetime(time.Second * 600) // 设置了连接可复用的最大时间。 + } diff --git a/utils/gopostgresql/go.mod b/utils/gopostgresql/go.mod deleted file mode 100644 index 8afc29ad..00000000 --- a/utils/gopostgresql/go.mod +++ /dev/null @@ -1,23 +0,0 @@ -module github.com/dtapps/go-library/utils/gopostgresql - -go 1.18 - -require ( - gorm.io/driver/postgres v1.3.1 - gorm.io/gorm v1.23.3 -) - -require ( - github.com/jackc/chunkreader/v2 v2.0.1 // indirect - github.com/jackc/pgconn v1.10.1 // indirect - github.com/jackc/pgio v1.0.0 // indirect - github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgproto3/v2 v2.2.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect - github.com/jackc/pgtype v1.9.1 // indirect - github.com/jackc/pgx/v4 v4.14.1 // indirect - github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jinzhu/now v1.1.4 // indirect - golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect - golang.org/x/text v0.3.7 // indirect -) diff --git a/utils/gopreg/go.mod b/utils/gopreg/go.mod deleted file mode 100644 index 208c5b38..00000000 --- a/utils/gopreg/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/dtapps/go-library/utils/gopreg - -go 1.18 diff --git a/utils/gopreg/gopreg.go b/utils/gopreg/gopreg.go deleted file mode 100644 index 69311aad..00000000 --- a/utils/gopreg/gopreg.go +++ /dev/null @@ -1,30 +0,0 @@ -package gopreg - -import ( - "regexp" -) - -// VerifyMobile 验证手机号码 -// 移动:134 135 136 137 138 139 147 150 151 152 157 158 159 178 182 183 184 187 188 198 -// 联通:130 131 132 145 155 156 166 171 175 176 185 186 -// 电信:133 149 153 173 177 180 181 189 199 -// 虚拟运营商: 170 195 -func VerifyMobile(mobile string) bool { - regular := "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,5,8-9]))[0-9]{8}$" - reg := regexp.MustCompile(regular) - return reg.MatchString(mobile) -} - -// VerifyIdCard 验证身份证号码 -func VerifyIdCard(idCard string) bool { - regular := "^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$|^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$" - reg := regexp.MustCompile(regular) - return reg.MatchString(idCard) -} - -// VerifyEmail 验证邮箱号码 -func VerifyEmail(email string) bool { - pattern := `^[0-9a-z][_.0-9a-z-]{0,31}@([0-9a-z][0-9a-z-]{0,30}[0-9a-z]\.){1,4}[a-z]{2,4}$` - reg := regexp.MustCompile(pattern) - return reg.MatchString(email) -} diff --git a/utils/gorandom/go.mod b/utils/gorandom/go.mod deleted file mode 100644 index 6ad04f76..00000000 --- a/utils/gorandom/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/dtapps/go-library/utils/gorandom - -go 1.18 diff --git a/utils/gorandom/gorandom.go b/utils/gorandom/gorandom.go deleted file mode 100644 index 78bac2b1..00000000 --- a/utils/gorandom/gorandom.go +++ /dev/null @@ -1,45 +0,0 @@ -package gorandom - -import ( - "math/rand" - "time" -) - -const numbers string = "0123456789" -const letters string = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" -const specials = "~!@#$%^*()_+-=[]{}|;:,./<>?" -const alphanumerics string = letters + numbers -const ascii string = alphanumerics + specials - -func random(n int, chars string) string { - if n <= 0 { - return "" - } - r := rand.New(rand.NewSource(time.Now().UnixNano())) - bytes := make([]byte, n, n) - l := len(chars) - for i := 0; i < n; i++ { - bytes[i] = chars[r.Intn(l)] - } - return string(bytes) -} - -// Alphanumeric 随机字母数字 -func Alphanumeric(n int) string { - return random(n, alphanumerics) -} - -// Alphabetic 随机字母 -func Alphabetic(n int) string { - return random(n, letters) -} - -// Numeric 随机数字 -func Numeric(n int) string { - return random(n, numbers) -} - -// Ascii 随机ASCII -func Ascii(n int) string { - return random(n, ascii) -} diff --git a/utils/goredis/go.mod b/utils/goredis/go.mod deleted file mode 100644 index 7968590d..00000000 --- a/utils/goredis/go.mod +++ /dev/null @@ -1,10 +0,0 @@ -module github.com/dtapps/go-library/utils/goredis - -go 1.18 - -require github.com/go-redis/redis/v8 v8.11.5 - -require ( - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect -) diff --git a/utils/gorequest/go.mod b/utils/gorequest/go.mod deleted file mode 100644 index ffdc0216..00000000 --- a/utils/gorequest/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/dtapps/go-library/utils/gorequest - -go 1.18 diff --git a/utils/gorsa/go.mod b/utils/gorsa/go.mod deleted file mode 100644 index f0817c75..00000000 --- a/utils/gorsa/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/dtapps/go-library/utils/gorsa - -go 1.18 diff --git a/utils/gorsa/gorsa.go b/utils/gorsa/gorsa.go deleted file mode 100644 index 1bdd8d64..00000000 --- a/utils/gorsa/gorsa.go +++ /dev/null @@ -1,77 +0,0 @@ -package gorsa - -import ( - "crypto/rand" - "crypto/rsa" - "crypto/x509" - "encoding/base64" - "encoding/pem" - "os" -) - -// PublicEncrypt 公钥加密 -func PublicEncrypt(encryptStr string, path string) (string, error) { - // 打开文件 - file, err := os.Open(path) - if err != nil { - return "", err - } - defer file.Close() - - // 读取文件内容 - info, _ := file.Stat() - buf := make([]byte, info.Size()) - file.Read(buf) - - // pem 解码 - block, _ := pem.Decode(buf) - - // x509 解码 - publicKeyInterface, err := x509.ParsePKIXPublicKey(block.Bytes) - if err != nil { - return "", err - } - - // 类型断言 - publicKey := publicKeyInterface.(*rsa.PublicKey) - - //对明文进行加密 - encryptedStr, err := rsa.EncryptPKCS1v15(rand.Reader, publicKey, []byte(encryptStr)) - if err != nil { - return "", err - } - - //返回密文 - return base64.URLEncoding.EncodeToString(encryptedStr), nil -} - -// PrivateDecrypt 私钥解密 -func PrivateDecrypt(decryptStr string, path string) (string, error) { - // 打开文件 - file, err := os.Open(path) - if err != nil { - return "", err - } - defer file.Close() - - // 获取文件内容 - info, _ := file.Stat() - buf := make([]byte, info.Size()) - file.Read(buf) - - // pem 解码 - block, _ := pem.Decode(buf) - - // X509 解码 - privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes) - if err != nil { - return "", err - } - decryptBytes, err := base64.URLEncoding.DecodeString(decryptStr) - - //对密文进行解密 - decrypted, _ := rsa.DecryptPKCS1v15(rand.Reader, privateKey, decryptBytes) - - //返回明文 - return string(decrypted), nil -} diff --git a/utils/gosort/go.mod b/utils/gosort/go.mod deleted file mode 100644 index eb947ee1..00000000 --- a/utils/gosort/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/dtapps/go-library/utils/gosort - -go 1.18 diff --git a/utils/gosort/gosort.go b/utils/gosort/gosort.go deleted file mode 100644 index 08995af7..00000000 --- a/utils/gosort/gosort.go +++ /dev/null @@ -1,26 +0,0 @@ -package gosort - -// QuickSort 快速排序算法 -// https://www.topgoer.com/Go%E9%AB%98%E7%BA%A7/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95.html -func QuickSort(arr []int) []int { - if len(arr) <= 1 { - return arr - } - splitdata := arr[0] //第一个数据 - low := make([]int, 0, 0) //比我小的数据 - hight := make([]int, 0, 0) //比我大的数据 - mid := make([]int, 0, 0) //与我一样大的数据 - mid = append(mid, splitdata) //加入一个 - for i := 1; i < len(arr); i++ { - if arr[i] < splitdata { - low = append(low, arr[i]) - } else if arr[i] > splitdata { - hight = append(hight, arr[i]) - } else { - mid = append(mid, arr[i]) - } - } - low, hight = QuickSort(low), QuickSort(hight) - myarr := append(append(low, mid...), hight...) - return myarr -} diff --git a/utils/gossh/go.mod b/utils/gossh/go.mod deleted file mode 100644 index adb37f23..00000000 --- a/utils/gossh/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/dtapps/go-library/utils/gossh - -go 1.18 - -require golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd - -require golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 // indirect diff --git a/utils/gossh/gossh.go b/utils/gossh/gossh.go deleted file mode 100644 index 26344c6f..00000000 --- a/utils/gossh/gossh.go +++ /dev/null @@ -1,66 +0,0 @@ -package gossh - -import ( - "fmt" - "golang.org/x/crypto/ssh" - "io" - "net" - "time" -) - -// 转发 -func sForward(serverAddr string, remoteAddr string, localConn net.Conn, config *ssh.ClientConfig) { - // 设置sshClientConn - sshClientConn, err := ssh.Dial("tcp", serverAddr, config) - if err != nil { - fmt.Printf("ssh.Dial failed: %s", err) - } - - // 设置Connection - sshConn, err := sshClientConn.Dial("tcp", remoteAddr) - - // 将localConn.Reader复制到sshConn.Writer - go func() { - _, err = io.Copy(sshConn, localConn) - if err != nil { - fmt.Printf("io.Copy failed: %v", err) - } - }() - - // 将sshConn.Reader复制到localConn.Writer - go func() { - _, err = io.Copy(localConn, sshConn) - if err != nil { - fmt.Printf("io.Copy failed: %v", err) - } - }() -} -func Tunnel(username string, password string, serverAddr string, remoteAddr string, localAddr string) { - // 设置SSH配置 - fmt.Printf("%s,服务器:%s;远程:%s;本地:%s\n", "设置SSH配置", serverAddr, remoteAddr, localAddr) - config := &ssh.ClientConfig{ - User: username, - Auth: []ssh.AuthMethod{ - ssh.Password(password), - }, - Timeout: 30 * time.Second, - HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error { - return nil - }, - } - - // 设置本地监听器 - localListener, err := net.Listen("tcp", localAddr) - if err != nil { - fmt.Printf("net.Listen failed: %v\n", err) - } - - for { - // 设置本地 - localConn, err := localListener.Accept() - if err != nil { - fmt.Printf("localListener.Accept failed: %v\n", err) - } - go sForward(serverAddr, remoteAddr, localConn, config) - } -} diff --git a/utils/gossl/go.mod b/utils/gossl/go.mod deleted file mode 100644 index 98d3b42c..00000000 --- a/utils/gossl/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/dtapps/go-library/utils/gossl - -go 1.18 diff --git a/utils/gossl/gossl.go b/utils/gossl/gossl.go deleted file mode 100644 index 854a7c76..00000000 --- a/utils/gossl/gossl.go +++ /dev/null @@ -1,43 +0,0 @@ -package gossl - -import ( - "crypto/tls" - "errors" - "fmt" - "net/http" - "time" -) - -// https://mritd.com/2021/05/31/golang-check-certificate-expiration-time/ -func checkSSl(beforeTime time.Duration) error { - c := &http.Client{ - Transport: &http.Transport{ - // 注意如果证书已过期,那么只有在关闭证书校验的情况下链接才能建立成功 - TLSClientConfig: &tls.Config{ - InsecureSkipVerify: true, - }, - }, - // 10s 超时后认为服务挂了 - Timeout: 10 * time.Second, - } - resp, err := c.Get("https://mritd.com") - if err != nil { - return err - } - defer func() { _ = resp.Body.Close() }() - - // 遍历所有证书 - for _, cert := range resp.TLS.PeerCertificates { - // 检测证书是否已经过期 - if !cert.NotAfter.After(time.Now()) { - return errors.New(fmt.Sprintf("Website [https://mritd.com] certificate has expired: %s", cert.NotAfter.Local().Format("2006-01-02 15:04:05"))) - } - - // 检测证书距离当前时间 是否小于 beforeTime - // 例如 beforeTime = 7d,那么在证书过期前 6d 开始就发出警告 - if cert.NotAfter.Sub(time.Now()) < beforeTime { - return errors.New(fmt.Sprintf("Website [https://mritd.com] certificate will expire, remaining time: %fh", cert.NotAfter.Sub(time.Now()).Hours())) - } - } - return nil -} diff --git a/utils/gostring/go.mod b/utils/gostring/go.mod deleted file mode 100644 index 942b9bbf..00000000 --- a/utils/gostring/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/dtapps/go-library/utils/gostring - -go 1.18 diff --git a/utils/gostring/gostring.go b/utils/gostring/gostring.go index 4cc05c36..a53f6c02 100644 --- a/utils/gostring/gostring.go +++ b/utils/gostring/gostring.go @@ -30,6 +30,24 @@ func ToInt64(s string) int64 { return int64(ToFloat64(s)) } +// ToUint string到uint64 +func ToUint(s string) uint { + i, err := strconv.ParseUint(s, 10, 64) + if err == nil { + return uint(i) + } + return 0 +} + +// ToUint64 string到uint64 +func ToUint64(s string) uint64 { + i, err := strconv.ParseUint(s, 10, 64) + if err == nil { + return i + } + return 0 +} + // Replace 字符串替换 func Replace(str, old, new string) string { return strings.Replace(str, old, new, -1) diff --git a/utils/gotime/Tomorrow.go b/utils/gotime/Tomorrow.go deleted file mode 100644 index e91268f5..00000000 --- a/utils/gotime/Tomorrow.go +++ /dev/null @@ -1,15 +0,0 @@ -package gotime - -import "time" - -// Tomorrow 明天 -func Tomorrow() Pro { - p := NewPro() - location, err := time.LoadLocation("Asia/Shanghai") - if err != nil { - p.Time = time.Now().Add(time.Hour*8).AddDate(0, 0, +1) - } else { - p.Time = time.Now().In(location).AddDate(0, 0, +1) - } - return p -} diff --git a/utils/gotime/app.go b/utils/gotime/app.go deleted file mode 100644 index b10633b4..00000000 --- a/utils/gotime/app.go +++ /dev/null @@ -1,91 +0,0 @@ -package gotime - -import ( - "fmt" - "time" -) - -// 时间格式化常量 -const ( - RFC3339Format = time.RFC3339 - Iso8601Format = "2006-01-02T15:04:05-07:00" - CookieFormat = "Monday, 02-Jan-2006 15:04:05 MST" - RFC1036Format = "Mon, 02 Jan 06 15:04:05 -0700" - RFC7231Format = "Mon, 02 Jan 2006 15:04:05 GMT" - DayDateTimeFormat = "Mon, Jan 2, 2006 3:04 PM" - DateTimeFormat = "2006-01-02 15:04:05" - DateFormat = "2006-01-02" - TimeFormat = "15:04:05" - ShortDateTimeFormat = "20060102150405" - ShortDateFormat = "20060102" - ShortTimeFormat = "150405" -) - -// Pro 结构体 -type Pro struct { - Time time.Time - loc *time.Location - Error error -} - -// NewPro 初始化结构体 -func NewPro() Pro { - return Pro{ - Time: time.Now(), - } -} - -// BeforeSeconds 获取n秒前的时间 -func (p Pro) BeforeSeconds(seconds int) Pro { - st, _ := time.ParseDuration(fmt.Sprintf("-%ds", seconds)) - p.Time = p.Time.Add(st) - return p -} - -// AfterSeconds 获取n秒后的时间 -func (p Pro) AfterSeconds(seconds int) Pro { - st, _ := time.ParseDuration(fmt.Sprintf("+%ds", seconds)) - p.Time = p.Time.Add(st) - return p -} - -// BeforeHour 获取n小时前的时间 -func (p Pro) BeforeHour(hour int) Pro { - st, _ := time.ParseDuration(fmt.Sprintf("-%dh", hour)) - p.Time = p.Time.Add(st) - return p -} - -// AfterHour 获取n小时后的时间 -func (p Pro) AfterHour(hour int) Pro { - st, _ := time.ParseDuration(fmt.Sprintf("+%dh", hour)) - p.Time = p.Time.Add(st) - return p -} - -// BeforeDay 获取n天前的时间 -func (p Pro) BeforeDay(day int) Pro { - p.Time = p.Time.AddDate(0, 0, -day) - return p -} - -// AfterDay 获取n天后的时间 -func (p Pro) AfterDay(day int) Pro { - p.Time = p.Time.AddDate(0, 0, day) - return p -} - -// SetFormat 格式化 -func (p Pro) SetFormat(layout string) string { - return p.Time.Format(layout) -} - -// Month 获取当前月 -func (p Pro) Month() int { - return p.MonthOfYear() -} - -// MonthOfYear 获取本年的第几月 -func (p Pro) MonthOfYear() int { - return int(p.Time.In(p.loc).Month()) -} diff --git a/utils/gotime/differ.go b/utils/gotime/differ.go deleted file mode 100644 index 0ad3033e..00000000 --- a/utils/gotime/differ.go +++ /dev/null @@ -1,69 +0,0 @@ -package gotime - -import "time" - -// DiffInHour 相差多少小时 -func (p Pro) DiffInHour(t2 time.Time) (hour int64) { - t2.Before(p.Time) - diff := p.Time.Unix() - t2.Unix() - hour = diff / 3600 - return hour -} - -// DiffInHourWithAbs 相差多少小时(绝对值) -func (p Pro) DiffInHourWithAbs(t2 time.Time) (hour int64) { - p.Time.Before(t2) - diff := t2.Unix() - p.Time.Unix() - hour = diff / 3600 - if hour > 0 { - return hour - } - t2.Before(p.Time) - diff = p.Time.Unix() - t2.Unix() - hour = diff / 3600 - return hour -} - -// DiffInMinutes 相差多少分钟 -func (p Pro) DiffInMinutes(t2 time.Time) (hour int64) { - t2.Before(p.Time) - diff := p.Time.Unix() - t2.Unix() - hour = diff / 60 - return hour -} - -// DiffInMinutesWithAbs 相差多少分钟(绝对值) -func (p Pro) DiffInMinutesWithAbs(t2 time.Time) (hour int64) { - p.Time.Before(t2) - diff := t2.Unix() - p.Time.Unix() - hour = diff / 60 - if hour > 0 { - return hour - } - t2.Before(p.Time) - diff = p.Time.Unix() - t2.Unix() - hour = diff / 60 - return hour -} - -// DiffInSecond 相差多少秒 -func (p Pro) DiffInSecond(t2 time.Time) (hour int64) { - t2.Before(p.Time) - diff := p.Time.Unix() - t2.Unix() - hour = diff - return hour -} - -// DiffInSecondWithAbs 相差多少秒(绝对值) -func (p Pro) DiffInSecondWithAbs(t2 time.Time) (hour int64) { - p.Time.Before(t2) - diff := t2.Unix() - p.Time.Unix() - hour = diff - if hour > 0 { - return hour - } - t2.Before(p.Time) - diff = p.Time.Unix() - t2.Unix() - hour = diff - return hour -} diff --git a/utils/gotime/errors.go b/utils/gotime/errors.go deleted file mode 100644 index 2f69622f..00000000 --- a/utils/gotime/errors.go +++ /dev/null @@ -1,8 +0,0 @@ -package gotime - -import "fmt" - -// invalidTimezoneError 无效的时区错误 -var invalidTimezoneError = func(timezone string) error { - return fmt.Errorf("invalid timezone %q, please see the file %q for all valid timezones", timezone, "$GOROOT/lib/time/zoneinfo.zip") -} diff --git a/utils/gotime/go.mod b/utils/gotime/go.mod deleted file mode 100644 index bd0c6e0b..00000000 --- a/utils/gotime/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/dtapps/go-library/utils/gotime - -go 1.18 diff --git a/utils/gotime/location.go b/utils/gotime/location.go deleted file mode 100644 index 1b664ab0..00000000 --- a/utils/gotime/location.go +++ /dev/null @@ -1,14 +0,0 @@ -package gotime - -import ( - "time" -) - -// 通过时区获取 Location 实例 -func getLocationByTimezone(timezone string) (*time.Location, error) { - loc, err := time.LoadLocation(timezone) - if err != nil { - err = invalidTimezoneError(timezone) - } - return loc, err -} diff --git a/utils/gotime/start_end.go b/utils/gotime/start_end.go deleted file mode 100644 index 5afb4f50..00000000 --- a/utils/gotime/start_end.go +++ /dev/null @@ -1,124 +0,0 @@ -package gotime - -import "time" - -// 数字常量 -const ( - YearsPerMillennium = 1000 // 每千年1000年 - YearsPerCentury = 100 // 每世纪100年 - YearsPerDecade = 10 // 每十年10年 - QuartersPerYear = 4 // 每年4季度 - MonthsPerYear = 12 // 每年12月 - MonthsPerQuarter = 3 // 每季度3月 - WeeksPerNormalYear = 52 // 每常规年52周 - weeksPerLongYear = 53 // 每长年53周 - WeeksPerMonth = 4 // 每月4周 - DaysPerLeapYear = 366 // 每闰年366天 - DaysPerNormalYear = 365 // 每常规年365天 - DaysPerWeek = 7 // 每周7天 - HoursPerWeek = 168 // 每周168小时 - HoursPerDay = 24 // 每天24小时 - MinutesPerDay = 1440 // 每天1440分钟 - MinutesPerHour = 60 // 每小时60分钟 - SecondsPerWeek = 604800 // 每周604800秒 - SecondsPerDay = 86400 // 每天86400秒 - SecondsPerHour = 3600 // 每小时3600秒 - SecondsPerMinute = 60 // 每分钟60秒 - MillisecondsPerSecond = 1000 // 每秒1000毫秒 - MicrosecondsPerMillisecond = 1000 // 每毫秒1000微秒 - MicrosecondsPerSecond = 1000000 // 每秒1000000微秒 -) - -// StartOfCentury 本世纪开始时间 -func (p Pro) StartOfCentury() Pro { - p.Time = time.Date(p.Time.Year()/YearsPerCentury*YearsPerCentury, 1, 1, 0, 0, 0, 0, p.Time.Location()) - return p -} - -// EndOfCentury 本世纪结束时间 -func (p Pro) EndOfCentury() Pro { - p.Time = time.Date(p.Time.Year()/YearsPerCentury*YearsPerCentury+99, 12, 31, 23, 59, 59, 999999999, p.Time.Location()) - return p -} - -// StartOfDecade 本年代开始时间 -func (p Pro) StartOfDecade() Pro { - p.Time = time.Date(p.Time.Year()/YearsPerDecade*YearsPerDecade, 1, 1, 0, 0, 0, 0, p.Time.Location()) - return p -} - -// EndOfDecade 本年代结束时间 -func (p Pro) EndOfDecade() Pro { - p.Time = time.Date(p.Time.Year()/YearsPerDecade*YearsPerDecade+9, 12, 31, 23, 59, 59, 999999999, p.Time.Location()) - return p -} - -// StartOfYear 本年开始时间 -func (p Pro) StartOfYear() Pro { - p.Time = time.Date(p.Time.Year(), 1, 1, 0, 0, 0, 0, p.Time.Location()) - return p -} - -// EndOfYear 本年结束时间 -func (p Pro) EndOfYear() Pro { - p.Time = time.Date(p.Time.Year(), 12, 31, 23, 59, 59, 999999999, p.Time.Location()) - return p -} - -// Quarter 获取当前季度 -func (p Pro) Quarter() (quarter int) { - switch { - case p.Time.Month() >= 10: - quarter = 4 - case p.Time.Month() >= 7: - quarter = 3 - case p.Time.Month() >= 4: - quarter = 2 - case p.Time.Month() >= 1: - quarter = 1 - } - return -} - -// StartOfQuarter 本季度开始时间 -func (p Pro) StartOfQuarter() Pro { - p.Time = time.Date(p.Time.Year(), time.Month(3*p.Quarter()-2), 1, 0, 0, 0, 0, p.Time.Location()) - return p -} - -// EndOfQuarter 本季度结束时间 -func (p Pro) EndOfQuarter() Pro { - quarter, day := p.Quarter(), 30 - switch quarter { - case 1, 4: - day = 31 - case 2, 3: - day = 30 - } - p.Time = time.Date(p.Time.Year(), time.Month(3*quarter), day, 23, 59, 59, 999999999, p.Time.Location()) - return p -} - -// StartOfMonth 本月开始时间 -func (p Pro) StartOfMonth() Pro { - p.Time = time.Date(p.Time.Year(), time.Month(p.Month()), 1, 0, 0, 0, 0, p.Time.Location()) - return p -} - -// EndOfMonth 本月结束时间 -func (p Pro) EndOfMonth() Pro { - p.Time = time.Date(p.Time.Year(), time.Month(p.Month()), 1, 23, 59, 59, 999999999, p.Time.Location()) - return p -} - -// StartOfDay 本日开始时间 -func (p Pro) StartOfDay() Pro { - p.Time = time.Date(p.Time.Year(), p.Time.Month(), p.Time.Day(), 0, 0, 0, 0, p.Time.Location()) - return p -} - -// EndOfDay 本日结束时间 -func (p Pro) EndOfDay() Pro { - p.Time = time.Date(p.Time.Year(), p.Time.Month(), p.Time.Day(), 23, 59, 59, 0, p.Time.Location()) - return p -} diff --git a/utils/gotime/today.go b/utils/gotime/today.go deleted file mode 100644 index f19f505e..00000000 --- a/utils/gotime/today.go +++ /dev/null @@ -1,112 +0,0 @@ -package gotime - -import ( - "log" - "strconv" - "strings" - "time" -) - -// Current 获取当前的时间 -func Current() Pro { - p := NewPro() - p.loc, p.Error = time.LoadLocation("Asia/Shanghai") - if p.Error != nil { - // Docker部署golang应用时时区问题 https://www.ddhigh.com/2018/03/01/golang-docker-timezone.html - log.Printf("【gotime】时区错误:%v\n", p.Error) - p.Time = time.Now().Add(time.Hour * 8) - } else { - p.Time = time.Now().In(p.loc) - } - return p -} - -// SetCurrent 设置当前的时间 -func SetCurrent(sTime time.Time) Pro { - p := NewPro() - p.Time = sTime - return p -} - -// SetCurrentParse 设置当前的时间 -func SetCurrentParse(str string) Pro { - - p := NewPro() - - p.loc, p.Error = time.LoadLocation("Asia/Shanghai") - - layout := DateTimeFormat - if str == "" || str == "0" || str == "0000-00-00 00:00:00" || str == "0000-00-00" || str == "00:00:00" { - return p - } - if len(str) == 10 && strings.Count(str, "-") == 2 { - layout = DateFormat - } - if strings.Index(str, "T") == 10 { - layout = RFC3339Format - } - if _, err := strconv.ParseInt(str, 10, 64); err == nil { - switch len(str) { - case 8: - layout = ShortDateFormat - case 14: - layout = ShortDateTimeFormat - } - } - location, _ := time.ParseInLocation(layout, str, p.loc) - - p.Time = location - return p -} - -// SetCurrentUnix 设置当前的时间 Unix时间戳 -func SetCurrentUnix(ts int64) Pro { - p := NewPro() - p.Time = time.Unix(ts, 0) - return p -} - -// Now 今天此刻 -func (p Pro) Now() time.Time { - return p.Time -} - -// Format 今天此刻格式化 -func (p Pro) Format() string { - return p.Time.Format(DateTimeFormat) -} - -// ToDateFormat 今天此刻日期 -func (p Pro) ToDateFormat() string { - return p.Time.Format(DateFormat) -} - -// ToTimeFormat 今天此刻时间 -func (p Pro) ToTimeFormat() string { - return p.Time.Format(TimeFormat) -} - -// Timestamp 今天此刻时间戳 -func (p Pro) Timestamp() int64 { - return p.Time.Unix() -} - -// TimestampWithSecond 今天此刻时间戳 -func (p Pro) TimestampWithSecond() int64 { - return p.Time.Unix() -} - -// TimestampWithMillisecond 今天毫秒级时间戳 -func (p Pro) TimestampWithMillisecond() int64 { - return p.Time.UnixNano() / int64(time.Millisecond) -} - -// TimestampWithMicrosecond 今天微秒级时间戳 -func (p Pro) TimestampWithMicrosecond() int64 { - return p.Time.UnixNano() / int64(time.Microsecond) -} - -// TimestampWithNanosecond 今天纳秒级时间戳 -func (p Pro) TimestampWithNanosecond() int64 { - return p.Time.UnixNano() -} diff --git a/utils/gotime/yesterday.go b/utils/gotime/yesterday.go deleted file mode 100644 index be1cd6c6..00000000 --- a/utils/gotime/yesterday.go +++ /dev/null @@ -1,17 +0,0 @@ -package gotime - -import ( - "time" -) - -// Yesterday 昨天 -func Yesterday() Pro { - p := NewPro() - location, err := time.LoadLocation("Asia/Shanghai") - if err != nil { - p.Time = time.Now().Add(time.Hour*8).AddDate(0, 0, -1) - } else { - p.Time = time.Now().In(location).AddDate(0, 0, -1) - } - return p -} diff --git a/utils/gourl/go.mod b/utils/gourl/go.mod deleted file mode 100644 index e13fcf9b..00000000 --- a/utils/gourl/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/dtapps/go-library/utils/gourl - -go 1.18 diff --git a/utils/gouuid/go.mod b/utils/gouuid/go.mod deleted file mode 100644 index f98fee4a..00000000 --- a/utils/gouuid/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/dtapps/go-library/utils/gouuid - -go 1.18 diff --git a/utils/gouuid/gouuid.go b/utils/gouuid/gouuid.go deleted file mode 100644 index 754fee6b..00000000 --- a/utils/gouuid/gouuid.go +++ /dev/null @@ -1,18 +0,0 @@ -package gouuid - -import ( - "crypto/rand" - "fmt" - "time" -) - -// GetUuId 获取唯一ID -func GetUuId() string { - unix32bits := uint32(time.Now().UTC().Unix()) - buff := make([]byte, 12) - numRead, err := rand.Read(buff) - if numRead != len(buff) || err != nil { - return "" - } - return fmt.Sprintf("%x-%x-%x-%x-%x-%x", unix32bits, buff[0:2], buff[2:4], buff[4:6], buff[6:8], buff[8:]) -} diff --git a/utils/goxml/goxml.go b/utils/goxml/goxml.go new file mode 100644 index 00000000..d8d169b2 --- /dev/null +++ b/utils/goxml/goxml.go @@ -0,0 +1,43 @@ +package goxml + +import ( + "encoding/xml" + "io" + "strings" +) + +func XmlDecode(data string) map[string]string { + decoder := xml.NewDecoder(strings.NewReader(data)) + result := make(map[string]string) + key := "" + for { + token, err := decoder.Token() //读取一个标签或者文本内容 + if err == io.EOF { + return result + } + if err != nil { + return result + } + switch tp := token.(type) { //读取的TOKEN可以是以下三种类型:StartElement起始标签,EndElement结束标签,CharData文本内容 + case xml.StartElement: + se := xml.StartElement(tp) //强制类型转换 + if se.Name.Local != "xml" { + key = se.Name.Local + } + if len(se.Attr) != 0 { + //读取标签属性 + } + case xml.EndElement: + ee := xml.EndElement(tp) + if ee.Name.Local == "xml" { + return result + } + case xml.CharData: //文本数据,注意一个结束标签和另一个起始标签之间可能有空格 + cd := xml.CharData(tp) + data := strings.TrimSpace(string(cd)) + if len(data) != 0 { + result[key] = data + } + } + } +} diff --git a/utils/phpjson/go.mod b/utils/phpjson/go.mod deleted file mode 100644 index 2e3d347b..00000000 --- a/utils/phpjson/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/dtapps/go-library/utils/phpjson - -go 1.18 diff --git a/utils/phpjson/phpjson.go b/utils/phpjson/phpjson.go deleted file mode 100644 index 16d8eafa..00000000 --- a/utils/phpjson/phpjson.go +++ /dev/null @@ -1,50 +0,0 @@ -package phpjson - -import ( - "encoding/json" - "fmt" - "reflect" - "strings" -) - -func Encode(v interface{}) (string, error) { - bytes, err := json.Marshal(v) - if err != nil { - return "", err - } - return string(bytes), nil -} - -func MarshalToString(msg interface{}) (string, error) { - j, e := json.Marshal(msg) - if e != nil { - return "", e - } - return string(j), nil -} - -func Implode(list interface{}, seq string) string { - listValue := reflect.Indirect(reflect.ValueOf(list)) - if listValue.Kind() != reflect.Slice { - return "" - } - count := listValue.Len() - listStr := make([]string, 0, count) - for i := 0; i < count; i++ { - v := listValue.Index(i) - if str, err := getValue(v); err == nil { - listStr = append(listStr, str) - } - } - return strings.Join(listStr, seq) -} - -func getValue(value reflect.Value) (res string, err error) { - switch value.Kind() { - case reflect.Ptr: - res, err = getValue(value.Elem()) - default: - res = fmt.Sprint(value.Interface()) - } - return -} diff --git a/utils/rmb/go.mod b/utils/rmb/go.mod deleted file mode 100644 index cf812765..00000000 --- a/utils/rmb/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/dtapps/go-library/utils/rmb - -go 1.18 - -require github.com/shopspring/decimal v1.3.1 diff --git a/utils/utils.go b/utils/utils.go deleted file mode 100644 index b791d103..00000000 --- a/utils/utils.go +++ /dev/null @@ -1,43 +0,0 @@ -package utils - -import ( - _ "github.com/dtapps/go-library/utils/goaes" - _ "github.com/dtapps/go-library/utils/goarray" - _ "github.com/dtapps/go-library/utils/gobase64" - _ "github.com/dtapps/go-library/utils/godecimal" - _ "github.com/dtapps/go-library/utils/godmail" - _ "github.com/dtapps/go-library/utils/goenv" - _ "github.com/dtapps/go-library/utils/gofiles" - _ "github.com/dtapps/go-library/utils/gofloat" - _ "github.com/dtapps/go-library/utils/goget" - _ "github.com/dtapps/go-library/utils/goheader" - _ "github.com/dtapps/go-library/utils/gohttp" - _ "github.com/dtapps/go-library/utils/goint" - _ "github.com/dtapps/go-library/utils/goint64" - _ "github.com/dtapps/go-library/utils/goip" - _ "github.com/dtapps/go-library/utils/gojson" - _ "github.com/dtapps/go-library/utils/goless" - _ "github.com/dtapps/go-library/utils/golock" - _ "github.com/dtapps/go-library/utils/golog" - _ "github.com/dtapps/go-library/utils/gomac" - _ "github.com/dtapps/go-library/utils/gomd5" - _ "github.com/dtapps/go-library/utils/gomongo" - _ "github.com/dtapps/go-library/utils/gomysql" - _ "github.com/dtapps/go-library/utils/goparams" - _ "github.com/dtapps/go-library/utils/gophp" - _ "github.com/dtapps/go-library/utils/gopostgresql" - _ "github.com/dtapps/go-library/utils/gopreg" - _ "github.com/dtapps/go-library/utils/gorandom" - _ "github.com/dtapps/go-library/utils/goredis" - _ "github.com/dtapps/go-library/utils/gorequest" - _ "github.com/dtapps/go-library/utils/gorsa" - _ "github.com/dtapps/go-library/utils/gosort" - _ "github.com/dtapps/go-library/utils/gossh" - _ "github.com/dtapps/go-library/utils/gossl" - _ "github.com/dtapps/go-library/utils/gostring" - _ "github.com/dtapps/go-library/utils/gotime" - _ "github.com/dtapps/go-library/utils/gourl" - _ "github.com/dtapps/go-library/utils/gouuid" - _ "github.com/dtapps/go-library/utils/phpjson" - _ "github.com/dtapps/go-library/utils/rmb" -)