/// <summary>
        /// Get Billing Token from Recurly
        /// </summary>
        /// <param name="request">TokenRequest containing billing information</param>
        /// <returns>TokenResponse</returns>
        internal override async Task <TokenResponse> getBillingToken(TokenRequest request, bool isPreProd)
        {
            string apiPath = Properties.AppSettings.recurlyTokenPath;
            string apiKey  = getApiKey(isPreProd);

            //setup request data
            var formContent = new[]
            {
                new KeyValuePair <string, string>("number", Convert.ToString(request.cardNumber.Replace("-", ""))),
                new KeyValuePair <string, string>("year", Convert.ToString(request.expirationYear)),
                new KeyValuePair <string, string>("month", Convert.ToString(request.expirationMonth)),
                new KeyValuePair <string, string>("cvv", Convert.ToString(request.cardCVV)),
                new KeyValuePair <string, string>("first_name", Convert.ToString(request.firstName)),
                new KeyValuePair <string, string>("last_name", Convert.ToString(request.lastName)),
                new KeyValuePair <string, string>("address1", Convert.ToString(request.street1)),
                new KeyValuePair <string, string>("city", Convert.ToString(request.city)),
                new KeyValuePair <string, string>("state", Convert.ToString(request.state)),
                new KeyValuePair <string, string>("country", Convert.ToString(request.country)),
                new KeyValuePair <string, string>("postal_code", Convert.ToString(request.postalCode)),
                new KeyValuePair <string, string>("key", apiKey)
            };

            //call recurly api endpoint for token
            var apiResponse = await RestHelper.PostFormContentRequest(baseAddress, apiPath, null, formContent);

            //parse the response body to object
            RecurlyTokenResponse recurlyResponse = JsonConvert.DeserializeObject <RecurlyTokenResponse>(apiResponse.Item2);


            //prepare TokenResponse object
            //TokenResponse response = new TokenResponse(recurlyResponse.id, true, creditCard);
            TokenResponse response = new TokenResponse();

            if (recurlyResponse.error != null)
            {
                if ((recurlyResponse.error.fields != null))
                {
                    foreach (var field in recurlyResponse.error.fields)
                    {
                        response.addError(new Error(translateFieldName(field), recurlyResponse.error.message));
                    }
                }
                else
                {
                    response.addError(new Error(translateFieldName(recurlyResponse.error.code), recurlyResponse.error.message));
                }
            }
            else
            {
                //populate the card details for the response from the request
                CreditCard creditCard = new CreditCard(request.expirationMonth, request.expirationYear,
                                                       getTypeOfCreditCard(request.cardNumber),
                                                       request.cardNumber.Substring(request.cardNumber.Length - 4, 4));

                BillingAddress address = new BillingAddress(request.street1, null, request.city,
                                                            request.state, request.postalCode);

                BillingInfo billingInfo = new BillingInfo(recurlyResponse.id, false, address, creditCard);
                response.addBillingInfo(billingInfo);
            }

            return(response);
        }