| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618 |
- package express
- import (
- "context"
- "fmt"
- "github.com/silenceper/wechat/v2/util"
- )
- // 同城配送 API URL
- // https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/industry/express/business/intracity_service.html
- const (
- // 开通门店权限
- intracityApplyURL = "https://api.weixin.qq.com/cgi-bin/express/intracity/apply?access_token=%s"
- // 创建门店
- intracityCreateStoreURL = "https://api.weixin.qq.com/cgi-bin/express/intracity/createstore?access_token=%s"
- // 查询门店
- intracityQueryStoreURL = "https://api.weixin.qq.com/cgi-bin/express/intracity/querystore?access_token=%s"
- // 更新门店
- intracityUpdateStoreURL = "https://api.weixin.qq.com/cgi-bin/express/intracity/updatestore?access_token=%s"
- // 门店运费充值
- intracityStoreChargeURL = "https://api.weixin.qq.com/cgi-bin/express/intracity/storecharge?access_token=%s"
- // 门店运费退款
- intracityStoreRefundURL = "https://api.weixin.qq.com/cgi-bin/express/intracity/storerefund?access_token=%s"
- // 门店运费流水查询
- intracityQueryFlowURL = "https://api.weixin.qq.com/cgi-bin/express/intracity/queryflow?access_token=%s"
- // 门店余额查询
- intracityBalanceQueryURL = "https://api.weixin.qq.com/cgi-bin/express/intracity/balancequery?access_token=%s"
- // 预下配送单(查询运费)
- intracityPreAddOrderURL = "https://api.weixin.qq.com/cgi-bin/express/intracity/preaddorder?access_token=%s"
- // 创建配送单
- intracityAddOrderURL = "https://api.weixin.qq.com/cgi-bin/express/intracity/addorder?access_token=%s"
- // 查询配送单
- intracityQueryOrderURL = "https://api.weixin.qq.com/cgi-bin/express/intracity/queryorder?access_token=%s"
- // 取消配送单
- intracityCancelOrderURL = "https://api.weixin.qq.com/cgi-bin/express/intracity/cancelorder?access_token=%s"
- // 模拟配送回调(仅用于测试)
- intracityMockNotifyURL = "https://api.weixin.qq.com/cgi-bin/express/intracity/mocknotify?access_token=%s"
- )
- // PayMode 充值/扣费主体
- type PayMode string
- const (
- // PayModeStore 门店
- PayModeStore PayMode = "PAY_MODE_STORE"
- // PayModeApp 小程序
- PayModeApp PayMode = "PAY_MODE_APP"
- // PayModeComponent 服务商
- PayModeComponent PayMode = "PAY_MODE_COMPONENT"
- )
- // OrderPattern 运力偏好
- type OrderPattern uint32
- const (
- // OrderPatternPriceFirst 价格优先
- OrderPatternPriceFirst OrderPattern = 1
- // OrderPatternTransFirst 运力优先
- OrderPatternTransFirst OrderPattern = 2
- )
- // FlowType 流水类型
- type FlowType uint32
- const (
- // FlowTypeCharge 充值流水
- FlowTypeCharge FlowType = 1
- // FlowTypeConsume 消费流水
- FlowTypeConsume FlowType = 2
- // FlowTypeRefund 退款流水
- FlowTypeRefund FlowType = 3
- )
- // IntracityDeliveryStatus 配送单状态
- type IntracityDeliveryStatus int32
- const (
- // IntracityDeliveryStatusReady 配送单待接单
- IntracityDeliveryStatusReady IntracityDeliveryStatus = 100
- // IntracityDeliveryStatusPickedUp 配送单待取货
- IntracityDeliveryStatusPickedUp IntracityDeliveryStatus = 101
- // IntracityDeliveryStatusOngoing 配送单配送中
- IntracityDeliveryStatusOngoing IntracityDeliveryStatus = 102
- // IntracityDeliveryStatusFinished 配送单已送达
- IntracityDeliveryStatusFinished IntracityDeliveryStatus = 200
- // IntracityDeliveryStatusCancelled 配送单已取消
- IntracityDeliveryStatusCancelled IntracityDeliveryStatus = 300
- // IntracityDeliveryStatusAbnormal 配送单异常
- IntracityDeliveryStatusAbnormal IntracityDeliveryStatus = 400
- )
- // IntracityAddressInfo 门店地址信息
- type IntracityAddressInfo struct {
- Province string `json:"province"` // 省/自治区/直辖市
- City string `json:"city"` // 地级市
- Area string `json:"area"` // 县/县级市/区
- Street string `json:"street"` // 街道
- House string `json:"house"` // 具体门牌号或详细地址
- Lat float64 `json:"lat"` // 门店所在地纬度
- Lng float64 `json:"lng"` // 门店所在地经度
- Phone string `json:"phone"` // 门店联系电话
- Name string `json:"name,omitempty"` // 联系人姓名(收货地址时使用)
- }
- // IntracityStoreInfo 门店信息
- type IntracityStoreInfo struct {
- WxStoreID string `json:"wx_store_id"` // 微信门店编号
- OutStoreID string `json:"out_store_id"` // 自定义门店编号
- CityID string `json:"city_id"` // 门店所在城市ID
- StoreName string `json:"store_name"` // 门店名称
- OrderPattern OrderPattern `json:"order_pattern"` // 运力偏好
- ServiceTransPrefer string `json:"service_trans_prefer"` // 优先使用的运力ID
- AddressInfo IntracityAddressInfo `json:"address_info"` // 门店地址信息
- }
- // ============ 门店管理接口 ============
- // IntracityApply 开通门店权限
- // https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/industry/express/business/intracity_service.html
- func (express *Express) IntracityApply(ctx context.Context) error {
- accessToken, err := express.GetAccessToken()
- if err != nil {
- return err
- }
- uri := fmt.Sprintf(intracityApplyURL, accessToken)
- response, err := util.PostJSONContext(ctx, uri, map[string]interface{}{})
- if err != nil {
- return err
- }
- return util.DecodeWithCommonError(response, "IntracityApply")
- }
- // CreateStoreRequest 创建门店请求参数
- type CreateStoreRequest struct {
- OutStoreID string `json:"out_store_id"` // 自定义门店编号
- StoreName string `json:"store_name"` // 门店名称
- OrderPattern OrderPattern `json:"order_pattern,omitempty"` // 运力偏好:1-价格优先,2-运力优先
- ServiceTransPrefer string `json:"service_trans_prefer,omitempty"` // 优先使用的运力ID,order_pattern=2时必填
- AddressInfo IntracityAddressInfo `json:"address_info"` // 门店地址信息
- }
- // CreateStoreResponse 创建门店返回参数
- type CreateStoreResponse struct {
- util.CommonError
- WxStoreID string `json:"wx_store_id"` // 微信门店编号
- AppID string `json:"appid"` // 小程序appid
- OutStoreID string `json:"out_store_id"` // 自定义门店ID
- }
- // IntracityCreateStore 创建门店
- func (express *Express) IntracityCreateStore(ctx context.Context, req *CreateStoreRequest) (res CreateStoreResponse, err error) {
- accessToken, err := express.GetAccessToken()
- if err != nil {
- return
- }
- uri := fmt.Sprintf(intracityCreateStoreURL, accessToken)
- response, err := util.PostJSONContext(ctx, uri, req)
- if err != nil {
- return
- }
- err = util.DecodeWithError(response, &res, "IntracityCreateStore")
- return
- }
- // QueryStoreRequest 查询门店请求参数
- type QueryStoreRequest struct {
- WxStoreID string `json:"wx_store_id,omitempty"` // 微信门店编号
- OutStoreID string `json:"out_store_id,omitempty"` // 自定义门店编号
- }
- // QueryStoreResponse 查询门店返回参数
- type QueryStoreResponse struct {
- util.CommonError
- Total uint32 `json:"total"` // 符合条件的门店总数
- AppID string `json:"appid"` // 小程序appid
- StoreList []IntracityStoreInfo `json:"store_list"` // 门店信息列表
- }
- // IntracityQueryStore 查询门店
- func (express *Express) IntracityQueryStore(ctx context.Context, req *QueryStoreRequest) (res QueryStoreResponse, err error) {
- accessToken, err := express.GetAccessToken()
- if err != nil {
- return
- }
- uri := fmt.Sprintf(intracityQueryStoreURL, accessToken)
- response, err := util.PostJSONContext(ctx, uri, req)
- if err != nil {
- return
- }
- err = util.DecodeWithError(response, &res, "IntracityQueryStore")
- return
- }
- // UpdateStoreKeyInfo 更新门店的key信息
- type UpdateStoreKeyInfo struct {
- WxStoreID string `json:"wx_store_id,omitempty"` // 微信门店编号
- OutStoreID string `json:"out_store_id,omitempty"` // 自定义门店编号,二选一
- }
- // UpdateStoreContent 更新门店的内容
- type UpdateStoreContent struct {
- StoreName string `json:"store_name,omitempty"` // 门店名称
- OrderPattern OrderPattern `json:"order_pattern,omitempty"` // 运力偏好
- ServiceTransPrefer string `json:"service_trans_prefer,omitempty"` // 优先使用的运力ID
- AddressInfo *IntracityAddressInfo `json:"address_info,omitempty"` // 门店地址信息
- }
- // UpdateStoreRequest 更新门店请求参数
- type UpdateStoreRequest struct {
- Keys UpdateStoreKeyInfo `json:"keys"` // 门店编号
- Content UpdateStoreContent `json:"content"` // 更新内容
- }
- // IntracityUpdateStore 更新门店
- func (express *Express) IntracityUpdateStore(ctx context.Context, req *UpdateStoreRequest) error {
- accessToken, err := express.GetAccessToken()
- if err != nil {
- return err
- }
- uri := fmt.Sprintf(intracityUpdateStoreURL, accessToken)
- response, err := util.PostJSONContext(ctx, uri, req)
- if err != nil {
- return err
- }
- return util.DecodeWithCommonError(response, "IntracityUpdateStore")
- }
- // ============ 充值退款接口 ============
- // StoreChargeRequest 门店运费充值请求参数
- type StoreChargeRequest struct {
- WxStoreID string `json:"wx_store_id,omitempty"` // 微信门店编号,pay_mode=PAY_MODE_STORE时必传
- ServiceTransID string `json:"service_trans_id"` // 运力ID
- Amount uint32 `json:"amount"` // 充值金额,单位:分,50元起充
- PayMode PayMode `json:"pay_mode,omitempty"` // 充值主体
- }
- // StoreChargeResponse 门店运费充值返回参数
- type StoreChargeResponse struct {
- util.CommonError
- PayURL string `json:"payurl"` // 充值页面地址
- AppID string `json:"appid"` // 小程序appid
- WxStoreID string `json:"wx_store_id"` // 微信门店编号
- }
- // IntracityStoreCharge 门店运费充值
- func (express *Express) IntracityStoreCharge(ctx context.Context, req *StoreChargeRequest) (res StoreChargeResponse, err error) {
- accessToken, err := express.GetAccessToken()
- if err != nil {
- return
- }
- uri := fmt.Sprintf(intracityStoreChargeURL, accessToken)
- response, err := util.PostJSONContext(ctx, uri, req)
- if err != nil {
- return
- }
- err = util.DecodeWithError(response, &res, "IntracityStoreCharge")
- return
- }
- // StoreRefundRequest 门店运费退款请求参数
- type StoreRefundRequest struct {
- WxStoreID string `json:"wx_store_id,omitempty"` // 微信门店编号
- PayMode PayMode `json:"pay_mode,omitempty"` // 充值/扣费主体
- ServiceTransID string `json:"service_trans_id"` // 运力ID
- }
- // StoreRefundResponse 门店运费退款返回参数
- type StoreRefundResponse struct {
- util.CommonError
- AppID string `json:"appid"` // 小程序appid
- WxStoreID string `json:"wx_store_id"` // 微信门店编号
- RefundAmount uint32 `json:"refund_amount"` // 退款金额,单位:分
- }
- // IntracityStoreRefund 门店运费退款
- func (express *Express) IntracityStoreRefund(ctx context.Context, req *StoreRefundRequest) (res StoreRefundResponse, err error) {
- accessToken, err := express.GetAccessToken()
- if err != nil {
- return
- }
- uri := fmt.Sprintf(intracityStoreRefundURL, accessToken)
- response, err := util.PostJSONContext(ctx, uri, req)
- if err != nil {
- return
- }
- err = util.DecodeWithError(response, &res, "IntracityStoreRefund")
- return
- }
- // QueryFlowRequest 门店运费流水查询请求参数
- type QueryFlowRequest struct {
- WxStoreID string `json:"wx_store_id"` // 微信门店编号
- FlowType FlowType `json:"flow_type"` // 流水类型:1-充值,2-消费,3-退款
- ServiceTransID string `json:"service_trans_id,omitempty"` // 运力ID
- BeginTime uint32 `json:"begin_time,omitempty"` // 开始时间戳
- EndTime uint32 `json:"end_time,omitempty"` // 结束时间戳
- PayMode PayMode `json:"pay_mode"` // 扣费主体
- }
- // FlowRecordInfo 流水记录信息
- type FlowRecordInfo struct {
- FlowType FlowType `json:"flow_type"` // 流水类型
- AppID string `json:"appid"` // appid
- WxStoreID string `json:"wx_store_id"` // 微信门店ID
- PayOrderID uint64 `json:"pay_order_id,omitempty"` // 充值订单号
- WxOrderID string `json:"wx_order_id,omitempty"` // 订单ID(消费流水)
- ServiceTransID string `json:"service_trans_id"` // 运力ID
- OpenID string `json:"openid,omitempty"` // 用户openid(消费流水)
- DeliveryStatus int32 `json:"delivery_status,omitempty"` // 运单状态(消费流水)
- PayAmount int32 `json:"pay_amount"` // 支付金额,单位:分
- PayTime uint32 `json:"pay_time,omitempty"` // 支付时间
- PayStatus string `json:"pay_status,omitempty"` // 支付状态
- RefundStatus string `json:"refund_status,omitempty"` // 退款状态
- RefundAmount int32 `json:"refund_amount,omitempty"` // 退款金额
- RefundTime uint32 `json:"refund_time,omitempty"` // 退款时间
- DeductAmount int32 `json:"deduct_amount,omitempty"` // 扣除违约金
- CreateTime uint32 `json:"create_time"` // 创建时间
- ConsumeDeadline uint32 `json:"consume_deadline,omitempty"` // 有效截止日期
- BillID string `json:"bill_id,omitempty"` // 运单ID
- DeliveryFinishedTime uint32 `json:"delivery_finished_time,omitempty"` // 运单完成配送的时间
- }
- // QueryFlowResponse 门店运费流水查询返回参数
- type QueryFlowResponse struct {
- util.CommonError
- Total uint32 `json:"total"` // 总数
- FlowList []FlowRecordInfo `json:"flow_list"` // 流水数组
- TotalPayAmt int `json:"total_pay_amt"` // 总支付金额
- TotalRefundAmt int `json:"total_refund_amt"` // 总退款金额
- TotalDeductAmt int `json:"total_deduct_amt"` // 总违约金(消费流水返回)
- }
- // IntracityQueryFlow 门店运费流水查询
- func (express *Express) IntracityQueryFlow(ctx context.Context, req *QueryFlowRequest) (res QueryFlowResponse, err error) {
- accessToken, err := express.GetAccessToken()
- if err != nil {
- return
- }
- uri := fmt.Sprintf(intracityQueryFlowURL, accessToken)
- response, err := util.PostJSONContext(ctx, uri, req)
- if err != nil {
- return
- }
- err = util.DecodeWithError(response, &res, "IntracityQueryFlow")
- return
- }
- // BalanceQueryRequest 门店余额查询请求参数
- type BalanceQueryRequest struct {
- WxStoreID string `json:"wx_store_id,omitempty"` // 微信门店编号
- ServiceTransID string `json:"service_trans_id,omitempty"` // 运力ID
- PayMode PayMode `json:"pay_mode,omitempty"` // 充值/扣费主体
- }
- // BalanceInfo 余额信息
- type BalanceInfo struct {
- ServiceTransID string `json:"service_trans_id"` // 运力ID
- Balance int32 `json:"balance"` // 余额,单位:分
- }
- // BalanceQueryResponse 门店余额查询返回参数
- type BalanceQueryResponse struct {
- util.CommonError
- AppID string `json:"appid"` // 小程序appid
- WxStoreID string `json:"wx_store_id"` // 微信门店编号
- BalanceList []BalanceInfo `json:"balance_list"` // 余额列表
- }
- // IntracityBalanceQuery 门店余额查询
- func (express *Express) IntracityBalanceQuery(ctx context.Context, req *BalanceQueryRequest) (res BalanceQueryResponse, err error) {
- accessToken, err := express.GetAccessToken()
- if err != nil {
- return
- }
- uri := fmt.Sprintf(intracityBalanceQueryURL, accessToken)
- response, err := util.PostJSONContext(ctx, uri, req)
- if err != nil {
- return
- }
- err = util.DecodeWithError(response, &res, "IntracityBalanceQuery")
- return
- }
- // ============ 配送订单接口 ============
- // CargoInfo 货物信息
- type CargoInfo struct {
- Name string `json:"name"` // 货物名称
- Num uint32 `json:"num,omitempty"` // 货物数量
- Price uint32 `json:"price,omitempty"` // 货物价格,单位:分
- Weight uint32 `json:"weight,omitempty"` // 货物重量,单位:克
- }
- // PreAddOrderRequest 预下配送单请求参数
- type PreAddOrderRequest struct {
- WxStoreID string `json:"wx_store_id,omitempty"` // 微信门店编号,二选一
- OutStoreID string `json:"out_store_id,omitempty"` // 自定义门店编号,二选一
- UserOpenID string `json:"user_openid"` // 用户openid
- UserPhone string `json:"user_phone,omitempty"` // 用户联系电话
- UserName string `json:"user_name,omitempty"` // 用户姓名
- UserLat float64 `json:"user_lat"` // 用户地址纬度
- UserLng float64 `json:"user_lng"` // 用户地址经度
- UserAddress string `json:"user_address"` // 用户详细地址
- ServiceTransID string `json:"service_trans_id,omitempty"` // 运力ID,不传则查询所有运力
- PayMode PayMode `json:"pay_mode,omitempty"` // 充值/扣费主体
- CargoInfo *CargoInfo `json:"cargo_info,omitempty"` // 货物信息
- }
- // TransInfo 运力信息
- type TransInfo struct {
- ServiceTransID string `json:"service_trans_id"` // 运力ID
- ServiceName string `json:"service_name"` // 运力名称
- Price uint32 `json:"price"` // 配送费用,单位:分
- Distance uint32 `json:"distance"` // 配送距离,单位:米
- Errcode int `json:"errcode"` // 错误码,0表示成功
- Errmsg string `json:"errmsg"` // 错误信息
- }
- // PreAddOrderResponse 预下配送单返回参数
- type PreAddOrderResponse struct {
- util.CommonError
- WxStoreID string `json:"wx_store_id"` // 微信门店编号
- AppID string `json:"appid"` // 小程序appid
- TransList []TransInfo `json:"trans_list"` // 运力列表
- }
- // IntracityPreAddOrder 预下配送单(查询运费)
- func (express *Express) IntracityPreAddOrder(ctx context.Context, req *PreAddOrderRequest) (res PreAddOrderResponse, err error) {
- accessToken, err := express.GetAccessToken()
- if err != nil {
- return
- }
- uri := fmt.Sprintf(intracityPreAddOrderURL, accessToken)
- response, err := util.PostJSONContext(ctx, uri, req)
- if err != nil {
- return
- }
- err = util.DecodeWithError(response, &res, "IntracityPreAddOrder")
- return
- }
- // AddOrderRequest 创建配送单请求参数
- type AddOrderRequest struct {
- WxStoreID string `json:"wx_store_id,omitempty"` // 微信门店编号,二选一
- OutStoreID string `json:"out_store_id,omitempty"` // 自定义门店编号,二选一
- OutOrderID string `json:"out_order_id"` // 自定义订单号,需唯一
- ServiceTransID string `json:"service_trans_id,omitempty"` // 运力ID
- UserOpenID string `json:"user_openid"` // 用户openid
- UserPhone string `json:"user_phone"` // 用户联系电话
- UserName string `json:"user_name"` // 用户姓名
- UserLat float64 `json:"user_lat"` // 用户地址纬度
- UserLng float64 `json:"user_lng"` // 用户地址经度
- UserAddress string `json:"user_address"` // 用户详细地址
- PayMode PayMode `json:"pay_mode,omitempty"` // 充值/扣费主体
- CargoInfo *CargoInfo `json:"cargo_info,omitempty"` // 货物信息
- OrderDetailPath string `json:"order_detail_path,omitempty"` // 订单详情页路径
- CallbackURL string `json:"callback_url,omitempty"` // 配送状态回调URL
- UseInsurance uint32 `json:"use_insurance,omitempty"` // 是否使用保价:0-不使用,1-使用
- InsuranceValue uint32 `json:"insurance_value,omitempty"` // 保价金额,单位:分
- ExpectTime uint32 `json:"expect_time,omitempty"` // 期望送达时间戳
- Remark string `json:"remark,omitempty"` // 备注
- }
- // AddOrderResponse 创建配送单返回参数
- type AddOrderResponse struct {
- util.CommonError
- WxOrderID string `json:"wx_order_id"` // 微信订单号
- AppID string `json:"appid"` // 小程序appid
- WxStoreID string `json:"wx_store_id"` // 微信门店编号
- OutOrderID string `json:"out_order_id"` // 自定义订单号
- ServiceTransID string `json:"service_trans_id"` // 运力ID
- BillID string `json:"bill_id"` // 运力订单号
- Price uint32 `json:"price"` // 配送费用,单位:分
- Distance uint32 `json:"distance"` // 配送距离,单位:米
- }
- // IntracityAddOrder 创建配送单
- func (express *Express) IntracityAddOrder(ctx context.Context, req *AddOrderRequest) (res AddOrderResponse, err error) {
- accessToken, err := express.GetAccessToken()
- if err != nil {
- return
- }
- uri := fmt.Sprintf(intracityAddOrderURL, accessToken)
- response, err := util.PostJSONContext(ctx, uri, req)
- if err != nil {
- return
- }
- err = util.DecodeWithError(response, &res, "IntracityAddOrder")
- return
- }
- // QueryOrderRequest 查询配送单请求参数
- type QueryOrderRequest struct {
- WxOrderID string `json:"wx_order_id,omitempty"` // 微信订单号,二选一
- OutOrderID string `json:"out_order_id,omitempty"` // 自定义订单号,二选一
- WxStoreID string `json:"wx_store_id,omitempty"` // 微信门店编号
- OutStoreID string `json:"out_store_id,omitempty"` // 自定义门店编号
- }
- // RiderInfo 骑手信息
- type RiderInfo struct {
- Name string `json:"name"` // 骑手姓名
- Phone string `json:"phone"` // 骑手电话
- RiderCode string `json:"rider_code"` // 骑手编号
- RiderImgURL string `json:"rider_img_url"` // 骑手头像URL
- }
- // QueryOrderResponse 查询配送单返回参数
- type QueryOrderResponse struct {
- util.CommonError
- WxOrderID string `json:"wx_order_id"` // 微信订单号
- AppID string `json:"appid"` // 小程序appid
- WxStoreID string `json:"wx_store_id"` // 微信门店编号
- OutOrderID string `json:"out_order_id"` // 自定义订单号
- ServiceTransID string `json:"service_trans_id"` // 运力ID
- BillID string `json:"bill_id"` // 运力订单号
- DeliveryStatus IntracityDeliveryStatus `json:"delivery_status"` // 配送状态
- Price uint32 `json:"price"` // 配送费用,单位:分
- Distance uint32 `json:"distance"` // 配送距离,单位:米
- CreateTime uint32 `json:"create_time"` // 订单创建时间
- RiderInfo *RiderInfo `json:"rider_info"` // 骑手信息
- FinishTime uint32 `json:"finish_time"` // 订单完成时间
- }
- // IntracityQueryOrder 查询配送单
- func (express *Express) IntracityQueryOrder(ctx context.Context, req *QueryOrderRequest) (res QueryOrderResponse, err error) {
- accessToken, err := express.GetAccessToken()
- if err != nil {
- return
- }
- uri := fmt.Sprintf(intracityQueryOrderURL, accessToken)
- response, err := util.PostJSONContext(ctx, uri, req)
- if err != nil {
- return
- }
- err = util.DecodeWithError(response, &res, "IntracityQueryOrder")
- return
- }
- // CancelOrderRequest 取消配送单请求参数
- type CancelOrderRequest struct {
- WxOrderID string `json:"wx_order_id,omitempty"` // 微信订单号,二选一
- OutOrderID string `json:"out_order_id,omitempty"` // 自定义订单号,二选一
- WxStoreID string `json:"wx_store_id,omitempty"` // 微信门店编号
- OutStoreID string `json:"out_store_id,omitempty"` // 自定义门店编号
- CancelReason string `json:"cancel_reason,omitempty"` // 取消原因
- }
- // CancelOrderResponse 取消配送单返回参数
- type CancelOrderResponse struct {
- util.CommonError
- WxOrderID string `json:"wx_order_id"` // 微信订单号
- RefundAmount int32 `json:"refund_amount"` // 退款金额,单位:分
- DeductAmount int32 `json:"deduct_amount"` // 扣除违约金,单位:分
- }
- // IntracityCancelOrder 取消配送单
- func (express *Express) IntracityCancelOrder(ctx context.Context, req *CancelOrderRequest) (res CancelOrderResponse, err error) {
- accessToken, err := express.GetAccessToken()
- if err != nil {
- return
- }
- uri := fmt.Sprintf(intracityCancelOrderURL, accessToken)
- response, err := util.PostJSONContext(ctx, uri, req)
- if err != nil {
- return
- }
- err = util.DecodeWithError(response, &res, "IntracityCancelOrder")
- return
- }
- // MockNotifyRequest 模拟配送回调请求参数(仅用于测试)
- type MockNotifyRequest struct {
- WxOrderID string `json:"wx_order_id"` // 微信订单号
- DeliveryStatus IntracityDeliveryStatus `json:"delivery_status"` // 配送状态
- }
- // IntracityMockNotify 模拟配送回调(仅用于测试)
- func (express *Express) IntracityMockNotify(ctx context.Context, req *MockNotifyRequest) error {
- accessToken, err := express.GetAccessToken()
- if err != nil {
- return err
- }
- uri := fmt.Sprintf(intracityMockNotifyURL, accessToken)
- response, err := util.PostJSONContext(ctx, uri, req)
- if err != nil {
- return err
- }
- return util.DecodeWithCommonError(response, "IntracityMockNotify")
- }
|