PayPal SOAP API响应需要手动解析

maa*_*enh 2 c# soap paypal visual-studio-2010

我目前正在开发一个Web项目,其中包括将PayPal的Express Checkout作为支付服务实施.该项目在C#中,我使用的是Visual Studio 2010和PayPal API的SOAP版本.我使用的API的版本是91.0(尝试将其切换到其他版本,但问题仍然存在),我正在沙箱中进行开发.

在SOAP API开发人员指南中,我发现WSDL将我的项目中的服务作为Web引用导入.我可以完成Express Checkout付款流程的每一步.提出请求是在公园散步,使用服务的响应,但不是.

由于某种原因,响应中的数据字段不会像我期望的那样自动填充.所有有用字段均为空.因此,我手动必须在响应中解析XML字符串以获取我需要的数据,而不是仅仅访问正确的对象.不用说,我不想这样工作.

支付流程的最后一步(DoExpressCheckout)的快速示例:

PayPalAPIAASoapBinding apiaa = new PayPalAPIAASoapBinding();
apiaa.RequesterCredentials = ... ;

DoExpressCheckoutPaymentReq decreq = new DoExpressCheckoutPaymentReq();
decreq.DoExpressCheckoutPaymentRequest = new DoExpressCheckoutPaymentRequestType();
/* Filling in all the fields required */

DoExpressCheckoutPaymentResponseType decres = apiaa.DoExpressCheckoutPayment(decreq);
Run Code Online (Sandbox Code Playgroud)

decres对象通常有一个字段DoExpressCheckoutPaymentResponseDetails,其中包含我需要的所有详细信息.根据手册和我的期望,我应该能够,例如,阅读响应中返回的令牌,如下所示:

string token = decres.DoExpressCheckoutPaymentResponseDetails.Token;
Run Code Online (Sandbox Code Playgroud)

相反,DoExpressCheckoutPaymentResponseDetails字段为空,我得到这样的标记:

string token = decres.Any.ChildNodes[0].InnerText;
Run Code Online (Sandbox Code Playgroud)

我没有收到PayPal服务的任何错误代码.

更奇怪的是当我使用TransactionSearch函数来查找多个事务时.假设函数返回50个事务.49个事务填充在正确的对象中,人们希望在阅读API文档后找到它们.但是,第一个事务不是也必须从响应中的Any字段手动解析.

有没有人曾经遇到过相同或类似的问题?

Fyi:我习惯编写Web应用程序PHP.根据具体需求,我在C#中这样做.这是标准的C#或Visual Studio行为(怀疑它)还是我在Visual Studio中以错误的方式构建/配置SOAP服务的一个方面?

Ty *_*y H 5

已解决:解决方案是停止使用传统的"网络参考",而是使用更新的标准服务参考.

我的大部分代码都适用于新的服务引用,我只需要设置Web.config并改变我创建服务实例的方式.

返回新的PayPalAPIAAInterfaceClient("PayPalAPIAA"); 取代了PayPalAPIAASoapBinding.

原帖后跟.......

我是第二个问题,这不是凭证无效,交易失败或API版本不匹配的问题.我正在做的一切正确,响应包含一个令牌,但它进入了anyField变量而不是它所属的位置.

在我从VS 2008 .Net 3.5升级到VS 2010 .Net 4后,这个错误令人头疼.我怀疑该错误不在PayPal方面,而是.Net 4 XML Parsing中的一个错误.

令牌应该进入Token属性......

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.233")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:ebay:api:PayPalAPI")]
public partial class SetExpressCheckoutResponseType : AbstractResponseType {

    private string tokenField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Order=0)]
    public string Token {
        get {
            return this.tokenField;
        }
        set {
            this.tokenField = value;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

相反,它最终在这里......

[System.Xml.Serialization.XmlAnyElementAttribute()]
        public System.Xml.XmlElement Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
            }
        }
Run Code Online (Sandbox Code Playgroud)

我可能能够在Reference.cs文件中修复此问题,但是一旦我更新了Web服务引用,我的修复就会被覆盖.

这是其他人有同样的问题,但他们的解决方案对我不起作用. https://www.x.com/developers/paypal/forums/soap/paypal-api-aa-and-net-wcf-undeserialized-fields

救命!!