package wechat import ( "context" "crypto/rsa" "crypto/x509" "errors" "git.tetele.net/tgo/helper" "github.com/wechatpay-apiv3/wechatpay-go/core" "github.com/wechatpay-apiv3/wechatpay-go/core/option" "github.com/wechatpay-apiv3/wechatpay-go/services/refunddomestic" "github.com/wechatpay-apiv3/wechatpay-go/utils" "io/ioutil" "log" ) /** * 商户订单号,退款单号,总金额,退款金额,微信商户id,微信商户平台API私钥,平台证书,商户平台证书序列号,商品名,商品id,退款原因,回调地址 */ func CreateRefund(order_sn, out_refund_no, total_amount, refund_amount, wx_mp_mch_id, wx_mch_apiclient_key, wx_pay_cert, mch_serial_no, title, uuid, reason, notify_url string) (map[string]interface{}, error) { total := helper.ToInt64(helper.FloatMul(total_amount, 100)) //总金额 refund := helper.ToInt64(helper.FloatMul(refund_amount, 100)) //退款金额 log.Println("refund", order_sn, out_refund_no, refund, total, notify_url) var ( ctx context.Context = context.Background() client *core.Client ) privateKey, err := utils.LoadPrivateKey(wx_mch_apiclient_key) if err != nil { log.Println("商户私钥有误:", err) return map[string]interface{}{}, errors.New("商户私钥有误") } wechatPayCertificate, err := utils.LoadCertificate(wx_pay_cert) if err != nil { log.Println("平台证书有误:", err) return map[string]interface{}{}, errors.New("商户平台证书有误") } client, err = CreateClient(ctx, wechatPayCertificate, privateKey, wx_mp_mch_id, mch_serial_no) if err != nil { return map[string]interface{}{}, errors.New("请检查支付参数配置") } // now := time.Now() svc := refunddomestic.RefundsApiService{Client: client} _, result, err := svc.Create(ctx, refunddomestic.CreateRequest{ Amount: &refunddomestic.AmountReq{ Currency: core.String("CNY"), // From: []refunddomestic.FundsFromItem{refunddomestic.FundsFromItem{ // Account: refunddomestic.ACCOUNT_AVAILABLE.Ptr(), // Amount: core.Int64(444), // }}, Refund: core.Int64(refund), Total: core.Int64(total), }, // FundsAccount: refunddomestic.REQFUNDSACCOUNT_AVAILABLE.Ptr(), GoodsDetail: []refunddomestic.GoodsDetail{refunddomestic.GoodsDetail{ GoodsName: core.String(title), MerchantGoodsId: core.String(uuid), RefundAmount: core.Int64(refund), RefundQuantity: core.Int64(1), UnitPrice: core.Int64(refund), // WechatpayGoodsId: core.String("1001"), }}, NotifyUrl: core.String(notify_url), OutRefundNo: core.String(out_refund_no), OutTradeNo: core.String(order_sn), Reason: core.String(reason), // SubMchid: core.String("1900000109"), // TransactionId: core.String("1217752501201407033233368018"), }, ) res := map[string]interface{}{} log.Println("Response:", result.Response) log.Println("Response Body:", result.Response.Body) if err != nil { response_body := map[string]interface{}{} body, _ := ioutil.ReadAll(result.Response.Body) err_body := json.Unmarshal(body, &response_body) if err_body != nil { res["code"] = "RESPONSE_BODY_ERROR" res["message"] = "退款回调参数异常" return res, err_body } log.Println("response_body:", response_body) res["code"] = response_body["code"] res["message"] = response_body["message"] return res, errors.New(helper.ToStr(response_body["message"])) } res["code"] = "success" res["message"] = "退款成功" return res, nil } func CreateClient(ctx context.Context, wechatPayCertificate *x509.Certificate, privateKey *rsa.PrivateKey, mchID, mchSerialNo string) (*core.Client, error) { var client *core.Client var err error if wechatPayCertificate != nil { client, err = core.NewClient( ctx, option.WithMerchantCredential(mchID, mchSerialNo, privateKey), option.WithWechatPayCertificate([]*x509.Certificate{wechatPayCertificate}), ) if err != nil { log.Println("创建 Client 失败:", err) return nil, err } } else { client, err = core.NewClient( ctx, option.WithMerchantCredential(mchID, mchSerialNo, privateKey), option.WithoutValidator(), ) if err != nil { log.Println("创建 Client 失败:", err) return nil, err } } return client, nil }