互动
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

122 lines
3.0 KiB

package pay_service
import (
"errors"
core2 "github.com/chanxuehong/wechat/mch/core"
"github.com/chanxuehong/wechat/mch/pay"
"github.com/ouxuanserver/osmanthuswine/src/core"
"hudongzhuanjia/models"
"hudongzhuanjia/utils"
"time"
)
const CALLBACK_REFUND_URL = "https://api.ouxuanhudong.com/PcClient/common/WeChatOauthCtl/callbackRefund"
func Refund(reason, outTradeNo, openId string, goodType, totalFee, refundFee int, userId, activityId int64) (*pay.RefundResponse, error) {
client, err := Client()
outRefundNo := utils.RandomStr(64)
nonceStr := utils.RandomStr(32)
res, err := pay.Refund2(client, &pay.RefundRequest{
TransactionId: "",
OutTradeNo: outTradeNo,
OutRefundNo: outRefundNo,
TotalFee: int64(totalFee),
RefundFee: int64(refundFee),
NonceStr: nonceStr,
SignType: core2.SignType_MD5,
RefundFeeType: "CNY",
RefundDesc: reason,
})
//
if err != nil {
return nil, err
}
refund := new(models.UserRefund)
refund.OutTradeNo = outTradeNo
refund.Status = 0
refund.TotalFee = totalFee
refund.GoodType = goodType
refund.RefundDesc = reason
refund.FeeType = "CNY"
refund.OpenId = openId
refund.UserId = userId
refund.ActivityId = activityId
refund.IsDelete = false
refund.CreatedAt = time.Now()
refund.UpdatedAt = time.Now()
_, err = refund.AddUserRefund()
if err != nil {
return nil, err
}
return res, err
}
func QueryRefund(outTradeNo string) (*pay.RefundQueryResponse, error) {
refund := new(models.UserRefund)
exist, err := refund.GetByOutTradeNo(outTradeNo)
if err != nil {
return nil, err
}
if !exist {
return nil, errors.New("不存在改笔退款")
}
client, err := Client()
res, err := pay.RefundQuery2(client, &pay.RefundQueryRequest{
OutTradeNo: outTradeNo,
NonceStr: utils.RandomStr(32),
SignType: core2.SignType_MD5,
})
//请求申请退款
if err != nil {
return nil, err
}
refund.RefundAccount = res.RefundList[0].RefundAccount
refund.RefundRecvAccount = res.RefundList[0].RefundRecvAccout
refund.RefundStatus = res.RefundList[0].RefundStatus
refund.Status = 1
refund.SuccessTime = res.RefundList[0].RefundSuccessTime
refund.WxRefundId = res.RefundList[0].RefundId
refund.TransactionId = res.TransactionId
_, err = refund.QueryUpdate()
if err != nil {
return nil, err
}
return res, nil
}
func BatchQueryRefundByUserId(userId int64) error {
refunds := make([]*models.UserRefund, 0)
if err := core.GetXormAuto().Where("status = 0 and user_id=?", userId).Find(&refunds); err != nil {
return err
}
if err := batchQueryRefund(refunds); err != nil {
return err
}
return nil
}
func BatchQueryRefundByActivityId(activityId int64) error {
refunds := make([]*models.UserRefund, 0)
if err := core.GetXormAuto().Where("status = 0 and user_id=?", activityId).Find(&refunds); err != nil {
return err
}
if err := batchQueryRefund(refunds); err != nil {
return err
}
return nil
}
func batchQueryRefund(refunds []*models.UserRefund) error {
for _, refund := range refunds {
_, err := QueryRefund(refund.OutTradeNo)
if err != nil {
return err
}
}
return nil
}