wx_pay.go 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package cygx
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/wechatpay-apiv3/wechatpay-go/core"
  6. "github.com/wechatpay-apiv3/wechatpay-go/core/option"
  7. "github.com/wechatpay-apiv3/wechatpay-go/services/refunddomestic"
  8. payUtils "github.com/wechatpay-apiv3/wechatpay-go/utils"
  9. "hongze/hz_crm_api/models/cygx"
  10. "hongze/hz_crm_api/services/alarm_msg"
  11. "hongze/hz_crm_api/utils"
  12. "log"
  13. )
  14. const (
  15. //MchPKFileName = "./utils/cert/apiclient_key.pem"
  16. //MchPKFileName = "../cert/cygx/apiclient_key.pem"
  17. MchPKFileName = "../hongze_mfyx/utils/cert/apiclient_key.pem"
  18. Mchid = "1624495680"
  19. MchCertificateSerialNumber = "5ED2719CFAE5205763034AD80BF4B8A33533C418"
  20. MchAPIv3Key = "W1tbnzQrzQ7yRRNuQCIHjis8dgdasKVX"
  21. )
  22. // 微信商户建立连接
  23. func getWechatClient() (context.Context, *core.Client, error) {
  24. var err error
  25. defer func() {
  26. if err != nil {
  27. fmt.Println(err)
  28. go alarm_msg.SendAlarmMsg(fmt.Sprint("微信商户建立连接失败 getWechatClient, err:", err.Error()), 2)
  29. }
  30. }()
  31. // 使用 utils 提供的函数从本地文件中加载商户私钥,商户私钥会用来生成请求的签名
  32. mchPrivateKey, err := payUtils.LoadPrivateKeyWithPath(MchPKFileName)
  33. if err != nil {
  34. log.Print("load merchant private key error")
  35. return nil, nil, err
  36. }
  37. ctx := context.Background()
  38. // 使用商户私钥等初始化 client,并使它具有自动定时获取微信支付平台证书的能力
  39. opts := []core.ClientOption{
  40. option.WithWechatPayAutoAuthCipher(Mchid, MchCertificateSerialNumber, mchPrivateKey, MchAPIv3Key),
  41. }
  42. client, err := core.NewClient(ctx, opts...)
  43. if err != nil {
  44. log.Printf("new wechat pay client err:%s", err)
  45. return nil, nil, err
  46. }
  47. return ctx, client, nil
  48. }
  49. // 微信商户退款
  50. func RefundsApiService(orderDetail *cygx.CygxOrderResp) (statusCode int, err error) {
  51. defer func() {
  52. if err != nil {
  53. fmt.Println(err)
  54. go alarm_msg.SendAlarmMsg(fmt.Sprint("微信商户退款失败 RefundsApiService, err:", err.Error()), 2)
  55. }
  56. }()
  57. ctx, client, err := getWechatClient()
  58. if err != nil {
  59. log.Printf("getWechatClientt err:%s", err)
  60. return
  61. }
  62. svc := refunddomestic.RefundsApiService{Client: client}
  63. resp, result, err := svc.Create(ctx,
  64. refunddomestic.CreateRequest{
  65. //SubMchid: core.String(Mchid),
  66. TransactionId: core.String(orderDetail.OutTradeCode),
  67. OutTradeNo: core.String(orderDetail.OrderCode),
  68. OutRefundNo: core.String("RE" + orderDetail.OrderCode),
  69. Reason: core.String("退款"),
  70. NotifyUrl: core.String(utils.Wx_MFYX_Refund_NotifyUrl),
  71. FundsAccount: refunddomestic.REQFUNDSACCOUNT_AVAILABLE.Ptr(),
  72. Amount: &refunddomestic.AmountReq{
  73. Currency: core.String("CNY"),
  74. //From: []refunddomestic.FundsFromItem{refunddomestic.FundsFromItem{
  75. // Account: refunddomestic.ACCOUNT_AVAILABLE.Ptr(),
  76. // Amount: core.Int64(444),
  77. //}},
  78. Refund: core.Int64(int64(orderDetail.PayMoney * 100)),
  79. Total: core.Int64(int64(orderDetail.PayMoney * 100)),
  80. },
  81. },
  82. )
  83. statusCode = result.Response.StatusCode
  84. if err != nil {
  85. // 处理错误
  86. log.Printf("call Create err:%s", err)
  87. } else {
  88. // 处理返回结果
  89. log.Printf("status=%d resp=%s", result.Response.StatusCode, resp)
  90. }
  91. return
  92. }