Пример #1
0
        /// <summary>
        /// Void the specified paymentId.
        ///
        /// Voids generally need to occur before end of business on the same day that the transaction was processed.
        ///
        /// Voids are used to cancel a transaction before the item is registered against a customer credit card account.
        /// Cardholders will never see a voided transaction on their credit card statement. As a result, voids can only
        /// be attempted on the same day as the original transaction. After the end of day (roughly 11:59 pm EST/EDT),
        /// void requests will be rejected from the API if attempted.
        /// </summary>
        /// <returns>The return result</returns>
        /// <param name="paymentId">Payment identifier from a previous transaction.</param>
        public PaymentResponse Void(string paymentId, double amount)
        {
            Gateway.ThrowIfNullArgument(paymentId, "paymentId");

            string url = BeanstreamUrls.VoidsUrl
                         .Replace("{v}", String.IsNullOrEmpty(_configuration.Version) ? "v1" : "v" + _configuration.Version)
                         .Replace("{p}", String.IsNullOrEmpty(_configuration.Platform) ? "www" : _configuration.Platform)
                         .Replace("{id}", paymentId);


            HttpsWebRequest req = new HttpsWebRequest()
            {
                MerchantId         = _configuration.MerchantId,
                Passcode           = _configuration.PaymentsApiPasscode,
                WebCommandExecutor = _webCommandExecuter
            };

            var VoidPayment = new
            {
                merchant_id = _configuration.MerchantId,
                amount      = amount
            };

            string response = req.ProcessTransaction(HttpMethod.Post, url, VoidPayment);

            Console.WriteLine(response);
            return(JsonConvert.DeserializeObject <PaymentResponse>(response));
        }
Пример #2
0
        /// <summary>
        /// Updates the card on the profile.
        /// </summary>
        /// <returns>The result of the update</returns>
        /// <param name="profileId">Profile identifier.</param>
        /// <param name="card">Card.</param>
        public ProfileResponse UpdateCard(string profileId, Card card)
        {
            string url = BamboraUrls.CardsUrl
                         .Replace("{v}", String.IsNullOrEmpty(_configuration.Version) ? "v1" : "v" + _configuration.Version)
                         .Replace("{p}", String.IsNullOrEmpty(_configuration.Platform) ? "www" : _configuration.Platform)
                         .Replace("{id}", profileId)
                         + "/" + card.Id;

            HttpsWebRequest req = new HttpsWebRequest()
            {
                MerchantId         = _configuration.MerchantId,
                SubMerchantId      = _configuration.SubMerchantId,
                Passcode           = _configuration.ProfilesApiPasscode,
                WebCommandExecutor = _webCommandExecuter
            };

            if (card.Number.Contains("X"))
            {
                card.Number = null;                 // when a card is returned from the server the number will be masked with X's. We don't want to submit that back.
            }
            // the json wants to be wrapped in a 'card' group
            var c = new {
                card
            };

            string response = req.ProcessTransaction(HttpMethod.Put, url, c);

            return(JsonConvert.DeserializeObject <ProfileResponse>(response));
        }
Пример #3
0
        /// <summary>
        /// Updates the profile. You must first retrieve the profile using ProfilesAPI.GetProfile(id)
        /// </summary>
        /// <returns>The profile response.</returns>
        /// <param name="profile">Profile.</param>
        public ProfileResponse UpdateProfile(PaymentProfile profile)
        {
            string url = BamboraUrls.BaseProfilesUrl
                         .Replace("{v}", String.IsNullOrEmpty(_configuration.Version) ? "v1" : "v" + _configuration.Version)
                         .Replace("{p}", String.IsNullOrEmpty(_configuration.Platform) ? "www" : _configuration.Platform)
                         + "/" + profile.Id;


            HttpsWebRequest req = new HttpsWebRequest()
            {
                MerchantId         = _configuration.MerchantId,
                SubMerchantId      = _configuration.SubMerchantId,
                Passcode           = _configuration.ProfilesApiPasscode,
                WebCommandExecutor = _webCommandExecuter
            };

            var updateProfile = new {
                billing  = profile.Billing,
                custom   = profile.CustomFields,
                language = profile.Language,
                comment  = profile.Comment
            };

            string response = req.ProcessTransaction(HttpMethod.Put, url, updateProfile);

            return(JsonConvert.DeserializeObject <ProfileResponse>(response));
        }
Пример #4
0
        /// <summary>
        /// Get a particular card on a profile.
        /// Card IDs are their index in getCards(), starting a 1 and going up: 1, 2, 3, 4...
        /// </summary>
        /// <returns>The card.</returns>
        /// <param name="profileId">Profile identifier.</param>
        /// <param name="cardId">Card identifier.</param>
        public Card GetCard(string profileId, int cardId)
        {
            string url = BamboraUrls.CardsUrl
                         .Replace("{v}", String.IsNullOrEmpty(_configuration.Version) ? "v1" : "v" + _configuration.Version)
                         .Replace("{p}", String.IsNullOrEmpty(_configuration.Platform) ? "www" : _configuration.Platform)
                         .Replace("{id}", profileId)
                         + "/" + cardId;

            HttpsWebRequest req = new HttpsWebRequest()
            {
                MerchantId         = _configuration.MerchantId,
                SubMerchantId      = _configuration.SubMerchantId,
                Passcode           = _configuration.ProfilesApiPasscode,
                WebCommandExecutor = _webCommandExecuter
            };

            string response = req.ProcessTransaction(HttpMethod.Get, url);

            ProfileCardsResponse cardResponse = JsonConvert.DeserializeObject <ProfileCardsResponse>(response);

            if (cardResponse.Cards == null)
            {
                return(null);
            }

            return(cardResponse.Cards[0]);
        }
Пример #5
0
        /// <summary>
        /// Gets the cards contained on this profile.
        /// It is possible for a profile not to contain any cards if it was created using a Legato token (single-use token)
        /// </summary>
        /// <returns>The cards.</returns>
        /// <param name="profileId">Profile identifier.</param>
        public IList <Card> GetCards(string profileId)
        {
            string url = BeanstreamUrls.CardsUrl
                         .Replace("{v}", String.IsNullOrEmpty(_configuration.Version) ? "v1" : "v" + _configuration.Version)
                         .Replace("{p}", String.IsNullOrEmpty(_configuration.Platform) ? "www" : _configuration.Platform)
                         .Replace("{id}", profileId);

            HttpsWebRequest req = new HttpsWebRequest()
            {
                MerchantId         = _configuration.MerchantId,
                Passcode           = _configuration.ProfilesApiPasscode,
                WebCommandExecutor = _webCommandExecuter
            };

            string response = req.ProcessTransaction(HttpMethod.Get, url);
            ProfileCardsResponse cardResponse = JsonConvert.DeserializeObject <ProfileCardsResponse>(response);

            if (cardResponse.Cards != null)
            {
                return(cardResponse.Cards);
            }
            else
            {
                return(new List <Card>());               // empty list with no cards
            }
        }
Пример #6
0
        /// <summary>
        /// Return a previous payment made through Bambora
        /// </summary>
        /// <returns>The payment result</returns>
        /// <param name="paymentId">Payment identifier.</param>
        /// <param name="returnRequest">Return request.</param>
        public PaymentResponse Return(string paymentId, ReturnRequest returnRequest)
        {
            Gateway.ThrowIfNullArgument(returnRequest, "returnRequest");
            Gateway.ThrowIfNullArgument(paymentId, "paymentId");

            string url = BamboraUrls.ReturnsUrl
                         .Replace("{v}", String.IsNullOrEmpty(_configuration.Version) ? "v1" : "v" + _configuration.Version)
                         .Replace("{p}", String.IsNullOrEmpty(_configuration.Platform) ? "www" : _configuration.Platform)
                         .Replace("{id}", String.IsNullOrEmpty(paymentId) ? "" : paymentId);


            HttpsWebRequest req = new HttpsWebRequest()
            {
                MerchantId         = _configuration.MerchantId,
                Passcode           = _configuration.PaymentsApiPasscode,
                WebCommandExecutor = _webCommandExecuter
            };

            returnRequest.MerchantId = _configuration.MerchantId.ToString();

            string response = req.ProcessTransaction(HttpMethod.Post, url, returnRequest);

            Console.WriteLine(response);
            return(JsonConvert.DeserializeObject <PaymentResponse>(response));
        }
Пример #7
0
        /// <summary>
        /// Query for transaction data. You must specify a start date and an end date, as well as search criteria.
        /// You also specify the start row and end row for paging since the search will limit the number of returned results to 1000.
        /// </summary>
        /// <param name="reportName">Report name. </param>
        /// <param name="startDate">Start date.</param>
        /// <param name="endDate">End date.</param>
        /// <param name="startRow">Start row.</param>
        /// <param name="endRow">End row.</param>
        /// <param name="criteria">Criteria.</param>
        public List <TransactionRecord> Query(DateTime startDate, DateTime endDate, int startRow, int endRow, params Criteria[] criteria)
        {
            if (endDate == null || startDate == null)
            {
                throw new ArgumentNullException("Start Date and End Date cannot be null!");
            }
            if (endDate < startDate)
            {
                throw new ArgumentException("End Date cannot be less than Start Date!");
            }
            if (endRow < startRow)
            {
                throw new ArgumentException("End Row cannot be less than Start Row!");
            }
            if (endRow - startRow > 1000)
            {
                throw new ArgumentException("You cannot query more than 1000 rows at a time!");
            }

            string url = BamboraUrls.ReportsUrl
                         .Replace("{v}", String.IsNullOrEmpty(_configuration.Version) ? "v1" : "v" + _configuration.Version)
                         .Replace("{p}", String.IsNullOrEmpty(_configuration.Platform) ? "www" : _configuration.Platform);


            HttpsWebRequest req = new HttpsWebRequest()
            {
                MerchantId         = _configuration.MerchantId,
                SubMerchantId      = _configuration.SubMerchantId,
                Passcode           = _configuration.ReportingApiPasscode,
                WebCommandExecutor = _webCommandExecuter
            };

            var query = new
            {
                name       = "Search",
                start_date = startDate,
                end_date   = endDate,
                start_row  = startRow,
                end_row    = endRow,
                criteria   = criteria
            };

            string response = req.ProcessTransaction(HttpMethod.Post, url, query);

            Console.WriteLine("\n\n" + response + "\n\n");

            Records records = JsonConvert.DeserializeObject <Records>(response);

            return(records.records);
        }
Пример #8
0
        private ProfileResponse CreateProfile(Token token, Card card, Address billingAddress, CustomFields customFields, string language, string comment, int?subMerchantId = null)
        {
            if (token == null && card == null)
            {
                Gateway.ThrowIfNullArgument(null, "Card and Token both null!");
            }

            if (token == null)
            {
                Gateway.ThrowIfNullArgument(card, "card");
                Gateway.ThrowIfNullArgument(card.Number, "card.number");
                Gateway.ThrowIfNullArgument(card.Name, "card.name");
                Gateway.ThrowIfNullArgument(card.ExpiryMonth, "card.expiryMonth");
                Gateway.ThrowIfNullArgument(card.ExpiryYear, "card.expiryYear");
            }
            if (card == null)
            {
                Gateway.ThrowIfNullArgument(token, "token");
                Gateway.ThrowIfNullArgument(token.Name, "token.name");
                Gateway.ThrowIfNullArgument(token.Code, "token.code");
            }


            string url = BamboraUrls.BaseProfilesUrl
                         .Replace("{v}", String.IsNullOrEmpty(_configuration.Version) ? "v1" : "v" + _configuration.Version)
                         .Replace("{p}", String.IsNullOrEmpty(_configuration.Platform) ? "www" : _configuration.Platform);


            HttpsWebRequest req = new HttpsWebRequest()
            {
                MerchantId         = _configuration.MerchantId,
                SubMerchantId      = _configuration.SubMerchantId,
                Passcode           = _configuration.ProfilesApiPasscode,
                WebCommandExecutor = _webCommandExecuter
            };

            var profile = new {
                card    = card,
                token   = token,
                billing = billingAddress,
                custom  = customFields
            };

            string response = req.ProcessTransaction(HttpMethod.Post, url, profile);

            return(JsonConvert.DeserializeObject <ProfileResponse>(response));
        }
Пример #9
0
        /// <summary>
        /// Internal handling of the Pre-auth requests after the 'complete' parameter
        /// has been modified on the various PaymentRequest objects.
        /// </summary>
        /// <returns>The auth.</returns>
        /// <param name="paymentRequest">Payment request.</param>
        private PaymentResponse PreAuthInternal(PaymentRequest paymentRequest)
        {
            string url = BeanstreamUrls.BasePaymentsUrl
                         .Replace("{v}", String.IsNullOrEmpty(_configuration.Version) ? "v1" : "v" + _configuration.Version)
                         .Replace("{p}", String.IsNullOrEmpty(_configuration.Platform) ? "www" : _configuration.Platform);


            HttpsWebRequest req = new HttpsWebRequest()
            {
                MerchantId         = _configuration.MerchantId,
                Passcode           = _configuration.PaymentsApiPasscode,
                WebCommandExecutor = _webCommandExecuter
            };


            string response = req.ProcessTransaction(HttpMethod.Post, url, paymentRequest);

            return(JsonConvert.DeserializeObject <PaymentResponse>(response));
        }
Пример #10
0
        /// <summary>
        /// Removes the card from the profile.
        /// Card IDs are their index in getCards(), starting a 1 and going up: 1, 2, 3, 4...
        /// </summary>
        /// <returns>The card.</returns>
        /// <param name="profileId">Profile identifier.</param>
        /// <param name="cardId">Card identifier.</param>
        public ProfileResponse RemoveCard(string profileId, int cardId)
        {
            string url = BeanstreamUrls.CardsUrl
                         .Replace("{v}", String.IsNullOrEmpty(_configuration.Version) ? "v1" : "v" + _configuration.Version)
                         .Replace("{p}", String.IsNullOrEmpty(_configuration.Platform) ? "www" : _configuration.Platform)
                         .Replace("{id}", profileId)
                         + "/" + cardId;

            HttpsWebRequest req = new HttpsWebRequest()
            {
                MerchantId         = _configuration.MerchantId,
                Passcode           = _configuration.ProfilesApiPasscode,
                WebCommandExecutor = _webCommandExecuter
            };

            string response = req.ProcessTransaction(HttpMethod.Delete, url);

            return(JsonConvert.DeserializeObject <ProfileResponse>(response));
        }
Пример #11
0
        public Transaction GetTransaction(string paymentId)
        {
            string url = BeanstreamUrls.GetPaymentUrl
                         .Replace("{v}", String.IsNullOrEmpty(_configuration.Version) ? "v1" : "v" + _configuration.Version)
                         .Replace("{p}", String.IsNullOrEmpty(_configuration.Platform) ? "www" : _configuration.Platform)
                         .Replace("{id}", paymentId);


            HttpsWebRequest req = new HttpsWebRequest()
            {
                MerchantId         = _configuration.MerchantId,
                Passcode           = _configuration.PaymentsApiPasscode,
                WebCommandExecutor = _webCommandExecuter
            };


            string response = req.ProcessTransaction(HttpMethod.Get, url);

            return(JsonConvert.DeserializeObject <Transaction>(response));
        }
Пример #12
0
        /// <summary>
        /// Make a credit card payment.
        /// </summary>
        /// <returns>he payment result</returns>
        /// <param name="paymentRequest">Payment request.</param>
        public PaymentResponse MakePayment(PaymentRequest paymentRequest)
        {
            Gateway.ThrowIfNullArgument(paymentRequest, "paymentRequest");

            string url = BamboraUrls.BasePaymentsUrl
                         .Replace("{v}", String.IsNullOrEmpty(_configuration.Version) ? "v1" : "v" + _configuration.Version)
                         .Replace("{p}", String.IsNullOrEmpty(_configuration.Platform) ? "www" : _configuration.Platform);


            HttpsWebRequest req = new HttpsWebRequest()
            {
                MerchantId         = _configuration.MerchantId,
                Passcode           = _configuration.PaymentsApiPasscode,
                WebCommandExecutor = _webCommandExecuter
            };

            string response = req.ProcessTransaction(HttpMethod.Post, url, paymentRequest);

            return(JsonConvert.DeserializeObject <PaymentResponse>(response));
        }
Пример #13
0
        /// <summary>
        /// Retrieve a profile using the profile's ID. If you want to modify a profile
        /// you must first retrieve it using this method.
        /// </summary>
        /// <returns>The profile.</returns>
        /// <param name="profileId">Profile identifier.</param>
        public PaymentProfile GetProfile(string profileId)
        {
            string url = BeanstreamUrls.BaseProfilesUrl
                         .Replace("{v}", String.IsNullOrEmpty(_configuration.Version) ? "v1" : "v" + _configuration.Version)
                         .Replace("{p}", String.IsNullOrEmpty(_configuration.Platform) ? "www" : _configuration.Platform)
                         + "/" + profileId;


            HttpsWebRequest req = new HttpsWebRequest()
            {
                MerchantId         = _configuration.MerchantId,
                Passcode           = _configuration.ProfilesApiPasscode,
                WebCommandExecutor = _webCommandExecuter
            };

            string         response = req.ProcessTransaction(HttpMethod.Get, url);
            PaymentProfile profile  = JsonConvert.DeserializeObject <PaymentProfile>(response);

            profile.Id = profileId;
            return(profile);
        }
Пример #14
0
        /// <summary>
        /// Return a previous swipe payment that was not made through Beanstream. Use this if you would like to
        /// return a payment but that payment was performed on another payment service.
        ///
        /// You must have this capability enabled on your account by calling Beanstream support. It is dangerous to
        /// have it enabled as the API will not check if you have a transaction ID.
        /// </summary>
        /// <returns>The return result</returns>
        /// <param name="returnRequest">Return request.</param>
        public PaymentResponse UnreferencedReturn(UnreferencedSwipeReturnRequest returnRequest)
        {
            Gateway.ThrowIfNullArgument(returnRequest, "returnRequest");

            string url = BeanstreamUrls.ReturnsUrl
                         .Replace("{v}", String.IsNullOrEmpty(_configuration.Version) ? "v1" : "v" + _configuration.Version)
                         .Replace("{p}", String.IsNullOrEmpty(_configuration.Platform) ? "www" : _configuration.Platform)
                         .Replace("{id}", "0");        // uses ID 0 since there is no existing payment ID for this transaction


            HttpsWebRequest req = new HttpsWebRequest()
            {
                MerchantId         = _configuration.MerchantId,
                Passcode           = _configuration.PaymentsApiPasscode,
                WebCommandExecutor = _webCommandExecuter
            };

            returnRequest.MerchantId = _configuration.MerchantId.ToString();

            string response = req.ProcessTransaction(HttpMethod.Post, url, returnRequest);

            return(JsonConvert.DeserializeObject <PaymentResponse>(response));
        }
Пример #15
0
        /// <summary>
        /// Add a new tokenized card to the profile. It gets appended to the end of the list of cards.
        /// Make sure your Merchant account can support more cards. The default amount is 1.
        /// You can change this limit in the online Members area for Merchants located at:
        /// https://www.beanstream.com/admin/sDefault.asp
        /// and heading to Configuration -> Payment Profile Configuration
        /// </summary>
        /// <returns>The response</returns>
        /// <param name="profileId">Profile identifier.</param>
        /// <param name="card">Card.</param>
        public ProfileResponse AddCard(string profileId, Token token)
        {
            string url = BeanstreamUrls.CardsUrl
                         .Replace("{v}", String.IsNullOrEmpty(_configuration.Version) ? "v1" : "v" + _configuration.Version)
                         .Replace("{p}", String.IsNullOrEmpty(_configuration.Platform) ? "www" : _configuration.Platform)
                         .Replace("{id}", profileId);

            HttpsWebRequest req = new HttpsWebRequest()
            {
                MerchantId         = _configuration.MerchantId,
                Passcode           = _configuration.ProfilesApiPasscode,
                WebCommandExecutor = _webCommandExecuter
            };

            // the json wants to be wrapped in a 'token' group
            var c = new {
                token
            };

            string response = req.ProcessTransaction(HttpMethod.Post, url, c);

            return(JsonConvert.DeserializeObject <ProfileResponse>(response));
        }