diff --git a/platformapi/ebaiapi/callback.go b/platformapi/ebaiapi/callback.go new file mode 100644 index 00000000..7e6b67f1 --- /dev/null +++ b/platformapi/ebaiapi/callback.go @@ -0,0 +1,65 @@ +package ebaiapi + +import ( + "errors" + "fmt" + "net/http" + + "git.rosy.net.cn/baseapi" + "git.rosy.net.cn/baseapi/utils" +) + +type CallbackResponse ResponseResult + +type CallbackMsg struct { + Cmd string + TimeStamp int64 + Body map[string]interface{} +} + +func Err2CallbackResponse(err error, data interface{}) *CallbackResponse { + if err == nil { + return &CallbackResponse{ + Error: "success", + ErrNo: 0, + Data: data, + } + } + return &CallbackResponse{ + Error: fmt.Sprintf("error:%v, data:%v", err, data), + ErrNo: -1, + Data: data, + } +} + +func (a *API) unmarshalData(data []byte, msg interface{}) (callbackResponse *CallbackResponse) { + err := utils.UnmarshalUseNumber(data, msg) + if err != nil { + return Err2CallbackResponse(err, nil) + } + return nil +} + +func (a *API) CheckCallbackValidation(request *http.Request) (callbackResponse *CallbackResponse) { + sign := a.signParams(request.PostForm) + if sign != request.FormValue(signKey) { + msg := fmt.Sprintf("Signature is not ok, mine:%v, get:%v", sign, request.FormValue(signKey)) + baseapi.SugarLogger.Info(msg) + return Err2CallbackResponse(errors.New(msg), nil) + } + return nil +} + +func (a *API) GetCallbackMsg(request *http.Request) (msg *CallbackMsg, callbackResponse *CallbackResponse) { + request.ParseForm() + if callbackResponse = a.CheckCallbackValidation(request); callbackResponse != nil { + return nil, callbackResponse + } + msg = new(CallbackMsg) + if callbackResponse = a.unmarshalData([]byte(request.FormValue("body")), &msg.Body); callbackResponse != nil { + return nil, callbackResponse + } + msg.Cmd = request.FormValue("cmd") + msg.TimeStamp = utils.MustInterface2Int64(request.FormValue("timestamp")) + return msg, nil +} diff --git a/platformapi/ebaiapi/ebaiapi.go b/platformapi/ebaiapi/ebaiapi.go index eb673fd7..b6e9b287 100644 --- a/platformapi/ebaiapi/ebaiapi.go +++ b/platformapi/ebaiapi/ebaiapi.go @@ -17,6 +17,13 @@ const ( signKey = "sign" ) +const ( + CmdOrderCreate = "order.create" + CmdOrderDeliveryStatus = "order.devlieryStatus.push" + CmdOrderPartRefund = "order.partrefund.push" + CmdOrderStatus = "order.status.push" + CmdOrderUserCancel = "order.user.cancel" +) type ResponseResult struct { ErrNo int `json:"errno"` @@ -101,9 +108,10 @@ func (a *API) AccessAPI(cmd string, body map[string]interface{}) (retVal *Respon return platformapi.ErrLevelSuccess, nil } newErr := utils.NewErrorIntCode(retVal.Error, retVal.ErrNo) - if newErr.IntCode() == 20212 { - return platformapi.ErrLevelExceedLimit, newErr - } + // todo 包括访问超频的很多错误都是这个错误号... + // if newErr.IntCode() == 20212 { + // return platformapi.ErrLevelExceedLimit, newErr + // } return platformapi.ErrLevelCodeIsNotOK, newErr }) return retVal, err diff --git a/platformapi/ebaiapi/order.go b/platformapi/ebaiapi/order.go new file mode 100644 index 00000000..460c816e --- /dev/null +++ b/platformapi/ebaiapi/order.go @@ -0,0 +1,129 @@ +package ebaiapi + +import "git.rosy.net.cn/baseapi/utils" + +const ( + CancelTypeNotInServiceArea = "1" + CancelTypeShopClosed = "2" + CancelTypeSoldOut = "3" + CancelTypePriceChanged = "4" + CancelTypeClientCanceled = "5" + CancelTypeDuplicatedOrder = "6" + CancelTypeTooBusy = "7" + CancelTypeCanNotContactClient = "8" + CancelTypeFakeOrder = "9" + CancelTypePushOrderFailed = "53" + CancelTypeCustom = "-1" +) + +const ( + OrderStatusNew = "1" + OrderStatusAccepted = "5" + OrderStatusCourierAccepted = "7" + OrderStatusCourierPickedup = "8" + OrderStatusFinished = "9" + OrderStatusCanceled = "10" +) + +const ( + WaybillStatusNew = "2" + WaybillStatusRequestDelivery = "3" + WaybillStatusWait4Courier = "4" + WaybillStatusCourierAccepted = "7" + WaybillStatusCourierPickedup = "8" + WaybillStatusDeliveryCancled = "15" + WaybillStatusFinished = "16" + WaybillStatusExceptional = "17" + WaybillStatusSelfDelivery = "18" + WaybillStatusNotInDelivering = "19" + WaybillStatusDeliveryRejected = "20" +) + +type ExpressInfo struct { + OrderID string `json:"order_id"` + ExpressID string `json:"express_id"` + ExpressCompany string `json:"express_company"` +} + +// 提供给合作方确认订单所用。 注:1、10分钟内未确认的订单系统自动取消。2、确认失败的订单请不要做餐。 2016年7月4号起,将由百度外卖负责完成订单。届时,对接方无需调用完成订单接口,继续调用可能导致订单结算有问题。 +func (a *API) OrderConfirm(orderID string) (err error) { + _, err = a.AccessAPI("order.confirm", map[string]interface{}{ + "order_id": orderID, + }) + return err +} + +// 提供给合作方取消订单所用。 注:1、百度物流配送且已经确认的订单无法取消。 +func (a *API) OrderCancel(orderID, cancelType, cancelReason string) (err error) { + _, err = a.AccessAPI("order.cancel", map[string]interface{}{ + "order_id": orderID, + "type": cancelType, + "reason": cancelReason, + }) + return err +} + +// 蜂鸟众包订单呼叫骑士配送,仅限蜂鸟众包商户调用 +func (a *API) OrderCallDelivery(orderID string) (err error) { + _, err = a.AccessAPI("order.callDelivery", map[string]interface{}{ + "order_id": orderID, + }) + return err +} + +// 蜂鸟众包订单取消呼叫骑士配送,仅限蜂鸟众包商户调用。 +func (a *API) OrderCancelDelivery(orderID string) (err error) { + _, err = a.AccessAPI("order.cancelDelivery", map[string]interface{}{ + "order_id": orderID, + }) + return err +} + +// 饿了么自配送订单回传订单已送出状态 +func (a *API) OrderSendOut(orderID, phone string) (err error) { + _, err = a.AccessAPI("order.sendout", map[string]interface{}{ + "order_id": orderID, + "phone": phone, + }) + return err +} + +// 饿了么自配送订单回传订单送达状态,调用成功后订单状态变为已完成。需先调用订单送出接口,且接单5分钟后可调用 +func (a *API) OrderComplete(orderID, phone string) (err error) { + _, err = a.AccessAPI("order.complete", map[string]interface{}{ + "order_id": orderID, + "phone": phone, + }) + return err +} + +// 提供给合作方在配送异常或物流拒单后选择自行配送 +func (a *API) OrderSwitchselfdelivery(orderID string) (err error) { + _, err = a.AccessAPI("order.switchselfdelivery", map[string]interface{}{ + "order_id": orderID, + }) + return err +} + +// 查看订单详情 +func (a *API) OrderGet(orderID string) (orderMap map[string]interface{}, err error) { + result, err := a.AccessAPI("order.get", map[string]interface{}{ + "order_id": orderID, + }) + if err == nil { + return result.Data.(map[string]interface{}), nil + } + return nil, err +} + +// 设置订单快递单号 +func (a *API) OrderExpressCreate(shopID string, expressList []*ExpressInfo) (status int, err error) { + result, err := a.AccessAPI("order.express.create", map[string]interface{}{ + KeyShopID: shopID, + "express_list": expressList, + }) + if err == nil { + return int(utils.MustInterface2Int64(result.Data.(map[string]interface{})["status"])), nil + } + return 0, err +} diff --git a/platformapi/ebaiapi/order_test.go b/platformapi/ebaiapi/order_test.go new file mode 100644 index 00000000..6e63a015 --- /dev/null +++ b/platformapi/ebaiapi/order_test.go @@ -0,0 +1,16 @@ +package ebaiapi + +import ( + "testing" + + "git.rosy.net.cn/baseapi/utils" +) + +func TestOrderGet(t *testing.T) { + result, err := api.OrderGet("15380342248732") + if err != nil { + t.Fatal(err) + } else { + t.Log(utils.Format4Output(result, false)) + } +}