Adding an offer the cart and sending a discounted quote (Java)
In this use case, the user applies an offer to a cart to avail a discount on a particular item or the total cart value. This offer is usually entered by the user as a code that when added, requests the seller to update the quote. Sometimes, the code may be used to avail additional services like free shipping, free packaging etc
Code snippets
BPP receives protocol select
/*
Example Request JSON:
{
"context": {
"domain": "local_retail",
"country": "IND",
"city": "std:080",
"action": "select",
"core_version": "0.9.2",
"bap_id": "https://mock_bap.com/",
"bap_uri": "https://mock_bap.com/beckn/",
"transaction_id": "1239890342",
"message_id": "123793824",
"timestamp": "2021-03-23T10:00:40.065Z"
},
"message": {
"order": {
"offers": [
{
"id": "offer_1"
}
]
}
}
}
*/
// BPP Select endpoint
@PostMapping("/bpp/select")
public ResponseEntity select(
@RequestHeader HttpHeaders headers,
@RequestBody SelectRequest request) {
var response = bppApplicationService.select(request, headers);
return ResponseEntity.ok(response);
}
BPP processes the select
public Response select(SelectRequest request, HttpHeaders headers) {
var selectResponse = new OnSelectRequest();
// Validate the headers
var isHeadersValid = validateHeaders(headers);
// Construct and return error
if (!isHeadersValid) return null;
// Fetch the data based on the request
var requestIntent = request.getMessage().getOrder();
// Execute business logic here
// Generate the response
selectResponse = generateSelectResponse(selectResult);
//invoke on_select api
return invokeOnSelect(selectResponse, headers);
}
}
BPP generates response
/*
Example Response JSON:
{
"context": {
"domain": "local_retail",
"country": "IND",
"city": "std:080",
"action": "on_select",
"core_version": "0.9.2",
"bap_id": "https://mock_bap.com/",
"bap_uri": "https://mock_bap.com/beckn/",
"transaction_id": "1239890342",
"message_id": "123793824",
"timestamp": "2021-03-23T10:00:40.065Z"
},
"message": {
"order": {
"items": [
{
"id": "item_1",
"price" : {
"currency": "INR",
"value": "40"
},
"quantity": {
"selected": {
"count": 1
}
}
},
{
"id": "item_4",
"price" : {
"currency": "INR",
"value": "60"
},
"quantity": {
"selected": {
"count": 2
}
}
}
],
"offers": [
{
"id": "offer_1"
}
],
"quote": {
"price": {
"currency": "INR",
"value": "110"
},
"breakup": [
{
"title": "Brown Bread 400 gm",
"price": {
"currency": "INR",
"value": "40"
}
},
{
"title": "Good Life Toned Milk 1L",
"price": {
"currency": "INR",
"value": "120"
}
},
{
"title": "50 rupees off",
"price": {
"currency": "INR",
"value": "-50"
}
}
],
"ttl": "P4D"
}
}
}
}
*/
public OnSelectRequest generateSelectResponse(List selectedResults) {
var selectResult = SelectResponseBuilder.builder.result(selectedResults).build();
// Convert response into protocol object similar to example above
return selectResult;
}
BPP calls protocol on_select
public Response invokeOnSelect(OnSelectRequest selectResponse, HttpHeaders headers) {
if(selectResponse.getError() == null) {
// Call BAP on_select api with the select response
// Call to look up function which returns the the public key and BAP/BG Endpoint to be called
var url = lookUp(headers);
var response = apiClient.post(url[0] + Context.ActionEnum.on_select,
constructResponseHeaders(),
selectResponse,
OnSelectRequest.class);
return Response.of("ACK", null);
} else {
return Response.of("NACK", null);
}
}