Asking a merchant to activate a service for a user
In the Bango Platform, entitlements describe a user's ability to access a service provided by a merchant. To request service access for a user, you create an entitlement by making a POST
request to the Bango Resale API.
As part of the API request, you supply:
The API response is a structure that contains:
For some services, the status of the new entitlement is ACTIVE
and the user can access the service immediately. For others, the status is PENDING
, which means the merchant won't activate the service until a process is complete. This process might include actions by the user: for example, registering for the service. In this case the response code indicates what your code should do (for example, send the user to a web page), and the response contains any extra data required (for example, a registration URL).
Here's some sample code in a C/Java-like language: adapt this code to your needs. Use the same API endpoint prefix with test credentials and with production credentials.
Some functions referenced in the skeleton code, such as redirect_device_to
, are not defined. You need to implement these where possible.
function create_entitlement (user_id, merchant, product, offer = null, notification_url) {
// *Always* use this endpoint prefix for the Bango Resale API.
const base_url = "https://resale.api.bango.net";
// This is what we're trying to find.
let entitlement = null;
const request_body_params = {
// Your unique identifier for the user.
customerIdentifier: user_id,
// Identifier for the merchant providing the service,
// supplied by Bango.
merchantAccountKey: merchant,
// Identifier for the product representing the service,
// supplied by Bango.
productKey: product,
// Identifier for the offer associated with the service,
// supplied by Bango. (Use null, or omit, if no offer key applies)
offerKey: offer,
// Your custom URL: the Bango Platform POSTs asynchronously
// to this URL on changes to the entitlement.
notificationUrl: notification_url,
// See API reference for more parameters.
// You could use your own entitlement IDs if you want, for example:
// entitlementId: get_entitlement_id(...);
};
try {
// POST UTF-8 JSON to the Bango Resale API and parse the JSON response
let response = rest_client_call({
method: "POST",
url: base_url + "entitlement",
headers: {
"Authorization": get_authorization_header(),
"Content-Type": "application/json",
},
body: make_json_string(request_body_params),
}).from_json();
// The responseCode tells us the result.
switch (response.responseCode) {
// Success: entitlement is created and ACTIVE
case "OK":
entitlement = response;
break;
// More to do: The reseller must take action
case "CLIENT_ACTION_REQUIRED":
// This response parameter tells us what we need to do.
switch (response.parameters.action) {
case "NAVIGATE_TO_URL":
// Send the user to a particular web page
// to complete a merchant-defined process.
// request_body_params must include notificationUrl
// to ensure you receive notification of service
// activation asynchronously.
redirect_device_to({
url: response.parameters.url,
});
// entitlement is created and PENDING
entitlement = response;
break;
default:
// Unrecognized action.
// Check the documentation again.
throw "Unrecognized client action";
}
break;
// Failures
// These may indicate issues in your code, not the Bango Platform.
case "BAD_REQUEST": // Invalid request
case "UNAUTHORIZED": // Check your credentials
case "NOT_AVAILABLE": // Unable to activate this service
case "ALREADY_EXISTS": // You tried to reuse an entitlement ID
case "TOO_MANY_REQUESTS": // Request limit reached: try again later
throw "Unable to create entitlement";
// Bango Platform issues
// These likely indicate transient problems.
// In production code, you might want to try the request again
// after a delay, ultimately falling back to an error state.
case "INTERNAL_ERROR":
case "SERVICE_UNAVAILABLE":
throw "Bango Platform unavailable";
// This might indicate Bango has added a new response code.
// Check the documentation again.
default:
throw "Unrecognized response code";
}
} catch (exception) {
// Production code might want to notify the reseller in some way,
// and/or log full details of the exception for later analysis,
// and degrade gracefully for the user.
output("An error occurred!");
output(exception);
}
// null if entitlement not created.
// If created, will have an entitlementId, status, and other properties:
// see API reference.
return entitlement;
}
In this section: