【问题标题】:PayPal SOAP API reponses require manual parsingPayPal SOAP API 响应需要手动解析
【发布时间】:2012-08-19 19:57:22
【问题描述】:

我目前正在开展一个网络项目,其中包括将 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);

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

string token = decres.DoExpressCheckoutPaymentResponseDetails.Token;

相反,DoExpressCheckoutPaymentResponseDetails 字段为空,我得到了这样的令牌:

string token = decres.Any.ChildNodes[0].InnerText;

我没有收到任何来自 PayPal 服务的错​​误代码。

更奇怪的是,当我使用 TransactionSearch 功能查找多个交易时。假设函数返回 50 笔交易。 49 笔交易填写在正确的对象中,人们在阅读 API 文档后可以找到它们。然而,第一笔交易不是,必须从响应中的 Any 字段手动解析。

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

仅供参考:我习惯于用 PHP 编写 Web 应用程序。根据特定需求,我在 C# 中执行此操作。这是标准的 C# 或 Visual Studio 行为(怀疑)还是我在 Visual Studio 中以错误的方式执行/配置 SOAP 服务的一个方面?

【问题讨论】:

    标签: c# visual-studio-2010 soap paypal


    【解决方案1】:

    已解决:解决方案是停止使用旧版“网络参考”,改用较新的标准服务参考。

    我的大部分代码在新的服务参考中运行良好,我只需要设置 Web.config 并更改创建服务实例的方式。

    return new PayPalAPIAAInterfaceClient("PayPalAPIAA"); 取代了 PayPalAPIAASoapBinding。

    原帖关注.......

    我支持这个问题,这与无效的凭据、失败的交易或不匹配的 API 版本无关。我做的一切都是正确的,响应确实包含一个令牌,但它进入 anyField 变量而不是它所属的位置。

    在我从 VS 2008 .Net 3.5 升级到 VS 2010 .Net 4 后,这个 bug 长得很丑。我怀疑这个 bug 不是 PayPal 方面的,而是 .Net 4 XML Parsing 中的一个 bug。

    Token 应该在这里进入 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;
            }
        }
    }
    

    相反,它在这里结束......

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

    我或许可以在 Reference.cs 文件中修复此问题,但我的修复将在我更新 Web 服务引用后立即被覆盖。

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

    救命!!

    【讨论】:

    • 不幸的是,该链接已消失,但此评论为我解决了问题:...解决方案是将 [System.Xml.Serialization.XmlIgnoreAttribute()] 添加到 Any 属性。
    【解决方案2】:

    很难说清楚。通常,这些字段在事务失败时为空,并在事务成功时显示。

    在调用DoExpressCheckoutPayment 后,您是否在检查decres.Ack?如果decres.AckAckCodeType.SuccessAckCodeType.SuccessWithWarning,那么事务成功并且您应该期望DoExpressCheckoutPaymentResponseDetails 被填充。否则,交易失败,字段为空。

    【讨论】:

    • 感谢您的回复。我在调用该函数后正在检查。我刚刚检查了一下,decres.Ack 字段的值为 AckCodeType.Succes。当我在 VS 中调试时,base 下的所有字段(例如 Ack)都已正确填写。我遇到此问题的不仅仅是 DoExpressCheckoutPayment。 SetExpressCheckout、GetExpressCheckoutDetails、TransactionSearch等,都有这个问题。我尝试使用 wsdl-tool 手动重新生成服务合同,但这也没有解决问题。
    • 我使用由 SvcUtil.exe 生成的服务类...我以前从未见过您的问题。您是否尝试过 PayPal 支持?
    • 尚未尝试使用 SvcUtil。 PayPal 支持人员基本上告诉我,我的代码或工作方式存在“问题”,并且他们的服务工作正常。
    • 我用svcutil生成了接口。这是否意味着我真的必须自己编写所有逻辑?如果是的话,我会开始怀疑我为什么要开始这个项目。
    猜你喜欢
    • 2016-01-11
    • 2022-01-23
    • 1970-01-01
    • 2019-03-28
    • 2019-02-05
    • 2020-04-22
    • 2012-09-10
    • 1970-01-01
    相关资源
    最近更新 更多