2017-02-14 5 views
0

Я пытаюсь настроить PayPal, чтобы принять оплату с моего сайта, которые рассчитывают плату в зависимости от количества загруженных фотографий. Последовал tutorial, но я хотел передать цену, которую я вычислил в другом контроллере.PayPal API и MVC5: получить цену с другого контроллера

Мой контроллер PayPal:

public ActionResult PaymentWithPaypal() 
    { 
     APIContext apiContext = PayPalConfig.GetAPIContext(); 

     try 
     { 
      string payerId = Request.Params["PayerID"]; 

      if (string.IsNullOrEmpty(payerId)) 
      { 
       string baseURI = Request.Url.Scheme + "://" + Request.Url.Authority + "/Paypal/PaymentWithPayPal?"; 
       var guid = Convert.ToString((new Random()).Next(100000));      
       var createdPayment = this.CreatePayment(apiContext, baseURI + "guid=" + guid); 
       var links = createdPayment.links.GetEnumerator(); 
       string paypalRedirectUrl = null; 
       while (links.MoveNext()) 
       { 
        Links lnk = links.Current; 
        if (lnk.rel.ToLower().Trim().Equals("approval_url")) 
        {        
         paypalRedirectUrl = lnk.href; 
        } 
       } 

       Session.Add(guid, createdPayment.id); 
       return Redirect(paypalRedirectUrl); 
      } 
      else 
      {    
       var guid = Request.Params["guid"]; 
       var executedPayment = ExecutePayment(apiContext, payerId, Session[guid] as string); 
       if (executedPayment.state.ToLower() != "approved") 
       { 
        return View("FailureView"); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      Logger.Log("Error" + ex.Message); 
      return View("FailureView"); 
     } 
     return View("SuccessView"); 
    } 

    private PayPal.Api.Payment payment; 

    private PayPal.Api.Payment ExecutePayment(APIContext apiContext, string payerId, string paymentId) 
    { 
     var paymentExecution = new PaymentExecution() { payer_id = payerId }; 
     this.payment = new PayPal.Api.Payment() { id = paymentId }; 
     return this.payment.Execute(apiContext, paymentExecution); 
    } 

    private PayPal.Api.Payment CreatePayment(APIContext apiContext, string redirectUrl) 
    { 
     var itemList = new ItemList() { items = new List<Item>() }; 
     itemList.items.Add(new Item() 
     { 
      name = "Participation Fee", 
      currency = "USD", 
      price = "5", 
      quantity = "1", 
      sku = "sku" 
     }); 

     var payer = new Payer() { payment_method = "paypal" }; 
     var redirUrls = new RedirectUrls() 
     { 
      cancel_url = redirectUrl, 
      return_url = redirectUrl 
     };    
     var details = new Details() 
     { 
      tax = "1", 
      shipping = "1", 
      subtotal = "5" 
     };    
     var amount = new Amount() 
     { 
      currency = "USD", 
      total = "7", 
      details = details 
     }; 

     var transactionList = new List<Transaction>(); 
     transactionList.Add(new Transaction() 
     { 
      description = "Transaction description.", 
      invoice_number = "your invoice number", 
      amount = amount, 
      item_list = itemList 
     }); 

     this.payment = new PayPal.Api.Payment() 
     { 
      intent = "sale", 
      payer = payer, 
      transactions = transactionList, 
      redirect_urls = redirUrls 
     }; 
     return this.payment.Create(apiContext); 

    } 

контроллер, где рассчитывается моя цена:

 int Asection; 
     int Bsection; 
     int Csection; 
     int Dsection; 

     if (viewPhotos.GetA1.Any() || viewPhotos.GetA2.Any() || viewPhotos.GetA3.Any() || viewPhotos.GetA4.Any()) 
     { 
      Asection = 1; 
     } 
     else 
     { 
      Asection = 0; 
     } 

     if (viewPhotos.GetB1.Any() || viewPhotos.GetB2.Any() || viewPhotos.GetB3.Any() || viewPhotos.GetB4.Any()) 
     { 
      Bsection = 1; 
     } 
     else 
     { 
      Bsection = 0; 
     } 

     if (viewPhotos.GetC1.Any() || viewPhotos.GetC2.Any() || viewPhotos.GetC3.Any() || viewPhotos.GetC4.Any()) 
     { 
      Csection = 1; 
     } 
     else 
     { 
      Csection = 0; 
     } 

     if (viewPhotos.GetD1.Any() || viewPhotos.GetD2.Any() || viewPhotos.GetD3.Any() || viewPhotos.GetD4.Any()) 
     { 
      Dsection = 1; 
     } 
     else 
     { 
      Dsection = 0; 
     } 

     int TotalSection = Asection + Bsection + Csection + Dsection; 

     viewPhotos.MoneyValue = TotalSection; 

     int RequiredMoney; 
     if (TotalSection == 1) 
     { 
      RequiredMoney = 20; 
     } 
     else if (TotalSection == 2) 
     { 
      RequiredMoney = 25; 
     } 
     else if (TotalSection == 3) 
     { 
      RequiredMoney = 30; 
     } 
     else 
     { 
      RequiredMoney = 36; 
     } 

     viewPhotos.RequiredMoney = RequiredMoney; 

     return View(viewPhotos); 

Мой вид, где цена была показана пользователю:

<p>You will need to pay participation fees USD @Model.RequiredMoney.</p> 
<h3>Total: USD @Model.RequiredMoney</h3> 
@Html.ActionLink("Make Payment with PayPal", "PaymentWithPaypal", "Paypal") 

До сих пор вышеуказанные коды работайте с ценой и деталями тестирования по умолчанию на сайте. Был бы признателен, если бы кто-нибудь мог помочь показать, как я могу установить сумму, которая будет получена PayPal, моей расчетной цене без какой-либо доставки или налога. Заранее спасибо.

+0

_sample_ создает жестко закодированные данные для «элементов» в своей функции «CreatePayment». Вам придется подключить к нему выбранные вами элементы. Другими словами, замените жестко закодированные элементы в «CreatePayment» соответственно. Hth. – EdSF

+0

Привет @EdSF, я понимаю, о чем вы говорите, но я не знаю, как его достичь. Будете ли вы так любезны продемонстрировать или поделиться с ним соответствующим учебным пособием? Благодарю. – Eva

+0

Пожалуйста, никогда не добавляйте 'new Random()', как вы делаете, так как вы можете легко иметь обстоятельства, при которых результат не случайный. Вы всегда должны создавать одну статическую переменную для «Случайного» и просто повторно использовать ее везде, где она вам нужна. – Enigmativity

ответ

0

После поиска и просмотра журнала на некоторое время, вот как я решил мою проблему:

На контроллере, где я вычисленный свою цену, я использовал TempData хранить свою цену:

TempData["ParticipationFee"] = RequiredMoney; 

Тогда в PaypalController, под CreatePayment функции,

var itemList = new ItemList() { items = new List<Item>() }; 

string FeeAmount = TempData["ParticipationFee"].ToString(); 

itemList.items.Add(new Item() 
{ 
    name = "Participation Fee", 
    currency = "USD", 
    price = FeeAmount, 
    quantity = "1", 
    sku = "sku" 
}); 

Hit F5 и получил успешный ответ от Paypal песочницы. Woot!