github.com/chanxuehong/wechat@v0.0.0-20230222024006-36f0325263cd/mch/pay/reverse.go (about)

     1  package pay
     2  
     3  import (
     4  	"github.com/chanxuehong/wechat/mch/core"
     5  	"github.com/chanxuehong/wechat/util"
     6  )
     7  
     8  // Reverse 撤销订单.
     9  //
    10  //	NOTE: 请求需要双向证书.
    11  func Reverse(clt *core.Client, req map[string]string) (resp map[string]string, err error) {
    12  	return clt.PostXML(core.APIBaseURL()+"/secapi/pay/reverse", req)
    13  }
    14  
    15  type ReverseRequest struct {
    16  	XMLName struct{} `xml:"xml" json:"-"`
    17  
    18  	// 必选参数,二选一
    19  	TransactionId string `xml:"transaction_id"` // 微信的订单号,优先使用
    20  	OutTradeNo    string `xml:"out_trade_no"`   // 商户系统内部订单号
    21  
    22  	// 可选参数
    23  	NonceStr string `xml:"nonce_str"` // 随机字符串,不长于32位。NOTE: 如果为空则系统会自动生成一个随机字符串。
    24  	SignType string `xml:"sign_type"` // 签名类型,目前支持HMAC-SHA256和MD5,默认为MD5
    25  }
    26  
    27  type ReverseResponse struct {
    28  	XMLName struct{} `xml:"xml" json:"-"`
    29  
    30  	// 必选返回
    31  	Recall bool `xml:"recall"` // 是否需要继续调用撤销
    32  }
    33  
    34  // Reverse2 撤销订单.
    35  //
    36  //	NOTE: 请求需要双向证书.
    37  func Reverse2(clt *core.Client, req *ReverseRequest) (resp *ReverseResponse, err error) {
    38  	m1 := make(map[string]string, 8)
    39  	if req.TransactionId != "" {
    40  		m1["transaction_id"] = req.TransactionId
    41  	}
    42  	if req.OutTradeNo != "" {
    43  		m1["out_trade_no"] = req.OutTradeNo
    44  	}
    45  	if req.NonceStr != "" {
    46  		m1["nonce_str"] = req.NonceStr
    47  	} else {
    48  		m1["nonce_str"] = util.NonceStr()
    49  	}
    50  	if req.SignType != "" {
    51  		m1["sign_type"] = req.SignType
    52  	}
    53  
    54  	m2, err := Reverse(clt, m1)
    55  	if err != nil {
    56  		return nil, err
    57  	}
    58  
    59  	resp = &ReverseResponse{}
    60  	if recall := m2["recall"]; recall == "Y" || recall == "y" {
    61  		resp.Recall = true
    62  	}
    63  	return resp, nil
    64  }