Bläddra i källkod

Merge branch 'cygx/mfyx_2.0' of http://8.136.199.33:3000/hongze/hz_crm_api into debug

xingzai 11 månader sedan
förälder
incheckning
bac680dbe6
6 ändrade filer med 114 tillägg och 5 borttagningar
  1. 11 2
      controllers/cygx/order.go
  2. 1 0
      go.mod
  3. 3 0
      go.sum
  4. 1 1
      models/cygx/orde.go
  5. 2 2
      models/cygx/order_refund.go
  6. 96 0
      services/cygx/wx_pay.go

+ 11 - 2
controllers/cygx/order.go

@@ -6,6 +6,7 @@ import (
 	"hongze/hz_crm_api/controllers"
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/cygx"
+	cygxService "hongze/hz_crm_api/services/cygx"
 	"hongze/hz_crm_api/utils"
 	"strconv"
 	"time"
@@ -217,6 +218,14 @@ func (this *UserController) OrderRefund() {
 		br.ErrMsg = "订单状态异常,orderCode:" + orderCode
 		return
 	}
+	//订单状态,0:已取消、1:待支付、2:已支付、3:退款成功、4:退款处理中、5:退款异常、6:退款关闭
+	statusCode, err := cygxService.RefundsApiService(orderDetail)
+	var orderStatus int
+	if statusCode == 200 && err == nil {
+		orderStatus = 4
+	} else {
+		orderStatus = 5
+	}
 	item := new(cygx.CygxOrderRefund)
 	item.OrderCode = orderCode
 	item.RefundMoney = orderDetail.OrderMoney
@@ -226,7 +235,7 @@ func (this *UserController) OrderRefund() {
 	item.RefundTime = time.Now()
 	item.AdminId = sysUser.AdminId
 	item.AdminName = sysUser.RealName
-	err = cygx.AddCygxOrderRefund(item)
+	err = cygx.AddCygxOrderRefund(item, orderStatus)
 	if err != nil {
 		br.Msg = "新增失败."
 		br.ErrMsg = "新增失败,Err:" + err.Error()
@@ -234,7 +243,7 @@ func (this *UserController) OrderRefund() {
 	}
 	br.Ret = 200
 	br.Success = true
-	br.Msg = "新增成功"
+	br.Msg = "操作成功"
 }
 
 // @Title 退款记录列表

+ 1 - 0
go.mod

@@ -97,6 +97,7 @@ require (
 	github.com/tidwall/match v1.1.1 // indirect
 	github.com/tidwall/pretty v1.2.0 // indirect
 	github.com/tjfoc/gmsm v1.3.2 // indirect
+	github.com/wechatpay-apiv3/wechatpay-go v0.2.18 // indirect
 	github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 // indirect
 	github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 // indirect
 	golang.org/x/crypto v0.5.0 // indirect

+ 3 - 0
go.sum

@@ -13,6 +13,7 @@ github.com/SebastiaanKlippert/go-wkhtmltopdf v1.7.2 h1:LORAatv6KuKheYq8HXehiwx3f
 github.com/SebastiaanKlippert/go-wkhtmltopdf v1.7.2/go.mod h1:TY8r0gmwEL1c5Lbd66NgQCkL4ZjGDJCMVqvbbFvUx20=
 github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
 github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
+github.com/agiledragon/gomonkey v2.0.2+incompatible/go.mod h1:2NGfXu1a80LLr2cmWXGBDaHEjb1idR6+FVlX5T3D9hw=
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
@@ -416,6 +417,8 @@ github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhso
 github.com/tjfoc/gmsm v1.3.2 h1:7JVkAn5bvUJ7HtU08iW6UiD+UTmJTIToHCfeFzkcCxM=
 github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w=
 github.com/ugorji/go v0.0.0-20171122102828-84cb69a8af83/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
+github.com/wechatpay-apiv3/wechatpay-go v0.2.18 h1:vj5tvSmnEIz3ZsnFNNUzg+3Z46xgNMJbrO4aD4wP15w=
+github.com/wechatpay-apiv3/wechatpay-go v0.2.18/go.mod h1:A254AUBVB6R+EqQFo3yTgeh7HtyqRRtN2w9hQSOrd4Q=
 github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc=
 github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 h1:6932x8ltq1w4utjmfMPVj09jdMlkY0aiA6+Skbtl3/c=
 github.com/xuri/efp v0.0.0-20220603152613-6918739fd470/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=

+ 1 - 1
models/cygx/orde.go

@@ -22,7 +22,7 @@ type CygxOrder struct {
 	RefundMoney      float64   `comment:"订单退款金额"`
 	RefundTime       time.Time `description:"退款时间"`
 	RefundRemark     string    `description:"退款原因说明"`
-	OrderStatus      int       `comment:"订单状态,0:已取消、1:待支付、2:已支付、3:已退款"`
+	OrderStatus      int       `comment:"订单状态,0:已取消、1:待支付、2:已支付、3:退款成功、4:退款处理中、5:退款异常、6:退款关闭"`
 	PayTime          time.Time `comment:"订单付款时间"`
 	SourceId         int       `comment:"来源ID"`
 	Source           string    `comment:"来源\n报告 :article\n活动 :activity"`

+ 2 - 2
models/cygx/order_refund.go

@@ -25,7 +25,7 @@ type CygxOrderRefundReq struct {
 }
 
 // 添加CygxOrderRefund
-func AddCygxOrderRefund(item *CygxOrderRefund) (err error) {
+func AddCygxOrderRefund(item *CygxOrderRefund, orderStatus int) (err error) {
 	to := orm.NewOrmUsingDB("hz_cygx")
 	o, err := to.Begin()
 	if err != nil {
@@ -39,7 +39,7 @@ func AddCygxOrderRefund(item *CygxOrderRefund) (err error) {
 		}
 	}()
 	updateParams := make(map[string]interface{})
-	updateParams["OrderStatus"] = 3
+	updateParams["OrderStatus"] = orderStatus
 	updateParams["RefundMoney"] = item.RefundMoney
 	updateParams["RefundRemark"] = item.Remark
 	updateParams["RefundTime"] = time.Now()

+ 96 - 0
services/cygx/wx_pay.go

@@ -0,0 +1,96 @@
+package cygx
+
+import (
+	"context"
+	"fmt"
+	"github.com/wechatpay-apiv3/wechatpay-go/core"
+	"github.com/wechatpay-apiv3/wechatpay-go/core/option"
+	"github.com/wechatpay-apiv3/wechatpay-go/services/refunddomestic"
+	payUtils "github.com/wechatpay-apiv3/wechatpay-go/utils"
+	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/services/alarm_msg"
+	"log"
+)
+
+const (
+	//MchPKFileName              = "./utils/cert/apiclient_key.pem"
+	//MchPKFileName = "../cert/cygx/apiclient_key.pem"
+	MchPKFileName              = "../hongze_mfyx/utils/cert/apiclient_key.pem"
+	Mchid                      = "1624495680"
+	MchCertificateSerialNumber = "5ED2719CFAE5205763034AD80BF4B8A33533C418"
+	MchAPIv3Key                = "W1tbnzQrzQ7yRRNuQCIHjis8dgdasKVX"
+)
+
+// 微信商户建立连接
+func getWechatClient() (context.Context, *core.Client, error) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("微信商户建立连接失败 getWechatClient, err:", err.Error()), 2)
+		}
+	}()
+	// 使用 utils 提供的函数从本地文件中加载商户私钥,商户私钥会用来生成请求的签名
+	mchPrivateKey, err := payUtils.LoadPrivateKeyWithPath(MchPKFileName)
+	if err != nil {
+		log.Print("load merchant private key error")
+		return nil, nil, err
+	}
+	ctx := context.Background()
+	// 使用商户私钥等初始化 client,并使它具有自动定时获取微信支付平台证书的能力
+	opts := []core.ClientOption{
+		option.WithWechatPayAutoAuthCipher(Mchid, MchCertificateSerialNumber, mchPrivateKey, MchAPIv3Key),
+	}
+	client, err := core.NewClient(ctx, opts...)
+	if err != nil {
+		log.Printf("new wechat pay client err:%s", err)
+		return nil, nil, err
+	}
+	return ctx, client, nil
+}
+
+// 微信商户退款
+func RefundsApiService(orderDetail *cygx.CygxOrderResp) (statusCode int, err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("生成预支付交易单失败 ExampleJsapiApiServicePrepay, err:", err.Error()), 2)
+		}
+	}()
+	ctx, client, err := getWechatClient()
+	if err != nil {
+		log.Printf("getWechatClientt err:%s", err)
+		return
+	}
+
+	svc := refunddomestic.RefundsApiService{Client: client}
+	resp, result, err := svc.Create(ctx,
+		refunddomestic.CreateRequest{
+			//SubMchid:      core.String(Mchid),
+			TransactionId: core.String(orderDetail.OutTradeCode),
+			OutTradeNo:    core.String(orderDetail.OrderCode),
+			OutRefundNo:   core.String("RE" + orderDetail.OrderCode),
+			Reason:        core.String("退款"),
+			NotifyUrl:     core.String("https://testmfyx.hzinsights.com/api/wechat/wxpay/refunds/notify"),
+			FundsAccount:  refunddomestic.REQFUNDSACCOUNT_AVAILABLE.Ptr(),
+			Amount: &refunddomestic.AmountReq{
+				Currency: core.String("CNY"),
+				//From: []refunddomestic.FundsFromItem{refunddomestic.FundsFromItem{
+				//	Account: refunddomestic.ACCOUNT_AVAILABLE.Ptr(),
+				//	Amount:  core.Int64(444),
+				//}},
+				Refund: core.Int64(int64(orderDetail.PayMoney * 100)),
+				Total:  core.Int64(int64(orderDetail.PayMoney * 100)),
+			},
+		},
+	)
+	statusCode = result.Response.StatusCode
+	if err != nil {
+		// 处理错误
+		log.Printf("call Create err:%s", err)
+	} else {
+		// 处理返回结果
+		log.Printf("status=%d resp=%s", result.Response.StatusCode, resp)
+	}
+	return
+}