2017-02-14 18 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」機能で「items」のハードコーディングされたデータを作成しています。ユーザーの選択したアイテムをそのアイテムに結びつける必要があります。言い換えれば、それに応じて 'CreatePayment'のハードコードされた項目を置き換えます。 Hth。 – EdSF

+0

こんにちは@EdSF、私はあなたが言っていることを理解していますが、私はそれを達成する方法を知らない。関連するチュートリアルを実演したり分かち合うのがとても親切ですか?ありがとう。 – Eva

+0

結果がランダムではない場合があるので、あなたがやっているように 'new Random()'をインライン化しないでください。 'Random'のための単一の静的変数を作成し、それを必要な場所に再利用するだけです。 – Enigmativity

答えて

0

検索し、しばらくの間、ログを確認した後、ここで私は私の問題解決方法は次のとおりです。次に

TempData["ParticipationFee"] = RequiredMoney; 

:私は私の価格を計算し、コントローラで

を、私は私の価格を保存するためにTempDataを使用しました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" 
}); 

は、F5をヒットし、Paypalのサンドボックスからの正常な応答を得ました。 Woot!

関連する問題