1

这是我的代码:

private void button1_Click(object sender, EventArgs e)
    {
        var process = new com.globalpay.certapia.GlobalPayments();
        var response = process.ProcessCreditCard("xxxxxx", "xxxxxx", "Sale",
            textBox1.Text, textBox2.Text, "", "", textBox3.Text, "",
            "", "", "", "", "");

        MessageBox.Show("RespMSG: " + response.RespMSG
            + "\nMessage: " + response.Message
            + "\nAuthCode: " + response.AuthCode
            + "\nPNRef: " + response.PNRef
            + "\nHostCode: " + response.HostCode
            + "\nCVResultTXT: " + response.GetCVResultTXT
            + "\nCommercialCard: " + response.GetCommercialCard
            + "\nExtData: " + response.ExtData);
    }

输出如下:

在此处输入图像描述

在 ExtData 部分我很困惑,我不知道如何提取这些值,例如获取 CardType、BatchNum、MID、TransID 的值。

我怎么可能提取这些值?

任何建议或建议如何实现这一目标都会有很大帮助。谢谢!

基于 api 的文档:

 <?xml version="1.0" encoding="utf-8" ?>
<Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="GlobalPayments">
<Result>0</Result>
<RespMSG>Approved</RespMSG>
<Message>AP</Message>
<AuthCode>000014</AuthCode>
<PNRef>564286</PNRef>
<HostCode>0032</HostCode>
<GetCVResultTXT>Service Not Requested</GetCVResultTXT>
<GetCommercialCard>False</GetCommercialCard>
<ExtData>InvNum=1234567900,CardType=MasterCard,BatchNum=0011<BatchNum>0011
</BatchNum><ReceiptData><MID>4910354</MID><Trans_Id>MCC1421250315
</Trans_Id></ReceiptData></ExtData>
</Response>
4

3 回答 3

2

这似乎是响应格式不正确的情况。这在这类 Web 服务中很常见。不要指望它会很快好转。

您只需要强制解析并希望他们不会更改它,或者它会根据您得到的响应类型进行更改。

一般算法是:

  1. 将 2 个不同的部分分开
    • 逗号分隔的等值部分
    • XML 格式的部分
    • 这可以通过找到 '<' 的第一个索引并在此位置将字符串拆分为 2 来完成
  2. 用不同的算法解析这两个部分。在第一种情况下,解析应该不是问题。只需沿 ',' 和 '=' 拆分,就可以得到键值对。在第二种情况下,您应该使用一些 XML 解析库来帮助您。同样,您会得到一堆键值对。
  3. 将所有键值对放入字符串/字符串字典中。
于 2013-01-13T06:48:12.983 回答
2

使用 LINQ 将是最简单的方法,假设响应是一个字符串或可以转换为字符串的东西:

// XDocument.Parse will load a string into the XDocument object.
XDocument xDoc = XDocument.Parse(response);
// XNamespace is required in order to parse the document.
XNamespace ns = "GlobalPayments";

var resp = (from x in xDoc.Descendants(ns + "ExtData")
            select new
            {
                ExtData = x.Value,
                BatchNum = x.Element(ns + "BatchNum").Value,
                MID = x.Element(ns + "MID").Value,
                TransID = x.Element(ns + "TransID").Value
            }).SingleOrDefault();

然后,您将拥有一个resp具有以下属性的匿名类型 ( ):

resp.ExtData = "InvNum=1234567900,CardType=MasterCard,BatchNum=0011"
resp.BatchNum = "0011"
resp.MID = "4910354"
resp.TransID = "MCC1421250315"

然后,您可以在 ExtData 上使用普通的 String.Split 操作从您需要的字符串中获取数据。

不是最漂亮的解决方案,但有时您必须使用蛮力方法。采用和修改以满足您的需求/口味。

于 2013-01-13T07:28:38.043 回答
1

您需要使用 String.IndexOf..) 手动提取它们,然后使用 String.SubString(..) 等

var cardType = data.Substring(data.IndexOf("<BatchNum>"), data.IndexOf("</BatchNum>") - data.IndexOf("<BatchNum>"));

当然有一些例外处理代码......

于 2013-01-13T06:44:44.713 回答