2012-11-08 104 views
0

我有一个本地托管的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的呼叫工作,而其他值不是当值(十进制)是相同的?

+1

您是否附加了一个调试器来验证第一个实例中的实际总数是12?我的另一个建议是使用Fiddler或Wireshark截获消息,以验证在每种情况下实际发送到PayPal的内容。 –

+0

你是否已经通过这段代码并实际验证了“Total”字段的值?我意识到它应该如预期的那样,但是,这不会是第一次假设已经咬我。 –

+0

@MikeParkhill对Fiddler的建议很好,我发现了这个问题。谢谢 – ChrisBint

回答

1

该值正在传递给该服务;

<a:Amount>12.0000</a:Amount> 

一个简单的改变,贝宝代码固定,

Value = payment.Amount.ToString("n2") 

感谢Mike Parkhill对Fiddler的建议,它让我发现问题。

+0

+1为大喊:)有趣的是,贝宝​​强制金额四舍五入到分。这是有道理的,但我从来没有想过这是一个问题。 –