close.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package order
  2. import (
  3. "encoding/xml"
  4. "errors"
  5. "github.com/silenceper/wechat/v2/util"
  6. )
  7. // https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_3
  8. var closeGateway = "https://api.mch.weixin.qq.com/pay/closeorder"
  9. // CloseParams 传入的参数
  10. type CloseParams struct {
  11. OutTradeNo string // 商户订单号
  12. SignType string // 签名类型
  13. }
  14. // closeRequest 接口请求参数
  15. type closeRequest struct {
  16. AppID string `xml:"appid"` // 公众账号ID
  17. MchID string `xml:"mch_id"` // 商户号
  18. NonceStr string `xml:"nonce_str"` // 随机字符串
  19. Sign string `xml:"sign"` // 签名
  20. SignType string `xml:"sign_type,omitempty"` // 签名类型
  21. OutTradeNo string `xml:"out_trade_no"` // 商户订单号
  22. }
  23. // CloseResult 关闭订单返回结果
  24. type CloseResult struct {
  25. ReturnCode *string `xml:"return_code"`
  26. ReturnMsg *string `xml:"return_msg"`
  27. AppID *string `xml:"appid" json:"appid"`
  28. MchID *string `xml:"mch_id"`
  29. NonceStr *string `xml:"nonce_str"`
  30. Sign *string `xml:"sign"`
  31. ResultCode *string `xml:"result_code"`
  32. ResultMsg *string `xml:"result_msg"`
  33. ErrCode *string `xml:"err_code"`
  34. ErrCodeDes *string `xml:"err_code_des"`
  35. }
  36. // CloseOrder 关闭订单
  37. func (o *Order) CloseOrder(p *CloseParams) (closeResult CloseResult, err error) {
  38. nonceStr := util.RandomStr(32)
  39. // 签名类型
  40. if p.SignType == "" {
  41. p.SignType = "MD5"
  42. }
  43. params := make(map[string]string)
  44. params["appid"] = o.AppID
  45. params["mch_id"] = o.MchID
  46. params["nonce_str"] = nonceStr
  47. params["out_trade_no"] = p.OutTradeNo
  48. params["sign_type"] = p.SignType
  49. var (
  50. sign string
  51. rawRet []byte
  52. )
  53. sign, err = util.ParamSign(params, o.Key)
  54. if err != nil {
  55. return
  56. }
  57. request := closeRequest{
  58. AppID: o.AppID,
  59. MchID: o.MchID,
  60. NonceStr: nonceStr,
  61. Sign: sign,
  62. OutTradeNo: p.OutTradeNo,
  63. SignType: p.SignType,
  64. }
  65. rawRet, err = util.PostXML(closeGateway, request)
  66. if err != nil {
  67. return
  68. }
  69. err = xml.Unmarshal(rawRet, &closeResult)
  70. if err != nil {
  71. return
  72. }
  73. if *closeResult.ReturnCode == SUCCESS {
  74. // close success
  75. if *closeResult.ResultCode == SUCCESS {
  76. err = nil
  77. return
  78. }
  79. err = errors.New(*closeResult.ErrCode + *closeResult.ErrCodeDes)
  80. return
  81. }
  82. err = errors.New("[msg : xmlUnmarshalError] [rawReturn : " + string(rawRet) + "] [sign : " + sign + "]")
  83. return
  84. }