diff --git a/platform/elmapi/elmapi_test.go b/platform/elmapi/elmapi_test.go index 960f6084..1c722199 100644 --- a/platform/elmapi/elmapi_test.go +++ b/platform/elmapi/elmapi_test.go @@ -14,7 +14,8 @@ var ( func init() { logger, _ := zap.NewDevelopment() - elmapi = NewELMAPI("bab2a27f99562f394b411dbb9a6214da", "KLRDcOZGrk", "1fc221f8265506531da36fb613d5f5ad673f2e9a", logger.Sugar(), true) + sugarLogger = logger.Sugar() + elmapi = NewELMAPI("bab2a27f99562f394b411dbb9a6214da", "KLRDcOZGrk", "1fc221f8265506531da36fb613d5f5ad673f2e9a", sugarLogger, true) } func TestTest(t *testing.T) { diff --git a/platform/jdapi/jdapi.go b/platform/jdapi/jdapi.go index d915df87..820f8807 100644 --- a/platform/jdapi/jdapi.go +++ b/platform/jdapi/jdapi.go @@ -152,7 +152,7 @@ func (j *JDAPI) AccessJDQuery(apiStr string, jdParams map[string]string) (retVal j.sugarLogger.Errorf("Error when marshal %v, error:%v", jdParams, err) return nil, err } - params["jd_param_json"] = string(jdParamStr) + params["jd_param_json"] = jdParamStr params["timestamp"] = utils.GetCurTimeStr() sign := signParams(params) params["sign"] = sign @@ -345,5 +345,5 @@ func forceInnerCode2Str(innerCode interface{}) string { if innerCodeStr, ok := innerCode.(string); ok { return innerCodeStr } - return string(utils.MustInterface2Int64(innerCode)) + return utils.Int64ToStr(utils.MustInterface2Int64(innerCode)) } diff --git a/platform/jdapi/jdapi_test.go b/platform/jdapi/jdapi_test.go index 601255f0..c136a188 100644 --- a/platform/jdapi/jdapi_test.go +++ b/platform/jdapi/jdapi_test.go @@ -15,7 +15,8 @@ var ( func init() { logger, _ := zap.NewDevelopment() - jdapi = NewJDAPI("91633f2a-c5f5-4982-a925-a220d19095c3", "1dba76d40cac446ca500c0391a0b6c9d", "a88d031a1e7b462cb1579f12e97fe7f4", logger.Sugar()) + sugarLogger = logger.Sugar() + jdapi = NewJDAPI("91633f2a-c5f5-4982-a925-a220d19095c3", "1dba76d40cac446ca500c0391a0b6c9d", "a88d031a1e7b462cb1579f12e97fe7f4", sugarLogger) } func TestTest(t *testing.T) { diff --git a/platform/mtpsapi/callback.go b/platform/mtpsapi/callback.go index f57bba0b..ee72e725 100644 --- a/platform/mtpsapi/callback.go +++ b/platform/mtpsapi/callback.go @@ -1,6 +1,7 @@ package mtpsapi import ( + "fmt" "net/http" "git.rosy.net.cn/baseapi/utils" @@ -37,7 +38,22 @@ var ( SuccessResponse = &MtpsCallbackResponse{Code: "0"} ) +func (m *MTPSAPI) CheckRequestValidation(request *http.Request) (callbackResponse *MtpsCallbackResponse) { + for _, valueKey := range []string{"delivery_id", "mt_peisong_id", "order_id"} { + if request.FormValue(valueKey) == "" { + return &MtpsCallbackResponse{ + Code: fmt.Sprintf("missing param:%s", valueKey), + } + } + } + return nil +} + func (m *MTPSAPI) GetOrderCallbackMsg(request *http.Request) (orderMsg *MtpsCallbackOrderMsg, callbackResponse *MtpsCallbackResponse) { + callbackResponse = m.CheckRequestValidation(request) + if callbackResponse != nil { + return nil, callbackResponse + } orderMsg = &MtpsCallbackOrderMsg{ MtpsOrderInfoCommon: MtpsOrderInfoCommon{ DeliveryId: utils.Str2Int64(request.FormValue("delivery_id")), @@ -59,6 +75,10 @@ func (m *MTPSAPI) GetOrderCallbackMsg(request *http.Request) (orderMsg *MtpsCall } func (m *MTPSAPI) GetOrderExceptionCallbackMsg(request *http.Request) (orderMsg *MtpsCallbackOrderExceptionMsg, callbackResponse *MtpsCallbackResponse) { + callbackResponse = m.CheckRequestValidation(request) + if callbackResponse != nil { + return nil, callbackResponse + } orderMsg = &MtpsCallbackOrderExceptionMsg{ MtpsOrderInfoCommon: MtpsOrderInfoCommon{ DeliveryId: utils.Str2Int64(request.FormValue("delivery_id")), diff --git a/platform/mtpsapi/mtpsapi.go b/platform/mtpsapi/mtpsapi.go index de8e990d..a8a7e450 100644 --- a/platform/mtpsapi/mtpsapi.go +++ b/platform/mtpsapi/mtpsapi.go @@ -6,6 +6,7 @@ import ( "net/http" "net/url" "sort" + "strconv" "strings" "time" @@ -48,12 +49,56 @@ type MtpsOrderInfo struct { CancelReason string } +type MtpsOrderResponse struct { + MtPeisongId string `json:"mt_peisong_id` + DeliveryId int64 `json:"delivery_id` + OrderId string `json:"order_id` +} + type MTPSResult struct { Code int `json:"code"` Message string `json:"message"` Data map[string]interface{} `json:"data"` } +const ( + DSCRapid = 4011 + DSCIntime = 4012 + DSCTogether = 403 +) + +const ( + PickupTypeClientSendToStation = 1 + PickupTypeMtPick = 2 +) + +const ( + OrderTypeASAP = 0 + OrderTypeBook = 1 +) + +const ( + CoordinateTypeMars = 0 + CoordinateTypeBaidu = 1 +) + +type MtpsCreateOrderByShopInfo struct { + DeliveryId int64 + OrderId string + ShopId string + DeliveryServiceCode int + ReceiverName string + ReceiverAddress string + ReceiverPhone string + ReceiverLng int + ReceiverLat int + CoordinateType int + GoodsValue float64 + GoodsWeight float64 + ExpectedDeliveryTime int64 + OrderType int +} + type MTPSAPI struct { appKey string secret string @@ -91,17 +136,17 @@ func (m *MTPSAPI) AccessMTPS(action string, params map[string]interface{}) (retV if params == nil { panic("params is nil!") } - params["appkey"] = m.appKey - params["timestamp"] = utils.GetCurTimestamp() - params["version"] = "1.0" params2 := make(url.Values) for k, v := range params { params2[k] = []string{fmt.Sprint(v)} } + params2["appkey"] = []string{m.appKey} + params2["timestamp"] = []string{utils.Int64ToStr(utils.GetCurTimestamp())} + params2["version"] = []string{"1.0"} params2["sign"] = []string{m.signParams(params2)} - request, _ := http.NewRequest("POST", mtpsAPIURL+"/"+action, strings.NewReader(string(params2.Encode()))) + request, _ := http.NewRequest("POST", mtpsAPIURL+"/"+action, strings.NewReader(params2.Encode())) request.Header.Set("Content-Type", "application/x-www-form-urlencoded") apiAccess := &common.AccessPlatformAPIWithRetryParams{ MaxExceedLimitRetryCount: maxRetryCountWhenReachLimited, @@ -123,7 +168,9 @@ func (m *MTPSAPI) AccessMTPS(action string, params map[string]interface{}) (retV Code: code, } if code == mtpsStatusSuccess { - retVal.Data = jsonResult1["data"].(map[string]interface{}) + if innerData, ok := jsonResult1["data"]; ok { + retVal.Data = innerData.(map[string]interface{}) + } return common.PAErrorLevelSuccess, nil } retVal.Message = jsonResult1["message"].(string) @@ -133,10 +180,46 @@ func (m *MTPSAPI) AccessMTPS(action string, params map[string]interface{}) (retV return retVal, err } -func (m *MTPSAPI) QueryOrderStatus(deliveryId int64, MtPeiSongId string) (retVal map[string]interface{}, err error) { +func (m *MTPSAPI) CreateOrderByShop(basicParams *MtpsCreateOrderByShopInfo, addParams map[string]interface{}) (order *MtpsOrderResponse, err error) { + params := make(map[string]interface{}) + params["delivery_id"] = utils.Int64ToStr(basicParams.DeliveryId) + params["order_id"] = basicParams.OrderId + params["shop_id"] = basicParams.ShopId + params["delivery_service_code"] = utils.Int2Str(basicParams.DeliveryServiceCode) + params["receiver_name"] = basicParams.ReceiverName + params["receiver_address"] = basicParams.ReceiverAddress + params["receiver_phone"] = basicParams.ReceiverPhone + params["receiver_lng"] = utils.Int2Str(basicParams.ReceiverLng) + params["receiver_lat"] = utils.Int2Str(basicParams.ReceiverLat) + params["coordinate_type"] = utils.Int2Str(basicParams.CoordinateType) + params["goods_value"] = strconv.FormatFloat(basicParams.GoodsValue, 'f', 2, 64) + params["goods_weight"] = strconv.FormatFloat(basicParams.GoodsWeight, 'f', 2, 64) + params["expected_delivery_time"] = utils.Int64ToStr(basicParams.ExpectedDeliveryTime) + params["order_type"] = utils.Int2Str(basicParams.OrderType) + if addParams != nil { + for k, v := range addParams { + params[k] = v + } + } + if params["order_type"] != utils.Int2Str(OrderTypeBook) { + delete(params, "expected_delivery_time") + } + if result, err := m.AccessMTPS("order/createByShop", params); err != nil { + m.sugarLogger.Debugf("result:%v", result) + return nil, err + } else { + order = new(MtpsOrderResponse) + order.MtPeisongId = result.Data["mt_peisong_id"].(string) + order.DeliveryId = utils.MustInterface2Int64(result.Data["delivery_id"]) + order.OrderId = result.Data["order_id"].(string) + return order, nil + } +} + +func (m *MTPSAPI) QueryOrderStatus(deliveryId int64, mtPeiSongId string) (retVal map[string]interface{}, err error) { params := map[string]interface{}{ "delivery_id": deliveryId, - "mt_peisong_id": MtPeiSongId, + "mt_peisong_id": mtPeiSongId, } if result, err := m.AccessMTPS("order/status/query", params); err != nil { return nil, err @@ -144,3 +227,32 @@ func (m *MTPSAPI) QueryOrderStatus(deliveryId int64, MtPeiSongId string) (retVal return result.Data, nil } } + +func (m *MTPSAPI) simulateOrderBehavior(action string, deliveryId int64, mtPeiSongId string) (err error) { + params := map[string]interface{}{ + "delivery_id": deliveryId, + "mt_peisong_id": mtPeiSongId, + } + _, err = m.AccessMTPS("test/order/"+action, params) + return err +} + +func (m *MTPSAPI) SimulateArrange(deliveryId int64, mtPeiSongId string) (err error) { + return m.simulateOrderBehavior("arrange", deliveryId, mtPeiSongId) +} + +func (m *MTPSAPI) SimulatePickup(deliveryId int64, mtPeiSongId string) (err error) { + return m.simulateOrderBehavior("pickup", deliveryId, mtPeiSongId) +} + +func (m *MTPSAPI) SimulateDeliver(deliveryId int64, mtPeiSongId string) (err error) { + return m.simulateOrderBehavior("deliver", deliveryId, mtPeiSongId) +} + +func (m *MTPSAPI) SimulateRearrange(deliveryId int64, mtPeiSongId string) (err error) { + return m.simulateOrderBehavior("rearrange", deliveryId, mtPeiSongId) +} + +func (m *MTPSAPI) SimulateReportException(deliveryId int64, mtPeiSongId string) (err error) { + return m.simulateOrderBehavior("reportException", deliveryId, mtPeiSongId) +} diff --git a/platform/mtpsapi/mtpsapi_test.go b/platform/mtpsapi/mtpsapi_test.go index 5a697dee..8809754e 100644 --- a/platform/mtpsapi/mtpsapi_test.go +++ b/platform/mtpsapi/mtpsapi_test.go @@ -14,7 +14,9 @@ var ( func init() { logger, _ := zap.NewDevelopment() - mtpsapi = NewMTPSAPI("3c0a05d464c247c19d7ec13accc78605", "b1M}9?:sTbsB[OF2gNORnN(|(iy9rB8(`7]|[wGLnbmt`evfM>E:A90DjHAW:UPE", logger.Sugar()) + sugarLogger = logger.Sugar() + mtpsapi = NewMTPSAPI("25e816550bc9484480642f19a95f13fd", "r4$HqrKx9~=7?2Jfo,$Z~a7%~k!Au&pEdI2)oPJvSbH2ao@2N0[8wSIvtuumh_J^", sugarLogger) + // mtpsapi = NewMTPSAPI("3c0a05d464c247c19d7ec13accc78605", "b1M}9?:sTbsB[OF2gNORnN(|(iy9rB8(`7]|[wGLnbmt`evfM>E:A90DjHAW:UPE", sugarLogger) } func TestTest(t *testing.T) { @@ -22,9 +24,9 @@ func TestTest(t *testing.T) { } func TestAccessMTPS(t *testing.T) { - mtPeiSongId := "1528955769086020" + mtPeiSongId := "1529387562097059" params := map[string]interface{}{ - "delivery_id": 378194, + "delivery_id": 123456789, "mt_peisong_id": mtPeiSongId, } result, err := mtpsapi.AccessMTPS("order/status/query", params) @@ -37,3 +39,31 @@ func TestAccessMTPS(t *testing.T) { } } } + +func TestCreateOrderByShop(t *testing.T) { + basicParams := &MtpsCreateOrderByShopInfo{ + DeliveryId: 123456789, + OrderId: "order_123456789", + // 设置测试门店 id,测试门店的坐标地址为 97235456,31065079(高德坐标),配送范围3km + ShopId: "test_0001", + DeliveryServiceCode: DSCIntime, + ReceiverName: "xjh", + ReceiverAddress: "九里堤", + ReceiverPhone: "18112345678", + ReceiverLng: 97235456, + ReceiverLat: 31065079, + CoordinateType: CoordinateTypeMars, + GoodsValue: 12.34, + GoodsWeight: 3.4, + OrderType: OrderTypeASAP, + } + + order, err := mtpsapi.CreateOrderByShop(basicParams, nil) + if order != nil { + sugarLogger.Debugf("order:%v", order) + } + + if err != nil { + sugarLogger.Debugf("err:%s", err.Error()) + } +}