forked from nikita-vanyasin/tinkoff
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinit.go
91 lines (79 loc) · 4.66 KB
/
init.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
package tinkoff
import (
"fmt"
)
const (
PayTypeOneStep = "O"
PayTypeTwoSteps = "T"
)
type InitRequest struct {
BaseRequest
Amount uint64 `json:"Amount,omitempty"` // Сумма в копейках
OrderID string `json:"OrderId"` // Идентификатор заказа в системе продавца
ClientIP string `json:"IP,omitempty"` // IP-адрес покупателя
Description string `json:"Description,omitempty"` // Описание заказа
Language string `json:"Language,omitempty"` // Язык платежной формы: ru или en
Recurrent string `json:"Recurrent,omitempty"` // Y для регистрации автоплатежа. Можно использовать SetIsRecurrent(true)
CustomerKey string `json:"CustomerKey,omitempty"` // Идентификатор покупателя в системе продавца. Передается вместе с параметром CardId. См. метод GetCardList
Data map[string]string `json:"DATA,omitempty"` // Дополнительные параметры платежа
Receipt *Receipt `json:"Receipt,omitempty"` // Чек
RedirectDueDate Time `json:"RedirectDueDate,omitempty"` // Срок жизни ссылки
NotificationURL string `json:"NotificationURL,omitempty"` // Адрес для получения http нотификаций
SuccessURL string `json:"SuccessURL,omitempty"` // Страница успеха
FailURL string `json:"FailURL,omitempty"` // Страница ошибки
PayType string `json:"PayType,omitempty"` // Тип оплаты. см. PayType*
Shops *[]Shop `json:"Shops,omitempty"` // Объект с данными партнера
}
type Shop struct {
ShopCode string `json:"ShopCode,omitempty"` // Код магазина. Для параметра ShopСode необходимо использовать значение параметра Submerchant_ID, полученного при регистрации через xml.
Amount uint64 `json:"Amount,omitempty"` // Суммаперечисленияв копейкахпо реквизитам ShopCode за вычетом Fee
Name string `json:"Name,omitempty"` // Наименованиепозиции
Fee string `json:"Fee,omitempty"` // Часть суммы Операции оплаты или % от суммы Операции оплаты. Fee удерживается из возмещения третьего лица (ShopCode) в пользу Предприятия по операциям оплаты.
}
func (i *InitRequest) SetIsRecurrent(r bool) {
if r {
i.Recurrent = "Y"
} else {
i.Recurrent = ""
}
}
func (i *InitRequest) GetValuesForToken() map[string]string {
v := map[string]string{
"OrderId": i.OrderID,
"IP": i.ClientIP,
"Description": i.Description,
"Language": i.Language,
"CustomerKey": i.CustomerKey,
"RedirectDueDate": i.RedirectDueDate.String(),
"NotificationURL": i.NotificationURL,
"SuccessURL": i.SuccessURL,
"FailURL": i.FailURL,
}
serializeUintToMapIfNonEmpty(&v, "Amount", i.Amount)
return v
}
type InitResponse struct {
BaseResponse
Amount uint64 `json:"Amount"` // Сумма в копейках
OrderID string `json:"OrderId"` // Номер заказа в системе Продавца
Status string `json:"Status"` // Статус транзакции
PaymentID string `json:"PaymentId"` // Уникальный идентификатор транзакции в системе Банка. По офф. документации это number(20), но фактически значение передается в виде строки.
PaymentURL string `json:"PaymentURL,omitempty"` // Ссылка на страницу оплаты. По умолчанию ссылка доступна в течении 24 часов.
}
func (c *Client) Init(request *InitRequest) (*InitResponse, error) {
response, err := c.PostRequest("/Init", request)
if err != nil {
return nil, err
}
defer response.Body.Close()
var res InitResponse
err = c.decodeResponse(response, &res)
if err != nil {
return nil, err
}
err = res.Error()
if res.Status != StatusNew {
err = errorConcat(err, fmt.Errorf("unexpected payment status: %s", res.Status))
}
return &res, err
}