2013-10-04 44 views
0

我遇到问题。 当我在我的网站项目(.net 4.0 aspx webform)上尝试使用PayPal进行付款时(PayPalCoreSDK版本为1.3.4.0,RestApiSDK版本为0.7.3.0)我有一个问题,错误消息。 但有时顺利运行 此消息是;paypal Rest Api错误请求被中止:请求被取消。直到写入所有字节才能关闭流

{"The request was aborted: The request was canceled."} 
{"Cannot close stream until all bytes are written."} 
    at System.Net.ConnectStream.CloseInternal(Boolean internalCall, Boolean aborting) 
    at System.Net.ConnectStream.System.Net.ICloseEx.CloseEx(CloseExState closeState) 
    at System.Net.ConnectStream.Dispose(Boolean disposing) 
    at System.IO.Stream.Close() 
    at System.IO.StreamWriter.Dispose(Boolean disposing) 
    at System.IO.TextWriter.Dispose() 
    at PayPal.HttpConnection.Execute(String payLoad, HttpWebRequest httpRequest) 
    at PayPal.PayPalResource.ConfigureAndExecute[T](APIContext apiContext, HttpMethod httpMethod, String resource, Dictionary`2 headersMap, String payLoad) 
    at PayPal.PayPalResource.ConfigureAndExecute[T](APIContext apiContext, HttpMethod httpMethod, String resource, String payLoad) 
    at PayPal.Api.Payments.Payment.Create(APIContext apiContext) 
    at DEPOSANAT.Web.CheckOut.PaymentWithPaypal(String totalAmount, String amountCurrency, String amountDetailShipping, String amountDetailSubTotal, String amountDetailTax, String orderID, String recipientName, String shipingAddressLine1, String shipingAddressLine2, List`1 shoppinListItems) in C:\Users\tahsin.ozcelik\Desktop\DEPOSANAT_Proj_TFS\DEPOSANAT\DEPOSANAT.Web\CheckOut.aspx.cs:line 181 
    at DEPOSANAT.Web.CheckOut.imgBtnPaypalOdeme_Click(Object sender, ImageClickEventArgs e) in C:\Users\tahsin.ozcelik\Desktop\DEPOSANAT_Proj_TFS\DEPOSANAT\DEPOSANAT.Web\CheckOut.aspx.cs:line 94 
    at System.Web.UI.WebControls.ImageButton.OnClick(ImageClickEventArgs e) 
    at System.Web.UI.WebControls.ImageButton.RaisePostBackEvent(String eventArgument) 
    at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 

我的代码;

private static string GetAccessToken() 
    { 
     string accessToken = new OAuthTokenCredential("XXXXXXXX", "XXXXXXXXX", GetConfig()).GetAccessToken(); 
     return accessToken; 
    } 
    public static APIContext GetAPIContext() 
    { 
     APIContext apiContext = new APIContext(GetAccessToken()); 
     apiContext.Config = GetConfig(); 
     return apiContext; 
    } 
    private static Dictionary<string, string> GetConfig() 
    { 
     Dictionary<string, string> configMap = new Dictionary<string, string>(); 
     configMap.Add("mode", "sandbox"); 
     configMap.Add("connectionTimeout", "36000"); 
     return configMap; 
    } 

APIContext apiContext = GetAPIContext();

 ProductLBll pLBll = new ProductLBll(); 
     List<Item> itms = new List<Item>(); 
     decimal productTotal = 0; 
     foreach (var myObj in shoppinListItems) 
     { 
      Item myAddItem = new Item(); 
      myAddItem.currency = amountCurrency; 
      myAddItem.name = pLBll.GetName(VariableHelper.CheckValueOfInt(myObj.ProductVariant.ProductId), SessionUser.LanguageTypeId);//pLBll.GetName(VariableHelper.CheckValueOfInt(myObj.ProductVariant.ProductId), SessionUser.LanguageTypeId); 
      myAddItem.price = String.Format("{0:0.00}", myObj.ProductVariant.CurrentAmount.Value);//String.Format("{0:0.00}", myObj.ProductVariant.CurrentAmount.Value); 
      myAddItem.quantity = shoppinListItems[0].Qtty.ToString();//myObj.Qtty.ToString(); 
      myAddItem.sku = myObj.ProductVariant.ProductId.HasValue ? myObj.ProductVariant.ProductId.Value.ToString() : "ID YOK"; 
      productTotal += myObj.ProductVariant.CurrentAmount.Value * myObj.Qtty;//myObj.ProductVariant.CurrentAmount.Value * myObj.Qtty; 
      itms.Add(myAddItem); 
     } 

     ItemList itemList = new ItemList(); 
     itemList.items = itms; 


     Payer payr = new Payer(); 
     payr.payment_method = "paypal"; 

     string baseURI = Request.Url.Scheme + "://" + Request.Url.Authority + "/odeme?"; 
     string requestUrl = Request.Url.OriginalString; 
     orderID = System.Guid.NewGuid().ToString(); 
     string returnUrl = baseURI + "snc=true"; 
     //+ orderID.Substring(0, 10); 
     string cancelUrl = baseURI + "snc=false"; 
     //+orderID.Substring(0, 13); 
     RedirectUrls redirUrls = new RedirectUrls(); 
     redirUrls.cancel_url = cancelUrl; 
     redirUrls.return_url = returnUrl; 

     Details details = new Details(); 
     details.tax = String.Format("{0:0.00}", amountDetailTax); 
     details.shipping = String.Format("{0:0.00}", amountDetailShipping); 
     details.subtotal = String.Format("{0:0.00}", productTotal); 



     decimal total = VariableHelper.CheckValueOfDecimal(details.tax) + VariableHelper.CheckValueOfDecimal(details.shipping) + productTotal; 
     Amount amnt = new Amount(); 
     amnt.currency = amountCurrency; 
     amnt.total = total.ToString(); 
     amnt.details = details; 

     List<Transaction> transactionList = new List<Transaction>(); 
     Transaction tran = new Transaction(); 
     tran.description = "işlem açıklaması"; 
     tran.amount = amnt; 
     tran.item_list = itemList; 

     transactionList.Add(tran); 


     Payment pymnt = new Payment(); 
     pymnt.intent = "sale"; 
     pymnt.payer = payr; 
     pymnt.transactions = transactionList; 
     pymnt.redirect_urls = redirUrls; 
     #endregion 

     string redirectUrl = ""; 
     try 
     { 
      Payment createdPayment = pymnt.Create(apiContext); 
      foreach (var itemm in createdPayment.links) 
      { 
       if (itemm.rel.Contains("approval_url")) 
        redirectUrl = itemm.href; 
      } 
     } 
     catch (PayPal.Exception.PayPalException ex) 
     { 
      //Response.Write(ex.Message); 
     } 

     Response.Redirect(redirectUrl); 

你能帮我快点吗? 谢谢。

回答

0

我遇到了同样的问题。 对我而言,事实证明,这是由交易描述中的某些字符和交易中的物品造成的。例如。 '欧元符号',等等。

看起来像编码这不是由库处理(正确)。

0

1月是完全正确的,并感谢你的重要领导。

自从我上周使用新付款形式上线以来,我一直在努力解决这个偶然的错误。事实证明,许多国际地址包含含有变音标记的字母(http://en.wikipedia.org/wiki/Diacritic)。我通过在我的发布数据中使用这些字符在PayPal沙箱中确认了这个问题,并且重复地得到了上面描述的确切错误。我也在使用上面描述的相同的库。

为了试图解决这个问题(适用于所有的测试到目前为止)我擦洗我的用户输入(地址1号线,2号线,名字,姓氏等),在下面的方法

// http://msdn.microsoft.com/en-us/library/ebza6ck1.aspx 
    String NormalizeString(String value) 
    { 
     if (!value.IsNullOrEmpty()) 
     { 
      var newStringBuilder = new StringBuilder(); 
      newStringBuilder.Append(value.Normalize(NormalizationForm.FormKD) 
              .Where(x => x < 128) 
              .ToArray()); 
      return newStringBuilder.ToString(); 
     } 

     return value; 
    } 
相关问题