package weapp const ( apiBindAccount = "/cgi-bin/express/business/account/bind" apiGetAllAccount = "/cgi-bin/express/business/account/getall" apiGetExpressPath = "/cgi-bin/express/business/path/get" apiAddExpressOrder = "/cgi-bin/express/business/order/add" apiCancelExpressOrder = "/cgi-bin/express/business/order/cancel" apiGetAllDelivery = "/cgi-bin/express/business/delivery/getall" apiGetExpressOrder = "/cgi-bin/express/business/order/get" apiGetPrinter = "/cgi-bin/express/business/printer/getall" apiGetQuota = "/cgi-bin/express/business/quota/get" apiUpdatePrinter = "/cgi-bin/express/business/printer/update" apiTestUpdateOrder = "/cgi-bin/express/business/test_update_order" ) // ExpressAccount 物流账号 type ExpressAccount struct { Type BindType `json:"type"` // bind表示绑定,unbind表示解除绑定 BizID string `json:"biz_id"` // 快递公司客户编码 DeliveryID string `json:"delivery_id"` // 快递公司 ID Password string `json:"password"` // 快递公司客户密码 RemarkContent string `json:"remark_content"` // 备注内容(提交EMS审核需要) } // BindType 绑定动作类型 type BindType = string // 所有绑定动作类型 const ( Bind = "bind" // 绑定 Unbind = "unbind" // 解除绑定 ) // Bind 绑定、解绑物流账号 // token 接口调用凭证 func (ea *ExpressAccount) Bind(token string) (*CommonError, error) { api := baseURL + apiBindAccount return ea.bind(api, token) } func (ea *ExpressAccount) bind(api, token string) (*CommonError, error) { url, err := tokenAPI(api, token) if err != nil { return nil, err } res := new(CommonError) if err := postJSON(url, ea, res); err != nil { return nil, err } return res, nil } // AccountList 所有绑定的物流账号 type AccountList struct { CommonError Count uint `json:"count"` // 账号数量 List []struct { BizID string `json:"biz_id"` // 快递公司客户编码 DeliveryID string `json:"delivery_id"` // 快递公司 ID CreateTime uint `json:"create_time"` // 账号绑定时间 UpdateTime uint `json:"update_time"` // 账号更新时间 StatusCode BindStatus `json:"status_code"` // 绑定状态 Alias string `json:"alias"` // 账号别名 RemarkWrongMsg string `json:"remark_wrong_msg"` // 账号绑定失败的错误信息(EMS审核结果) RemarkContent string `json:"remark_content"` // 账号绑定时的备注内容(提交EMS审核需要)) QuotaNum uint `json:"quota_num"` // 电子面单余额 QuotaUpdateTime uint `json:"quota_update_time"` // 电子面单余额更新时间 } `json:"list"` // 账号列表 } // BindStatus 账号绑定状态 type BindStatus = int8 // 所有账号绑定状态 const ( BindSuccess = 0 // 成功 BindFailed = -1 // 系统失败 ) // GetAllAccount 获取所有绑定的物流账号 // token 接口调用凭证 func GetAllAccount(token string) (*AccountList, error) { api := baseURL + apiGetAllAccount return getAllAccount(api, token) } func getAllAccount(api, token string) (*AccountList, error) { url, err := tokenAPI(api, token) if err != nil { return nil, err } res := new(AccountList) if err := postJSON(url, requestParams{}, res); err != nil { return nil, err } return res, nil } // ExpressPathGetter 查询运单轨迹所需参数 type ExpressPathGetter ExpressOrderGetter // GetExpressPathResponse 运单轨迹 type GetExpressPathResponse struct { CommonError OpenID string `json:"openid"` // 用户openid DeliveryID string `json:"delivery_id"` // 快递公司 ID WaybillID string `json:"waybill_id"` // 运单 ID PathItemNum uint `json:"path_item_num"` // 轨迹节点数量 PathItemList []ExpressPathNode `json:"path_item_list"` // 轨迹节点列表 } // ExpressPathNode 运单轨迹节点 type ExpressPathNode struct { ActionTime uint `json:"action_time"` // 轨迹节点 Unix 时间戳 ActionType uint `json:"action_type"` // 轨迹节点类型 ActionMsg string `json:"action_msg"` // 轨迹节点详情 } // Get 查询运单轨迹 // token 接口调用凭证 func (ep *ExpressPathGetter) Get(token string) (*GetExpressPathResponse, error) { api := baseURL + apiGetExpressPath return ep.get(api, token) } func (ep *ExpressPathGetter) get(api, token string) (*GetExpressPathResponse, error) { url, err := tokenAPI(api, token) if err != nil { return nil, err } res := new(GetExpressPathResponse) if err := postJSON(url, ep, res); err != nil { return nil, err } return res, nil } // ExpressOrderSource 订单来源 type ExpressOrderSource = uint8 // 所有订单来源 const ( FromWeapp ExpressOrderSource = 0 // 小程序订单 FromAppOrH5 = 2 // APP或H5订单 ) // ExpressOrderCreator 订单创建器 type ExpressOrderCreator struct { ExpressOrder AddSource ExpressOrderSource `json:"add_source"` // 订单来源,0为小程序订单,2为App或H5订单,填2则不发送物流服务通知 WXAppID string `json:"wx_appid,omitempty"` // App或H5的appid,add_source=2时必填,需和开通了物流助手的小程序绑定同一open帐号 ExpectTime uint `json:"expect_time,omitempty"` // 顺丰必须填写此字段。预期的上门揽件时间,0表示已事先约定取件时间;否则请传预期揽件时间戳,需大于当前时间,收件员会在预期时间附近上门。例如expect_time为“1557989929”,表示希望收件员将在2019年05月16日14:58:49-15:58:49内上门取货。 TagID uint `json:"tagid,omitempty"` //订单标签id,用于平台型小程序区分平台上的入驻方,tagid须与入驻方账号一一对应,非平台型小程序无需填写该字段 } // InsureStatus 保价状态 type InsureStatus = uint8 // 所有保价状态 const ( Uninsured = 0 // 不保价 Insured = 1 // 保价 ) // CreateExpressOrderResponse 创建订单返回数据 type CreateExpressOrderResponse struct { CommonError OrderID string `json:"order_id"` // 订单ID,下单成功时返回 WaybillID string `json:"waybill_id"` // 运单ID,下单成功时返回 WaybillData []struct { Key string `json:"key"` // 运单信息 key Value string `json:"value"` // 运单信息 value } `json:"waybill_data"` // 运单信息,下单成功时返回 DeliveryResultcode int `json:"delivery_resultcode"` // 快递侧错误码,下单失败时返回 DeliveryResultmsg string `json:"delivery_resultmsg"` // 快递侧错误信息,下单失败时返回 } // Create 生成运单 // token 接口调用凭证 func (creator *ExpressOrderCreator) Create(token string) (*CreateExpressOrderResponse, error) { api := baseURL + apiAddExpressOrder return creator.create(api, token) } func (creator *ExpressOrderCreator) create(api, token string) (*CreateExpressOrderResponse, error) { url, err := tokenAPI(api, token) if err != nil { return nil, err } res := new(CreateExpressOrderResponse) if err := postJSON(url, creator, res); err != nil { return nil, err } return res, nil } // CancelOrderResponse 取消订单返回数据 type CancelOrderResponse struct { CommonError Count uint `json:"count"` //快递公司数量 Data []struct { DeliveryID string `json:"delivery_id"` // 快递公司 ID DeliveryName string `json:"delivery_name"` // 快递公司名称 } `json:"data"` //快递公司信息列表 } // DeliveryList 支持的快递公司列表 type DeliveryList struct { CommonError Count uint `json:"count"` // 快递公司数量 Data []struct { ID string `json:"delivery_id"` // 快递公司 ID Name string `json:"delivery_name"` // 快递公司名称 } `json:"data"` // 快递公司信息列表 } // GetAllDelivery 获取支持的快递公司列表 // token 接口调用凭证 func GetAllDelivery(token string) (*DeliveryList, error) { api := baseURL + apiGetAllDelivery return getAllDelivery(api, token) } func getAllDelivery(api, token string) (*DeliveryList, error) { queries := requestQueries{ "access_token": token, } url, err := encodeURL(api, queries) if err != nil { return nil, err } res := new(DeliveryList) if err := getJSON(url, res); err != nil { return nil, err } return res, nil } // ExpressOrderGetter 订单获取器 type ExpressOrderGetter struct { OrderID string `json:"order_id"` // 订单 ID,需保证全局唯一 OpenID string `json:"openid,omitempty"` // 用户openid,当add_source=2时无需填写(不发送物流服务通知) DeliveryID string `json:"delivery_id"` // 快递公司ID,参见getAllDelivery WaybillID string `json:"waybill_id"` // 运单ID } // GetExpressOrderResponse 获取运单返回数据 type GetExpressOrderResponse struct { CommonError PrintHTML string `json:"print_html"` // 运单 html 的 BASE64 结果 WaybillData []struct { Key string `json:"key"` // 运单信息 key Value string `json:"value"` // 运单信息 value } `json:"waybill_data"` // 运单信息 } // Get 获取运单数据 // token 接口调用凭证 func (getter *ExpressOrderGetter) Get(token string) (*GetExpressOrderResponse, error) { api := baseURL + apiGetExpressOrder return getter.get(api, token) } func (getter *ExpressOrderGetter) get(api, token string) (*GetExpressOrderResponse, error) { url, err := tokenAPI(api, token) if err != nil { return nil, err } res := new(GetExpressOrderResponse) if err := postJSON(url, getter, res); err != nil { return nil, err } return res, nil } // ExpressOrderCanceler 订单取消器 type ExpressOrderCanceler ExpressOrderGetter // Cancel 取消运单 // token 接 口调用凭证 func (canceler *ExpressOrderCanceler) Cancel(token string) (*CommonError, error) { api := baseURL + apiCancelExpressOrder return canceler.cancel(api, token) } func (canceler *ExpressOrderCanceler) cancel(api, token string) (*CommonError, error) { url, err := tokenAPI(api, token) if err != nil { return nil, err } res := new(CommonError) if err := postJSON(url, canceler, res); err != nil { return nil, err } return res, nil } // GetPrinterResponse 获取打印员返回数据 type GetPrinterResponse struct { CommonError Count uint `json:"count"` // 已经绑定的打印员数量 OpenID []string `json:"openid"` // 打印员 openid 列表 TagIDList []string `json:"tagid_list"` } // GetPrinter 获取打印员。若需要使用微信打单 PC 软件,才需要调用。 // token 接口调用凭证 func GetPrinter(token string) (*GetPrinterResponse, error) { api := baseURL + apiGetPrinter return getPrinter(api, token) } func getPrinter(api, token string) (*GetPrinterResponse, error) { url, err := tokenAPI(api, token) if err != nil { return nil, err } res := new(GetPrinterResponse) if err := getJSON(url, res); err != nil { return nil, err } return res, nil } // QuotaGetter 电子面单余额获取器 type QuotaGetter struct { DeliveryID string `json:"delivery_id"` // 快递公司ID,参见getAllDelivery BizID string `json:"biz_id"` // 快递公司客户编码 } // QuotaGetResponse 电子面单余额 type QuotaGetResponse struct { CommonError Number uint // 电子面单余额 } // Get 获取电子面单余额。仅在使用加盟类快递公司时,才可以调用。 func (getter *QuotaGetter) Get(token string) (*QuotaGetResponse, error) { api := baseURL + apiGetQuota return getter.get(api, token) } func (getter *QuotaGetter) get(api, token string) (*QuotaGetResponse, error) { url, err := tokenAPI(api, token) if err != nil { return nil, err } res := new(QuotaGetResponse) if err := postJSON(url, getter, res); err != nil { return nil, err } return res, nil } // UpdateExpressOrderTester 模拟的快递公司更新订单 type UpdateExpressOrderTester struct { BizID string `json:"biz_id"` // 商户id,需填test_biz_id OrderID string `json:"order_id"` // 订单ID,下单成功时返回 WaybillID string `json:"waybill_id"` // 运单 ID DeliveryID string `json:"delivery_id"` // 快递公司 ID ActionTime uint `json:"action_time"` // 轨迹变化 Unix 时间戳 ActionType uint `json:"action_type"` // 轨迹变化类型 ActionMsg string `json:"action_msg"` // 轨迹变化具体信息说明,展示在快递轨迹详情页中。若有手机号码,则直接写11位手机号码。使用UTF-8编码。 } // Test 模拟快递公司更新订单状态, 该接口只能用户测试 func (tester *UpdateExpressOrderTester) Test(token string) (*CommonError, error) { api := baseURL + apiTestUpdateOrder return tester.test(api, token) } func (tester *UpdateExpressOrderTester) test(api, token string) (*CommonError, error) { url, err := tokenAPI(api, token) if err != nil { return nil, err } res := new(CommonError) if err := postJSON(url, tester, res); err != nil { return nil, err } return res, nil } // PrinterUpdater 打印员更新器 type PrinterUpdater struct { OpenID string `json:"openid"` // 打印员 openid Type BindType `json:"update_type"` // 更新类型 TagIDList string `json:"tagid_list"` // 用于平台型小程序设置入驻方的打印员面单打印权限,同一打印员最多支持10个tagid,使用逗号分隔,如填写123,456,表示该打印员可以拉取到tagid为123和456的下的单,非平台型小程序无需填写该字段 } // Update 更新打印员。若需要使用微信打单 PC 软件,才需要调用。 func (updater *PrinterUpdater) Update(token string) (*CommonError, error) { api := baseURL + apiUpdatePrinter return updater.update(api, token) } func (updater *PrinterUpdater) update(api, token string) (*CommonError, error) { url, err := tokenAPI(api, token) if err != nil { return nil, err } res := new(CommonError) if err := postJSON(url, updater, res); err != nil { return nil, err } return res, nil }