105 lines
3.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package weChat
import (
"context"
"errors"
"github.com/wechatpay-apiv3/wechatpay-go/core"
"github.com/wechatpay-apiv3/wechatpay-go/core/option"
"github.com/wechatpay-apiv3/wechatpay-go/services/payments"
"github.com/wechatpay-apiv3/wechatpay-go/services/refunddomestic"
"github.com/wechatpay-apiv3/wechatpay-go/utils"
"hepa-calc-admin-api/config"
"time"
)
// 创建客户端
func createClient() (*core.Client, error) {
mchId := config.C.Wechat.Pay1281030301.MchId // 商户号
mchCertificateSerialNumber := config.C.Wechat.Pay1281030301.MchCertificateSerialNumber // 商户证书序列号
v3ApiSecret := config.C.Wechat.Pay1281030301.V3ApiSecret // 商户APIv3密钥
privateKeyPath := config.C.Wechat.Pay1281030301.PrivateKey // 商户私钥文件地址
if mchId == "" {
return nil, errors.New("商户号错误")
}
mchPrivateKey, err := utils.LoadPrivateKeyWithPath(privateKeyPath)
if err != nil {
return nil, errors.New("微信支付生成失败")
}
ctx := context.Background()
// 使用商户私钥等初始化 client并使它具有自动定时获取微信支付平台证书的能力
opts := []core.ClientOption{
option.WithWechatPayAutoAuthCipher(mchId, mchCertificateSerialNumber, mchPrivateKey, v3ApiSecret),
}
client, err := core.NewClient(ctx, opts...)
if err != nil {
return nil, errors.New(err.Error())
}
return client, nil
}
// WxPayResult 支付结果
type WxPayResult struct {
OrderStatus int `json:"order_status"` // 订单状态1:待支付 2:已完成 3:已取消)
PayStatus int `json:"pay_status"` // 支付状态1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)
PayTime *string `json:"pay_time"` // 支付时间
}
// WxPayRefundResult 退款结果
type WxPayRefundResult struct {
RefundStatus int `json:"refundStatus"` // 订单退款状态0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常 7:部分退款)
SuccessTime *time.Time `json:"successTime"` // 退款成功时间
}
// HandlePayStatus 处理支付状态
func HandlePayStatus(t *payments.Transaction) (w *WxPayResult, err error) {
switch *t.TradeState {
case "SUCCESS": // 支付成功
w.OrderStatus = 2
w.PayStatus = 2
w.PayTime = t.SuccessTime
case "CLOSED": // 已关闭
w.PayStatus = 6
case "REVOKED": // 已撤销(付款码支付)
w.PayStatus = 7
case "USERPAYING": // 用户支付中(付款码支付)
w.PayStatus = 3
case "PAYERROR": // 支付失败(其他原因,如银行返回失败)
w.PayStatus = 4
default:
return nil, errors.New("未知支付状态")
}
return w, nil
}
// HandlePayRefundStatus 处理退款状态
func HandlePayRefundStatus(r *refunddomestic.Refund) (w *WxPayRefundResult, err error) {
if r.Status == nil {
return nil, errors.New("退款状态错误")
}
switch *r.Status {
case "SUCCESS": // 退款成功
w.RefundStatus = 3
if r.SuccessTime != nil {
//successTime := r.SuccessTime.Format("2006-01-02 15:04:05")
w.SuccessTime = r.SuccessTime
}
case "CLOSED": // 退款关闭
w.RefundStatus = 5
case "PROCESSING": // 退款处理中
w.RefundStatus = 2
case "ABNORMAL": // 退款异常
return nil, errors.New("退款状态错误")
default:
return nil, errors.New("退款状态错误")
}
return w, nil
}