尝试从 Stringbuilder 字符串获取 XML 值 - C#(Moneris 数据预加载)
Trying to get XML value from Stringbuilder String - C# (Moneris Data Preload)
我正在编写代码以从 Stringbuilder 中提取特定值。
我的想法是,我正在向 Moneris 提交一个表单 - 一个支付网关(我正在使用示例密钥和 ID,因此这里没有提到机密信息)以接收来自 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).
请查看我从 Moneris 收到的回复的屏幕截图 https://snag.gy/OHbk6y.jpg。
我有兴趣从我在上面的屏幕截图中突出显示的 "ticket" 节点中提取值。
这是我正在编写的代码,用于从 "ticket" 节点提取值。
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 的响应时从浏览器的源代码中提取的值。
你能帮我解决这个问题吗?
您可以使用 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;
}
我正在编写代码以从 Stringbuilder 中提取特定值。 我的想法是,我正在向 Moneris 提交一个表单 - 一个支付网关(我正在使用示例密钥和 ID,因此这里没有提到机密信息)以接收来自 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).
请查看我从 Moneris 收到的回复的屏幕截图 https://snag.gy/OHbk6y.jpg。
我有兴趣从我在上面的屏幕截图中突出显示的 "ticket" 节点中提取值。
这是我正在编写的代码,用于从 "ticket" 节点提取值。
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 的响应时从浏览器的源代码中提取的值。
你能帮我解决这个问题吗?
您可以使用 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;
}