Merge remote-tracking branch 'origin/mark' into su
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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{
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
24
conf/apiclient_cert.pem
Executable file
24
conf/apiclient_cert.pem
Executable file
@@ -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-----
|
||||
28
conf/apiclient_key.pem
Executable file
28
conf/apiclient_key.pem
Executable file
@@ -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-----
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"))
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user