mirror of
https://github.com/silenceper/wechat.git
synced 2026-02-11 08:12:26 +08:00
接入微信关闭订单 (#471)
* 接入关闭订单 * test * 删除testing,过不了ci * 避免err覆盖 Co-authored-by: liujianwei <liujianwei@linghit.com>
This commit is contained in:
98
pay/order/close.go
Normal file
98
pay/order/close.go
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
package order
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/xml"
|
||||||
|
"errors"
|
||||||
|
|
||||||
|
"github.com/silenceper/wechat/v2/util"
|
||||||
|
)
|
||||||
|
|
||||||
|
// https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_3
|
||||||
|
var closeGateway = "https://api.mch.weixin.qq.com/pay/closeorder"
|
||||||
|
|
||||||
|
// CloseParams 传入的参数
|
||||||
|
type CloseParams struct {
|
||||||
|
OutTradeNo string // 商户订单号
|
||||||
|
SignType string // 签名类型
|
||||||
|
}
|
||||||
|
|
||||||
|
// closeRequest 接口请求参数
|
||||||
|
type closeRequest struct {
|
||||||
|
AppID string `xml:"appid"` // 公众账号ID
|
||||||
|
MchID string `xml:"mch_id"` // 商户号
|
||||||
|
NonceStr string `xml:"nonce_str"` // 随机字符串
|
||||||
|
Sign string `xml:"sign"` // 签名
|
||||||
|
SignType string `xml:"sign_type,omitempty"` // 签名类型
|
||||||
|
OutTradeNo string `xml:"out_trade_no"` // 商户订单号
|
||||||
|
}
|
||||||
|
|
||||||
|
// CloseResult 关闭订单返回结果
|
||||||
|
type CloseResult struct {
|
||||||
|
ReturnCode *string `xml:"return_code"`
|
||||||
|
ReturnMsg *string `xml:"return_msg"`
|
||||||
|
|
||||||
|
AppID *string `xml:"appid" json:"appid"`
|
||||||
|
MchID *string `xml:"mch_id"`
|
||||||
|
NonceStr *string `xml:"nonce_str"`
|
||||||
|
Sign *string `xml:"sign"`
|
||||||
|
ResultCode *string `xml:"result_code"`
|
||||||
|
ResultMsg *string `xml:"result_msg"`
|
||||||
|
ErrCode *string `xml:"err_code"`
|
||||||
|
ErrCodeDes *string `xml:"err_code_des"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// CloseOrder 关闭订单
|
||||||
|
func (o *Order) CloseOrder(p *CloseParams) (closeResult CloseResult, err error) {
|
||||||
|
nonceStr := util.RandomStr(32)
|
||||||
|
// 签名类型
|
||||||
|
if p.SignType == "" {
|
||||||
|
p.SignType = "MD5"
|
||||||
|
}
|
||||||
|
|
||||||
|
params := make(map[string]string)
|
||||||
|
params["appid"] = o.AppID
|
||||||
|
params["mch_id"] = o.MchID
|
||||||
|
params["nonce_str"] = nonceStr
|
||||||
|
params["out_trade_no"] = p.OutTradeNo
|
||||||
|
params["sign_type"] = p.SignType
|
||||||
|
|
||||||
|
var (
|
||||||
|
sign string
|
||||||
|
rawRet []byte
|
||||||
|
)
|
||||||
|
|
||||||
|
sign, err = util.ParamSign(params, o.Key)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
request := closeRequest{
|
||||||
|
AppID: o.AppID,
|
||||||
|
MchID: o.MchID,
|
||||||
|
NonceStr: nonceStr,
|
||||||
|
Sign: sign,
|
||||||
|
OutTradeNo: p.OutTradeNo,
|
||||||
|
SignType: p.SignType,
|
||||||
|
}
|
||||||
|
|
||||||
|
rawRet, err = util.PostXML(closeGateway, request)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = xml.Unmarshal(rawRet, &closeResult)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if *closeResult.ReturnCode == SUCCESS {
|
||||||
|
// close success
|
||||||
|
if *closeResult.ResultCode == SUCCESS {
|
||||||
|
err = nil
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = errors.New(*closeResult.ErrCode + *closeResult.ErrCodeDes)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = errors.New("[msg : xmlUnmarshalError] [rawReturn : " + string(rawRet) + "] [sign : " + sign + "]")
|
||||||
|
return
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user