- ebai callback.

This commit is contained in:
gazebo
2018-09-27 17:53:03 +08:00
parent a4fb6880de
commit 303bca1193
4 changed files with 221 additions and 3 deletions

View File

@@ -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
}

View File

@@ -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

View File

@@ -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
}

View File

@@ -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))
}
}