zhutik/adyen-api-go

View on GitHub
README.md

Summary

Maintainability
Test Coverage
# [Deprecated] Adyen API for Go

This library is deprecated in favor of [official one from Adyen](https://github.com/Adyen/adyen-go-api-library), now it's finally released!

Thanks a lot for everyone who contributed and used this library!

-----------------------------------------------------------------

[![Build Status](https://travis-ci.org/zhutik/adyen-api-go.png)](https://travis-ci.org/zhutik/adyen-api-go)
[![GoDoc](http://godoc.org/github.com/zhutik/adyen-api-go?status.png)](http://godoc.org/github.com/zhutik/adyen-api-go)
[![Maintainability](https://api.codeclimate.com/v1/badges/47b60e74a4ee14812282/maintainability)](https://codeclimate.com/github/zhutik/adyen-api-go/maintainability)
[![Test Coverage](https://api.codeclimate.com/v1/badges/47b60e74a4ee14812282/test_coverage)](https://codeclimate.com/github/zhutik/adyen-api-go/test_coverage)
[![Go Report Card](https://goreportcard.com/badge/github.com/zhutik/adyen-api-go)](https://goreportcard.com/report/github.com/zhutik/adyen-api-go)

A Go client library for [Adyen](https://www.adyen.com/en/) payments platform.

This is *not* an official client library. Adyen has official libraries for multiple platforms [Github](https://github.com/adyen/), but not Go yet.

This package provides core functionality to perform most common types of a Payment requests to an API. 
If you see some functionality is missing, please, open an issue (or better yet, a pull request).

## Installation

```
go get github.com/zhutik/adyen-api-go
```

## Playground and examples

Please check separate repository with Adyen API playground, where you can test API
and get some usage examples for Adyen API library

https://github.com/zhutik/adyen-api-go-example

Or you can visit [Wiki page](https://github.com/zhutik/adyen-api-go/wiki) for more details and examples

## Supported API Calls

* Authorise (Encrypted in recommended)
* Authorise 3D
* Recurring payments and retrieving stored payment methods
* Capture
* Cancel
* Refund (CancelOrRefund)
* Notifications

## Usage

```go
import "github.com/zhutik/adyen-api-go"

// Configure Adyen API
instance := adyen.New(
  adyen.Testing,
  os.Getenv("ADYEN_USERNAME"),
  os.Getenv("ADYEN_PASSWORD"),
)

amount := &adyen.Amount{
    Value:    1000, // amount * 100, f.e. 10,30 EUR = 1030
    Currency: "EUR" // or use instance.Currency
}

// or amount := adyen.NewAmount("EUR", 10), in this case decimal points would be adjusted automatically

req := &adyen.AuthoriseEncrypted{
  Amount: amount,
  MerchantAccount: os.Getenv("ADYEN_ACCOUNT"), // your merchant account in Adyen
  AdditionalData:  &adyen.AdditionalData{Content: "encryptedData"}, // encrypted data from a form
  Reference:       "your-order-number",
}

// Perform authorise transaction
g, err := instance.Payment().AuthoriseEncrypted(req)

```

Load Client Side JS for form encryption to include on credit card form page

```go
// Configure Adyen API
instance := adyen.New(
  adyen.Testing,
  os.Getenv("ADYEN_USERNAME"),
  os.Getenv("ADYEN_PASSWORD"),
)

url := &adyen.ClientURL(os.Getenv("ADYEN_CLIENT_TOKEN"))
```

Currently, MerchantAccount and Currency need to be set for every request manually

To shortcut configuration, additional methods could be used to set and retrieve those settings.

```go
// Configure Adyen API
instance := adyen.New(
  adyen.Testing,
  os.Getenv("ADYEN_USERNAME"),
  os.Getenv("ADYEN_PASSWORD"),
)

// set parameters once for current instance
instance.Currency = "USD"
instance.MerchantAccount = "TEST_MERCHANT_ACCOUNT"

// futher, information could be retrieved to populate request 
req := &adyen.AuthoriseEncrypted{
  Amount: adyen.NewAmount(instance.Currency, 10.00),
  MerchantAccount: instance.MerchantAccount,
  AdditionalData:  &adyen.AdditionalData{Content: "encryptedData"}, // encrypted data from a form
  Reference:       "your-order-number",
}
```

### Environment configuration

Adyen's Production environment requires additional configuration to the Test environment for security reasons.  Namely, this includes a random hexadecimal string that's generated for your account and the company account name.

In the following examples, the environmenst have been hard-coded for clarity.  They would typically come from environments variables instead.

To target the Test environment:

``` go
env := adyen.TestEnvironment()
```

To target the Production environment:

``` go
env, err := adyen.ProductionEnvironment("5409c4fd1cc98a4e", "AcmeAccount123")
```

## To run example

### Expose your settings for Adyen API configuration.

```
$ export ADYEN_CLIENT_TOKEN="YOUR_ADYEN_CLIENT_TOKEN"
$ export ADYEN_USERNAME="YOUR_ADYEN_API_USERNAME"
$ export ADYEN_PASSWORD="YOUR_API_PASSWORD"
$ export ADYEN_ACCOUNT="YOUR_MERCHANT_ACCOUNT"
```

Settings explanation:
* ADYEN_CLIENT_TOKEN - Library token in Adyen, used to load external JS file from Adyen to validate Credit Card information
* ADYEN_USERNAME - Adyen API username, usually starts with ws@
* ADYEN_PASSWORD - Adyen API password for username
* ADYEN_ACCOUNT - Selected Merchant Account

## Hosted Payment Pages

Update your settings to include

```
$ export ADYEN_HMAC="YOUR_HMAC_KEY"
$ export ADYEN_SKINCODE="YOUR_SKINCODE_ID"
$ export ADYEN_SHOPPER_LOCALE="YOUR_SHOPPER_LOCALE"
```

Use HPP constructor to initialize new Adyen API instance

```go
import "github.com/zhutik/adyen-api-go"

// Configure Adyen API
instance := adyen.NewWithHMAC(
  adyen.Testing,
  os.Getenv("ADYEN_USERNAME"),
  os.Getenv("ADYEN_PASSWORD"),
  os.Getenv("ADYEN_HMAC"),
)

```

Perform requests as usual:

```go
timeIn := time.Now().Local().Add(time.Minute * time.Duration(60))

req := &adyen.DirectoryLookupRequest{
    CurrencyCode:      "EUR",
    MerchantAccount:   os.Getenv("ADYEN_ACCOUNT"),
    PaymentAmount:     1000,
    SkinCode:          os.Getenv("ADYEN_SKINCODE"),
    MerchantReference: "your-order-number",
    SessionsValidity:  timeIn.Format(time.RFC3339),
}

g, err := instance.Payment().DirectoryLookup(req)

```

or generate redirect URL for selected payment method

Example with iDEAL for Netherlands:

```go
timeIn := time.Now().Local().Add(time.Minute * time.Duration(60))

req := &adyen.SkipHppRequest{
    MerchantReference: "your-order-number",
    PaymentAmount:     1000,
    CurrencyCode:      "EUR",
    ShipBeforeDate:    timeIn.Format(time.RFC3339),
    SkinCode:          os.Getenv("ADYEN_SKINCODE"),
    MerchantAccount:   os.Getenv("ADYEN_ACCOUNT"),
    ShopperLocale:     "nl",
    SessionsValidity:  timeIn.Format(time.RFC3339),
    CountryCode:       "NL",
    BrandCode:         "ideal",
    IssuerID:          "1121",
}

url, err := instance.Payment().GetHPPRedirectURL(req)

http.Redirect(w, r, url, http.StatusTemporaryRedirect)
```

Supported Calls:
* Directory Lookup
* Locale payment methods redirect

### Setup playgroup

Please check separate repository with Adyen API playgroup, where you can test API
and get some usage example for Adyen API library

https://github.com/zhutik/adyen-api-go-example

### Perform payments

Open http://localhost:8080 in your browser and check implemented actions.

Test credit cards could be found https://docs.adyen.com/support/integration#testcardnumbers

## TODOs

* Move some constants into enum files.
* Parse URLs for environment's BaseURL, ClientURL and HppURL methods instead of string concatenation (needs to return an error as well).
* Reduced API surface by making most types and functions unexported.