2013-10-04 65 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; 
    } 
相關問題