Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,20 @@ Follows Gitflow:
**Before merging a new SDK version to `main`**, always run the version-tagging command above first.

CI/CD is defined in `.github/workflows/deploy.yml`. The `setenv.sh` script is run as part of the deployment to switch URLs and `includeCurrentVersion` flags between environments.

### Merge method (important)

`dev` and `main` are long-lived branches that must share history. Use the right merge method per target:

| PR | Merge method | Why |
|----|--------------|-----|
| feature → `dev` | **Squash and merge** | Keeps `dev` history clean; the squash is harmless here. |
| `dev` → `main` | **Create a merge commit** (never squash) | Squashing creates a new commit on `main` that does not share history with `dev`'s individual commits, so every later `dev` → `main` comparison reports false conflicts. A merge commit keeps the histories connected. |

GitHub cannot restrict the merge method per target branch (the setting is repo-wide), so this is a manual discipline: when merging `dev` → `main`, always pick **"Create a merge commit"** from the green button dropdown.

If a `dev` → `main` PR was accidentally squashed and the next one shows phantom conflicts, fix it by branching off `main`, merging `dev` into it (`git merge -X theirs --no-ff origin/dev`), verifying the resulting tree matches `dev` (`git diff origin/dev HEAD` is empty), and opening that branch as a merge-commit PR to `main`. This reconnects the histories.

### Avoiding broken builds

The build runs with `onBrokenMarkdownLinks: 'throw'`, so a single unresolvable Markdown link fails the entire production deploy. Within an SDK docs plugin, **links must be relative to that plugin** — e.g. from `restapi/restendpoints.md` link to `restobjects.md#anchor`, not `restapi/restobjects.md#anchor` (the plugin prefix points outside the plugin and won't resolve). Run `yarn build` locally before opening a `dev` → `main` PR to catch these.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ npm run docusaurus docs:version:android "Android SDK 7.1013.0"
Automatically, it will create the new folder for this version (version-Android SDK 7.1011.0) in `android_versioned_docs`.

```console
npm run docusaurus docs:version:restapi "REST API 2.29.0"
npm run docusaurus docs:version:restapi "REST API 2.30.0"
```

**To see it published you will have to restart docusaurus.**
Expand Down
42 changes: 42 additions & 0 deletions android/androidintegrationguide.md
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,20 @@ android {
}
```

**Core library desugaring (required since SDK 7.1014.0)**

```groovy
android {
compileOptions {
coreLibraryDesugaringEnabled true
}
}

dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.5'
}
```

:::tip
If using AndroidX you will need to switch the following flags to true:<br></br>
android.enableJetifier=true<br></br>
Expand Down Expand Up @@ -371,6 +385,20 @@ dependencies {
}
```

**Core library desugaring (required since SDK 7.1014.0)**

```groovy
android {
compileOptions {
coreLibraryDesugaringEnabled true
}
}

dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.5'
}
```


**2.2 In the gradle.build (Top-level build file)**

Expand Down Expand Up @@ -627,6 +655,20 @@ dependencies {
}
```

**Core library desugaring (required since SDK 7.1014.0)**

```groovy
android {
compileOptions {
coreLibraryDesugaringEnabled true
}
}

dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.5'
}
```


**2.2 In the gradle.build (Top-level build file)**

Expand Down
14 changes: 14 additions & 0 deletions android/androidintroduction.md
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,20 @@ android {
}
```

**Core library desugaring (required since SDK 7.1014.0)**

```groovy
android {
compileOptions {
coreLibraryDesugaringEnabled true
}
}

dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.5'
}
```

It is time to visit our **[Integration Guides](androidintegrationguide)** section.

If you have any questions, do not hesitate to **[Contact Us](mailto:support@handpoint.com)**.
62 changes: 62 additions & 0 deletions android/androidobjects.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ An object holding information about the result of a transaction.

| Parameter | Description |
| ----------- | ----------- |
| `addressVerification` <br />[*AddressVerification*](#address-verification) | AVS (Address Verification Service) result, present only when the acquirer performed one.|
| `aid` <br />*String* | Application Identifier of the card (EMV tag 9F06).|
| `arc` <br />*String* | EMV Authorisation Response Code (EMV tag 8A).|
| `authorisationCode` <br />*String* | Acquirer response code.|
Expand Down Expand Up @@ -86,6 +87,9 @@ An object holding information about the result of a transaction.

```json
{
"addressVerification": {
"resultCode": "FULL_MATCH"
},
"aid": "A0000000041010",
"arc": "0000",
"authorisationCode": "123456",
Expand Down Expand Up @@ -182,6 +186,36 @@ public enum Acquirer { AMEX,
}
```

## Address Verification

`AddressVerification` <span class="badge badge--info">Object</span>

Address verification (AVS) result for a MoTo transaction, exposed on [TransactionResult](#25).

**Properties**

| Parameter | Description |
| ----------- | ----------- |
| `resultCode` <br />[*AvsResultCode*](#avs-result-code) | Outcome of the AVS check performed by the acquirer |

**Code example**

```json
{
"resultCode": "FULL_MATCH"
}
```

## Avs Result Code

`AvsResultCode` <span class="badge badge--info">Enum</span>

An enum representing the outcome of an Address Verification Service (AVS) check performed by the acquirer for a MoTo transaction.

**Possible values**

`FULL_MATCH` `EXACT_MATCH` `ADDRESS_MATCH` `ZIP_MATCH` `ZIP9_MATCH` `NO_MATCH` `UNSUPPORTED` `INTERNATIONAL` `RETRY` `UNAVAILABLE` `UNKNOWN`

## Balance

`Balance` <span class="badge badge--info">Object</span>
Expand Down Expand Up @@ -217,6 +251,25 @@ An enum representing the balance sign.

`POSITIVE_SIGN('C')` `NEGATIVE_SIGN('D')`

## Billing

`Billing` <span class="badge badge--info">Object</span>

Billing address details attached to a MoTo transaction, used for Address Verification Service (AVS) checks.

**Properties**

| Parameter | Description |
| ----------- | ----------- |
| `zipCode` <span class="badge badge--primary">Required</span> <br />*String* | The billing postal/ZIP code |
| `address` <br />*String* | The billing street address. Optional; used for AVS when provided |

**Code example**

```java
Billing billing = new Billing("90210", "123 Main Street");
```

## Card Brands{#cardBrands}

`CardBrands` <span class="badge badge--info">Enum</span>
Expand Down Expand Up @@ -721,6 +774,8 @@ An object to store optional parameters for card not present (MoTo) transactions.
| `cardToken` <br />*String* | From token providers who support PAN + Expiry de-tokenization|
| `Tokenize` <br />*Boolean* | Flag to activate tokenization of the operation, if this flag is set, a token representing the PAN of the card will be sent back by the Handpoint sytems|
| `MoneyRemittanceOptions` <br />[*MoneyRemittanceOptions*](androidobjects.md#money-remittance-options) | An object representing options for Mastercard money remittance transactions.|
| `billing` <br />[*Billing*](androidobjects.md#billing) | Billing address details used for Address Verification Service (AVS) checks|
| `enableAvsFields` <br />*Boolean* | Instructs the MoTo Dialog to request the AVS fields from the cardholder. Ignored if `billing` is already set|



Expand All @@ -737,6 +792,13 @@ options.setChannel(MoToChannel.TO);
//Adding Money Remitance options
MoneyRemittanceOptions moneyRemittanceOptions = new MoneyRemittanceOptions("John Doe", CountryCode.USA);
MoToOptions moToOptions = new MoToOptions(moneyRemittanceOptions);

//Adding AVS billing details directly
Billing billing = new Billing("90210", "123 Main Street");
options.setBilling(billing);

//Or letting the MoTo Dialog collect the AVS fields from the cardholder instead
options.setEnableAvsFields(true);
```

## Operation DTO
Expand Down
39 changes: 39 additions & 0 deletions android/androidreleasenotes.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,45 @@ id: androidreleasenotes
Don’t miss any updates on our latest releases. Contact your Handpoint relationship manager to subscribe to the Handpoint Newsletter!
:::

## 7.1014.0
**BREAKING CHANGE:**

Starting with this version, the SDK requires [core library desugaring](androidintegrationguide.md#8) to be enabled in your app's Gradle configuration. At Handpoint we want to keep backwards compatibility with older Android APIs (the SDK still supports Android 5.1.1 / API level 22 and up) while starting to use new, modern Java APIs internally — enabling desugaring lets us do both at the same time.

Add the following to your app module's `build.gradle`:

```groovy
android {
compileOptions {
coreLibraryDesugaringEnabled true
}
}

dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.5'
}
```

**Features**

Added support for Address Verification Service (AVS) checks on MoTo transactions. You can now pass the cardholder's billing details via [`MoToOptions.billing`](androidobjects.md#moto-options), or set [`MoToOptions.enableAvsFields`](androidobjects.md#moto-options) to have the MoTo Dialog collect them from the cardholder instead. See the [Billing](androidobjects.md#billing) object for details. The result of the check performed by the acquirer is returned on [`TransactionResult.addressVerification`](androidobjects.md#25), see the [Address Verification](androidobjects.md#address-verification) object.

## 7.1013.0

**New Features**

- Duplicate-Check support is now available for MoTo Sale operations, preventing double-charges when a sale is retried after a network or connectivity issue.
- Deferred Tokenization is now supported in the Android SDK, allowing integrators to tokenize a card used in a previous sale, refund, pre-authorization capture, MoTo sale or MoTo refund at a later point using the transaction's GUID. See the [REST API 2.26.0 Deferred Tokenization](pathname:///restapi/restreleasenotes) endpoint for the corresponding gateway operation.

**Improvements**

- Contactless (NFC) reading performance has been improved: the NFC reader is no longer reinitialised on every polling cycle, resulting in faster and more reliable tap detection, including quick taps.
- MoTo Sale transactions that return an UNDEFINED result can now recover the approved result via the Get Transaction Status service. Previously, MoTo Sale did not include a `transactionReference`, making status recovery impossible.

**Bug fixes**

- Fixed: Card entry type now correctly reports `CHIPFAILMAGSTRIPE` instead of `TOKENIZATION` when a chip card falls back to magnetic stripe.

## 7.1012.3
**Features**

Expand Down
2 changes: 1 addition & 1 deletion android/androidtransactions.md
Original file line number Diff line number Diff line change
Expand Up @@ -1334,7 +1334,7 @@ The **`tokenizedOperation`** method allows integrators to provide a specific ope

---

## Cloud Tokenized Payments Operations
## Cloud Tokenized Payments Operations{#cloudTokenizedPaymentsOperations}

`cloudTokenizedPaymentsOperations`

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1334,7 +1334,7 @@ The **`tokenizedOperation`** method allows integrators to provide a specific ope

---

## Cloud Tokenized Payments Operations
## Cloud Tokenized Payments Operations{#cloudTokenizedPaymentsOperations}

`cloudTokenizedPaymentsOperations`

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1334,7 +1334,7 @@ The **`tokenizedOperation`** method allows integrators to provide a specific ope

---

## Cloud Tokenized Payments Operations
## Cloud Tokenized Payments Operations{#cloudTokenizedPaymentsOperations}

`cloudTokenizedPaymentsOperations`

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1334,7 +1334,7 @@ The **`tokenizedOperation`** method allows integrators to provide a specific ope

---

## Cloud Tokenized Payments Operations
## Cloud Tokenized Payments Operations{#cloudTokenizedPaymentsOperations}

`cloudTokenizedPaymentsOperations`

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1334,7 +1334,7 @@ The **`tokenizedOperation`** method allows integrators to provide a specific ope

---

## Cloud Tokenized Payments Operations
## Cloud Tokenized Payments Operations{#cloudTokenizedPaymentsOperations}

`cloudTokenizedPaymentsOperations`

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1334,7 +1334,7 @@ The **`tokenizedOperation`** method allows integrators to provide a specific ope

---

## Cloud Tokenized Payments Operations
## Cloud Tokenized Payments Operations{#cloudTokenizedPaymentsOperations}

`cloudTokenizedPaymentsOperations`

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1334,7 +1334,7 @@ The **`tokenizedOperation`** method allows integrators to provide a specific ope

---

## Cloud Tokenized Payments Operations
## Cloud Tokenized Payments Operations{#cloudTokenizedPaymentsOperations}

`cloudTokenizedPaymentsOperations`

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1334,7 +1334,7 @@ The **`tokenizedOperation`** method allows integrators to provide a specific ope

---

## Cloud Tokenized Payments Operations
## Cloud Tokenized Payments Operations{#cloudTokenizedPaymentsOperations}

`cloudTokenizedPaymentsOperations`

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1334,7 +1334,7 @@ The **`tokenizedOperation`** method allows integrators to provide a specific ope

---

## Cloud Tokenized Payments Operations
## Cloud Tokenized Payments Operations{#cloudTokenizedPaymentsOperations}

`cloudTokenizedPaymentsOperations`

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1355,7 +1355,7 @@ The **`tokenizedOperation`** method allows integrators to provide a specific ope

---

## Cloud Tokenized Payments Operations
## Cloud Tokenized Payments Operations{#cloudTokenizedPaymentsOperations}

`cloudTokenizedPaymentsOperations`

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1334,7 +1334,7 @@ The **`tokenizedOperation`** method allows integrators to provide a specific ope

---

## Cloud Tokenized Payments Operations
## Cloud Tokenized Payments Operations{#cloudTokenizedPaymentsOperations}

`cloudTokenizedPaymentsOperations`

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
---
sidebar_position: 4
id: androidapioverview
---

# Trigger Amounts

Your test payments are sent against a test server on the Handpoint side which simulates the behavior of an acquiring bank. Funds are not moved and sensitive data from the card is fully encrypted. You can use trigger amounts to generate some specific responses from our servers:

**Sale amounts**

| Amount | Behaviour |
| ----------- | ----------- |
| 37.79 | Issuer response code = 01 (Refer to issuer) |
| 37.84 | Issuer response code = 05 (Not authorized) |
| 37.93 | Issuer response code = 04 (Pick up card) |
| 37.57 | Request is partially approved |
| 37.68 | Request timeout |

:::tip
Supporting partial approval is **mandatory** for the US market. Partial authorization occurs when a payment card authorization is attempted for a transaction and there are not enough funds available in the account to cover the full amount. The issuer returns an authorization for the amount available in the account, leaving you to obtain an additional form of payment from the customer for the balance.
:::
Loading
Loading