我多年来一直在使用Authorize.NET的GetCustomerProfile,而且今天突然响应没有返回付款资料。它只返回一个配置文件数组,但所有重要字段(例如payment
)都为空。
(这是他们的CIM功能的一部分,其中返回了一个'模糊的付款资料,应该像XXXX1234一样)
我在Visual Studio中使用生成的代理到URL https://api.authorize.net/soap/v1/Service.asmx?WSDL
(生成References.cs文件)
答案 0 :(得分:3)
我在昨天,2015年11月3日刚刚开始的CreateCustomerPaymentProfile SOAP调用(通过.NET自动生成的代理)上遇到了类似的问题,尽管我们已成功连接SOAP CIM几年
我能够修复"做一个"更新服务参考"在Visual Studio中根据最新的WSDL重新生成代理类。 WSDL中有一些变化。
具体来说,在我的结尾,似乎响应在成功创建结束后不包括customerPaymentProfileId的值。实际上,他们实际上仍在发送这个值,但在XML响应中有一个新的字段,customerProfileId。正如Simon_Weaver在他的回答中提到的,Visual Studio生成的代理类具有正确反序列化所需字段的显式排序。以前添加的这个"未知"已知字段上方的字段导致它破坏了我的代码。
幸运的是,这个新的customerProfileId包含在他们最新的WSDL中,所以"更新服务参考"并重新编译修复了我的问题。
我非常详细地通知了Authorize.net对我的问题的支持,告诉他们他们需要在"序列结束时包含任何新字段。在WSDL文档中为了不破坏和客户端使用旧版本的WSDL。到目前为止,我还没有听到他们的回复,但我鼓励其他任何遇到过这个问题的人,即使你已经解决了这个问题,也可以通过support@authorize.net向他们报告,这样他们就不会# 39; t意外地再次这样做。
答案 1 :(得分:1)
西蒙,你好! 看起来Authorize.NET使用新字段更新了他们的服务,但忘了将它们添加到WSDL中。
这是我发送的示例请求(使用Fiddler拦截):
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<VsDebuggerCausalityData xmlns="http://schemas.microsoft.com/vstudio/diagnostics/servicemodelsink">uIDPo3vYq2eC/5VIuiUcm2hEtw8AABBBJr/dLQF7z02Y7UKwphq24W1n9j0XlQ1MiAlOjy5fO14ACQAA</VsDebuggerCausalityData>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<GetCustomerProfile xmlns="https://api.authorize.net/soap/v1/">
<merchantAuthentication>
<name>95U6bwXXXXX</name>
<transactionKey>8tf62gV7XXXXXX</transactionKey>
</merchantAuthentication>
<customerProfileId>37745529</customerProfileId>
</GetCustomerProfile>
</s:Body>
</s:Envelope>
这是回复:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<GetCustomerProfileResponse xmlns="https://api.authorize.net/soap/v1/">
<GetCustomerProfileResult>
<resultCode>Ok</resultCode>
<messages>
<MessagesTypeMessage>
<code>I00001</code>
<text>Successful.</text>
</MessagesTypeMessage>
</messages>
<profile>
<merchantCustomerId>33938</merchantCustomerId>
<email>4691705@EXAMPLE.COM</email>
<customerProfileId>37745529</customerProfileId>
<paymentProfiles>
<CustomerPaymentProfileMaskedType>
<billTo>
<firstName>TEST</firstName>
<lastName>USER</lastName>
<company>Defender Razor</company>
<address>1 RODEO DRIVE</address>
<city>BEVERLY HILLS</city>
<state>CA</state>
<zip>90210</zip>
<country>UNITED STATES</country>
</billTo>
<customerProfileId>0</customerProfileId>
<customerPaymentProfileId>34313485</customerPaymentProfileId>
<payment>
<creditCard>
<cardNumber>XXXX5108</cardNumber>
<expirationDate>XXXX</expirationDate>
</creditCard>
</payment>
</CustomerPaymentProfileMaskedType>
</paymentProfiles>
</profile>
</GetCustomerProfileResult>
</GetCustomerProfileResponse>
</soap:Body>
</soap:Envelope>
此处的所有内容都是正确的 - 您可以看到payment
节点正在正确发送。
但是 - 使用.NET反序列化时,属性的顺序很重要 - 正如生成的References.cs
文件中所指定的那样。
[System.Xml.Serialization.XmlElementAttribute(Order=0)]
事实证明,响应billTo
和customerProfileId
中添加了两个新字段,但它们未添加到WSDL中。
因此,当尝试反序列化时,找到billTo
字段,但这不是预期的 - 所以一切都以null结束。
如果你添加这两行(并注意将它们添加到这种类型),那么你可以重新生成references.cs文件(通过右键单击服务引用并重新生成文件)。
如果您是从网址https://api.authorize.net/soap/v1/Service.asmx?WSDL
生成代理,那么您需要在Service.wsdl
本地下载此文件并从那里生成代理。
<s:element minOccurs="1" maxOccurs="1" name="billTo" type="tns:CustomerAddressType"/>
<s:element minOccurs="1" maxOccurs="1" name="customerProfileId" type="s:long" />
<s:complexType name="CustomerPaymentProfileMaskedType">
<s:complexContent mixed="false">
<s:extension base="tns:CustomerPaymentProfileBaseType">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="billTo" type="tns:CustomerAddressType"/>
<s:element minOccurs="1" maxOccurs="1" name="customerProfileId" type="s:long" />
<s:element minOccurs="1" maxOccurs="1" name="customerPaymentProfileId" type="s:long" />
<s:element minOccurs="0" maxOccurs="1" name="payment" type="tns:PaymentMaskedType" />
<s:element minOccurs="0" maxOccurs="1" name="driversLicense" type="tns:DriversLicenseMaskedType" />
<s:element minOccurs="0" maxOccurs="1" name="taxId" type="s:string" />
</s:sequence>
</s:extension>
</s:complexContent>
</s:complexType>
在检测到之前我丢失了超过12小时的付款。幸运的是,我收到了客户的电子邮件,但这非常糟糕。您不能只将字段添加到订单重要的响应中。更糟糕的是,你不能忘记将它们添加到WSDL中。
这是我的快速解决方案。我可能会在某些时候切换到使用适当的API - 我已经向Authorize.net报告了这一点,希望他们也能做出回应。
这是我做出改变后References.cs的差异。如您所见,Order
属性已增加: