添加京东到家签名转大写!

This commit is contained in:
邹宗楠
2022-03-18 14:08:15 +08:00
parent ef1222df31
commit a6f3978595
7 changed files with 450 additions and 166 deletions

View File

@@ -7,20 +7,39 @@ import (
)
const (
sigKey = "signature"
TokenURL = "https://open-anubis.ele.me/anubis-webapi/openapi/token"
ApiURL = "https://open-anubis.ele.me/anubis-webapi/v3/invoke/"
RequestPost = "POST"
RequestGet = "GET"
)
//todo 返回参数没做玩
//type TokenInfo struct {
// AccessToken string `json:"access_token"`
// AppID string `json:"app_id"`
// ExpireTime int64 `json:"expire_time"`
//}
// 注册请求api
type API struct {
grantType string `json:"grant_type"`
code string `json:"code"`
appID string `json:"app_id"`
merchantId string `json:"merchant_id"`
signature string `json:"signature"`
timestamp int64 `json:"timestamp"`
accessToken string `json:"access_token"`
appSecret string `json:"app_secret"`
version string `json:"version"`
locker sync.RWMutex
client *http.Client
config *platformapi.APIConfig
}
// 请求基础结构体
type BaseInfo struct {
AccessToken string `json:"access_token"` //凭证token
Signature string `json:"signature"`
MerchantID string `json:"merchant_id"` //商户id
Version string `json:"version"` // 版本固定1.0
AppID string `json:"app_id"` //应用id
Timestamp int64 `json:"timestamp"` // 当前时间戳
}
//#region 获取授权token
// 获取token
type TokenInfo struct {
@@ -39,33 +58,9 @@ type BusinessData struct {
ReExpireIn string `json:"re_expire_in"` //refresh_token剩余有效时间
}
// 注册请求api
type API struct {
grantType string `json:"grant_type"`
code string `json:"code"`
appID string `json:"app_id"`
merchantId string `json:"merchant_id"`
signature string `json:"signature"`
timestamp int64 `json:"timestamp"`
accessToken string `json:"access_token"`
appSecret string `json:"app_secret"`
version string `json:"version"`
locker sync.RWMutex
client *http.Client
config *platformapi.APIConfig
}
//<------------------------------------------------------------->
// 请求基础结构体
type BaseInfo struct {
AccessToken string `json:"access_token"` //凭证token
Signature string `json:"signature"`
MerchantID string `json:"merchant_id"` //商户id
Version string `json:"version"` // 版本固定1.0
AppID string `json:"app_id"` //应用id
Timestamp int64 `json:"timestamp"` // 当前时间戳
}
//#endregion
//<------------------------------------门店--------------------------------------------------------------------------------------->
//#region 获取蜂鸟门店信息
// 获取单个门店查询
@@ -74,17 +69,13 @@ type GetOneStoreParam struct {
BusinessData string `json:"business_data"` // 门店基础数据
}
// 获取单个门店基础参数
// 获取单个门店基础参数(请求)
type GetOneStore struct {
MerchantID string `json:"merchant_id"` // 商户id
OutShopCode string `json:"out_shop_code"` // 外部门店编码
}
// 获取门店返回值信息
type GetStoreResp struct {
TokenInfo
}
// 获取单个门店(返回)
type GetOneStoreRespData struct {
Address string `json:"address"` // 门店地址
BranchName string `json:"branch_name"` // 门店分店名
@@ -112,47 +103,328 @@ type GetOneStoreRespData struct {
StatusDesc string `json:"status_desc"` // 门店认证状态描述
}
//#endregion
// 更新蜂鸟门店信息
type UpdateStoreParam struct {
// 必填
ChainStoreID string `json:"chain_store_id"`
HeadShopName string `json:"head_shop_name"` // 门店主店名
ContactPhone string `json:"contact_phone"` // 门店联系方式
Address string `json:"address"` // 门店地址
Longitude string `json:"longitude"` // 纬度
Latitude string `json:"latitude"` // 门店纬度
PositionSource string `json:"position_source"` // 经纬度来源 坐标属性高德地图3目前只支持高德地图坐标
OutShopCode string `json:"out_shop_code"` // 外部门店编码
CategoryID string `json:"category_id"` // 门店类目
OwnerName string `json:"owner_name"` // 门店主店名
OwnerIDNum string `json:"owner_id_num"` // 门店拥有人身份证号
HandheldLicencePicHash string `json:"handheld_licence_pic_hash"` // 门店拥有人手持身份证、营业执照图片
OwnerIDPicFrontHash string `json:"owner_id_pic_front_hash"` // 身份证正面
OwnerIDPicBackHash string `json:"owner_id_pic_back_hash"` // 身份证反面
CreditCode string `json:"credit_code"` // 统一社会信用代码
BusinessLicencePicHash string `json:"business_licence_pic_hash"` // 营业执照图片
// CreateStoreParam 创建门店请求参数
type CreateStoreParam struct {
BaseInfo
BusinessData string `json:"business_data"` // 门店基础数据
// 选填
BranchShopName string `json:"branch_shop_name"` // 门店主店名
ChainstoreType string `json:"chainstore_type"`
FoodLicensePicHash string `json:"food_license_pic_hash"` // 食品安全执照图片
SecondMedicalEquipmentLicensePicHash string `json:"second_medical_equipment_license_pic_hash"` // 第二类医疗器械类目必传
MedicalInstitutionLicensePicHash string `json:"medical_institution_license_pic_hash"` // 医疗机构必传
MedicalEquipmentLicensePicHash string `json:"medical_equipment_license_pic_hash"` // 经营医疗器械必传
MedicineLicensePicHash string `json:"medicine_license_pic_hash"` // 药品经营许可证
TabacooLicensePicHash string `json:"tabacoo_license_pic_hash"` // 烟草经营许可证图片
}
// 创建门店基础数据
type CreateStoreBaseInfo struct {
BranchShopName string `json:"branch_shop_name"` // 门店主店名 必填
// 必填
HeadShopName string `json:"head_shop_name"` // 门店主店名
ContactPhone string `json:"contact_phone"` // 门店联系方式
OwnerIDPicFrontHash string `json:"owner_id_pic_front_hash"` // 身份证正面
BusinessLicencePicHash string `json:"business_licence_pic_hash"` // 营业执照图片
Address string `json:"address"` // 门店地址
Longitude float64 `json:"longitude"` // 门店经度(0-18)
Latitude float64 `json:"latitude"` // 门店纬度(0-90)
PositionSource int `json:"position_source"` // 经纬度来源只支持高德(默认值3)
OutShopCode string `json:"out_shop_code"` // 外部门店编码
CategoryID string `json:"category_id"` // 门店类目
HandheldLicencePicHash string `json:"handheld_licence_pic_hash"` // 门店拥有人手持身份证、营业执照图片
CreditCode string `json:"credit_code"` // 统一社会信用代码
SettlementModel string `json:"settlement_model"` // 1实时结算 2账期结算默认为1若为账期结算需额外传入结算账号id
SettlementAccountID string `json:"settlement_account_id"` // 门店结算账号id
OwnerIDNum string `json:"owner_id_num"` // 门店拥有人身份证号
FoodLicensePicHash string `json:"food_license_pic_hash"` // 食品安全执照图片(食品经营必传)
HeadShopName string `json:"head_shop_name"` // 门店主店名
Address string `json:"address"` // 门店地址
OwnerName string `json:"owner_name"` // 门店拥有人姓名
ChainstoreType int `json:"chainstore_type"` // 门店类型 1正式门店2测试门店默认为1
OwnerIDNum string `json:"owner_id_num"` // 门店拥有人身份证号
HandheldLicencePicHash string `json:"handheld_licence_pic_hash"` // 门店拥有人手持身份证、营业执照图片
OwnerIDPicFrontHash string `json:"owner_id_pic_front_hash"` // 身份证正面
OwnerIDPicBackHash string `json:"owner_id_pic_back_hash"` // 身份证反面
PositionSource int `json:"position_source"` // 经纬度来源只支持高德(默认值3)
CreditCode string `json:"credit_code"` // 统一社会信用代码
BusinessLicencePicHash string `json:"business_licence_pic_hash"` // 营业执照图片
// 非必填
BranchShopName string `json:"branch_shop_name"` // 门店主店名
ChainstoreType int `json:"chainstore_type"` // 门店类型 1正式门店2测试门店默认为1
SettlementModel string `json:"settlement_model"` // 1实时结算 2账期结算默认为1若为账期结算需额外传入结算账号id
SettlementAccountID string `json:"settlement_account_id"` // 门店结算账号id
// 经营类目包含食品必传
FoodLicensePicHash string `json:"food_license_pic_hash"` // 食品安全执照图片(食品经营必传)
SecondMedicalEquipmentLicensePicHash string `json:"second_medical_equipment_license_pic_hash"` // 第二类医疗器械类目必传
MedicalInstitutionLicensePicHash string `json:"medical_institution_license_pic_hash"` // 医疗机构必传
MedicalEquipmentLicensePicHash string `json:"medical_equipment_license_pic_hash"` // 经营医疗器械必传
MedicineLicensePicHash string `json:"medicine_license_pic_hash"` // 药品经营许可证
TabacooLicensePicHash string `json:"tabacoo_license_pic_hash"` // 烟草经营许可证图片
}
type GetStoreResult struct {
ChainStoreCode string `json:"chain_store_code"`
ChainStoreName string `json:"chain_store_name"`
Address string `json:"address"`
Latitude string `json:"latitude"`
Longitude string `json:"longitude"`
PositionSource int `json:"position_source"`
City string `json:"city"`
ContactPhone string `json:"contact_phone"`
ServiceCode string `json:"service_code"`
Status int `json:"status"` //1关店2开店
//#endregion
// <--------------------------------------------------订单------------------------------------------------------------------->
//#region 预请求获取订单
type PreCreateOrder struct {
// 必填参数
PartnerOrderCode string `json:"partner_order_code"` // 外部订单号
OrderType int `json:"order_type"` // 订单类型1:即时单3:预约单)
PositionSource int `json:"position_source"` // 经纬度来源
ReceiverAddress string `json:"receiver_address"` // 收货人地址 文字描述
ReceiverLongitude string `json:"receiver_longitude"` // 收货人经度
ReceiverLatitude string `json:"receiver_latitude"` // 收货人纬度
GoodsTotalAmountCent int `json:"goods_total_amount_cent"` // 订单商品总金额(分)
GoodsActualAmountCent int64 `json:"goods_actual_amount_cent"` // 订单商品客户实际支付金额
GoodsWeight string `json:"goods_weight"` // 订单总重量(kg)
GoodsCount int `json:"goods_count"` // 货物件数
GoodsItemList []*GoodsItemsList // 货物列表
// 非必填参数
TransportLongitude float64 `json:"transport_longitude,omitempty"` // 取货经度
TransportLatitude float64 `json:"transport_latitude,omitempty"` // 取货纬度
TransportTel string `json:"transport_tel,omitempty"` // 取货点联系人电话
OutShopCode string `json:"out_shop_code,omitempty"` // 外部门店id 当使用门店发单 out_shop_code和chain_store_id必填1个
ChainStoreID string `json:"chain_store_id"` // 门店id
OrderSource string `json:"order_source,omitempty"` // 饿百订单传109 商户订单来源(如饿了么、美团等)手发单/未知来源: 0 或不传 美团: 2 口碑: 4 饿了么: 6支付宝: 7 饿百: 8
ServiceGoodsId int64 `json:"service_goods_id"` // 服务商品id
BaseGoodsId int64 `json:"base_goods_id"` // 基础商品id
RequireReceiveTime string `json:"require_receive_time"` // 需要送达时间 预约单如(需要送达时间 推单时间) 60min
OrderAddTime int64 `json:"order_add_time,omitempty"` // 下单时间毫秒
UseCoupon int `json:"use_coupon,omitempty"` // 是否使用优惠券 0:不使用, 1:使用 默认使用
ExpectFetchTime int64 `json:"expect_fetch_time,omitempty"` // 预计出餐时间(毫秒) (预约单该字段必填)建议和商务合同里约定的承诺出货时长保持一致,否则影响考核结算
TransportAddress string `json:"transport_address"` // 取货点地址描述
OrderTipAmountCent int64 `json:"order_tip_amount_cent,omitempty"` // 取货点地址描述
//OrderRemark string `json:"order_remark"`
//FetchCode string `json:"fetch_code"`
//WriteOffCode string `json:"write_off_code"`
//CustomerExtTel string `json:"customer_ext_tel"`
}
// 货物明细
type GoodsItemsList struct {
ItemName string `json:"item_name"` // 商品名字
ItemQuantity int `json:"item_quantity"` // 商品数量
ItemAmountCent int64 `json:"item_amount_cent"` // 商品原价分
ItemActualAmountCent int64 `json:"item_actual_amount_cent"` // 商品实际支付金额,必须是乘以数量后的金额,否则影响售后环节的赔付标准
// 非必填
ItemId string `json:"item_id"` // 商品编号
ItemSize int `json:"item_size"` // 商品尺寸 1:小, 2:中, 3:大
ItemRemark string `json:"item_remark"` // 品备注(不超过255个字符)
}
// 蜂鸟请求预下单返回值
type PreCreateOrderResp struct {
Distance int64 `json:"distance"` //配送距离
CityId int64 `json:"city_id"` // 城市id
Time int64 `json:"time"` // 预询时间戳
GoodsInfos []*GoodsInfos // 服务商品明细
}
// 预下单商品服务明细
type GoodsInfos struct {
ServiceGoodsId int64 `json:"service_goods_id"` // 服务商品id
BaseGoodsId int64 `json:"base_goods_id"` // 基础商品id
IsValid int `json:"is_valid"` // 是否可用0不可1可
DisableReason string `json:"disable_reason"` // 不可用原因描述
PredictDeliveryTime int64 `json:"predict_delivery_time"` // 预计送达时间戳
PredictDeliveryMinutes int `json:"predict_delivery_minutes"` // 预计送达时长分钟
CanAddTip int `json:"can_add_tip"` // 服务商品是否支持加小费0否1是
Slogan string `json:"slogan"` // 商品介绍
TotalDeliveryAmountCent int64 `json:"total_delivery_amount_cent"` // 原始配送费总价格(含入参小费金额) 分
ActualDeliveryAmountCent int64 `json:"actual_delivery_amount_cent"` // 优惠后配送费总价格(含入参小费金额) 入单实际价格 关注这一个字段就行!!!
PriceDetail *PriceOpenapiDetail `json:"price_detail"` // 加价说明
WarehouseId int64 `json:"warehouse_id"` // 优惠券记录id
TIndexid string `json:"t_indexid"` // 预询标识 入单时需传入,标识本次预询
}
// 订单加价说明
type PriceOpenapiDetail struct {
StartPriceCent int `json:"start_price_cent"` // 起送价 分
DistancePriceCent int `json:"distance_price_cent"` // 距离加价
WeightPriceCent int `json:"weight_price_cent"` // 重量加价
TimePeriodSurchargeCent int `json:"time_period_surcharge_cent"` // 时段加价
TemporarySurchargeCent int `json:"temporary_surcharge_cent"` // 临时加价
CategorySurchargeCent int `json:"category_surcharge_cent"` // 品类加价
OrderPriceSurchargeCent int `json:"order_price_surcharge_cent"` // 客单价加价
PressureSurchargeCent int `json:"pressure_surcharge_cent"` // 运力紧张加价
RiverCrossingSurchargeCent int `json:"river_crossing_surcharge_cent"` // 跨江单加价
}
//#endregion
//#region 正式下单(订单查询,骑手查询,账户查询)
// 创建订单
type CreateOrderReqParam struct {
// 必传参数
PartnerOrderCode string `json:"partner_order_code,omitempty"` // 外部订单号
OrderType int `json:"order_type,omitempty"` // 订单类型1:即时单3:预约单)
PositionSource int `json:"position_source,omitempty"` // 坐标经纬度来源1:腾讯地 图, 2:百度地图, 3:高德地图)蜂鸟建议使用高德地图
ReceiverAddress string `json:"receiver_address,omitempty"` // 收货人地址 文字描述
ReceiverLongitude float64 `json:"receiver_longitude,omitempty"` // 收货人经度
ReceiverLatitude float64 `json:"receiver_latitude,omitempty"` // 收货人纬度
GoodsTotalAmountCent int64 `json:"goods_total_amount_cent,omitempty"` // 订单商品总金额(分)
GoodsActualAmountCent int `json:"goods_actual_amount_cent,omitempty"` // 订单商品客户实际支付金额
GoodsWeight float64 `json:"goods_weight,omitempty"` // 订单总重量(kg)
GoodsCount int `json:"goods_count,omitempty"` // 货物件数
GoodsItemList []*GoodsItemsList `json:"goods_item_list,omitempty"` // 货物明细
ReceiverName string `json:"receiver_name,omitempty"` // 收货人姓名
ReceiverPrimaryPhone string `json:"receiver_primary_phone,omitempty"` // 只支持手机号400开头电话座机号码以及95013开头、长度13位的虚拟电话
// 选传参数
TransportLongitude float64 `json:"transport_longitude,omitempty"` // 取货经度
TransportLatitude float64 `json:"transport_latitude,omitempty"` // 取货纬度
TransportTel string `json:"transport_tel,omitempty"` // 取货点联系人电话
OutShopCode string `json:"out_shop_code,omitempty"` // 外部门店id 当使用门店发单 out_shop_code和chain_store_id必填1个
ChainStoreId int64 `json:"chain_store_id,omitempty"` // 门店id
OrderSource string `json:"order_source,omitempty"` // 饿百订单传109 商户订单来源(如饿了么、美团等)手发单/未知来源: 0 或不传 美团: 2 口碑: 4 饿了么: 6支付宝: 7 饿百: 8
ServiceGoodsId int64 `json:"service_goods_id,omitempty"` // 服务商品id 校验预询配送费价格时 必传
BaseGoodsId int64 `json:"base_goods_id,omitempty"` // 基础商品id 校验预询配送费价格时 必传
RequireReceiveTime int64 `json:"require_receive_time,omitempty"` // 需要送达时间 需要送达时间(毫秒); 订单类型为预约单时必传,如(需要送达时间 推单时间) 60min则蜂鸟配送开放平台自动将订单类型置为即时单 ,反之则置为预约单
OrderAddTime int64 `json:"order_add_time,omitempty"` // 下单时间毫秒
UseCoupon int `json:"use_coupon,omitempty"` // 是否使用优惠券 0:不使用, 1:使用 默认使用
ExpectFetchTime int64 `json:"expect_fetch_time,omitempty"` // 预计出餐时间(毫秒) (预约单该字段必填)建议和商务合同里约定的承诺出货时长保持一致,否则影响考核结算
TransportAddress string `json:"transport_address,omitempty"` // 取货点地址描述
OrderTipAmountCent int64 `json:"order_tip_amount_cent,omitempty"` // 取货点地址描述
SerialNumber string `json:"serial_number,omitempty"` // 商家订单流水号, 方便配送骑手 到店取货, 支持数字,字母及#等常见字符. 建议填写。长度<=6。
OrderSourceOrderId string `json:"order_source_order_id,omitempty"` // 订单来源的 单号
ReceiverSecondPhone string `json:"receiver_second_phone,omitempty"` // 收货人备用联系方式
CustomerExtTel string `json:"customer_ext_tel,omitempty"` // 分机号
OrderRemark string `json:"order_remark,omitempty"` // 用户备注
PreCreateOrderTIndexId string `json:"pre_create_order_t_index_id,omitempty"` // 预询后下单标识 为null不校验配送费价格直接 入单 不为null强校验配送费价格 与入参价格不一致拒绝入单
WarehouseId int64 `json:"warehouse_id,omitempty"` // 优惠券id
ActualDeliveryAmountCent int64 `json:"actual_delivery_amount_cent,omitempty"` // 优惠后配送费总价格(含入参小费金额) 入单实际价格 取自预下单接口出参同名字段!!!不为null则校验配送费价格不一致拒绝入单 (含入参小费)校验预询配送费价格时 必传
WriteOffCode string `json:"write_off_code,omitempty"` // 销码(贵品服务必填)骑手和商户交互 签贵品履约才生效
CancelCode string `json:"cancel_code,omitempty"` // 取消码(贵品服务必填)
FetchCode string `json:"fetch_code,omitempty"` // 取餐码 骑手和用户交互
}
// 查询余额getAmount
type GetBalanceAmountRes struct {
BalanceAmountCent int64 `json:"balance_amount_cent"` // 账户余额 分
FrozenBalanceAmountCent int64 `json:"frozen_balance_amount_cent"` // 账户冻结余额 分
BalanceStatus int `json:"balance_status"` // 账户状态 1 正常 2 冻结
}
// 查询订单详情接口 getOrderDetail
type GetOrderDetailReq struct {
OrderId string `json:"order_id"` // 订单号 订单号和外部订单号必填1个
PartnerOrderCode string `json:"partner_order_code"` // 外部订单号
}
// 查询订单详情接口返回值
type GetOrderDetailRes struct {
OrderId int64 `json:"order_id"` // 订单id
TrackingId int64 `json:"tracking_id"` // 运单id
PartnerOrderCode string `json:"partner_order_code"` // 外部订单号
SerialNumber string `json:"serial_number"` // 商家订单流水号, 方便配送骑手 到店取货, 支持数字,字母及#等常见字符. 建议填写。长度<=6。
OrderStatus int `json:"order_status"` // 订单生成0运单生成成功120骑手接单80骑手到店2配送中3已完成4已取消5配送异常
CarrierDriverId string `json:"carrier_driver_id"` // 配送员id
CarrierDriverName string `json:"carrier_driver_name"` // 配送员姓名
CarrierDriverPhone string `json:"carrier_driver_phone"` // 配送员电话
EstimateArriveTime int64 `json:"estimate_arrive_time"` // 预计送达时间(毫秒)
OvertimeCompensationCostCent int64 `json:"overtime_compensation_cost_cent"` // 时效赔付
IfCanAddTip int `json:"if_can_add_tip"` // 是否支持添加调度费 1可以0不可以
OrderTipAmountCent int64 `json:"order_tip_amount_cent"` // 订单当前小费总金额 分
DeliveryFetchPhotos []interface{} `json:"delivery_fetch_photos"` // 骑手取货照片地址
OrderTotalAmountCent int64 `json:"order_total_amount_cent"` // 原始配送费金额(分)
OrderActualAmountCent int64 `json:"order_actual_amount_cent"` // 订单实际配送支付总金额关注这个字段即可(分)
PriceDetail []*struct{} `json:"price_detail"` // 配送费价格明细
AbnormalCode string `json:"abnormal_code"` // 运单异常原因code
AbnormalDesc string `json:"abnormal_desc"` // 运单异常原因描述
EventLogDetails []*struct{} `json:"event_log_details"` // 运单事件节点信息
ComplaintId int64 `json:"complaint_id"` // 投诉编号
ComplaintReasonDesc string `json:"complaint_reason_desc"` // 投诉原因描述
ComplaintStatus int `json:"complaint_status"` // 投诉状态 1待处理 2成功3失败
ClaimId int64 `json:"claim_id"` // 索赔id
ClaimReasonDesc string `json:"claim_reason_desc"` // 索赔原因描述
ClaimStatus int `json:"claim_status"` // 索赔状态 1待处理 2成功3失败
Temperature string `json:"temperature"` // 骑手体温
OrderDistance float64 `json:"order_distance"` // 配送距离(米)
}
// getKnightInfo 查询骑手信息接口,参数 GetOrderDetailReq
type GetKnightInfoRes struct {
CarrierDriverId string `json:"carrier_driver_id"` // 配送员id
CarrierDriverName string `json:"carrier_driver_name"` // 配送员姓名
CarrierDriverPhone string `json:"carrier_driver_phone"` // 配送员电话
CarrierDriverLongitude string `json:"carrier_driver_longitude"` // 骑手坐标
CarrierDriverLatitude string `json:"carrier_driver_latitude"` // 骑手坐标
}
//#endregion
//#region 加小费接口
//追加小费,订单小费总金额为每次累加
//注:不是所有订单都支持加小费,受合同服务 & 接单运力 & 当时订单状态等多个因素影响。 订单详情接口有返回是否可加小费字段。
//另:联调环境使用加小费接口 需先使用联调工具->订单状态回调把订单状态改为1否则订单状态会不支持加小费
// 添加小费
type AddTipRes struct {
GetOrderDetailReq
AddTipAmountCent int64 `json:"add_tip_amount_cent"` // 小费金额分(必填)
ThirdIndexId int64 `json:"third_index_id"` // 本次加小费唯一标识 每个订单内 不可重复, 会用来做幂等相同third_index_id的后续请求会被忽略
}
// 业务出参 "business_data": "{\"result\":true}"
//#endregion
//#region 取消接口
// getCancelReasonList 获取可用取消原因列表接口 参数:GetOrderDetailReq
// getCancelReasonListRes 取消接口返回值
type GetCancelReasonListRes struct {
CancelReasonList []*struct {
OrderCancelCode int `json:"order_cancel_code"` // 取消原因code
OrderCancelDesc int `json:"order_cancel_desc"` // 取消原因描述
}
}
// cancelOrder 正式取消订单接口
type CancelOrderReq struct {
GetOrderDetailReq
OrderCancelCode int64 `json:"order_cancel_code"` // 从可用取消原因列表接口返回结果选择(必填)
ActualCancelCostCent int64 `json:"actual_cancel_cost_cent"` // 单位分 取消实际需扣金额,从预取消接口拿(非必填)
OrderCancelOtherReason string `json:"order_cancel_other_reason"` // 取消原因补充 20字以内(非必填)
OrderCancelRole int `json:"order_cancel_role"` // 1商户取消, 2 用户取消(必填)
}
//#endregion
//#region 投诉订单
// complaintOrder投诉订单
type ComplaintOrderReq struct {
GetOrderDetailReq
OrderComplaintCode int `json:"order_complaint_code"` // 投诉编码 230:其他, 150:未保持餐品完整, 160:服务态度恶劣, 190:额外索取费用,170:诱导收货人或商户退单, 140:提前点击送达,210:虚假标记异常, 220:少餐错餐,200:虚假配送, 130:未进行配送(必填)
OrderComplaintDesc string `json:"order_complaint_desc"` // 投诉原因描述(否)
}
// claimOrder 索赔订单
type ClaimOrderRes struct {
GetOrderDetailReq
OrderClaimCode int `json:"order_claim_code"` // 索赔编码150: 未保持餐品完整,160: 服务态度恶劣, 170: 诱导收货人或商户退单,210:虚假标记异常, 130: 骑手接单后未完成配送,320:少餐错餐, 190:额外索取费用,140:提前点击送达, 200:骑手点击配送成功,实际未配送
OrderClaimDesc string `json:"order_claim_desc"` // 投诉原因描述
OrderClaimPriceCent int64 `json:"order_claim_price_cent"` // 索赔金额 分
OrderClaimSku []*OrderClaimSkuDto `json:"order_claim_sku"` // 索赔明细
}
// 索赔明细
type OrderClaimSkuDto struct {
ClaimSkuName string `json:"claim_sku_name"` // 索赔商品名称
ClaimSkuGoodsCount string `json:"claim_sku_goods_count"` // 索赔商品数量
ClaimSkuPriceCent string `json:"claim_sku_price_cent"` // 索赔商品实际单价 分
ClaimSkuTotalPriceCent string `json:"claim_sku_total_price_cent"` // 索赔商品实际总价 分
}
//#endregion

View File

@@ -21,6 +21,17 @@ func (a *API) SetToken(token string) {
a.accessToken = token
}
func (a *API) MakeFnRequestHead() map[string]interface{} {
requestParam := make(map[string]interface{}, 6)
requestParam["access_token"] = a.accessToken
requestParam["signature"] = a.signature
requestParam["merchant_id"] = a.merchantId
requestParam["version"] = a.version
requestParam["app_id"] = a.appID
requestParam["timestamp"] = a.timestamp
return requestParam
}
func New(appID, appSecret, merchantId string, config ...*platformapi.APIConfig) *API {
curConfig := platformapi.DefAPIConfig
if len(config) > 0 {
@@ -101,18 +112,3 @@ func (a *API) AccessAPI(baseUrl, actionApi, method string, bizParams map[string]
err = platformapi.AccessPlatformAPIWithRetry(a.client, sendUrl, a.config, dataMarshal)
return retVal, err
}
// 获取access_token
func (a *API) GetAccessToken() (tokenInfo *TokenInfo, err error) {
a.grantType = "authorization_code"
a.signature = a.signParam2()
result, err := a.AccessAPI(TokenURL, "", RequestPost, nil)
if err != nil {
return nil, err
}
if err := utils.Map2StructByJson(result["data"], &tokenInfo, false); err != nil {
return nil, err
}
return tokenInfo, err
}

View File

@@ -1,8 +1,7 @@
package fnpsapi
import (
"time"
"encoding/json"
"git.rosy.net.cn/baseapi/utils"
)
@@ -26,35 +25,36 @@ const (
OrderStatusException = 5 //异常
)
type CreateOrderParam struct {
PartnerRemark string `json:"partner_remark,omitempty"`
PartnerOrderCode string `json:"partner_order_code,omitempty"`
NotifyURL string `json:"notify_url,omitempty"`
OrderType int `json:"order_type,omitempty"`
ChainStoreCode string `json:"chain_store_code,omitempty"`
TransportInfo *TransportInfo `json:"transport_info,omitempty"`
OrderAddTime int64 `json:"order_add_time,omitempty"`
OrderTotalAmount float64 `json:"order_total_amount,omitempty"`
OrderActualAmount float64 `json:"order_actual_amount,omitempty"`
OrderWeight float64 `json:"order_weight,omitempty"`
OrderRemark string `json:"order_remark,omitempty"`
IsInvoiced int `json:"is_invoiced"`
Invoice string `json:"invoice,omitempty"`
OrderPaymentStatus int `json:"order_payment_status,omitempty"`
OrderPaymentMethod int `json:"order_payment_method,omitempty"`
IsAgentPayment int `json:"is_agent_payment"`
RequirePaymentPay float64 `json:"require_payment_pay,omitempty"`
GoodsCount int `json:"goods_count,omitempty"`
RequireReceiveTime int64 `json:"require_receive_time,omitempty"`
SerialNumber string `json:"serial_number,omitempty"`
ReceiverInfo *ReceiverInfo `json:"receiver_info,omitempty"`
ItemsJSON []*ItemsJSON `json:"items_json,omitempty"`
OrderSource string `json:"order_source,omitempty"` //饿百订单传109
ChannelOrderCode string `json:"channel_order_code,omitempty"`
CookingTime int64 `json:"cooking_time,omitempty"`
PlatformPaidTime int64 `json:"platform_paid_time,omitempty"`
PlatformCreatedTime int64 `json:"platform_created_time,omitempty"`
MerchantCode string `json:"merchant_code,omitempty"`
// 蜂鸟预下单
func (a *API) PreCreateByShopFn(basicParams *PreCreateOrder) (deliveryFee, baseDeliveryFee int64, err error) {
preOrder := a.MakeFnRequestHead()
params := utils.Struct2MapByJson(basicParams)
preOrder["business_data"] = params
result, err := a.AccessAPI(ApiURL, "preCreateOrder", RequestPost, params)
if err != nil {
return 0, 0, err
}
preOrderResult := PreCreateOrderResp{}
if err := json.Unmarshal([]byte(result["business_data"].(string)), &preOrderResult); err != nil {
return 0, 0, err
}
deliveryFee = utils.Float64TwoInt64(utils.MustInterface2Float64(preOrderResult.GoodsInfos[0].ActualDeliveryAmountCent)) // 订单配送价格
baseDeliveryFee = utils.Float64TwoInt64(utils.MustInterface2Float64(preOrderResult.GoodsInfos[0].TotalDeliveryAmountCent)) // 订单优惠价格
return deliveryFee, baseDeliveryFee, nil
}
// 蜂鸟正式下单
func (a *API) CreateOrder(createOrderParam *CreateOrderReqParam) (err error) {
orderHead := a.MakeFnRequestHead()
bytes, err := json.Marshal(createOrderParam)
if err != nil {
return err
}
orderHead["business_data"] = string(bytes)
_, err = a.AccessAPI(ApiURL, "createOrder", RequestPost, orderHead)
return err
}
type ReceiverInfo struct {
@@ -64,7 +64,7 @@ type ReceiverInfo struct {
ReceiverAddress string `json:"receiver_address,omitempty"`
ReceiverLongitude float64 `json:"receiver_longitude,omitempty"`
ReceiverLatitude float64 `json:"receiver_latitude,omitempty"`
PositionSource int `json:"position_source,omitempty"`
PositionSource int `json:"position_source,omitempty"` // 经纬度来源
}
type TransportInfo struct {
@@ -72,7 +72,7 @@ type TransportInfo struct {
TransportAddress string `json:"transport_address,omitempty"`
TransportLongitude float64 `json:"transport_longitude,omitempty"`
TransportLatitude float64 `json:"transport_latitude,omitempty"`
PositionSource int `json:"position_source,omitempty"`
PositionSource int `json:"position_source,omitempty"` // 经纬度来源
TransportTel string `json:"transport_tel,omitempty"`
TransportRemark string `json:"transport_remark,omitempty"`
}
@@ -90,13 +90,6 @@ type ItemsJSON struct {
AgentPurchasePrice float64 `json:"agent_purchase_price,omitempty"`
}
//https://open.ele.me/documents/%E5%88%9B%E5%BB%BA%E8%9C%82%E9%B8%9F%E8%AE%A2%E5%8D%95
func (a *API) CreateOrder(createOrderParam *CreateOrderParam) (err error) {
params := utils.Struct2FlatMap(createOrderParam)
_, err = a.AccessAPI("v2/order", URL, params, true)
return err
}
//order_cancel_reason_code 订单取消原因代码(1:用户取消,2:商家取消)
// order_cancel_code 订单取消编码(
// 1:物流原因:订单长时间未分配骑手,
@@ -114,17 +107,18 @@ type CancelOrderParam struct {
OrderCancelTime int64 `json:"order_cancel_time,omitempty"`
}
func (a *API) CancelOrder(cancelOrderParam *CancelOrderParam) (err error) {
params := utils.Struct2FlatMap(cancelOrderParam)
_, err = a.AccessAPI("v2/order/cancel", URL, params, true)
return err
}
func (a *API) ComplaintOrder(cancelOrderParam *CancelOrderParam) (err error) {
params := utils.Struct2FlatMap(cancelOrderParam)
_, err = a.AccessAPI("v2/order/complaint", URL, params, true)
return err
}
//
//func (a *API) CancelOrder(cancelOrderParam *CancelOrderParam) (err error) {
// params := utils.Struct2FlatMap(cancelOrderParam)
// _, err = a.AccessAPI("v2/order/cancel", URL, params, true)
// return err
//}
//
//func (a *API) ComplaintOrder(cancelOrderParam *CancelOrderParam) (err error) {
// params := utils.Struct2FlatMap(cancelOrderParam)
// _, err = a.AccessAPI("v2/order/complaint", URL, params, true)
// return err
//}
type QueryOrderResult struct {
AbnormalCode string `json:"abnormal_code"`
@@ -155,21 +149,22 @@ type QueryOrderResult struct {
TransportStationTel string `json:"transport_station_tel"`
}
func (a *API) QueryOrder(partnerOrderCode string) (queryOrderResult *QueryOrderResult, err error) {
result, err := a.AccessAPI("v2/order/query", URL, map[string]interface{}{
"partner_order_code": partnerOrderCode,
}, true)
if err == nil {
utils.Map2StructByJson(result["data"], &queryOrderResult, false)
}
return queryOrderResult, err
}
func (a *API) ComplaintRider(partnerOrderCode string, orderComplaintCode int) (err error) {
_, err = a.AccessAPI("v2/order/complaint", URL, map[string]interface{}{
"partner_order_code": partnerOrderCode,
"order_complaint_code": orderComplaintCode,
"order_complaint_time": time.Now().UnixNano() / 1e6,
}, true)
return err
}
//
//func (a *API) QueryOrder(partnerOrderCode string) (queryOrderResult *QueryOrderResult, err error) {
// result, err := a.AccessAPI("v2/order/query", URL, map[string]interface{}{
// "partner_order_code": partnerOrderCode,
// }, true)
// if err == nil {
// utils.Map2StructByJson(result["data"], &queryOrderResult, false)
// }
// return queryOrderResult, err
//}
//
//func (a *API) ComplaintRider(partnerOrderCode string, orderComplaintCode int) (err error) {
// _, err = a.AccessAPI("v2/order/complaint", URL, map[string]interface{}{
// "partner_order_code": partnerOrderCode,
// "order_complaint_code": orderComplaintCode,
// "order_complaint_time": time.Now().UnixNano() / 1e6,
// }, true)
// return err
//}

View File

@@ -3,9 +3,8 @@ package fnpsapi
import (
"encoding/json"
"fmt"
"strings"
"git.rosy.net.cn/baseapi/utils"
"strings"
)
const (
@@ -13,15 +12,41 @@ const (
StoreExist = "该门店已存在"
)
// 获取access_token
func (a *API) GetAccessToken() (tokenInfo *TokenInfo, err error) {
a.grantType = "authorization_code"
a.signature = a.signParam2()
result, err := a.AccessAPI(TokenURL, "", RequestPost, nil)
if err != nil {
return nil, err
}
if err := utils.Map2StructByJson(result["data"], &tokenInfo, false); err != nil {
return nil, err
}
return tokenInfo, err
}
// 创建门店.
func (a *API) CreateStore(createStoreParam *CreateStoreParam) (err error) {
func (a *API) CreateStore(createStoreParam *CreateStoreBaseInfo) (err error) {
requestHead := a.MakeFnRequestHead()
params := utils.Struct2FlatMap(createStoreParam)
_, err = a.AccessAPI(ApiURL, "chainstoreCreate", RequestPost, params)
requestHead["business_data"] = params
_, err = a.AccessAPI(ApiURL, "chainstoreCreate", RequestPost, requestHead)
return err
}
// 更新门店
func (a *API) UpdateStore(updateStore *UpdateStoreParam) (err error) {
requestHead := a.MakeFnRequestHead()
params := utils.Struct2FlatMap(updateStore)
requestHead["business_data"] = params
_, err = a.AccessAPI(ApiURL, "chainstoreUpdate", RequestPost, requestHead)
return
}
// 获取门店(单个)
func (a *API) GetStore(storeID string) (getStoreResult *GetStoreResult, err error) {
func (a *API) GetStore(storeID string) (getStoreResult *GetOneStoreRespData, err error) {
params := GetOneStoreParam{
BaseInfo: BaseInfo{
AccessToken: a.accessToken,
@@ -77,8 +102,4 @@ func IsErrShopExist(err error) bool {
return false
}
func (a *API) UpdateStore(createStoreParam *CreateStoreParam) (err error) {
//params := utils.Struct2FlatMap(createStoreParam)
//_, err = a.AccessAPI("v2/chain_store/update", URL, params, true)
return err
}
//todo商户门店接口,图片上传接口

View File

@@ -110,6 +110,7 @@ var (
type PageResultParser func(map[string]interface{}, int) ([]interface{}, int, error)
// 京东签名
func (a *API) signParams(jdParams map[string]interface{}) string {
var keys []string
for k := range jdParams {
@@ -190,7 +191,7 @@ func (a *API) AccessAPI2(apiStr string, jdParams map[string]interface{}, traceIn
err = platformapi.AccessPlatformAPIWithRetry(a.client,
func() *http.Request {
params["timestamp"] = utils.GetCurTimeStr()
sign := a.signParams(params)
sign := strings.ToUpper(a.signParams(params))
params[signKey] = sign
var request *http.Request
if userGet {

View File

@@ -304,7 +304,6 @@ func (a *API) QueryChildCategoriesForOP(pid int64) (catList []*CategoryInfo, err
return nil, err
}
// 新增商家店内分类信息接口
// https://opendj.jd.com/staticnew/widgets/resources.html?groupid=180&apiid=de26f24a62aa47a49e5ab7579d638cb3
func (a *API) AddShopCategory(pid int64, shopCategoryName string, shopCategoryLevel, sort int, userName string) (catId string, err error) {
params := map[string]interface{}{

View File

@@ -238,4 +238,4 @@ func RebuildError(inErr error, bzParams map[string]interface{}, watchKeys []stri
}
}
return inErr
}
}