Skip to content

Commit bc94d95

Browse files
author
fideism
committed
关闭订单
1 parent bb6aa8e commit bc94d95

File tree

6 files changed

+101
-211
lines changed

6 files changed

+101
-211
lines changed

pay/README.md

+38-6
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,24 @@
22

33
[官方文档](https://pay.weixin.qq.com/wiki/doc/api/index.html)
44

5-
5+
## 目录
6+
- [请求参数](#请求参数)
7+
- [响应参数](#响应参数)
8+
- [实例化支付对象](#实例化支付对象)
9+
- [下单](#下单)
10+
- [查询订单](#查询订单)
11+
- [关闭订单](#关闭订单)
12+
- [撤销订单](#撤销订单)
13+
- [退款](#退款)
14+
- [查询退款](#查询退款)
615

716
### 请求参数
817

9-
支付内部调用参数传递类型`Params map[string]interface{}`
18+
- 支付内部调用参数传递类型`Params map[string]interface{}`
19+
- `appid` `mch_id` `nonce_str` `sign` `sign_type` 内部会自动传入
20+
- `spbill_create_ip` 如果外部传入参数没有,后续调用会自动获取
21+
- `sign_type` 外部不传入,默认`MD5`
22+
1023
```go
1124
import "github.com/fideism/golang-wechat/util"
1225

@@ -61,11 +74,8 @@ payment := pay.NewPay(&config.Config{
6174
})
6275
```
6376

64-
### 统一下单
65-
66-
`spbill_create_ip` 如果外部传入参数没有,后续调用会自动获取
77+
### 下单
6778

68-
`sign_type` 外部不传入,默认`MD5`
6979

7080
```go
7181
p := util.Params{
@@ -103,6 +113,28 @@ func (order *Order) Query(params base.Params) (*base.Response, error)
103113
payment.GetOrder().Query()
104114
```
105115

116+
### 关闭订单
117+
```go
118+
params := util.Params{
119+
"out_trade_no": "202007240001",
120+
}
121+
122+
func (order *Order) Close(params base.Params) (*base.Response, error)
123+
124+
payment.GetOrder().Close()
125+
```
126+
127+
### 撤销订单
128+
```go
129+
params := util.Params{
130+
"out_trade_no": "202007240001",
131+
}
132+
133+
func (order *Order) Reverse(params base.Params) (*base.Response, error)
134+
135+
payment.GetOrder().Reverse()
136+
```
137+
106138
### 退款
107139

108140
`order.`

pay/base/url.go

+18
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,24 @@ func GetOrderQueryURL(c *config.Config) string {
5959
return OrderQueryURL
6060
}
6161

62+
// GetCloseOrderURL 关闭订单
63+
func GetCloseOrderURL(c *config.Config) string {
64+
if c.Sandbox {
65+
return SandboxCloseOrderURL
66+
}
67+
68+
return CloseOrderURL
69+
}
70+
71+
// GetReverseURL 撤销订单
72+
func GetReverseURL(c *config.Config) string {
73+
if c.Sandbox {
74+
return SandboxReverseURL
75+
}
76+
77+
return ReverseURL
78+
}
79+
6280
// GetRefundURL 退款接口
6381
func GetRefundURL(c *config.Config) string {
6482
if c.Sandbox {

pay/notify/notify.go

+21
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package notify
22

33
import (
4+
"github.com/fideism/golang-wechat/pay/base"
45
"github.com/fideism/golang-wechat/pay/config"
56
)
67

@@ -13,3 +14,23 @@ type Notify struct {
1314
func NewNotify(cfg *config.Config) *Notify {
1415
return &Notify{cfg}
1516
}
17+
18+
// 通知成功
19+
func (n *Notify) Success() (*base.Response, error) {
20+
var params base.Response
21+
22+
params.ReturnCode = "Success"
23+
params.ReturnMsg = "OK"
24+
25+
return &params, nil
26+
}
27+
28+
// 通知不成功
29+
func (n *Notify) Fail(errMsg string) (*base.Response, error) {
30+
var params base.Response
31+
32+
params.ReturnCode = "Success"
33+
params.ReturnMsg = errMsg
34+
35+
return &params, nil
36+
}

pay/notify/paid.go

-108
This file was deleted.

pay/order/order.go

+24
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,27 @@ func (order *Order) Query(params util.Params) (*base.Response, error) {
5959

6060
return base.ProcessResponseXML(xmlStr)
6161
}
62+
63+
// Close 关闭订单
64+
func (order *Order) Close(params util.Params) (*base.Response, error) {
65+
params = base.Sign(params, order.Config)
66+
67+
xmlStr, err := base.PostWithoutCert(base.GetCloseOrderURL(order.Config), params)
68+
if err != nil {
69+
return nil, err
70+
}
71+
72+
return base.ProcessResponseXML(xmlStr)
73+
}
74+
75+
// Reverse 撤销订单
76+
func (order *Order) Reverse(params util.Params) (*base.Response, error) {
77+
params = base.Sign(params, order.Config)
78+
79+
xmlStr, err := base.PostWithoutCert(base.GetReverseURL(order.Config), params)
80+
if err != nil {
81+
return nil, err
82+
}
83+
84+
return base.ProcessResponseXML(xmlStr)
85+
}

util/http.go

-97
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,15 @@ package util
22

33
import (
44
"bytes"
5-
"crypto/tls"
65
"encoding/json"
7-
"encoding/pem"
8-
"encoding/xml"
96
"fmt"
107
logger "github.com/fideism/golang-wechat/log"
118
"github.com/sirupsen/logrus"
129
"io"
1310
"io/ioutil"
14-
"log"
1511
"mime/multipart"
1612
"net/http"
1713
"os"
18-
19-
"golang.org/x/crypto/pkcs12"
2014
)
2115

2216
//HTTPGet get 请求
@@ -185,94 +179,3 @@ func PostMultipartForm(fields []MultipartFormField, uri string) (respBody []byte
185179
respBody, err = ioutil.ReadAll(resp.Body)
186180
return
187181
}
188-
189-
//PostXML perform a HTTP/POST request with XML body
190-
func PostXML(uri string, obj interface{}) ([]byte, error) {
191-
logger.Entry().WithFields(logrus.Fields{
192-
"url": uri,
193-
"data": obj,
194-
}).Debug("发起微信post-xml请求")
195-
196-
xmlData, err := xml.Marshal(obj)
197-
198-
if err != nil {
199-
return nil, err
200-
}
201-
202-
body := bytes.NewBuffer(xmlData)
203-
response, err := http.Post(uri, "application/xml;charset=utf-8", body)
204-
if err != nil {
205-
return nil, err
206-
}
207-
defer response.Body.Close()
208-
209-
if response.StatusCode != http.StatusOK {
210-
return nil, fmt.Errorf("http code error : uri=%v , statusCode=%v", uri, response.StatusCode)
211-
}
212-
return ioutil.ReadAll(response.Body)
213-
}
214-
215-
//httpWithTLS CA证书
216-
func httpWithTLS(rootCa, key string) (*http.Client, error) {
217-
var client *http.Client
218-
certData, err := ioutil.ReadFile(rootCa)
219-
if err != nil {
220-
return nil, fmt.Errorf("unable to find cert path=%s, error=%v", rootCa, err)
221-
}
222-
cert := pkcs12ToPem(certData, key)
223-
config := &tls.Config{
224-
Certificates: []tls.Certificate{cert},
225-
}
226-
tr := &http.Transport{
227-
TLSClientConfig: config,
228-
DisableCompression: true,
229-
}
230-
client = &http.Client{Transport: tr}
231-
return client, nil
232-
}
233-
234-
//pkcs12ToPem 将Pkcs12转成Pem
235-
func pkcs12ToPem(p12 []byte, password string) tls.Certificate {
236-
blocks, err := pkcs12.ToPEM(p12, password)
237-
defer func() {
238-
if x := recover(); x != nil {
239-
log.Print(x)
240-
}
241-
}()
242-
if err != nil {
243-
panic(err)
244-
}
245-
var pemData []byte
246-
for _, b := range blocks {
247-
pemData = append(pemData, pem.EncodeToMemory(b)...)
248-
}
249-
cert, err := tls.X509KeyPair(pemData, pemData)
250-
if err != nil {
251-
panic(err)
252-
}
253-
return cert
254-
}
255-
256-
//PostXMLWithTLS perform a HTTP/POST request with XML body and TLS
257-
func PostXMLWithTLS(uri string, obj interface{}, ca, key string) ([]byte, error) {
258-
xmlData, err := xml.Marshal(obj)
259-
if err != nil {
260-
return nil, err
261-
}
262-
263-
body := bytes.NewBuffer(xmlData)
264-
client, err := httpWithTLS(ca, key)
265-
if err != nil {
266-
return nil, err
267-
}
268-
response, err := client.Post(uri, "application/xml;charset=utf-8", body)
269-
if err != nil {
270-
return nil, err
271-
}
272-
defer response.Body.Close()
273-
274-
if response.StatusCode != http.StatusOK {
275-
return nil, fmt.Errorf("http code error : uri=%v , statusCode=%v", uri, response.StatusCode)
276-
}
277-
return ioutil.ReadAll(response.Body)
278-
}

0 commit comments

Comments
 (0)