我有一个本地托管的WCF服务,它与PayPal的API进行通信以进行付款。WCF请求失败并返回有效请求
这是我的服务合同;
[DataContract]
public class ProcessPaymentRequest
{
[DataMember]
public string CreditCardNumber { get; set; }
[DataMember]
public string Ccv2Number { get; set; }
[DataMember]
public string Email { get; set; }
[DataMember]
public decimal Amount { get; set; }
[DataMember]
public int ExpiryMonth { get; set; }
[DataMember]
public int ExpiryYear { get; set; }
}
我使用下面的代码调用服务;
var request = new ProcessPaymentRequest
{
Amount = proforma.Total,
CreditCardNumber = billingDetails.Number,
Ccv2Number = billingDetails.Code,
ExpiryMonth = 3,
ExpiryYear = 2014
};
var response = ServiceInvoker.Invoke<IPayments, ProcessPaymentRequest, ProcessPaymentResponse>(
"Payments",
request,
(proxy, req) => proxy.ProcessPayment(req));
if (response == null)
{
}
proforma.Total是十进制的(值为12);
public class Proforma
{
public decimal Total { get; set; }
}
在这种情况下,我的响应为空,这意味着失败付款。来自Paypal的潜在错误是OrderTotal无效。
这是在WCF中设置OrderTotal的代码(注意转换);
return new PaymentDetailsType
{
OrderTotal =
new BasicAmountType
{
currencyID = CurrencyCodeType.GBP,
Value = payment.Amount.ToString()
}
};
现在这是奇怪的事情。如果我将请求更改为;
var request = new ProcessPaymentRequest
{
Amount = 12,
CreditCardNumber = billingDetails.Number,
Ccv2Number = billingDetails.Code,
ExpiryMonth = 3,
ExpiryYear = 2014
};
它的工作原理!
如果我尝试设置request.Amount使用;
decimal totalAmount = proforma.Total;
它失败。
那么为什么使用request.Amount = 12
的呼叫工作,而其他值不是当值(十进制)是相同的?
您是否附加了一个调试器来验证第一个实例中的实际总数是12?我的另一个建议是使用Fiddler或Wireshark截获消息,以验证在每种情况下实际发送到PayPal的内容。 –
你是否已经通过这段代码并实际验证了“Total”字段的值?我意识到它应该如预期的那样,但是,这不会是第一次假设已经咬我。 –
@MikeParkhill对Fiddler的建议很好,我发现了这个问题。谢谢 – ChrisBint