/// <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)); }
/// <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)); }
/// <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)); }
/// <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]); }
/// <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 } }
/// <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)); }
/// <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); }
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)); }
/// <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)); }
/// <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)); }
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)); }
/// <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)); }
/// <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); }
/// <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)); }
/// <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)); }