Confirmation of a postpaid order (Java)
In this use case, the user confirms the order without making any payment and receives a confirmed order with the latest status of the fulfillment. In the case of hyperlocal delivery, the response sometimes also contains the details of the agent allocated to perform the delivery.
Code snippets
BPP receives protocol confirm
/*
Example Request JSON:
{
"context": {
"domain": "delivery",
"country": "IND",
"city": "std:080",
"action": "confirm",
"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-06-23T07:33:02.655Z"
},
"message": {
"order": {
"items": [
{
"id": "standard",
"quantity": {
"count": 1
}
}
],
"billing": {
"name": "John Doe",
"address": {
"door": "21A",
"name": "ABC Apartments",
"locality": "HSR Layout",
"city": "Bengaluru",
"state": "Karnataka",
"country": "India",
"area_code": "560102"
},
"email": "[email protected]",
"phone": "+919876543210",
"created_at": "2021-06-15T07:08:36.211Z",
"updated_at": "2021-06-15T07:08:36.211Z"
},
"fulfillment": {
"type": "home-delivery",
"tracking": false,
"start": {
"location": {
"gps": "12.9349377,77.6055586"
},
"time": {
"range": {
"start": "2021-06-15T07:09:30.000Z",
"end": "2021-06-15T07:10:30.000Z"
}
},
"instructions": {
"name": "pick up instructions",
"short_desc": "Don't ring doorbell"
},
"contact": {
"phone": "+919999999999",
"email": "[email protected]"
}
},
"end": {
"location": {
"gps": "12.914028, 77.638698",
"address": {
"door": "21A",
"name": "ABC Apartments",
"locality": "HSR Layout",
"city": "Bengaluru",
"state": "Karnataka",
"country": "India",
"area_code": "560102"
}
},
"time": {
"range": {
"start": "2021-06-15T07:11:36.212Z",
"end": "2021-06-15T07:12:36.212Z"
}
},
"instructions": {
"name": "drop off instructions",
"short_desc": "Leave at door step"
},
"contact": {
"phone": "+919876543210",
"email": "[email protected]"
}
}
},
"quote": {
"price": {
"currency": "INR",
"value": "40"
},
"breakup": [
{
"title": "Standard delivery",
"price": {
"currency": "INR",
"value": "40"
}
}
],
"ttl": "P4D"
},
"payment": {
"uri": "https://api.bpp.com/pay?amt=$amount&txn_id=ksh87yriuro34iyr3p4&mode=upi&vpa=bpp@upi",
"tl_method": "http/get",
"params": {
"transaction_id": "ksh87yriuro34iyr3p4",
"amount": "40",
"mode": "upi",
"vpa": "bpp@upi"
},
"type": "POST-FULFILLMENT",
"status": "NOT-PAID",
"time": {
"label": "Pay by",
"range": {
"end": "2021-07-24T10:13:35.216Z"
}
}
}
}
}
}
*/
// BPP Confirm Endpoint
@PostMapping("/bpp/confirm")
public ResponseEntity confirm(
@RequestHeader HttpHeaders headers,
@RequestBody ConfirmRequest request) {
var response = bppApplicationService.confirm(request, headers);
return ResponseEntity.ok(response);
}
BPP processes the confirm
public Response confirm(ConfirmRequest request, HttpHeaders headers) {
var onConfirmRequest = new OnConfirmRequest();
// Validate the headers
var isHeadersValid = validateHeaders(headers);
// Construct and return error
if (!isHeadersValid) return null;
// Confirm the given order
var confirmOrder = request.getMessage().getOrder();
// Execute business logic here
// Generate the response
onConfirmRequest = generateConfirmResponse(confirmOrder);
//invoke on_conrim api
return invokeOnConfirm(onConfirmRequest, headers);
}
}
BPP generates response
/*
Example Response JSON:
{
"context": {
"domain": "delivery",
"country": "IND",
"city": "std:080",
"action": "on_confirm",
"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-06-23T07:33:02.655Z"
},
"message": {
"order": {
"id": "0f8c1e68-c041-427d-9ef4-d4d3e5b22ef9",
"state": "Active",
"items": [
{
"id": "standard",
"quantity": {
"count": 1
}
}
],
"billing": {
"name": "John Doe",
"address": {
"door": "21A",
"name": "ABC Apartments",
"locality": "HSR Layout",
"city": "Bengaluru",
"state": "Karnataka",
"country": "India",
"area_code": "560102"
},
"email": "[email protected]",
"phone": "+919876543210",
"created_at": "2021-06-15T07:08:36.211Z",
"updated_at": "2021-06-15T07:08:36.211Z"
},
"fulfillment": {
"type": "home-delivery",
"tracking": false,
"start": {
"location": {
"gps": "12.9349377,77.6055586"
},
"time": {
"range": {
"start": "2021-06-15T07:09:30.000Z",
"end": "2021-06-15T07:10:30.000Z"
}
},
"instructions": {
"name": "pick up instructions",
"short_desc": "Don't ring doorbell"
},
"contact": {
"phone": "+919999999999",
"email": "[email protected]"
}
},
"end": {
"location": {
"gps": "12.914028, 77.638698",
"address": {
"door": "21A",
"name": "ABC Apartments",
"locality": "HSR Layout",
"city": "Bengaluru",
"state": "Karnataka",
"country": "India",
"area_code": "560102"
}
},
"time": {
"range": {
"start": "2021-06-15T07:11:36.212Z",
"end": "2021-06-15T07:12:36.212Z"
}
},
"instructions": {
"name": "drop off instructions",
"short_desc": "Leave at door step"
},
"contact": {
"phone": "+919876543210",
"email": "[email protected]"
}
}
},
"quote": {
"price": {
"currency": "INR",
"value": "40"
},
"breakup": [
{
"title": "Standard delivery",
"price": {
"currency": "INR",
"value": "40"
}
}
],
"ttl": "P4D"
},
"payment": {
"uri": "https://api.bpp.com/pay?amt=$amount&txn_id=ksh87yriuro34iyr3p4&mode=upi&vpa=bpp@upi",
"tl_method": "http/get",
"params": {
"transaction_id": "ksh87yriuro34iyr3p4",
"amount": "40",
"mode": "upi",
"vpa": "bpp@upi"
},
"type": "POST-FULFILLMENT",
"status": "NOT-PAID",
"time": {
"label": "Pay by",
"range": {
"end": "2021-07-24T10:13:35.216Z"
}
}
},
"created_at": "2021-06-23T07:33:02.655Z",
"updated_at": "2021-06-23T07:33:02.655Z"
}
}
}
*/
public OnConfirmRequest generateConfirmResponse(OrderDetails orderResponse) {
var confirmResult = ConfirmResponseBuilder.builder.result(orderResponse).build();
// Convert response into protocol object similar to example above
return confirmResult;
}
BPP calls protocol on_confirm
public Response invokeOnConfirm(OnConfirmRequest confirmResponse, HttpHeaders headers) {
if(confirmResponse.getError() == null) {
// Call BAP on_confirm api with the order response
// Call to look up function which returns the the public key and BAP Endpoint to be called
var url = lookUp(headers);
var response = apiClient.post(url[0] + Context.ActionEnum.on_confirm,
constructResponseHeaders(),
confirmResponse,
OnConfirmRequest.class);
return Response.of("ACK", null);
} else {
return Response.of("NACK", null);
}
}