-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathapi.go
210 lines (168 loc) · 7.06 KB
/
api.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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
package mercadopago
import (
"encoding/json"
"os"
"github.com/eduardo-mior/mercadopago-sdk-go/internal/request"
)
const BASEURL = "https://api.mercadopago.com"
// CreatePayment é o método responsável por criar um pagamento no MercadoPago.
func CreatePayment(paymentRequest PaymentRequest, mercadoPagoAccessToken ...string) (*PaymentResponse, *ErrorResponse, error) {
params := request.Params{
Method: "POST",
Body: paymentRequest,
Headers: map[string]interface{}{"Authorization": "Bearer " + getAccessToken(mercadoPagoAccessToken...)},
URL: BASEURL + "/checkout/preferences",
}
response, err := request.New(params)
if err != nil {
return nil, nil, err
}
if response.StatusCode > 300 {
resp, err := parseError(response.RawBody)
return nil, resp, err
}
var paymentResponse PaymentResponse
err = json.Unmarshal(response.RawBody, &paymentResponse)
return &paymentResponse, nil, err
}
// UpdatePayment é o método responsável por atualizar as informações de um pagamento no MercadoPago.
func UpdatePayment(paymentID string, paymentRequest PaymentRequest, mercadoPagoAccessToken ...string) (*PaymentResponse, *ErrorResponse, error) {
params := request.Params{
Method: "PUT",
PathParams: request.PathParams{paymentID},
Body: paymentRequest,
Headers: map[string]interface{}{"Authorization": "Bearer " + getAccessToken(mercadoPagoAccessToken...)},
URL: BASEURL + "/checkout/preferences",
}
response, err := request.New(params)
if err != nil {
return nil, nil, err
}
if response.StatusCode > 300 {
resp, err := parseError(response.RawBody)
return nil, resp, err
}
var paymentResponse PaymentResponse
err = json.Unmarshal(response.RawBody, &paymentResponse)
return &paymentResponse, nil, err
}
// GetPayment é o método responsável buscar todas as informações de um pagamento no MercadoPago.
func GetPayment(paymentID string, mercadoPagoAccessToken ...string) (*PaymentResponse, *ErrorResponse, error) {
params := request.Params{
Method: "GET",
PathParams: request.PathParams{paymentID},
Headers: map[string]interface{}{"Authorization": "Bearer " + getAccessToken(mercadoPagoAccessToken...)},
URL: BASEURL + "/checkout/preferences",
}
response, err := request.New(params)
if err != nil {
return nil, nil, err
}
if response.StatusCode > 300 {
resp, err := parseError(response.RawBody)
return nil, resp, err
}
var paymentResponse PaymentResponse
err = json.Unmarshal(response.RawBody, &paymentResponse)
return &paymentResponse, nil, err
}
// SearchPayments é o método responsável buscar todas as informações de um pagamento no MercadoPago.
// Como não existe nenhuma documentação completa sobre como esse EndPoint funciona então ele recebe por parametro qualquer filtro.
// Segundo oque consta nos SDKs oficiais e alguns não oficiais do MercadoPago, esse EndPoint é baseado em "Criteria Filters", ou seja,
// você pode filtrar por qualquer campo do pagamento usando qualquer operador, exemplo external_reference=525.
func SearchPayments(searchParams PaymentSearchParams, mercadoPagoAccessToken ...string) (*PaymentSearchResponse, *ErrorResponse, error) {
params := request.Params{
Method: "GET",
QueryParams: request.QueryParams(searchParams),
Headers: map[string]interface{}{"Authorization": "Bearer " + getAccessToken(mercadoPagoAccessToken...)},
URL: BASEURL + "/checkout/preferences/search",
}
response, err := request.New(params)
if err != nil {
return nil, nil, err
}
if response.StatusCode > 300 {
resp, err := parseError(response.RawBody)
return nil, resp, err
}
var paymentSearchResponse PaymentSearchResponse
err = json.Unmarshal(response.RawBody, &paymentSearchResponse)
return &paymentSearchResponse, nil, err
}
// ConsultPayment é o método responsável consultar as informações atualizadas de um pagamento no MercadoPago, incluindo Status.
func ConsultPayment(paymentID string, mercadoPagoAccessToken ...string) (*PaymentConsultResponse, *ErrorResponse, error) {
params := request.Params{
Method: "GET",
PathParams: request.PathParams{paymentID},
Headers: map[string]interface{}{"Authorization": "Bearer " + getAccessToken(mercadoPagoAccessToken...)},
URL: BASEURL + "/v1/payments",
}
response, err := request.New(params)
if err != nil {
return nil, nil, err
}
if response.StatusCode > 300 {
resp, err := parseError(response.RawBody)
return nil, resp, err
}
var paymentResponse PaymentConsultResponse
err = json.Unmarshal(response.RawBody, &paymentResponse)
return &paymentResponse, nil, err
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// GetIdentificationTypes é o método responsável retornar todos o tipos de documento de identificação do MercadoPago.
func GetIdentificationTypes(mercadoPagoAccessToken ...string) ([]IdentificationType, *ErrorResponse, error) {
params := request.Params{
Method: "GET",
Headers: map[string]interface{}{"Authorization": "Bearer " + getAccessToken(mercadoPagoAccessToken...)},
URL: BASEURL + "/v1/identification_types",
}
response, err := request.New(params)
if err != nil {
return nil, nil, err
}
if response.StatusCode > 300 {
resp, err := parseError(response.RawBody)
return nil, resp, err
}
var identificationTypes []IdentificationType
err = json.Unmarshal(response.RawBody, &identificationTypes)
return identificationTypes, nil, err
}
// GetPaymentMethods é o método responsável retornar todos o tipos de documento de identificação do MercadoPago.
func GetPaymentMethods(mercadoPagoAccessToken ...string) ([]PaymentMethod, *ErrorResponse, error) {
params := request.Params{
Method: "GET",
Headers: map[string]interface{}{"Authorization": "Bearer " + getAccessToken(mercadoPagoAccessToken...)},
URL: BASEURL + "/v1/payment_methods",
}
response, err := request.New(params)
if err != nil {
return nil, nil, err
}
if response.StatusCode > 300 {
resp, err := parseError(response.RawBody)
return nil, resp, err
}
var paymentMethods []PaymentMethod
err = json.Unmarshal(response.RawBody, &paymentMethods)
return paymentMethods, nil, err
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// parseError é a função que pega os dados do erro do MercadoPago e retorna em formato de Struct.
func parseError(body []byte) (*ErrorResponse, error) {
var errResponse ErrorResponse
if err := json.Unmarshal(body, &errResponse); err != nil {
return nil, err
}
return &errResponse, nil
}
// getAccessToken é a função responsável por retornar o AccessToken do mercado pago.
// Caso tenha sido passado um token por parametro pegamos o token passado por parametro, se não pegamos da variavel de ambiente MERCADO_PAGO_ACCESS_TOKEN.
func getAccessToken(mercadoPagoAccessToken ...string) string {
if len(mercadoPagoAccessToken) > 0 {
return mercadoPagoAccessToken[0]
} else {
return os.Getenv("MERCADO_PAGO_ACCESS_TOKEN")
}
}