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 }