diff --git a/business/auth2/auth2.go b/business/auth2/auth2.go index 3377d3e40..6d6bd558b 100644 --- a/business/auth2/auth2.go +++ b/business/auth2/auth2.go @@ -254,15 +254,16 @@ func Login(ctx *Context, authType, authID, authIDType, authSecret string) (authI } else { // 返回authBind中UserID为空表示只是认证,但本地没有记录,这种情况会返回临时TOKEN if authBindEx.UserHint != nil && authBindEx.UserID == "" { - if authBindEx.UserHint.Mobile != "" { - user = userProvider.GetUser(authBindEx.UserHint.Mobile, UserIDMobile) - } - if user == nil && authBindEx.UserHint.Email != "" { - user = userProvider.GetUser(authBindEx.UserHint.Email, UserIDEmail) - } - if user != nil { - authBindEx.UserID = user.GetID() - } + // 利用得到受信任的信息查找用户 + // if authBindEx.UserHint.Mobile != "" { + // user = userProvider.GetUser(authBindEx.UserHint.Mobile, UserIDMobile) + // } + // if user == nil && authBindEx.UserHint.Email != "" { + // user = userProvider.GetUser(authBindEx.UserHint.Email, UserIDEmail) + // } + // if user != nil { + // authBindEx.UserID = user.GetID() + // } } else if authBindEx.UserID != "" { user = userProvider.GetUser(authBindEx.UserID, UserIDID) } diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index a7e1d0607..f80328328 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -74,9 +74,15 @@ func (c *OrderManager) OnOrderNew(order *model.GoodsOrder, orderStatus *model.Or if order.Status == model.OrderStatusUnknown { order.Status = model.OrderStatusNew } - isDuplicated, err := addOrderOrWaybillStatus(orderStatus, db) - if err == nil && !isDuplicated { - isDuplicated, err = c.SaveOrder(order, false, db) + + var isDuplicated bool + if order.Status == model.OrderStatusNew && order.VendorID == model.VendorIDJX && !model.IsOrderJXTemp(order) { + isDuplicated, _, err = c.addOrderStatus(orderStatus, db) + } else { + isDuplicated, err = addOrderOrWaybillStatus(orderStatus, db) + if err == nil && !isDuplicated { + isDuplicated, err = c.SaveOrder(order, false, db) + } } if err == nil { dao.Commit(db) @@ -268,7 +274,6 @@ func (c *OrderManager) SaveOrder(order *model.GoodsOrder, isAdjust bool, db *dao } order.ConsigneeName = utils.LimitUTF8StringLen(order.ConsigneeName, 32) - // globals.SugarLogger.Debugf("saveOrder isAdjust:%t, order:%v", isAdjust, order) created, _, err2 := db.Db.ReadOrCreate(order, "VendorOrderID", "VendorID") if err = err2; err == nil { originalOrder := &model.GoodsOrderOriginal{ diff --git a/business/jxstore/act/act.go b/business/jxstore/act/act.go index da94f2567..b7f2a4e15 100644 --- a/business/jxstore/act/act.go +++ b/business/jxstore/act/act.go @@ -613,7 +613,7 @@ func GetActStoreSkuInfo(ctx *jxcontext.Context, actID int, vendorIDs []int, keyw func CancelAct(ctx *jxcontext.Context, actID int) (err error) { db := dao.GetDB() - if err = DeleteActStoreSkuBind(ctx, db, actID, nil); err != nil { + if _, err = DeleteActStoreSkuBind(ctx, db, actID, nil); err != nil { return err } _, err = SyncAct(ctx, nil, actID, nil, false) @@ -621,22 +621,26 @@ func CancelAct(ctx *jxcontext.Context, actID int) (err error) { } // actStoreSkuParam为空,不会删除act_store_sku,但会删除act_store_sku_map -func DeleteActStoreSkuBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, actStoreSkuParam []*ActStoreSkuParam) (err error) { +func DeleteActStoreSkuBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, actStoreSkuParam []*ActStoreSkuParam) (originSyncStatus int8, err error) { actMap, err := dao.GetActVendorInfo(db, actID, nil) if err != nil { - return err + return 0, err } if len(actMap) == 0 { - return fmt.Errorf("找不到活动:%d,或已被取消", actID) + return 0, fmt.Errorf("找不到活动:%d,或已被取消", actID) + } + if actMap[0].Status != model.ActStatusCreated { + // 如果不是正常状态直接跳过 + return 0, nil } actStoreSkuMap, err := dao.GetActStoreSkuVendorInfo(db, actID, nil, nil, nil) if err != nil { - return err + return 0, err } act := actMap[partner.GetVendorIDsFromActMap(actMap)[0]] if act.Status != model.ActStatusCreated || time.Now().Sub(act.EndAt) > 0 { - return fmt.Errorf("当前活动状态:%s,不能进行此操作,或已过期", model.ActStatusName[act.Status]) + return 0, fmt.Errorf("当前活动状态:%s,不能进行此操作,或已过期", model.ActStatusName[act.Status]) } dao.Begin(db) @@ -657,12 +661,13 @@ func DeleteActStoreSkuBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, act model.FieldStoreID: v.StoreID, model.FieldSkuID: v.SkuID, }); err != nil { - return err + return 0, err } } isNeedCancelAct := true for vendorID, act := range actMap { + originSyncStatus |= act.SyncStatus isDeleteAll := true isDeleteAtLeastOne := false if actStoreSkuParam != nil { @@ -684,7 +689,7 @@ func DeleteActStoreSkuBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, act }, ctx.GetUserName(), nil) } if err != nil { - return err + return 0, err } isDeleteAtLeastOne = true } else { @@ -708,7 +713,7 @@ func DeleteActStoreSkuBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, act map[string]interface{}{ model.FieldSyncStatus: syncStatus, }, ctx.GetUserName(), nil); err != nil { - return err + return 0, err } } } @@ -724,11 +729,11 @@ func DeleteActStoreSkuBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, act map[string]interface{}{ model.FieldStatus: model.ActStatusCanceled, }, ctx.GetUserName(), nil); err != nil { - return err + return 0, err } } dao.Commit(db) - return err + return originSyncStatus, err } // todo 当前逻辑要求传入活动的全部SKU信息(以便低层做一些判断,比如全部删除时要取消,所以暂时删除storeIDs与skuIDs这两个参数 @@ -914,7 +919,8 @@ func DeleteSkusFromAct(ctx *jxcontext.Context, vendorID int, skuIDs []int, isAsy } if len(deleteList) > 0 { // globals.SugarLogger.Debug(utils.Format4Output(deleteList, false)) - if err = DeleteActStoreSkuBind(ctx, db, actID, deleteList); err == nil { + originSyncStatus, err2 := DeleteActStoreSkuBind(ctx, db, actID, deleteList) + if err = err2; err == nil && originSyncStatus == 0 { if _, err = SyncAct(ctx, task, actID, nil, false); err == nil { retVal = deleteList } diff --git a/business/jxstore/act/act_test.go b/business/jxstore/act/act_test.go index 55da0e276..670c21a76 100644 --- a/business/jxstore/act/act_test.go +++ b/business/jxstore/act/act_test.go @@ -121,7 +121,7 @@ func TestCancelAct(t *testing.T) { } func TestDeleteActStoreBind(t *testing.T) { - err := DeleteActStoreSkuBind(jxcontext.AdminCtx, dao.GetDB(), 1, []*ActStoreSkuParam{ + _, err := DeleteActStoreSkuBind(jxcontext.AdminCtx, dao.GetDB(), 1, []*ActStoreSkuParam{ // &ActStoreSkuParam{ // ActStoreSku: model.ActStoreSku{ // StoreID: 100119, diff --git a/business/model/order.go b/business/model/order.go index 9eb767f6b..1960b900f 100644 --- a/business/model/order.go +++ b/business/model/order.go @@ -13,7 +13,7 @@ const ( PayStatusNo = 0 PayStatusYes = 1 - PayStatusRefund = 2 + PayStatusFailed = 2 ) type ModelTimeInfo struct { @@ -278,11 +278,13 @@ type OrderPay struct { Status int `json:"status"` PayCreatedAt time.Time `orm:"type(datetime);index" json:"payCreatedAt"` PayFinishedAt *time.Time `orm:"type(datetime);null" json:"payFinishedAt"` + TotalFee int `json:"totalFee"` - PrepayID string `orm:"column(prepay_id);unique;size(48)" json:"prepayID"` - CodeURL string `orm:"column(code_url);size(256)" json:"codeURL"` - PayOrderID string `orm:"column(pay_order_id);size(48)" json:"payOrderID"` - OriginalData string `orm:"type(text)" json:"-"` + TransactionID string `orm:"column(transaction_id);index;size(48)" json:"transactionID"` + PrepayID string `orm:"column(prepay_id);unique;size(48)" json:"prepayID"` + CodeURL string `orm:"column(code_url);size(256)" json:"codeURL"` + PayOrderID string `orm:"column(pay_order_id);size(48)" json:"payOrderID"` + OriginalData string `orm:"type(text)" json:"-"` } func (v *OrderPay) TableIndex() [][]string { @@ -291,6 +293,24 @@ func (v *OrderPay) TableIndex() [][]string { } } +type OrderPayRefund struct { + ModelIDCULD + + RefundID string `orm:"column(refund_id);unique;size(48)" json:"refundID"` + VendorRefundID string `orm:"column(vendor_refund_id);unique;size(48)" json:"vendorRefundID"` + + AfsOrderID string `orm:"column(afs_order_id);index;size(48)" json:"afsOrderID"` + VendorOrderID string `orm:"column(vendor_order_id);index;size(48)" json:"vendorOrderID"` + VendorID int `orm:"column(vendor_id)" json:"vendorID"` + TransactionID string `orm:"column(transaction_id);index;size(48)" json:"transactionID"` + Status int `json:"status"` + RefundCreatedAt time.Time `orm:"type(datetime);index" json:"payCreatedAt"` + RefundFinishedAt *time.Time `orm:"type(datetime);null" json:"payFinishedAt"` + RefundFee int `json:"refundFee"` + + OriginalData string `orm:"type(text)" json:"-"` +} + // 判断是否是购买平台自有物流 // 对于京东,饿百来说,就是其自有的物流,对于微商城来说,是达达 func IsWaybillPlatformOwn(bill *Waybill) bool { @@ -318,11 +338,9 @@ func IsOrderDeliveryByPlatform(order *GoodsOrder) bool { } func IsOrderJXTemp(order *GoodsOrder) bool { - // return order.Flag&OrderFlagMaskTempJX != 0 - return true + return order.VendorID == VendorIDJX && order.Flag&OrderFlagMaskTempJX != 0 } func IsAfsOrderJXTemp(order *AfsOrder) bool { - // return order.Flag&OrderFlagMaskTempJX != 0 - return true + return order.VendorID == VendorIDJX && order.Flag&OrderFlagMaskTempJX != 0 } diff --git a/business/partner/purchase/jd/act.go b/business/partner/purchase/jd/act.go index a9c3c96f7..2f69f6afd 100644 --- a/business/partner/purchase/jd/act.go +++ b/business/partner/purchase/jd/act.go @@ -242,6 +242,7 @@ func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITa } } } + db := dao.GetDB() err = func() (err error) { if model.IsSyncStatusDelete(act.SyncStatus) { for vendorActID := range vendorActInfoMap { @@ -257,6 +258,10 @@ func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITa updateItems = append(updateItems, partner.Act2Update(act, model.SyncFlagModifiedMask)) } else if model.IsSyncStatusNew(act.SyncStatus) { if act.VendorActID, err = createSkuAct(ctx, act, actStoreSkuList4Create); err != nil { + if act.VendorActID != "" { + actMap := partner.Act2ActMap(act) + dao.UpdateEntity(db, actMap, "VendorActID") + } return err } updateItems = append(updateItems, partner.ActStoreSku2Update(actStoreSkuList4Create, model.SyncFlagNewMask)...) @@ -289,7 +294,6 @@ func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITa } return err }() - db := dao.GetDB() // globals.SugarLogger.Debug(utils.Format4Output(updateItems, false)) _, err2 := dao.BatchUpdateEntityByKV(db, updateItems) if err == nil { diff --git a/business/partner/purchase/jx/localjx/order.go b/business/partner/purchase/jx/localjx/order.go index 1810b92ad..f37383608 100644 --- a/business/partner/purchase/jx/localjx/order.go +++ b/business/partner/purchase/jx/localjx/order.go @@ -12,6 +12,7 @@ import ( "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/business/partner" + "git.rosy.net.cn/jx-callback/globals" ) const ( @@ -79,6 +80,8 @@ func Pay4Order(ctx *jxcontext.Context, orderID int64, payType int, vendorPayType switch payType { case model.PayTypeWX: orderPay, err = pay4OrderByWX(ctx, order, vendorPayType) + dao.WrapAddIDCULDEntity(orderPay, ctx.GetUserName()) + err = dao.CreateEntity(dao.GetDB(), orderPay) default: err = fmt.Errorf("支付方式:%d当前不支持", payType) } @@ -93,13 +96,13 @@ func OnPayFinished(orderPay *model.OrderPay) (err error) { dao.UpdateEntity(db, orderPay) order.Status = model.OrderStatusNew order.StatusTime = *orderPay.PayFinishedAt - // OnOrderNew逻辑需要修改 - // err = partner.CurOrderManager.OnOrderNew(order, model.Order2Status(order)) + err = partner.CurOrderManager.OnOrderNew(order, model.Order2Status(order)) } return err } func GenOrderNo(ctx *jxcontext.Context) (orderNo int64) { + const prefix = 88 const randPartNum = 1000 orderNo = time.Now().Unix() - orderNoBeginTimestamp // fmt.Println(orderNo) @@ -110,10 +113,17 @@ func GenOrderNo(ctx *jxcontext.Context) (orderNo int64) { randPart += int(v) << ((k % 3) * 8) } orderNo += int64(randPart % randPartNum) - orderNo += int64(math.Pow10(int(math.Log10(float64(orderNo)))+1)) * 88 + orderNo += int64(math.Pow10(int(math.Log10(float64(orderNo)))+1)) * prefix return orderNo } +func GenRefundID(order *model.GoodsOrder) (refundID int64) { + const suffix = 100000 + orderID := utils.Str2Int64(order.VendorOrderID) * suffix + orderID += int64(time.Now().Sub(order.OrderFinishedAt) / time.Minute) + return refundID +} + func formalizeSkus(skus []*JxSkuInfo) (outSkus []*JxSkuInfo) { skuMap := make(map[int]int) for _, v := range skus { @@ -290,3 +300,72 @@ func jxOrder2GoodsOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, deliveryAd return order, err } + +func AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error) { + var status int + if isAcceptIt { + status = model.OrderStatusAccepted + } else { + status = model.OrderStatusCanceled + } + return changeOrderStatus(order.VendorOrderID, status, "") +} + +func PickupGoods(order *model.GoodsOrder, isSelfDelivery bool, userName string) (err error) { + return changeOrderStatus(order.VendorOrderID, model.OrderStatusFinishedPickup, "") +} + +func SelfDeliverDelivering(order *model.GoodsOrder, userName string) (err error) { + return changeOrderStatus(order.VendorOrderID, model.OrderStatusDelivering, "") +} + +func SelfDeliverDelivered(order *model.GoodsOrder, userName string) (err error) { + return changeOrderStatus(order.VendorOrderID, model.OrderStatusFinished, "") +} + +func CancelOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) { + if order.Status < model.OrderStatusDelivering { + orderPay := &model.OrderPay{ + VendorOrderID: order.VendorOrderID, + VendorID: jxutils.GetPossibleVendorIDFromVendorOrderID(order.VendorOrderID), + Status: model.PayStatusYes, + } + orderPay.DeletedAt = utils.DefaultTimeValue + db := dao.GetDB() + if err = dao.GetEntity(db, orderPay, "VendorOrderID", "VendorID", "Status", "DeletedAt"); err == nil || dao.IsNoRowsError(err) { + if err == nil { + refundID := utils.Int64ToStr(GenRefundID(order)) + orderPayRefund, err2 := refundOrderByWX(ctx, orderPay, refundID) + if err = err2; err == nil { + dao.WrapAddIDCULDEntity(orderPayRefund, ctx.GetUserName()) + err = dao.CreateEntity(dao.GetDB(), orderPay) + } + } else { + if order.Status >= model.OrderStatusNew { + globals.SugarLogger.Warnf("订单:%s找不到有效的支付方式", order.VendorOrderID) + } + } + if err == nil { + err = changeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, reason) + } + } + } else { + err = fmt.Errorf("当前订单状态:%s不允许取消", model.OrderStatusName[order.Status]) + } + return err +} + +func changeOrderStatus(vendorOrderID string, status int, remark string) (err error) { + orderStatus := &model.OrderStatus{ + VendorOrderID: vendorOrderID, + VendorID: model.VendorIDJX, + OrderType: model.OrderTypeOrder, + RefVendorOrderID: vendorOrderID, + RefVendorID: model.VendorIDJX, + VendorStatus: utils.Int2Str(status), + Status: status, + StatusTime: time.Now(), + Remark: remark, + } + return partner.CurOrderManager.OnOrderStatusChanged(orderStatus) +} diff --git a/business/partner/purchase/jx/localjx/wxpay.go b/business/partner/purchase/jx/localjx/wxpay.go index 3e2f8620e..01ed71e43 100644 --- a/business/partner/purchase/jx/localjx/wxpay.go +++ b/business/partner/purchase/jx/localjx/wxpay.go @@ -9,6 +9,7 @@ import ( "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model/dao" + "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" ) @@ -20,7 +21,7 @@ func pay4OrderByWX(ctx *jxcontext.Context, order *model.GoodsOrder, vendorPayTyp payCreatedAt := time.Now() param := &wxpay.CreateOrderParam{ Body: "", - NotifyURL: "http://callback.test.jxc4.com/wxpay/msg/", + NotifyURL: globals.WxpayNotifyURL, OutTradeNo: order.VendorOrderID, SpbillCreateIP: ctx.GetRealRemoteIP(), TradeType: vendorPayType2WxpayType(vendorPayType), @@ -40,14 +41,19 @@ func pay4OrderByWX(ctx *jxcontext.Context, order *model.GoodsOrder, vendorPayTyp PayCreatedAt: payCreatedAt, PrepayID: result.PrepayID, CodeURL: result.CodeURL, + TotalFee: int(order.ActualPayPrice), } - dao.WrapAddIDCULDEntity(orderPay, ctx.GetUserName()) - err = dao.CreateEntity(dao.GetDB(), orderPay) } return orderPay, err } func OnWxPayCallback(msg *wxpay.CallbackMsg) (err error) { + switch msg.MsgType { + case wxpay.MsgTypePay: + err = onWxpayFinished(msg.Data.(*wxpay.PayResultMsg)) + case wxpay.MsgTypeRefund: + err = onWxpayRefund(msg.Data.(*wxpay.RefundResultMsg)) + } return err } @@ -62,9 +68,59 @@ func onWxpayFinished(msg *wxpay.PayResultMsg) (err error) { if err = dao.GetEntity(db, orderPay, "VendorOrderID", "VendorID", "PayType", "DeletedAt"); err == nil { orderPay.VendorPayType = msg.TradeType orderPay.PayFinishedAt = utils.Time2Pointer(wxpay.PayTime2Time(msg.TimeEnd)) - orderPay.Status = model.PayStatusYes + orderPay.TransactionID = msg.TransactionID + orderPay.OriginalData = utils.Format4Output(msg, true) + if msg.ResultCode == wxpay.ResponseCodeSuccess { + orderPay.Status = model.PayStatusYes + } else { + orderPay.Status = model.PayStatusFailed + } dao.UpdateEntity(db, orderPay) - err = OnPayFinished(orderPay) + if msg.ResultCode == wxpay.ResponseCodeSuccess { + err = OnPayFinished(orderPay) + } } return err } + +func onWxpayRefund(msg *wxpay.RefundResultMsg) (err error) { + orderPayRefund := &model.OrderPayRefund{ + RefundID: msg.ReqInfoObj.OutRefundNo, + } + db := dao.GetDB() + if err = dao.GetEntity(db, orderPayRefund, "RefundID"); err == nil { + if msg.ResultCode == wxpay.ResponseCodeSuccess { + orderPayRefund.Status = model.PayStatusYes + } else { + orderPayRefund.Status = model.PayStatusFailed + } + orderPayRefund.OriginalData = utils.Format4Output(msg, true) + dao.UpdateEntity(db, orderPayRefund) + } else if dao.IsNoRowsError(err) { + globals.SugarLogger.Warnf("收到异常的退款事件, msg:%s", utils.Format4Output(msg, true)) + } + return err +} + +func refundOrderByWX(ctx *jxcontext.Context, orderPay *model.OrderPay, refundID string) (orderPayRefund *model.OrderPayRefund, err error) { + result, err := api.WxpayAPI.PayRefund(&wxpay.PayRefundParam{ + OutTradeNo: orderPay.VendorOrderID, + NotifyURL: globals.WxpayNotifyURL, + OutRefundNo: refundID, + TotalFee: orderPay.TotalFee, + RefundFee: orderPay.TotalFee, + }) + if err == nil { + orderPayRefund = &model.OrderPayRefund{ + RefundID: refundID, + VendorRefundID: result.RefundID, + VendorOrderID: orderPay.VendorOrderID, + VendorID: orderPay.VendorID, + Status: model.PayStatusNo, + TransactionID: orderPay.TransactionID, + RefundFee: orderPay.TotalFee, + RefundCreatedAt: time.Now(), + } + } + return orderPayRefund, err +} diff --git a/business/partner/purchase/jx/order.go b/business/partner/purchase/jx/order.go index 51df85de2..1a31217f3 100644 --- a/business/partner/purchase/jx/order.go +++ b/business/partner/purchase/jx/order.go @@ -7,6 +7,7 @@ import ( "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/partner" + "git.rosy.net.cn/jx-callback/business/partner/purchase/jx/localjx" "git.rosy.net.cn/jx-callback/business/partner/purchase/jx/phpjx" ) @@ -27,6 +28,8 @@ func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptI } if model.IsOrderJXTemp(order) { err = phpjx.NotifyOrderStatusChanged(order, status) + } else { + err = localjx.AcceptOrRefuseOrder(order, isAcceptIt, userName) } return err } @@ -34,6 +37,8 @@ func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptI func (c *PurchaseHandler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bool, userName string) (err error) { if model.IsOrderJXTemp(order) { err = phpjx.NotifyOrderStatusChanged(order, model.OrderStatusFinishedPickup) + } else { + err = localjx.PickupGoods(order, isSelfDelivery, userName) } return err } @@ -61,6 +66,8 @@ func (c *PurchaseHandler) Swtich2SelfDelivered(order *model.GoodsOrder, userName func (c *PurchaseHandler) SelfDeliverDelivering(order *model.GoodsOrder, userName string) (err error) { if model.IsOrderJXTemp(order) { err = phpjx.NotifyOrderStatusChanged(order, model.OrderStatusDelivering) + } else { + err = localjx.SelfDeliverDelivering(order, userName) } return err } @@ -68,6 +75,8 @@ func (c *PurchaseHandler) SelfDeliverDelivering(order *model.GoodsOrder, userNam func (c *PurchaseHandler) SelfDeliverDelivered(order *model.GoodsOrder, userName string) (err error) { if model.IsOrderJXTemp(order) { err = phpjx.NotifyOrderStatusChanged(order, model.OrderStatusFinished) + } else { + err = localjx.SelfDeliverDelivered(order, userName) } return err } @@ -83,6 +92,8 @@ func (c *PurchaseHandler) AgreeOrRefuseCancel(ctx *jxcontext.Context, order *mod func (c *PurchaseHandler) CancelOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) { if model.IsOrderJXTemp(order) { err = phpjx.NotifyOrderStatusChanged(order, model.OrderStatusCanceled) + } else { + err = localjx.CancelOrder(ctx, order, reason) } return err } diff --git a/conf/apiclient_cert.pem b/conf/apiclient_cert.pem new file mode 100755 index 000000000..651549410 --- /dev/null +++ b/conf/apiclient_cert.pem @@ -0,0 +1,24 @@ +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIUahJVy5/uo88B8ZcW9PcRyZOPkBowDQYJKoZIhvcNAQEL +BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT +FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg +Q0EwHhcNMTkwMTE1MDQyNzEwWhcNMjQwMTE0MDQyNzEwWjCBjzETMBEGA1UEAwwK +MTM5MDY4NjcwMjEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMScwJQYDVQQL +DB7miJDpg73oi6Xmuqrnp5HmioDmnInpmZDlhazlj7gxCzAJBgNVBAYMAkNOMRIw +EAYDVQQIDAlHdWFuZ0RvbmcxETAPBgNVBAcMCFNoZW5aaGVuMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5/ewqoqhiuackazAzJNUXC2eh/EKzWkiEZ7q +sLLKQ+ZilYOHF+GLmpmgGwM5jM4xY667l2sIWAvF7Z7IdHViGxABbOjkea0AmMMA +H4hHyczQGuRa66BiJ14l4ez+ZfKD9u5DEMgMH38/CGKZsyj5KebozBHiso8riC0E +Pb+O4oeUD6N20WD6GLrXBYUfzOQ3bklzWQiSit5G69lScmVrB57N0DndEXWAtCd+ +os9mSW9YKJvR3+5IlXn7VNRWYxdoO+oG1TZuFBgO1Ar751Iw2VKuaU5ytsxZFr6Y +I+HjUMbkMWwr97mcZLuLn5st7/GWa7qbJK+4JiDtf4Z3zrpyaQIDAQABo4GBMH8w +CQYDVR0TBAIwADALBgNVHQ8EBAMCBPAwZQYDVR0fBF4wXDBaoFigVoZUaHR0cDov +L2V2Y2EuaXRydXMuY29tLmNuL3B1YmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUw +REJDMDRCMDZBRDM5NzU0OTg0NkMwMUMzRThFQkQyMA0GCSqGSIb3DQEBCwUAA4IB +AQBUkt45/yL9ucpJwzvdFwPyV8RfQZmljqhFhJKt1TlFyeB0HKpOaC6fDdM+2GTZ +p2t7U9OTjTo2GUSFNy2ZHAwOw75PSnsX7Y63IdM53ieuRCq4xSPIqgUTu8Xrl4da +BKjuf6ZozYaY3x5ApagEEGibjCVzC/QUm1skMb+r6RRlp3DKWVa4CkDVXtEfwLnZ +KxZd3nY8v4zTBR0hQs/j9e/8wiI+C56nf4XTa50DlQPvkxTG1QTmM/iTGCy7x3ni +7WHxpCuOTwvF/9pbYQ3g5uJVop3DIYcVjFtIsewA/X5VwJK7c5vLoyM/hS4lYLZV +mJv81fv5chMHzTKMlki4JL7X +-----END CERTIFICATE----- diff --git a/conf/apiclient_key.pem b/conf/apiclient_key.pem new file mode 100755 index 000000000..8386bfbdd --- /dev/null +++ b/conf/apiclient_key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDn97CqiqGK5pyR +rMDMk1RcLZ6H8QrNaSIRnuqwsspD5mKVg4cX4YuamaAbAzmMzjFjrruXawhYC8Xt +nsh0dWIbEAFs6OR5rQCYwwAfiEfJzNAa5FrroGInXiXh7P5l8oP27kMQyAwffz8I +YpmzKPkp5ujMEeKyjyuILQQ9v47ih5QPo3bRYPoYutcFhR/M5DduSXNZCJKK3kbr +2VJyZWsHns3QOd0RdYC0J36iz2ZJb1gom9Hf7kiVeftU1FZjF2g76gbVNm4UGA7U +CvvnUjDZUq5pTnK2zFkWvpgj4eNQxuQxbCv3uZxku4ufmy3v8ZZrupskr7gmIO1/ +hnfOunJpAgMBAAECggEAKIqTp9q+zQXtC1DECX0eW1XlxSCNoMTlHWtG3UcCLsfP +Jw5rx/K1cXm0D8SKhF9tJlzdkGM2fBzipNsBcckqMkyj0yMI+3MPDaPXG6u30D8p +h+mtMk0/ml3MBSZkd/Dgu4F82yv7Ym3c2FxTPIrGsVoYCcJ+enKnSw+DFD+se06d +gyWNvyt/uy5sKBo7lt0FUK8+clL+TwozoaiTCKNlwlEbJkCwYFoAHh1mZ4Kecrwf +V1ltwpAdnEJML2vKJq5GOV+tUeKRkQqBRVwo/82MUWSH6/SS1NodO8cAOZ2rDP3V +DkTfhNZXFw58Za88K0TINqlUPtMOKvd2kUeTYOTY4QKBgQD99JrhBoKqQQGw+TM9 +Rt/HAAKhhMHep77FmnHbNWP0gnOHPLJGAEEXwwpR/gBzYIMp/iHwpXgmjYMzwnXL +eZ1dfsV02r5qUdxKU3yKGN3fzR9Bfd6Kw9UKAYLRNoCx0DxD0karcQFrt4OHhkTt +HPKKJRj4GXe5+gExWlS7Ps2ATQKBgQDp1cTBIsQ7OHOnccgJB+dKWj0BRCEj3H74 +crOTSHvu/pngcyuJoj/jMfw37sPRwamqCv1dLuMFAxf7bkB3/kDCpQ0tJM1+j1Fl +SwSUfrJE0slSW0+/r84A8uXztBNxuNguSyq8nDk+Asj9+J/VZcWHqW4IPg8R1xEs +SEfwItnojQKBgQD3bRZpH9q23lczgdh2X1Mvo8bsb1gkAvNPu0Yq+T3FwEOnA2/9 +28mPySuI7xypTOL+Sufueokxprap+1ChSoAT06u2SlkzZUZn9CdmtQuXPVayjFwC +fwJVmVtHUv7YP7Y3revEpXlo5Yd0x1DoZEe6aKKHNuj7faUj3IqpVGsMEQKBgD2A +WPiHQV9mEJ0owvkFGCMpKsRre9/nvYlw+aQyO053rlcnU3smrnD+E51Ocjh4HDy6 +GTtp+pG155fcvp4QxE2thZKrDFVOMpVWrsSzsgWB/ytnEsmS3rbHLA31/es6N7mt +UXc8C54ws1aBDuDcnKB6wpLuZ55El6Ky/CC/udp9AoGBALOnuEfpU78mkhXZfsXR +xQz+9z4fkS3e1Ku67Rdcom2TQAP5R5Dx7cSBhxhkB9LobPcqgZzokRwxMsR6e2DY +XPWGpBHtIwwRg6EhQi3bQWSBKeTgLT+ND4wL6R5/7niN0GUFX1QyDtW6x2PRJCNP +gQPd0x04LZXgOcyyv/3fhb0Y +-----END PRIVATE KEY----- diff --git a/conf/app.conf b/conf/app.conf index 8e6d243f5..3dbee43ff 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -53,6 +53,7 @@ weixinMiniSecret = "e7ec67c86cbd4dfa531af7af7533cdc9" wxpayAppID = "wx4b5930c13f8b1170" wxpayAppKey = "XKJPOIHJ233adf01KJIXlIeQDSDKFJAD" wxpayAppMchID = "1390686702" +wxpayNotifyURL = "http://callback.test.jxc4.com/wxpay/msg/" backstageHost = "http://www.jxc4.com" wxBackstageHost = "http://wx.jxc4.com" @@ -152,6 +153,8 @@ weixinSecret = "6bbbed1443cc062c20a015a64c07a531" weixinMiniAppID2 = "wx4b5930c13f8b1170" weixinMiniSecret2 = "2a57228a716ce991a52739f0ff41111d" +wxpayNotifyURL = "http://callback.jxc4.com/wxpay/msg/" + dbConnectStr = "root:WebServer@1@tcp(db1.int.jxc4.com:3306)/jxd_dev_0?charset=utf8mb4&loc=Local&parseTime=true" enableStoreWrite = true @@ -207,6 +210,8 @@ weixinSecret = "6bbbed1443cc062c20a015a64c07a531" weixinMiniAppID = "wx2d6949f724b2541d" weixinMiniSecret = "11f3c380551c4683c149990b004d6df9" +wxpayNotifyURL = "http://callback-jxgy.jxc4.com/wxpay/msg/" + backstageHost = "http://www-jxgy.jxc4.com" wxBackstageHost = "http://wx-jxgy.jxc4.com" diff --git a/controllers/act.go b/controllers/act.go index edf33804d..77c892d54 100644 --- a/controllers/act.go +++ b/controllers/act.go @@ -243,7 +243,7 @@ func (c *ActController) UpdateActStoreSkuBind() { } } if len(actStoreSkuDeleteList) > 0 { - if err = act.DeleteActStoreSkuBind(params.Ctx, db, params.ActID, actStoreSkuDeleteList); err != nil { + if _, err = act.DeleteActStoreSkuBind(params.Ctx, db, params.ActID, actStoreSkuDeleteList); err != nil { dao.Rollback(db) return } diff --git a/controllers/wxpay_callback.go b/controllers/wxpay_callback.go index dfdbd5f19..dc7c2d049 100644 --- a/controllers/wxpay_callback.go +++ b/controllers/wxpay_callback.go @@ -1,6 +1,7 @@ package controllers import ( + "fmt" "net/http" "git.rosy.net.cn/baseapi/platformapi/wxpay" @@ -16,15 +17,18 @@ type WXPayController struct { func (c *WXPayController) Msg() { if c.Ctx.Input.Method() == http.MethodPost { msg, callbackResponse := api.WxpayAPI.GetCallbackMsg(c.Ctx.Request) + var err error if callbackResponse == nil { - if err := localjx.OnWxPayCallback(msg); err != nil { - if msg.MsgType != wxpay.MsgTypeUnkown { - callbackResponse = wxpay.Err2CallbackResponse(err, "") - } + if msg.MsgType != wxpay.MsgTypeUnkown { + err = fmt.Errorf("未知的微信支付回调类型:%d", msg.MsgType) + } else { + err = localjx.OnWxPayCallback(msg) } } if callbackResponse == nil { callbackResponse = wxpay.SuccessResponse + } else if err != nil { + callbackResponse = wxpay.Err2CallbackResponse(err, "") } c.Data["xml"] = callbackResponse c.ServeXML() diff --git a/globals/api/api.go b/globals/api/api.go index eb4aed297..d94e5bd5d 100644 --- a/globals/api/api.go +++ b/globals/api/api.go @@ -25,6 +25,7 @@ import ( "git.rosy.net.cn/baseapi/platformapi/zhongwuapi" "git.rosy.net.cn/jx-callback/business/jxutils/cache" "git.rosy.net.cn/jx-callback/business/jxutils/cache/redis" + "git.rosy.net.cn/jx-callback/globals" "github.com/astaxie/beego" "github.com/qiniu/api.v7/auth/qbox" @@ -143,8 +144,11 @@ func Init() { WeixinMiniAPI2 = weixinapi.New(WeixinMiniAppID2, beego.AppConfig.String("weixinMiniSecret2")) } WeixinPageAPI = weixinapi.New(beego.AppConfig.String("weixinPageAppID"), beego.AppConfig.String("weixinPageSecret")) - WxpayAPI = wxpay.New(beego.AppConfig.String("wxpayAppID"), beego.AppConfig.String("wxpayAppKey"), beego.AppConfig.String("wxpayAppMchID")) - + if globals.WxpayNotifyURL != "" { + // WxpayAPI = wxpay.New(beego.AppConfig.String("wxpayAppID"), beego.AppConfig.String("wxpayAppKey"), beego.AppConfig.String("wxpayAppMchID")) + WxpayAPI = wxpay.NewWithCertificate(beego.AppConfig.String("wxpayAppID"), beego.AppConfig.String("wxpayAppKey"), beego.AppConfig.String("wxpayAppMchID"), + "conf/apiclient_cert.pem", "conf/apiclient_key.pem") + } AutonaviAPI = autonavi.New(beego.AppConfig.String("autonaviKey")) BaiDuNaviAPI = baidunavi.New(beego.AppConfig.String("baidunaviAK"), beego.AppConfig.String("baidunaviSK")) QiniuAPI = qbox.NewMac(beego.AppConfig.String("qiniuAK"), beego.AppConfig.String("qiniuSK")) diff --git a/globals/globals.go b/globals/globals.go index e615981b0..c2a846da6 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -47,6 +47,8 @@ var ( EnableWXAuth2 bool DisableWXAuth1 bool + + WxpayNotifyURL string ) func init() { @@ -92,6 +94,8 @@ func Init() { EnableWXAuth2 = true // beego.BConfig.RunMode == "beta" DisableWXAuth1 = true + + WxpayNotifyURL = beego.AppConfig.DefaultString("wxpayNotifyURL", "") } func IsCallbackAlwaysReturnSuccess() bool {