Skip to main content

Java Example

Use this when you want to send the vendor-number callback from Java. Construct with apiKey and baseUrl (e.g. from config), then call assignVendorNumber(eventId, vendorNumber). Returns true on 204.

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;

public class B1LinkWebhookClient {
private final String apiKey;
private final String baseUrl;
private final HttpClient httpClient;
private final ObjectMapper objectMapper;

public B1LinkWebhookClient(String apiKey, String baseUrl) {
this.apiKey = apiKey;
this.baseUrl = baseUrl;
this.httpClient = HttpClient.newHttpClient();
this.objectMapper = new ObjectMapper();
}

public boolean assignVendorNumber(String eventId, String vendorNumber) throws Exception {
// Create request payload
var payload = Map.of(
"Id", eventId,
"ErpVendorNumber", vendorNumber
);

// Serialize to JSON (compact format)
String jsonPayload = objectMapper.writeValueAsString(payload);

// Generate signature
String signature = generateSignature(jsonPayload, apiKey);

// Create HTTP request
String url = baseUrl + "/api/onboarding-request-erp-events/assign-erp-vendor-number-event";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Content-Type", "application/json")
.header("X-B1LINK-Signature", signature)
.PUT(HttpRequest.BodyPublishers.ofString(jsonPayload))
.build();

// Send request
HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
return response.statusCode() == 204;
}

private String generateSignature(String payload, String apiKey) throws Exception {
// Get bytes
byte[] payloadBytes = payload.getBytes(StandardCharsets.UTF_8);
byte[] keyBytes = apiKey.getBytes(StandardCharsets.UTF_8);

// Create HMAC-SHA256
Mac mac = Mac.getInstance("HmacSHA256");
SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "HmacSHA256");
mac.init(secretKeySpec);

// Compute hash
byte[] hashBytes = mac.doFinal(payloadBytes);

// Base64 encode
return Base64.getEncoder().encodeToString(hashBytes);
}
}

// Usage
B1LinkWebhookClient client = new B1LinkWebhookClient(
"your-api-key-here",
"{baseUrl}"
);

boolean success = client.assignVendorNumber(
"550e8400-e29b-41d4-a716-446655440000",
"VENDOR-12345"
);

Key Points

  • Uses java.net.http.HttpClient (Java 11+)
  • ObjectMapper from Jackson for JSON serialization
  • Mac.getInstance("HmacSHA256") for signature generation
  • Base64.getEncoder() for Base64 encoding

Dependencies

Add to your pom.xml (Maven):

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>

Or to your build.gradle (Gradle):

implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.2'

Requirements

  • Java 11 or higher (for java.net.http.HttpClient)

Next step