-
Notifications
You must be signed in to change notification settings - Fork 0
/
refund.go
104 lines (83 loc) · 2.63 KB
/
refund.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package client
import (
"context"
"errors"
"fmt"
"net/http"
"net/url"
"strings"
)
// Refund API call
const (
REFUND_SUCCESS = "success"
REFUND_FAILURE = "failure"
REFUND_PENDING = "pending"
)
// -d REQUESTID=requestid1
// -d NUMBERS=o2-uk.447400000000
// -d CHARGE_GUID=chargeguid1
// -d DUMMY=YES
type RefundParams struct {
RequestID string
Numbers string
ChargeGuid string
Dummy string
}
func (refundParams *RefundParams) ToParams() string {
data := url.Values{}
data.Set("REQUESTID", refundParams.RequestID)
data.Set("NUMBERS", refundParams.Numbers)
data.Set("CHARGE_GUID", refundParams.ChargeGuid)
if strings.ToUpper(refundParams.Dummy) == "YES" {
data.Set("DUMMY", "yes")
}
return data.Encode()
}
type RefundResponse struct {
Status string
IfVersion string `json:"ifversion"`
StatusCode string `json:"statuscode"`
StatusText string `json:"statustext"`
Guid string `json:"guid"`
RequestID string `json:"requestid"`
ChargeGuid string `json:"charge_guid"`
RefundTime string `json:"refund_time"`
RefundAmountInPence int `json:"refunded_amount_in_pence"`
}
type RefundResponseWrapper struct {
Success *RefundResponse `json:"success"`
Failure *RefundResponse `json:"failure"`
Pending *RefundResponse `json:"pending"`
}
func (sr *RefundResponse) ToConsole() string {
return fmt.Sprintf("======Refund Request Result======\nGuid: %s\nIfVersion: %s\nStatusCode: %s\nStatusText: %s\nRequestID: %s\nChargeGuid: %s\nRefundTime: %s\nRefundAmountInPence: %d\n", sr.Guid, sr.IfVersion, sr.StatusCode, sr.StatusText, sr.RequestID, sr.ChargeGuid, sr.RefundTime, sr.RefundAmountInPence)
}
func (client *Client) Refund(ctx context.Context, refundParams *RefundParams) (*RefundResponse, error) {
apiUrl, err := client.apiBaseUrlAndUrlPath(client.baseURLRefund, V2_REFUND)
if err != nil {
return nil, err
}
req, err := http.NewRequestWithContext(ctx, "POST", apiUrl, strings.NewReader(refundParams.ToParams()))
if err != nil {
return nil, err
}
req = req.WithContext(ctx)
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
response := RefundResponseWrapper{}
if err = client.sendRequest(req, &response); err != nil {
return nil, err
}
if response.Success != nil {
response.Success.Status = REFUND_SUCCESS
return response.Success, nil
}
if response.Failure != nil {
response.Failure.Status = REFUND_FAILURE
return response.Failure, nil
}
if response.Pending != nil {
response.Pending.Status = REFUND_PENDING
return response.Pending, nil
}
return nil, errors.New("empty response or unknown response")
}