微信相关接口
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

126 lines
4.2 KiB

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
}