private HttpResponseMessage ProcessVisaEndpointMessage(VisaEPMRequestType type) { VisaEpmResponse response = new VisaEpmResponse { StatusCode = "0", ErrorMessage = "" }; CommerceContext context = null; string message = null; try { EndPointMessageRequest request = ParseRequest(); context = CommerceContext.BuildSynchronousContext("Incoming Visa Request", request, response); message = Request.Content.ReadAsStringAsync().Result; context.Log.Verbose("Incoming POST payload from Visa : \r\n\"{0}\".", message); //If Visa do not send StatementCredit message on a new endpoint then we have to detect from the message if it is StatementCredit message if (request.MessageName != null && request.MessageName.IndexOf("StatementCreditEndPoint", StringComparison.OrdinalIgnoreCase) >= 0) { type = VisaEPMRequestType.OnStatementCredit; } //if (IsAuthorized(context)) { Stopwatch callTimer = Stopwatch.StartNew(); var httpStatusCode = HttpStatusCode.OK; if (type == VisaEPMRequestType.OnClear) { httpStatusCode = ProcessVisaEndpointMessage(context, callTimer, () => { VisaRedeemDealExecutor visaEndpointMessageProcessor = new VisaRedeemDealExecutor(context); return(visaEndpointMessageProcessor.Execute()); }); } else if (type == VisaEPMRequestType.OnAuth) { httpStatusCode = ProcessVisaEndpointMessage(context, callTimer, () => { VisaAuthorizationExecutor visaEndpointMessageProcessor = new VisaAuthorizationExecutor(context); return(visaEndpointMessageProcessor.Execute()); }); } else if (type == VisaEPMRequestType.OnStatementCredit) { httpStatusCode = ProcessVisaEndpointMessage(context, callTimer, () => { VisaStatementCreditExecutor visaEndpointMessageProcessor = new VisaStatementCreditExecutor(context); return(visaEndpointMessageProcessor.Execute()); }); } else { httpStatusCode = HttpStatusCode.BadRequest; context.Log.Warning("Incoming request message is not of type auth, clearing or statementCredit. Request : {0} ", request.ToString()); } if (httpStatusCode != HttpStatusCode.OK) { response.StatusCode = "100"; response.ErrorMessage = "General Input Error"; context.Log.Warning("Incoming {0} request processing error. Request : {1} ", type, request.ToString()); } return(ComposeResponseMessage(response, context, request.MessageId)); } //return new HttpResponseMessage(HttpStatusCode.Unauthorized); } catch (Exception ex) { try { if (context == null) { context = CommerceContext.BuildSynchronousContext("Incoming Visa Request", Request, response); } if (message == null) { try { message = Request.Content.ReadAsStringAsync().Result; } catch { } } context.Log.Error("{0} call ended with an error. Message:{1}", ex, context.ApiCallDescription, message); } catch { } response.StatusCode = "100"; response.ErrorMessage = "General Input Error"; return(ComposeResponseMessage(response)); } }
/// <summary> /// Executes processing of the request. /// </summary> public ResultCode Execute() { ResultCode result = ResultCode.None; EndPointMessageRequest request = (EndPointMessageRequest)Context[Key.Request]; Dictionary <String, String> messageElementCollectionDictionary = new Dictionary <string, string>(); foreach (MessageElementsCollection c in request.MessageElementsCollection) { messageElementCollectionDictionary.Add(c.Key, c.Value); } String requestType = messageElementCollectionDictionary[VisaEPMConstants.EventEventType]; if (string.Equals(requestType, VisaEPMConstants.OnClearEventTypeValue, StringComparison.OrdinalIgnoreCase)) { Dictionary <String, String> userDefinedFieldsCollectionDictionary = new Dictionary <string, string>(); foreach (UserDefinedFieldsCollection c in request.UserDefinedFieldsCollection) { userDefinedFieldsCollectionDictionary.Add(c.Key, c.Value); } String cardId = request.CardId; String merchantId = messageElementCollectionDictionary[VisaEPMConstants.TransactionVisaMerchantId]; String storeId = messageElementCollectionDictionary[VisaEPMConstants.TransactionVisaStoreId]; // Marshal the redeem deal request into a RedeemedDeal object. RedeemedDeal redeemedDeal = new RedeemedDeal() { AnalyticsEventId = Guid.NewGuid() }; Context[Key.RedeemedDeal] = redeemedDeal; redeemedDeal.CallbackEvent = RedemptionEvent.Settlement; redeemedDeal.PartnerRedeemedDealScopeId = messageElementCollectionDictionary[VisaEPMConstants.TransactionVipTransactionId]; redeemedDeal.PartnerRedeemedDealId = messageElementCollectionDictionary[VisaEPMConstants.TransactionTransactionID]; String time = messageElementCollectionDictionary[VisaEPMConstants.TransactionTimeStampYYMMDD]; // UTC Time: 2013-12-05T07:25:06 redeemedDeal.PurchaseDateTime = DateTime.Parse(time); redeemedDeal.PurchaseDateTime = DateTime.SpecifyKind(redeemedDeal.PurchaseDateTime, DateTimeKind.Utc); String amount = messageElementCollectionDictionary[VisaEPMConstants.TransactionClearingAmount]; redeemedDeal.AuthorizationAmount = AmexUtilities.ParseAuthAmount(amount); redeemedDeal.Currency = VisaConstants.CurrencyUSD; Context[Key.PartnerCardId] = cardId; Context[Key.PartnerClaimedDealId] = null; // could be the BingOfferDealId Context[Key.PartnerMerchantId] = string.Format("{0};{1}", merchantId, storeId); Context[Key.OutletPartnerMerchantId] = null; // storedId; Context[Key.CreditStatus] = CreditStatus.ClearingReceived; string merchantCity = messageElementCollectionDictionary.NullIfNotExist(VisaEPMConstants.MerchantCityString); string merchantState = messageElementCollectionDictionary.NullIfNotExist(VisaEPMConstants.MerchantStateString); var merchantPostalCode = messageElementCollectionDictionary.NullIfNotExist(VisaEPMConstants.MerchantPostalCodeString); KeyTransactionData keyTransactionData = new KeyTransactionData { MerchantCity = merchantCity, MerchantState = merchantState, MerchantPostalCode = merchantPostalCode }; Context[Key.PartnerData] = keyTransactionData.XmlSerialize(); LogRedeedmedDealRequestParameters(redeemedDeal); result = AddRedeemedDeal(); Context[Key.ResultCode] = result; // If the deal was successfully redeemed, apply any applicable rewards. if (result == ResultCode.Created) { RedeemedDealInfo redeemedDealInfo = (RedeemedDealInfo)Context[Key.RedeemedDealInfo]; if (redeemedDealInfo != null) { // Update analytics. SharedUserLogic sharedUserLogic = new SharedUserLogic(Context, CommerceOperationsFactory.UserOperations( Context)); Context[Key.GlobalUserId] = redeemedDealInfo.GlobalUserId; User user = sharedUserLogic.RetrieveUser(); if (user != null) { Analytics.AddRedemptionEvent(redeemedDealInfo.GlobalUserId, redeemedDeal.AnalyticsEventId, user.AnalyticsEventId, redeemedDealInfo.ParentDealId, redeemedDealInfo.Currency, redeemedDeal.AuthorizationAmount, redeemedDealInfo.DiscountAmount, redeemedDealInfo.GlobalId, (string)Context[Key.PartnerMerchantId]); } // Add rewards for any active rewards program. AddRedemptionRewards(); } } } return(result); }
/// <summary> /// Executes processing of the request. /// </summary> public ResultCode Execute() { ResultCode result = ResultCode.None; EndPointMessageRequest request = (EndPointMessageRequest)Context[Key.Request]; Dictionary <String, String> messageElementCollectionDictionary = new Dictionary <string, string>(); foreach (MessageElementsCollection c in request.MessageElementsCollection) { messageElementCollectionDictionary.Add(c.Key, c.Value); } String requestType = messageElementCollectionDictionary[VisaEPMConstants.EventEventType]; if (!string.Equals(requestType, VisaEPMConstants.OnAuthEventTypeValue, StringComparison.OrdinalIgnoreCase)) { throw new ArgumentException("Wrong request message"); } Dictionary <String, String> userDefinedFieldsCollectionDictionary = new Dictionary <string, string>(); foreach (UserDefinedFieldsCollection c in request.UserDefinedFieldsCollection) { userDefinedFieldsCollectionDictionary.Add(c.Key, c.Value); } String cardId = request.CardId; String merchantId = messageElementCollectionDictionary[VisaEPMConstants.TransactionVisaMerchantId]; String storeId = messageElementCollectionDictionary[VisaEPMConstants.TransactionVisaStoreId]; SharedAuthorizationLogic sharedAuthorizationLogic = new SharedAuthorizationLogic(Context, CommerceOperationsFactory.AuthorizationOperations(Context)); Authorization authorization = new Authorization(); Context[Key.Authorization] = authorization; // Populate the Authorization. String amount = messageElementCollectionDictionary[VisaEPMConstants.TransactionTransactionAmount]; authorization.AuthorizationAmount = AmexUtilities.ParseAuthAmount(amount); authorization.Currency = VisaConstants.CurrencyUSD; authorization.TransactionScopeId = messageElementCollectionDictionary[VisaEPMConstants.TransactionVipTransactionId]; authorization.TransactionId = messageElementCollectionDictionary[VisaEPMConstants.TransactionTransactionID]; String time = messageElementCollectionDictionary[VisaEPMConstants.TransactionTimeStampYYMMDD]; // UTC time: 2013-12-05T07:25:06 authorization.PurchaseDateTime = DateTime.Parse(time); authorization.PurchaseDateTime = DateTime.SpecifyKind(authorization.PurchaseDateTime, DateTimeKind.Utc); // Populate the Auth Info. Context[Key.PartnerCardId] = cardId; Context[Key.PartnerMerchantId] = string.Format("{0};{1}", merchantId, storeId); string merchantCity = messageElementCollectionDictionary.NullIfNotExist(VisaEPMConstants.MerchantCityString); string merchantState = messageElementCollectionDictionary.NullIfNotExist(VisaEPMConstants.MerchantStateString); string merchantPostalCode = messageElementCollectionDictionary.NullIfNotExist(VisaEPMConstants.MerchantPostalCodeString); KeyTransactionData keyTransactionData = new KeyTransactionData { MerchantCity = merchantCity, MerchantState = merchantState, MerchantPostalCode = merchantPostalCode }; Context[Key.PartnerData] = keyTransactionData.XmlSerialize(); LogAuthorizationRequest(authorization, Context); result = sharedAuthorizationLogic.AddAuthorization(); Context[Key.ResultCode] = result; if (result == ResultCode.Created) { // Send notification. var notifyAuthorization = new NotifyAuthorization(Context); Context[Key.CardBrand] = CardBrand.Visa; Task.Run(new Action(notifyAuthorization.SendNotification)); } return(result); }