fix
This commit is contained in:
parent
c3165aa0c2
commit
1920418c31
|
@ -3521,7 +3521,7 @@ func (v *Vas) payRefund(ctx *gin.Context, order *dbstruct.Order) error {
|
||||||
}
|
}
|
||||||
case vasproto.PayTypeYeepayAlipayH5, vasproto.PayTypeYeepayWxpayH5:
|
case vasproto.PayTypeYeepayAlipayH5, vasproto.PayTypeYeepayWxpayH5:
|
||||||
yeepayCli := yeepaycli.GetDefaultYeepayClient()
|
yeepayCli := yeepaycli.GetDefaultYeepayClient()
|
||||||
resp, err := yeepayCli.RefundOne(ctx, &yeepaycli.RefundOneParam{
|
resp, refundRequestId, err := yeepayCli.RefundOne(ctx, &yeepaycli.RefundOneParam{
|
||||||
OutTradeNo: orderId,
|
OutTradeNo: orderId,
|
||||||
RefundAmount: order.GetPayAmount(),
|
RefundAmount: order.GetPayAmount(),
|
||||||
RefundReason: "用户退款",
|
RefundReason: "用户退款",
|
||||||
|
@ -3530,11 +3530,46 @@ func (v *Vas) payRefund(ctx *gin.Context, order *dbstruct.Order) error {
|
||||||
logger.Error("wxpayCli.RefundOne fail, orderId: %v, resp: %v, err: %v", orderId, util.ToJson(resp), err)
|
logger.Error("wxpayCli.RefundOne fail, orderId: %v, resp: %v, err: %v", orderId, util.ToJson(resp), err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if resp.Status != "SUCCESS" {
|
if resp.Code != "OPR00000" {
|
||||||
err = fmt.Errorf("退款失败,请稍后再试")
|
err = fmt.Errorf("退款失败,请稍后再试")
|
||||||
logger.Error("wxpayCli.RefundOne fail, orderId: %v, resp: %v, err: %v", orderId, util.ToJson(resp), err)
|
logger.Error("wxpayCli.RefundOne fail, orderId: %v, resp: %v, err: %v", orderId, util.ToJson(resp), err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 轮询退款结果,达到同步退款效果
|
||||||
|
var (
|
||||||
|
loop = 0
|
||||||
|
isRefundSuccess = false
|
||||||
|
)
|
||||||
|
for range time.Tick(time.Second * 1) {
|
||||||
|
if loop >= 10 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
qRefundResp, _err := yeepayCli.QueryRefund(ctx, &yeepaycli.QueryRefundParam{
|
||||||
|
OutTradeNo: orderId,
|
||||||
|
RefundRequestId: refundRequestId,
|
||||||
|
})
|
||||||
|
if _err != nil {
|
||||||
|
logger.Error("loop: %v, yeepayCli.QueryRefund fail, orderId: %v, resp: %v, err: %v", loop, orderId, util.ToJson(qRefundResp), _err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if qRefundResp.Code != "OPR00000" {
|
||||||
|
logger.Error("loop: %v, yeepayCli.QueryRefund fail, invalid code, orderId: %v, resp: %v", loop, orderId, util.ToJson(qRefundResp))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if qRefundResp.Status == "SUCCESS" {
|
||||||
|
logger.Info("loop: %v, yeepayCli.QueryRefund ok, orderId: %v, resp: %v", loop, orderId, util.ToJson(qRefundResp))
|
||||||
|
isRefundSuccess = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
loop++
|
||||||
|
}
|
||||||
|
if !isRefundSuccess {
|
||||||
|
err = fmt.Errorf("退款失败,请稍后再试")
|
||||||
|
logger.Error("wxpayCli.RefundOne fail, orderId: %v", orderId)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
logger.Info("wxpayCli.RefundOne success, orderId: %v", orderId)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -175,14 +175,15 @@ type RefundOneResp struct {
|
||||||
RefundCsFinishDate string `json:"refundCsFinishDate"`
|
RefundCsFinishDate string `json:"refundCsFinishDate"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *YeepayClient) RefundOne(ctx context.Context, param *RefundOneParam) (resp *RefundOneResp, err error) {
|
func (c *YeepayClient) RefundOne(ctx context.Context, param *RefundOneParam) (resp *RefundOneResp, refundRequestId string, err error) {
|
||||||
|
refundRequestId = idgenerator.GenYeepayRefundId()
|
||||||
req := request.NewYopRequest(constants.POST_HTTP_METHOD, "/rest/v1.0/trade/refund")
|
req := request.NewYopRequest(constants.POST_HTTP_METHOD, "/rest/v1.0/trade/refund")
|
||||||
req.AppId = c.AppId
|
req.AppId = c.AppId
|
||||||
req.IsvPriKey = request.IsvPriKey{Value: c.PrivateKey, CertType: request.RSA2048}
|
req.IsvPriKey = request.IsvPriKey{Value: c.PrivateKey, CertType: request.RSA2048}
|
||||||
req.AddParam("parentMerchantNo", c.ParentMerchantNo)
|
req.AddParam("parentMerchantNo", c.ParentMerchantNo)
|
||||||
req.AddParam("merchantNo", c.MerchantNo)
|
req.AddParam("merchantNo", c.MerchantNo)
|
||||||
req.AddParam("orderId", param.OutTradeNo)
|
req.AddParam("orderId", param.OutTradeNo)
|
||||||
req.AddParam("refundRequestId", idgenerator.GenYeepayRefundId())
|
req.AddParam("refundRequestId", refundRequestId)
|
||||||
req.AddParam("refundAmount", fmt.Sprintf("%.2f", float64(param.RefundAmount)/100.0))
|
req.AddParam("refundAmount", fmt.Sprintf("%.2f", float64(param.RefundAmount)/100.0))
|
||||||
|
|
||||||
respMeta, err := c.client.Request(req)
|
respMeta, err := c.client.Request(req)
|
||||||
|
@ -198,3 +199,45 @@ func (c *YeepayClient) RefundOne(ctx context.Context, param *RefundOneParam) (re
|
||||||
}
|
}
|
||||||
|
|
||||||
// 查询退款
|
// 查询退款
|
||||||
|
type QueryRefundParam struct {
|
||||||
|
OutTradeNo string // 商家订单id,我们自己的订单id
|
||||||
|
RefundRequestId string
|
||||||
|
}
|
||||||
|
|
||||||
|
type QueryRefundResp struct {
|
||||||
|
Code string `json:"code"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
ParentMerchantNo string `json:"parentMerchantNo"`
|
||||||
|
MerchantNo string `json:"merchantNo"`
|
||||||
|
OrderId string `json:"orderId"`
|
||||||
|
RefundRequestId string `json:"refundRequestId"`
|
||||||
|
UniqueRefundNo string `json:"uniqueRefundNo"`
|
||||||
|
Status string `json:"status"`
|
||||||
|
RefundAmount string `json:"refundAmount"`
|
||||||
|
RefundRequestDate string `json:"refundRequestDate"`
|
||||||
|
RefundMerchantFee string `json:"refundMerchantFee"`
|
||||||
|
RefundAccountDetail string `json:"refundAccountDetail"`
|
||||||
|
RefundCsFinishDate string `json:"refundCsFinishDate"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *YeepayClient) QueryRefund(ctx context.Context, param *QueryRefundParam) (resp *QueryRefundResp, err error) {
|
||||||
|
req := request.NewYopRequest(constants.GET_HTTP_METHOD, "/rest/v1.0/trade/refund/query")
|
||||||
|
req.AppId = c.AppId
|
||||||
|
req.ServerRoot = request.SERVER_ROOT
|
||||||
|
req.IsvPriKey = request.IsvPriKey{Value: c.PrivateKey, CertType: request.RSA2048}
|
||||||
|
req.AddParam("parentMerchantNo", c.ParentMerchantNo)
|
||||||
|
req.AddParam("merchantNo", c.MerchantNo)
|
||||||
|
req.AddParam("orderId", param.OutTradeNo)
|
||||||
|
req.AddParam("refundRequestId", param.RefundRequestId)
|
||||||
|
|
||||||
|
respMeta, err := c.client.Request(req)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("yeepay RefundOne fail, param: %v, respMeta: %v, err: %v", util.ToJson(req.Params), util.ToJson(respMeta), err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp = new(QueryRefundResp)
|
||||||
|
b, _ := json.Marshal(respMeta.Result)
|
||||||
|
_ = json.Unmarshal(b, resp)
|
||||||
|
logger.Info("yeepay QueryRefund param: %v, resp: %v", util.ToJson(req.Params), util.ToJson(resp))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
|
@ -61,3 +61,13 @@ func TestYeepayClient_ParseNotify(t *testing.T) {
|
||||||
|
|
||||||
fmt.Println("Payment Info:", paymentInfo)
|
fmt.Println("Payment Info:", paymentInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestYeepayClient_QueryRefund(t *testing.T) {
|
||||||
|
cli := GetDefaultYeepayClient()
|
||||||
|
resp, err := cli.QueryRefund(nil, &QueryRefundParam{
|
||||||
|
OutTradeNo: "1795300011844579328",
|
||||||
|
RefundRequestId: "1795652043868880896",
|
||||||
|
})
|
||||||
|
t.Log(err)
|
||||||
|
t.Log(util.ToJson(resp))
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue