Попытка получить значение XML из Stringbuilder String - C # (предварительная загрузка данных Moneris) - PullRequest
0 голосов
/ 26 июня 2018

Я пишу код для извлечения определенного значения из Stringbuilder.Идея заключается в том, что я отправляю форму в Moneris - Платежный шлюз (я использую образец ключа и идентификатор, поэтому здесь не упоминается конфиденциальная информация) для получения динамически сгенерированного ключа от Moneris.

Пожалуйста, смотрите мой код ниже:

StringBuilder sb = new StringBuilder();
    sb.Append("<html>");
    sb.AppendFormat(@"<body onload='document.forms[""form""].submit()'>");
    sb.AppendFormat("<form name='form' action='{0}' method='post'>", "https://esqa.moneris.com/HPPDP/index.php");
    sb.AppendFormat("<input type='hidden' name='ps_store_id' value='{0}'>", "R6SXStore3");
    sb.AppendFormat("<input type='hidden' name='hpp_key' value='{0}'>", "hpZPXLXZNBLF");
    sb.AppendFormat("<input type='hidden' name='charge_total' value='{0}'>", "2.00");
    sb.AppendFormat("<input type='hidden' name='hpp_preload' value='{0}'>", "");
    sb.AppendFormat("<input type='hidden' name='order_id' value='{0}'>", "");
    sb.Append("</form>");
    sb.Append("</body>");
    sb.Append("</html>");

Response.Write(sb.ToString()); // This is submitting the above form to the moneris (third party payment website and throwing values in a kind of XML format).

Пожалуйста, смотрите скриншот https://snag.gy/OHbk6y.jpg того, что я получаю от Moneris.

Я заинтересован визвлечение значения из узла «тикета», который я выделил на снимке экрана выше.

Это код, который я пишу, чтобы получить значение из узла «тикета».

XmlDocument xmlDoc = new XmlDocument();
//  string myXML = @"<!--?xml version='1.0' standalone='yes'?--><html><head></head><body><response><hpp_id>R6SXStore3</hpp_id><ticket>hpp1529956212E2mefmVB93Yu2taJy</ticket><order_id></order_id><response_code>1</response_code></response></body></html>";
string myXML = sb.ToString();
xmlDoc.LoadXml(myXML);
XmlNodeList parentNode = xmlDoc.GetElementsByTagName("response");
string xticket;
string xhpp_id;
foreach (XmlNode childrenNode in parentNode)
    {
        HttpContext.Current.Response.Write(childrenNode.SelectSingleNode("ticket").InnerText);
    }
Response.End();

Ошибка:

Когда я запускаю вышеупомянутый код, я вижу эту ошибку: Пожалуйста, смотрите скриншот https://snag.gy/PJMKqL.jpg

Однако, когда я отменяю комментарий моего кода, где я передаюжестко закодированное значение в переменной "myXML", тогда я получаю свой результат отлично.Значение в жестком коде - это то, что я извлекаю из исходного кода браузера, когда получаю ответ от Moneris.

Не могли бы вы помочь мне решить эту проблему.

1 Ответ

0 голосов
/ 26 июня 2018

Вы можете использовать WebClient для этого.Я также добавил несколько строк для работы над SSL, если вам это нужно.

public void test()
    {
        var postData = "ps_store_id=R6SXStore3";
        postData += "&hpp_key=hpZPXLXZNBLF";
        postData += "&charge_total=2.00";
        postData += "&hpp_preload=";
        postData += "&order_id=";

        var encoding = new ASCIIEncoding();
        byte[] data = encoding.GetBytes(postData);

        var myRequest = (HttpWebRequest)WebRequest.Create("https://esqa.moneris.com/HPPDP/index.php");
        myRequest.Method = "POST";
        myRequest.ContentType = "application/x-www-form-urlencoded";
        myRequest.ContentLength = data.Length;

        //This code is to work using SSL
        ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications);
        ServicePointManager.Expect100Continue = true;
        ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

        //Post the content
        var newStream = myRequest.GetRequestStream();
        newStream.Write(data, 0, data.Length);
        newStream.Close();

        //Read the response
        var response = myRequest.GetResponse();
        var responseStream = response.GetResponseStream();
        var responseReader = new StreamReader(responseStream);
        var result = responseReader.ReadToEnd();

        responseReader.Close();
        response.Close();

        //Your original code
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.LoadXml(result); //Load the response into the XML
        XmlNodeList parentNode = xmlDoc.GetElementsByTagName("response");
        string xticket;
        string xhpp_id;
        foreach (XmlNode childrenNode in parentNode)
        {
            xticket = childrenNode.SelectSingleNode("ticket").InnerText;
            xhpp_id = childrenNode.SelectSingleNode("hpp_id").InnerText;
        }
    }

    public bool AcceptAllCertifications(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certification, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
    {
        return true;
    }
...