2

我目前正在开发一个 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);

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

string token = decres.DoExpressCheckoutPaymentResponseDetails.Token;

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

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

我没有从 PayPal 服务收到任何错误代码。

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

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

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

4

2 回答 2

6

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

我的大部分代码都可以在新的服务参考中正常工作,我只需要设置 Web.config 并更改创建服务实例的方式。

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

原帖如下......

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

在我从 VS 2008 .Net 3.5 升级到 VS 2010 .Net 4 后,这个错误引起了它的丑陋。我怀疑这个错误不在 PayPal 方面,而是在 .Net 4 XML Parsing 中的一个错误。

令牌应该在这里进入令牌属性...

[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

帮助!!

于 2012-09-16T06:04:44.617 回答
0

具体很难说。通常,这些字段在事务失败时为空,并在事务成功时出现。

decres.Ack打电话后查DoExpressCheckoutPayment吗?如果decres.AckAckCodeType.SuccessAckCodeType.SuccessWithWarning,则事务成功,您应该期望DoExpressCheckoutPaymentResponseDetails被填充。否则,交易失败,字段将为空。

于 2012-08-24T22:13:58.703 回答