Files
baseapi/platformapi/fnpsapi/callback.go
2022-03-25 09:33:46 +08:00

205 lines
7.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package fnpsapi
import (
"encoding/json"
"errors"
"git.rosy.net.cn/baseapi"
"git.rosy.net.cn/jx-callback/globals"
"net/http"
"net/url"
"git.rosy.net.cn/baseapi/utils"
)
const (
OrderStatus = "orderStatusNotify" // 订单状态回调
AbnormalStatus = "abnormalReportNotify" // 异常报备回调
CookingFinishStatus = "cookingFinishNotify" // 商户出餐回调
ChainstoreStatus = "chainstoreStatusNotify" // 门店状态变更回调
ChainstoreServiceStatus = "chainstoreServiceStatusNotify" // 门店采购服务变更回调
NoServiceStatus = "noServiceNotify" // 城市屏蔽区域调整回调通知
)
var (
SuccessResponse = &CallbackResponse{Code: 200}
SignatureIsNotOk = &CallbackResponse{Code: -1}
)
type CallbackResponse struct {
Code int `json:"code"`
}
func Err2CallbackResponse(err error, data string) *CallbackResponse {
if err == nil {
return SuccessResponse
}
return &CallbackResponse{
Code: -1,
}
}
type ShortStatus struct {
AppId string `json:"app_id"`
Signature string `json:"signature"`
Timestamp string `json:"timestamp"`
BusinessData string `json:"business_data"`
}
// 门店状态回调
type ChainstoreStatusNotify struct {
CallbackBusinessType string `json:"callback_business_type"`
Param string `json:"param"`
}
// 门店状态回调paramter
type ChainstoreParam struct {
MerchantId string `json:"merchant_id"` // 商户id
ChainStoreId string `json:"chain_store_id"` // 蜂鸟门店id
OutShopCode string `json:"out_shop_code"` // 外部门店编码
Status string `json:"status"` // 门店认证状态
ModifyStatus string `json:"modify_status"` // 门店修改状态
Remark string `json:"remark "` // 门店认证、修改等驳回时返回原因
}
// 订单状态回调paramter
type OrderCallbackParam struct {
OrderId int64 `json:"order_id"` // 订单号
AppId string `json:"app_id"` // 应用id
PartnerOrderCode string `json:"partner_order_code"` // 外部订单号
OrderStatus int `json:"order_status"` // 订单状态 订单生成0运单生成成功120骑手接单80骑手到 店2配送中3已完成4已取消5配送异常
CarrierDriverId int64 `json:"carrier_driver_id"` // 骑手id
CarrierLat string `json:"carrier_lat"` // 坐标高德(不要使用)
CarrierLng string `json:"carrier_lng"` // 坐标高德(不要使用)
CarrierDriverName string `json:"carrier_driver_name"` // 骑手姓名
CarrierDriverPhone string `json:"carrier_driver_phone"` // 骑手电话
Description string `json:"description"` // 描述
ErrorCode string `json:"error_code"` // 异常code
ErrorScene string `json:"error_scene"` // 异常描述
DetailDescription string `json:"detail_description"` // 详情描述
PushTime int64 `json:"push_time"` // 状态推送时间 (毫秒)
Transfer int `json:"transfer"` // 转单标识 转单标识 1 是转单 0非转单
}
// 出餐回调
type CookingFinishNotify struct {
OrderId int64 `json:"order_id"` // 订单号
AppId string `json:"app_id"` // 应用id
PartnerOrderCode string `json:"partner_order_code"` // 外部订单号
ChainStoreId string `json:"chain_store_id"` // 蜂鸟门店id
MerchantId string `json:"merchant_id"` // 商户id
CookingFinishTime int64 `json:"cooking_finish_time"` // 状态推送时间 (毫秒)
}
// 获取门店状态回调消息
func (a *API) GetChainstoreStatusNotify(request *http.Request) (shopStatusMsg map[string]interface{}, callbackResponse *CallbackResponse) {
storeNotify := ShortStatus{}
err := utils.Map2StructByJson(utils.URLValues2Map(request.PostForm), &storeNotify, true)
if err != nil {
baseapi.SugarLogger.Debugf("FN GetShopStatusCallbackMsg failed with err:%v", err)
callbackResponse = &CallbackResponse{Code: -1}
return nil, callbackResponse
}
fnNotify := &ChainstoreStatusNotify{}
if err := json.Unmarshal([]byte(storeNotify.BusinessData), fnNotify); err != nil {
baseapi.SugarLogger.Debugf("FN callback string to ChainstoreStatusNotify failed with err:%v", err)
callbackResponse = &CallbackResponse{Code: -1}
return nil, callbackResponse
}
// 解析蜂鸟返回值
shopStatusMsg, err = FnCallbackAnalysis(fnNotify)
if err != nil {
return nil, &CallbackResponse{Code: -1}
}
return shopStatusMsg, SuccessResponse
}
// 蜂鸟返回值解析
func FnCallbackAnalysis(notify *ChainstoreStatusNotify) (result map[string]interface{}, err error) {
switch notify.CallbackBusinessType {
case OrderStatus: // 订单回调
orderRes := &OrderCallbackParam{}
if err := json.Unmarshal([]byte(notify.Param), orderRes); err != nil {
return nil, err
}
notifyObj := utils.Struct2FlatMap(orderRes)
notifyObj["orderStatusNotify"] = ChainstoreStatus
return notifyObj, nil
case AbnormalStatus: // 异常报备回调
return nil, nil
case CookingFinishStatus: // 商户出餐回调
//cokking := &CookingFinishNotify{}
//if err := json.Unmarshal([]byte(notify.Param), cokking); err != nil {
// return nil, err
//}
//notifyObj := utils.Struct2FlatMap(cokking)
//notifyObj["cookingFinishNotify"] = ChainstoreStatus
//return notifyObj, nil
return nil, nil
case ChainstoreStatus: // 门店状态变更回调
storeRes := &ChainstoreParam{}
if err := json.Unmarshal([]byte(notify.Param), storeRes); err != nil {
return nil, err
}
notifyObj := utils.Struct2FlatMap(storeRes)
notifyObj["notifyUel"] = ChainstoreStatus
return notifyObj, nil
case ChainstoreServiceStatus: // 门店采购服务变更回调
return nil, nil
case NoServiceStatus: // 城市屏蔽区域调整回调通知
return nil, nil
default:
return nil, errors.New("回调函数,回调路径错误")
}
globals.SugarLogger.Warnf("Fn callback url func err:=[%s],dont's exits", "notify.CallbackBusinessType")
return nil, errors.New("回调函数,回调路径错误")
}
type CallBackInfo struct {
AppID string `json:"app_id"`
Data string `json:"data"`
Salt int `json:"salt"`
Signature string `json:"signature"`
}
type WayBillInfo struct {
PartnerOrderCode string `json:"partner_order_code"`
OrderStatus int `json:"order_status"`
PushTime int64 `json:"push_time"`
CarrierDriverName string `json:"carrier_driver_name"`
CarrierDriverPhone string `json:"carrier_driver_phone"`
OpenOrderCode int64 `json:"open_order_code"`
PlatformCode string `json:"platform_code"`
ErrorScene string `json:"error_scene"`
Description string `json:"description"`
ErrorCode string `json:"error_code"`
DetailDescription string `json:"detail_description"`
}
func (a *API) GetOrderCallbackMsg(data []byte) (orderMsg *WayBillInfo) {
callbackInfo := &CallBackInfo{}
err := utils.UnmarshalUseNumber(data, callbackInfo)
if err != nil {
globals.SugarLogger.Debugf("fn msg faild %v, err : %v", string(data), err)
return nil
}
if err == nil {
if str, err := url.QueryUnescape(callbackInfo.Data); err == nil {
orderMsg = &WayBillInfo{}
if err := utils.UnmarshalUseNumber([]byte(str), orderMsg); err == nil {
return orderMsg
} else {
globals.SugarLogger.Debugf("fn msg faild3 %v", err)
return nil
}
} else {
globals.SugarLogger.Debugf("fn msg faild2 %v", err)
return nil
}
}
return orderMsg
}