diff --git a/platformapi/fnpsapi_v3/fnps_v3.go b/platformapi/fnpsapi_v3/fnps_v3.go index 97f3ea61..2a2c3b39 100644 --- a/platformapi/fnpsapi_v3/fnps_v3.go +++ b/platformapi/fnpsapi_v3/fnps_v3.go @@ -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,运单生成成功1,20:骑手接单,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 diff --git a/platformapi/fnpsapi_v3/fnpsapi.go b/platformapi/fnpsapi_v3/fnpsapi.go index f55806b4..b301c017 100644 --- a/platformapi/fnpsapi_v3/fnpsapi.go +++ b/platformapi/fnpsapi_v3/fnpsapi.go @@ -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 -} diff --git a/platformapi/fnpsapi_v3/order.go b/platformapi/fnpsapi_v3/order.go index bc01b1b2..25207e91 100644 --- a/platformapi/fnpsapi_v3/order.go +++ b/platformapi/fnpsapi_v3/order.go @@ -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 +//} diff --git a/platformapi/fnpsapi_v3/store.go b/platformapi/fnpsapi_v3/store.go index cc490823..97ced1f4 100644 --- a/platformapi/fnpsapi_v3/store.go +++ b/platformapi/fnpsapi_v3/store.go @@ -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商户门店接口,图片上传接口 diff --git a/platformapi/jdapi/jdapi.go b/platformapi/jdapi/jdapi.go index 952c1363..2c114217 100644 --- a/platformapi/jdapi/jdapi.go +++ b/platformapi/jdapi/jdapi.go @@ -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 { diff --git a/platformapi/jdapi/sku.go b/platformapi/jdapi/sku.go index 4b458fdb..51615602 100644 --- a/platformapi/jdapi/sku.go +++ b/platformapi/jdapi/sku.go @@ -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{}{ diff --git a/platformapi/platformapi.go b/platformapi/platformapi.go index 73406ee7..b6bdc05a 100644 --- a/platformapi/platformapi.go +++ b/platformapi/platformapi.go @@ -238,4 +238,4 @@ func RebuildError(inErr error, bzParams map[string]interface{}, watchKeys []stri } } return inErr -} +} \ No newline at end of file