-
Notifications
You must be signed in to change notification settings - Fork 2
/
paylink.go
144 lines (128 loc) · 4.83 KB
/
paylink.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
package twikey
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"net/url"
"strings"
)
// PaylinkRequest is the base object for sending and receiving paylinks to Twikey
type PaylinkRequest struct {
CustomerNumber string // The customer number (strongly advised)
Email string // Email of the debtor (Required to send invite)
Lastname string // lastname
Firstname string // firstname
Language string // Language (en/fr/nl/de/pt/es/it)
Mobile string // mobile number
Template string // contract template
Title string // Message to the debto
Remittance string // Payment message, if empty then title will be used
Amount float64 // Amount to be billed
RedirectUrl string // Optional redirect after pay url (must use http(s)://)
Place string // Optional place
Expiry string // Optional expiration date
SendInvite string // Send out invite email or sms directly (email, sms)
Address string // Address (street + number)
City string // City of debtor
Zip string // Zipcode of debtor
Country string // ISO format (2 letters)
Txref string // References from existing transactions
Method string // Circumvents the payment selection with PSP (bancontact/ideal/maestro/mastercard/visa/inghomepay/kbc/belfius)
Invoice string // create payment link for specific invoice number
Extra map[string]string
}
func (request *PaylinkRequest) Add(key string, value string) {
request.Extra[key] = value
}
// Paylink is the response receiving from Twikey upon a request
type Paylink struct {
Id int64 `json:"id,omitempty"`
Amount float64 `json:"amount,omitempty"`
Msg string `json:"msg,omitempty"`
Ref string `json:"ref,omitempty"`
State string `json:"state,omitempty"`
Url string `json:"url,omitempty"`
}
type PaylinkList struct {
Links []Paylink
}
// PaylinkNew sends the new paylink to Twikey for creation
func (c *Client) PaylinkNew(paylinkRequest *PaylinkRequest) (*Paylink, error) {
params := url.Values{}
addIfExists(params, "ct", paylinkRequest.Template)
addIfExists(params, "title", paylinkRequest.Title)
addIfExists(params, "remittance", paylinkRequest.Remittance)
addIfExists(params, "amount", fmt.Sprintf("%.2f", paylinkRequest.Amount))
addIfExists(params, "redirectUrl", paylinkRequest.RedirectUrl)
addIfExists(params, "place", paylinkRequest.Place)
addIfExists(params, "expiry", paylinkRequest.Expiry)
addIfExists(params, "sendInvite", paylinkRequest.SendInvite)
addIfExists(params, "txref", paylinkRequest.Txref)
addIfExists(params, "method", paylinkRequest.Method)
addIfExists(params, "invoice", paylinkRequest.Invoice)
addIfExists(params, "customerNumber", paylinkRequest.CustomerNumber)
addIfExists(params, "email", paylinkRequest.Email)
addIfExists(params, "lastname", paylinkRequest.Lastname)
addIfExists(params, "firstname", paylinkRequest.Firstname)
addIfExists(params, "l", paylinkRequest.Language)
addIfExists(params, "mobile", paylinkRequest.Mobile)
addIfExists(params, "address", paylinkRequest.Address)
addIfExists(params, "city", paylinkRequest.City)
addIfExists(params, "zip", paylinkRequest.Zip)
addIfExists(params, "country", paylinkRequest.Country)
if paylinkRequest.Extra != nil {
for k, v := range paylinkRequest.Extra {
addIfExists(params, k, v)
}
}
c.Debug.Println("New link", params.Encode())
req, _ := http.NewRequest(http.MethodPost, c.BaseURL+"/creditor/payment/link", strings.NewReader(params.Encode()))
var paylink Paylink
err := c.sendRequest(req, &paylink)
if err != nil {
return nil, err
}
return &paylink, nil
}
// PaylinkFeed retrieves the feed of updated paylinks since last call
func (c *Client) PaylinkFeed(callback func(paylink *Paylink), sideloads ...string) error {
if err := c.refreshTokenIfRequired(); err != nil {
return err
}
_url := c.BaseURL + "/creditor/payment/link/feed"
for i, sideload := range sideloads {
if i == 0 {
_url = _url + "?include=" + sideload
} else {
_url = _url + "&include=" + sideload
}
}
for {
req, _ := http.NewRequest(http.MethodGet, _url, nil)
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
req.Header.Add("Authorization", c.apiToken)
req.Header.Set("User-Agent", c.UserAgent)
res, _ := c.HTTPClient.Do(req)
if res.StatusCode == 200 {
payload, _ := ioutil.ReadAll(res.Body)
_ = res.Body.Close()
var paylinks PaylinkList
err := json.Unmarshal(payload, &paylinks)
if err == nil {
c.Debug.Printf("Fetched %d links\n", len(paylinks.Links))
for _, paylink := range paylinks.Links {
callback(&paylink)
}
} else {
return err
}
if len(paylinks.Links) == 0 {
return nil
}
} else {
c.Debug.Println("Error response from Twikey: ", res.StatusCode)
return NewTwikeyErrorFromResponse(res)
}
}
}