public async Task <BuyItemRes> BuyItem(BuyItemReq request)
        {
            return(await Task.Run(() =>
            {
                try
                {
                    /*Will hardcode response, but in production, data could be stored in db and
                     * payment reference generated after payment is confirmed
                     */
                    BuyItemRes buyItemRes = new BuyItemRes()
                    {
                        ReferenceNo = "XXXXXX",
                        ResponseCode = $"0{((int)InternalResponseCode.Succesful).ToString()}",
                        ResponseMessage = "Payment Successful"
                    };

                    return buyItemRes;
                }
                catch (Exception ex)
                {
                    logger.Error(ex);
                    return null;
                }
            }));
        }
        public async Task <HttpResponseMessage> BuyItem(BuyItemReq req)
        {
            BuyItemRes res = new BuyItemRes();

            try
            {
                if (req == null)
                {
                    res.ResponseCode = ((int)InternalResponseCode.InvalidRequestBody).ToString();

                    res.ResponseMessage = "Request body cannot be null";

                    return(Request.CreateResponse(HttpStatusCode.BadRequest, res));
                }
                CommonLib commonLib = new CommonLib();

                var identity = (ClaimsIdentity)User.Identity;
                //get merchantname from identity
                var merchantname = identity.Name;
                //get merchant profile from name
                var profile = commonLib.GetUserProfileByMerchantName(merchantname);
                if (profile == null)
                {
                    //invalid profile
                    res.ResponseCode    = ((int)InternalResponseCode.InvalidCredential).ToString();
                    res.ResponseMessage = "Invalid Credential";

                    return(Request.CreateResponse(HttpStatusCode.Forbidden, res));
                }
                //generate hash and compare with what was included in the requestbody
                var mygeneratedhash = commonLib.GenerateSHA256Hash(profile.SecretKey, req.timestamp, profile.ApiKey, req.ReceiptRef);
                //compare with hash sent by client
                if (mygeneratedhash != req.HashValue || string.IsNullOrEmpty(req.HashValue))
                {
                    //unrecognised user
                    res.ResponseCode    = ((int)InternalResponseCode.InvalidHash).ToString();
                    res.ResponseMessage = "Invalid Hash";

                    return(Request.CreateResponse(HttpStatusCode.Forbidden, res));
                }
                res = await commonLib.BuyItem(req);

                return(Request.CreateResponse(HttpStatusCode.OK, res));
            }
            catch (Exception ex)
            {
                logger.Error(ex);
                res.ResponseCode    = ((int)InternalResponseCode.Exception).ToString();
                res.ResponseMessage = "Exception Occurred";
                return(Request.CreateResponse(HttpStatusCode.ExpectationFailed, res));
            }
        }