Browse Source

notice

master
黄梓健 5 years ago
parent
commit
2d1e37a34a
  1. 47
      controllers/common/wechat_oauth.go
  2. 4
      log/hdzj.log
  3. 4
      models/user_order.go
  4. 147
      services/pay/order.go

47
controllers/common/wechat_oauth.go

@ -9,6 +9,7 @@ import (
"hudongzhuanjia/libs/filter"
"hudongzhuanjia/logger"
pay_service "hudongzhuanjia/services/pay"
"hudongzhuanjia/utils/define"
"os"
"time"
)
@ -73,36 +74,52 @@ var counter = new(atomic.Int64)
func (t *WeChatOauthCtl) CallbackOrder() {
counter.Add(1)
//搜索支付的order表, 查找到某条记录
_, err := pay_service.NotifyOrder(t.Request.OriginRequest.Body)
_, err := pay_service.NotifyOrder(t.Request.BODY)
param := new(CallbackParam)
if err != nil {
logger.Error(fmt.Sprintf("出现错误: %v", err))
return
param.ReturnCode = CDATA{Text: define.CODE_FAIL}
param.ReturnMsg = CDATA{Text: err.Error()}
} else {
param.ReturnCode = CDATA{Text: define.CODE_SUCCESS}
param.ReturnMsg = CDATA{Text: "OK"}
}
xmlRes, _ := xml.Marshal(param)
if t.Request.OriginRequest.Method == "GET" {
t.JSON(map[string]interface{}{
"counter": counter.Load(),
"time": time.Now(),
"xml": param,
})
}
logger.Error(fmt.Sprintf("微信响应次数: %v", counter.Load()))
t.XML(xmlRes)
}
func (t *WeChatOauthCtl) CallbackRefund() {
_, err := pay_service.NotifyRefund(t.Request.BODY)
param := new(CallbackParam)
param.ReturnCode = CDATA{Text: "SUCCESS"}
param.ReturnMsg = CDATA{Text: "OK"}
if err != nil {
logger.Error("", err)
param.ReturnCode = CDATA{Text: define.CODE_FAIL}
param.ReturnMsg = CDATA{Text: err.Error()}
} else {
param.ReturnCode = CDATA{Text: define.CODE_SUCCESS}
param.ReturnMsg = CDATA{Text: "OK"}
}
xmlRes, _ := xml.Marshal(param)
if t.Request.OriginRequest.Method == "GET" {
t.JSON(map[string]interface{}{
"counter": counter.Load(),
"time": time.Now(),
"xml": param,
})
}
logger.Error(fmt.Sprintf("微信响应次数: %v", counter.Load()))
t.XML(xmlRes)
}
//func (t *WeChatOauthCtl) CallbackRefund() {
// logger.Sugar.Infof("%s", t.Request.OriginRequest.RemoteAddr)
// //t.CheckErr(pay_service.NotifyRefund(t.Request.OriginRequest))
// param := new(CallbackParam)
// param.ReturnCode = "SUCCESS"
// param.ReturnMsg = "OK"
// xmlRes, _ := xml.Marshal(param)
// t.XML(xmlRes)
//}
//
//func (t *WeChatOauthCtl) SendRedPack() {
// user := new(models.User)
// exist, err := models.GetById(user, 234)

4
log/hdzj.log

@ -94,3 +94,7 @@
2020-05-21 10:38:23.165 ERROR logger/logger.go:87 查询订单出现错误{错误原因 15 0 invalid connection <nil>} {交易订单号 15 0 W1zSTjb10NTYuLM2D4EKOGM25MbbHuG2 <nil>}
2020-05-21 15:38:53.530 ERROR logger/logger.go:87 check err{error 25 0 sql: expected 3 destination arguments in Scan, not 1}
2020-05-21 15:45:57.936 ERROR logger/logger.go:87 check err{error 25 0 sql: expected 3 destination arguments in Scan, not 1}
2020-05-22 15:01:04.224 ERROR logger/logger.go:87 出现错误: xml unmarsal error:EOF
2020-05-22 15:01:42.724 ERROR logger/logger.go:87 出现错误: xml unmarsal error:EOF
2020-05-22 15:03:20.189 ERROR logger/logger.go:87 出现错误: xml unmarsal error:EOF
2020-05-22 15:06:18.656 ERROR logger/logger.go:87 微信响应次数: 1

4
models/user_order.go

@ -56,6 +56,10 @@ func (t *UserOrder) UpdateStatusByOutTradeNo(outTradeNo interface{}, status int)
Cols("status").Update(t)
}
func (t *UserOrder) UpdateByOutTradeNo(outTradeNo interface{}, filed ...string) (int64, error) {
return core.GetXormAuto().Where("out_trade_no=?", outTradeNo).Cols(filed...).Update(t)
}
//
//func (t *UserOrder) UpdateRefundByOutTradeNo(outTradeNo interface{}) (int64, error) {
// return core.GetXormAuto().Where("out_trade_no=?", outTradeNo).

147
services/pay/order.go

@ -9,8 +9,6 @@ import (
"hudongzhuanjia/models"
"hudongzhuanjia/utils"
"hudongzhuanjia/utils/define"
"io"
"io/ioutil"
"strconv"
"time"
)
@ -107,7 +105,7 @@ func ReOrder(outTradeNo string) (map[string]interface{}, error) {
}
// Notify
type NotifyRequest struct {
type NotifyOrderParam struct {
ReturnCode string `xml:"return_code,omitempty" json:"return_code,omitempty"`
ReturnMsg string `xml:"return_msg,omitempty" json:"return_msg,omitempty"`
ResultCode string `xml:"result_code,omitempty" json:"result_code,omitempty"`
@ -128,62 +126,54 @@ type NotifyRequest struct {
FeeType string `xml:"fee_type,omitempty" json:"fee_type,omitempty"`
CashFee int `xml:"cash_fee,omitempty" json:"cash_fee,omitempty"`
CashFeeType string `xml:"cash_fee_type,omitempty" json:"cash_fee_type,omitempty"`
CouponFee int `xml:"coupon_fee,omitempty" json:"coupon_fee,omitempty"`
CouponCount int `xml:"coupon_count,omitempty" json:"coupon_count,omitempty"`
CouponType0 string `xml:"coupon_type_0,omitempty" json:"coupon_type_0,omitempty"`
CouponType1 string `xml:"coupon_type_1,omitempty" json:"coupon_type_1,omitempty"`
CouponId0 string `xml:"coupon_id_0,omitempty" json:"coupon_id_0,omitempty"`
CouponId1 string `xml:"coupon_id_1,omitempty" json:"coupon_id_1,omitempty"`
CouponFee0 int `xml:"coupon_fee_0,omitempty" json:"coupon_fee_0,omitempty"`
CouponFee1 int `xml:"coupon_fee_1,omitempty" json:"coupon_fee_1,omitempty"`
TransactionId string `xml:"transaction_id,omitempty" json:"transaction_id,omitempty"`
OutTradeNo string `xml:"out_trade_no,omitempty" json:"out_trade_no,omitempty"`
Attach string `xml:"attach,omitempty" json:"attach,omitempty"`
TimeEnd string `xml:"time_end,omitempty" json:"time_end,omitempty"`
}
func NotifyOrder(w io.Reader) (order *models.UserOrder, err error) {
var exist bool
res := NotifyRequest{}
body, err := ioutil.ReadAll(w)
if err != nil {
err = fmt.Errorf("body read all error:%+v", err)
return nil, err
}
err = xml.Unmarshal(body, &res)
func NotifyOrder(body string) (*models.UserOrder, error) {
res := NotifyOrderParam{}
err := xml.Unmarshal([]byte(body), &res)
if err != nil {
err = fmt.Errorf("xml unmarsal error:%+v", err)
return
logger.Error(err)
return nil, err
}
if res.ReturnCode != define.CODE_SUCCESS {
return nil, fmt.Errorf("network error, retrun_code: %+v and return_msg: %+v", res.ReturnCode, res.ReturnMsg)
err = fmt.Errorf("network error, retrun_code: %+v and return_msg: %+v", res.ReturnCode, res.ReturnMsg)
logger.Error(err)
return nil, err
}
if res.ResultCode != define.CODE_SUCCESS {
err = fmt.Errorf("trade error, result_code: %+v and err_code: %+v and err_desc: %+v",
res.ResultCode, res.ErrCode, res.ErrCodeDes)
logger.Error(err)
return nil, err
}
order := new(models.UserOrder)
exist, err := order.GetByOutTradeNo(res.OutTradeNo)
if err == nil || !exist {
err = fmt.Errorf("user order get by out_trade_no: %+v, error: %+v, exist: %+v", res.OutTradeNo, err, exist)
return nil, err
}
order.TransactionId = res.TransactionId
order.Status = 1
_, err = models.Update(order.Id, order, "status", "transaction_id")
if err != nil {
return nil, err
}
if res.ResultCode == define.CODE_SUCCESS && res.TradeType == define.CODE_TRADE_SUCCESS {
userOrder := new(models.UserOrder)
userOrder.TransactionId = res.TransactionId
userOrder.Status = 1
_, err = userOrder.UpdateStatusByOutTradeNo(res.OutTradeNo, 1)
if err != nil {
return nil, err
}
exist, err = userOrder.GetByOutTradeNo(res.OutTradeNo)
if err == nil || !exist {
err = fmt.Errorf("user order get by out_trade_no: %+v, error: %+v, exist: %+v", res.OutTradeNo, err, exist)
return
}
err = HandleSuccess(userOrder)
if err != nil {
logger.Error(fmt.Sprintf("handle success: %v", err))
return
}
return userOrder, nil
} else {
err = fmt.Errorf("trade error, err_code: %+v and err_code_des: %+v", res.ErrCode, res.ErrCodeDes)
return
err = HandleSuccess(order)
if err != nil {
logger.Error(fmt.Sprintf("callback 错误处理: %v", err))
return nil, err
}
return order, nil
}
type OrderQueryResult struct {
@ -286,3 +276,68 @@ func QueryRefund(outTradeNo string) (*pay.RefundQueryResponse, error) {
}
return res, nil
}
type NotifyRefundParam struct {
ReturnCode string `xml:"return_code,omitempty" json:"return_code,omitempty"`
ReturnMsg string `xml:"return_msg,omitempty" json:"return_msg,omitempty"`
ResultCode string `xml:"result_code,omitempty" json:"result_code,omitempty"`
ErrCode string `xml:"err_code,omitempty" json:"err_code,omitempty"`
ErrCodeDes string `xml:"err_code_des,omitempty" json:"err_code_des,omitempty"`
Appid string `xml:"appid,omitempty" json:"appid,omitempty"`
MchId string `xml:"mch_id,omitempty" json:"mch_id,omitempty"`
NonceStr string `xml:"nonce_str,omitempty" json:"nonce_str,omitempty"`
ReqInfo string `xml:"req_info,omitempty" json:"req_info,omitempty"`
TransactionId string `xml:"transaction_id,omitempty" json:"transaction_id,omitempty"`
OutTradeNo string `xml:"out_trade_no,omitempty" json:"out_trade_no,omitempty"`
RefundId string `xml:"refund_id,omitempty" json:"refund_id,omitempty"`
OutRefundNo string `xml:"out_refund_no,omitempty" json:"out_refund_no,omitempty"`
TotalFee int `xml:"total_fee,omitempty" json:"total_fee,omitempty"`
SettlementTotalFee int `xml:"settlement_total_fee,omitempty" json:"settlement_total_fee,omitempty"`
RefundFee int `xml:"refund_fee,omitempty" json:"refund_fee,omitempty"`
SettlementRefundFee int `xml:"settlement_refund_fee,omitempty" json:"settlement_refund_fee,omitempty"`
RefundStatus string `xml:"refund_status,omitempty" json:"refund_status,omitempty"`
SuccessTime string `xml:"success_time,omitempty" json:"success_time,omitempty"`
RefundRecvAccout string `xml:"refund_recv_accout,omitempty" json:"refund_recv_accout,omitempty"`
RefundAccount string `xml:"refund_account,omitempty" json:"refund_account,omitempty"`
RefundRequestSource string `xml:"refund_request_source,omitempty" json:"refund_request_source,omitempty"`
}
func NotifyRefund(body string) (*models.UserOrder, error) {
res := NotifyRefundParam{}
err := xml.Unmarshal([]byte(body), &res)
if err != nil {
err = fmt.Errorf("xml unmarsal error: %+v", err)
logger.Error(err)
return nil, err
}
if res.ReturnCode != define.CODE_SUCCESS {
err = fmt.Errorf("network error, retrun_code: %+v and return_msg: %+v", res.ReturnCode, res.ReturnMsg)
logger.Error(err)
return nil, err
}
if res.ResultCode != define.CODE_SUCCESS {
err = fmt.Errorf("trade error, result_code: %+v and err_code: %+v and err_desc: %+v",
res.ResultCode, res.ErrCode, res.ErrCodeDes)
logger.Error(err)
return nil, err
}
order := new(models.UserOrder)
exist, err := order.GetByOutTradeNo(res.OutTradeNo)
if err == nil || !exist {
err = fmt.Errorf("user order get by out_trade_no: %+v, error: %+v, exist: %+v", res.OutTradeNo, err, exist)
return nil, err
}
order.RefundRecvAccount = res.RefundRecvAccout
order.RefundAccount = res.RefundAccount
order.TransactionId = res.TransactionId
order.Status = 4
_, err = models.Update(order.Id, order, "status", "transaction_id")
if err != nil {
return nil, err
}
return order, nil
}
Loading…
Cancel
Save