/// <summary> /// Sends request to the server and returns responses. /// </summary> /// <returns> /// Array of Response returned by server. /// </returns> public Response[] GetResponses() { List<Response> responses = new List<Response>(); HttpWebRequest request = CreateWebRequest(); HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse(); string responseText = new StreamReader(webResponse.GetResponseStream()).ReadToEnd(); XElement responseXml = XElement.Parse(responseText); IEnumerable<XElement> envelopeElements = responseXml.Descendants(OperationEnvelopeNodeName); foreach (XElement envelope in envelopeElements) { Response liqpayResponse; string encodedOperationXml = envelope.Element(OperationXmlNodeName).Value.Trim(); string operationXml = Encoding.UTF8.GetString(Convert.FromBase64String(encodedOperationXml)); string signature = envelope.Element(SignatureNodeName).Value.Trim(); if (this.SignatureProvider.GenerateSignature(operationXml) == signature) liqpayResponse = Response.Create(operationXml); else liqpayResponse = new InvalidResponse(ErrorCode.SignatureError, "Signatures does not match.", responseText); responses.Add(liqpayResponse); } return responses.ToArray(); }
/// <summary> /// Parses server operation response XML and creates instance of class derived from Response which describes concrete response. /// </summary> /// <param name="operationXml"> /// Operation response XML returned by server /// </param> /// <returns> /// Instance of class derived from Response which represents parsed operation response /// </returns> public static Response Create(string operationXml) { Response response; try { XElement operationXmlElement = XElement.Parse(operationXml); string action = operationXmlElement.Element(ActionNodeName).Value.Trim(); switch (action.ToLower(CultureInfo.InvariantCulture)) { case LiqPayAction.SendMoney: response = SendMoneyResponse.FromXml(operationXmlElement); break; case LiqPayAction.ViewBalance: response = ViewBalanceResponse.FromXml(operationXmlElement); break; case LiqPayAction.ViewTransaction: response = ViewTransactionResponse.FromXml(operationXmlElement); break; case LiqPayAction.PhoneCredit: response = PhoneCreditResponse.FromXml(operationXmlElement); break; default: throw new LiqPayException(ErrorCode.UnknownAction, string.Format(CultureInfo.InvariantCulture, "Unknown LiqPay action: '{0}'.", action), operationXml); } response.Action = action; response.ApiVersion = operationXmlElement.Element(VersionNodeName).Value.Trim(); response.Status = operationXmlElement.Element(StatusNodeName).Value.Trim(); if (!response.Success) { response.Code = operationXmlElement.Element(CodeNodeName).Value.Trim(ResponseTrimChars); response.ResponseDescription = operationXmlElement.Element(ResponseDescriptionNodeName).Value.Trim(ResponseTrimChars); } } catch { response = new InvalidResponse(); response.ResponseDescription = "Response xml is not well formed."; } response.ResponseText = operationXml; return response; }