225 lines
6.6 KiB
Go
225 lines
6.6 KiB
Go
package financial
|
|
|
|
import (
|
|
"fmt"
|
|
"git.rosy.net.cn/baseapi/platformapi/recharge_phone_bill"
|
|
"git.rosy.net.cn/baseapi/platformapi/tonglianpayapi"
|
|
"git.rosy.net.cn/baseapi/utils"
|
|
"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/business/q_bida"
|
|
"git.rosy.net.cn/jx-callback/globals"
|
|
"git.rosy.net.cn/jx-callback/globals/api"
|
|
)
|
|
|
|
type PayHandler struct {
|
|
PayType int `json:"-"` //支付方式
|
|
Ctx *jxcontext.Context
|
|
Order *model.Order
|
|
VendorPayType string
|
|
|
|
WxPayParam *WxPayParam `json:"wxPayParam"`
|
|
}
|
|
|
|
type WxPayParam struct {
|
|
Prepayid string `json:"prepayid"`
|
|
Noncestr string `json:"noncestr"`
|
|
Timestamp string `json:"timestamp"`
|
|
Package string `json:"package"`
|
|
Partnerid string `json:"partnerid"`
|
|
Appid string `json:"appid"`
|
|
Sign string `json:"sign"`
|
|
}
|
|
|
|
type PayHandlerInterface interface {
|
|
CreatePay() (err error)
|
|
CreateRefund() (err error)
|
|
}
|
|
|
|
func OnPayFinished(order *model.Order) (err error) {
|
|
var db = dao.GetDB()
|
|
globals.SugarLogger.Debugf("OnPayFinished begin modify account order: %v", utils.Format4Output(order, false))
|
|
txDB, _ := dao.Begin(db)
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
dao.Rollback(db, txDB)
|
|
panic(r)
|
|
}
|
|
}()
|
|
//如果用户没有对应账单信息就给他生成一条
|
|
userBill, err := dao.GetUserBill(db, order.UserID, "")
|
|
if userBill == nil {
|
|
globals.SugarLogger.Debugf("OnPayFinished 未找到该用户的账单 order: %v", utils.Format4Output(order, false))
|
|
return fmt.Errorf("未找到该用户的账单!%v", order.UserID)
|
|
}
|
|
//根据订单类型来操作账户
|
|
switch order.Type {
|
|
case model.OrderTypePay:
|
|
//如果是账户充值(发布任务等)
|
|
//账户收入
|
|
if err = AddIncomeUpdateAccount(txDB, userBill, model.BillTypeInvest, order.PayPrice, 0); err != nil {
|
|
dao.Rollback(db, txDB)
|
|
}
|
|
default:
|
|
globals.SugarLogger.Debugf("OnPayFinished 暂不支持此订单类型 order: %v", utils.Format4Output(order, false))
|
|
return fmt.Errorf("暂不支持此订单类型!")
|
|
}
|
|
dao.Commit(db, txDB)
|
|
globals.SugarLogger.Debugf("OnPayFinished end modify account ...")
|
|
return err
|
|
}
|
|
|
|
func OnCashFinished(order *model.Order) (err error) {
|
|
var (
|
|
db = dao.GetDB()
|
|
)
|
|
globals.SugarLogger.Debugf("OnCashFinished begin modify account order: %v", utils.Format4Output(order, false))
|
|
txDB, _ := dao.Begin(db)
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
dao.Rollback(db, txDB)
|
|
panic(r)
|
|
}
|
|
}()
|
|
//如果用户没有对应账单信息就给他生成一条
|
|
userBill, err := dao.GetUserBill(db, order.UserID, "")
|
|
if userBill == nil {
|
|
globals.SugarLogger.Debugf("OnCashFinished 未找到该用户的账单 order: %v", utils.Format4Output(order, false))
|
|
return fmt.Errorf("未找到该用户的账单!%v", order.UserID)
|
|
}
|
|
//根据订单类型来操作账户
|
|
switch order.Type {
|
|
case model.OrderTypeCash:
|
|
//如果是账户提现
|
|
//账户支出
|
|
if err = AddExpendUpdateAccount(txDB, userBill, model.BillTypeCash, order.PayPrice, 0); err != nil {
|
|
dao.Rollback(db, txDB)
|
|
}
|
|
default:
|
|
globals.SugarLogger.Debugf("OnPayFinished 暂不支持此订单类型 order: %v", utils.Format4Output(order, false))
|
|
return fmt.Errorf("暂不支持此订单类型!")
|
|
}
|
|
dao.Commit(db, txDB)
|
|
globals.SugarLogger.Debugf("OnCashFinished end modify account ...")
|
|
return err
|
|
}
|
|
|
|
//微信支付充值会员
|
|
func OnWXPayFinished(order *model.Order) (err error) {
|
|
var (
|
|
db = dao.GetDB()
|
|
ctx *jxcontext.Context
|
|
txDB, _ = dao.Begin(db)
|
|
)
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
dao.Rollback(db, txDB)
|
|
panic(r)
|
|
}
|
|
}()
|
|
|
|
//判断是新会员充值还是老会员续费
|
|
userMembers, err := dao.GetUserMember(db, order.UserID, model.MemberTypeNormal)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
//根据订单类型来操作账户
|
|
if order.Type == model.OrderTypePay {
|
|
//为新会员生成会员信息并充值
|
|
if len(userMembers) > 0 {
|
|
if _, err := WXInvestMember(ctx, order.OrderType, order.UserID); err != nil {
|
|
return err
|
|
}
|
|
} else {
|
|
if _, err := WXInvestMemberNew(ctx, order.OrderType, order.UserID); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
order.Status = model.OrderStatusFinished
|
|
//更新order状态
|
|
if _, err := dao.UpdateEntityTx(txDB, &order, "Status"); err != nil {
|
|
dao.Rollback(db, txDB)
|
|
return err
|
|
}
|
|
} else {
|
|
return fmt.Errorf("暂不支持此订单类型!")
|
|
}
|
|
return err
|
|
}
|
|
|
|
// OnWxPayTelephone 微信充值话费
|
|
func OnWxPayTelephone(order *model.Order) error {
|
|
orderNumber, err := api.TelephoneAPI.RechargePhoneBill(&recharge_phone_bill.RechargePhoneBillBase{
|
|
FlowCode: order.FlowCode,
|
|
Mobile: order.Mobile,
|
|
OrderNumber: order.OrderID,
|
|
CallbackURL: "http://callback.rsm.jxc4.com/recharge/msg",
|
|
ChargeType: "1",
|
|
})
|
|
if err != nil {
|
|
order.Comment = err.Error()
|
|
order.RechargeStatus = -1 // 充值失败
|
|
}
|
|
order.RechargeStatus = 1 // 充值中
|
|
order.Comment = orderNumber
|
|
//更新order状态
|
|
order.Status = model.OrderStatusFinished
|
|
if _, err := dao.UpdateEntity(dao.GetDB(), &order, "Status", "RechargeStatus", "Comment"); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// OnWxPaySendPage 发快递支付方
|
|
func OnWxPaySendPage(db *dao.DaoDB, order *model.Order, call *tonglianpayapi.CallBackResult, payStatus int) (err error) {
|
|
txdb, _ := dao.Begin(db)
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
panic(r)
|
|
}
|
|
}()
|
|
order.TransactionID = call.TrxID
|
|
order.Status = 110 //支付成功状态
|
|
if _, err := dao.UpdateEntityTx(txdb, order, "TransactionID", "Status"); err != nil {
|
|
dao.Rollback(db, txdb)
|
|
return err
|
|
}
|
|
userOrder := model.UserVendorOrder{LocalWayBill: order.OrderID}
|
|
if err := dao.GetEntity(db, &userOrder, "LocalWayBill"); err != nil {
|
|
dao.Rollback(db, txdb)
|
|
return err
|
|
}
|
|
userOrder.OrderStatus = payStatus
|
|
if _, err := dao.UpdateEntityTx(txdb, &userOrder, "OrderStatus"); err != nil {
|
|
dao.Rollback(db, txdb)
|
|
return err
|
|
}
|
|
//1-余额,2-微信,5-混合
|
|
if order.PayMethod == model.OrderPayMethodMix {
|
|
userBill, err := dao.GetUserBill(db, order.UserID, "")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
//创建混合支付账单
|
|
totalPrice := order.PayPrice + userBill.AccountBalance
|
|
if err := AddMixPay(txdb, order.OrderID, userBill.AccountBalance, totalPrice, 1); err != nil {
|
|
dao.Rollback(db, txdb)
|
|
return err
|
|
}
|
|
//余额清空
|
|
if err := dao.UpdateUserBill(order.UserID, 0); err != nil {
|
|
dao.Rollback(db, txdb)
|
|
return err
|
|
}
|
|
}
|
|
dao.Commit(db, txdb)
|
|
if call.TrxStatus == tonglianpayapi.TrxStatusSuccess {
|
|
switch order.OrderType {
|
|
case model.PayType4Express:
|
|
err = q_bida.CreateOrder2QBiDa(&userOrder, order.OrderID)
|
|
}
|
|
}
|
|
return err
|
|
}
|