2013-10-28 120 views
4

我使用C#和PayPal Rest API來獲得批准的付款並執行付款。但是,我需要更新與已批准付款相關的交易。貝寶的文件上寫着:PayPal Rest API - 使用更新的交易信息執行付款

Use this call to execute (complete) a PayPal payment that has been approved by the payer. You can optionally update transaction information when executing the payment by passing in one or more transactions.

這裏是我的代碼

//Update the payment details in case totals changed because of a new address/zipcode 
Details amountDetails = new Details(); 
amountDetails.subtotal = ValidationHelper.GetString(prices[Order.CartPricesEnum.Subtotal], "0"); 
amountDetails.tax = ValidationHelper.GetString(prices[Order.CartPricesEnum.Tax], "0"); 
amountDetails.shipping = ValidationHelper.GetString(prices[Order.CartPricesEnum.Shipping], "0"); 

Amount amount = new Amount(); 
amount.total = ValidationHelper.GetString(prices[Order.CartPricesEnum.Total], "0"); 
amount.currency = "USD"; 
amount.details = amountDetails; 

//update the transaction to make sure we have accounted for any updated prices 
Transactions trn = new Transactions(); 
trn.amount = amount; 

List<Transactions> trns = new List<Transactions>();      
trns.Add(trn); 

//Create a payment execution object 
PaymentExecution paymentExecution = new PaymentExecution(); 
paymentExecution.payer_id = payPalPayerID; 
paymentExecution.transactions = trns;      

//Execute (complete) the payment 
Payment newPayment = payment.Execute(accessToken, paymentExecution); 

的問題是,當在運行此我得到以下錯誤:

{"name":"VALIDATION_ERROR","details":[{"field":"transactions[0].total","issue":"Required field missing"},{"field":"transactions[0].currency","issue":"Required field missing"},{"field":"transactions[0].amount","issue":"This field name is not defined for this resource type"}],"message":"Invalid request - see details","information_link":"https://developer.paypal.com/webapps/developer/docs/api/#VALIDATION_ERROR","debug_id":"bcba38f3c56d7"} 

這是告訴我,我m缺少.total和.currency,並且.amount字段未定義。但是,你可以清楚地看到,我設置了總與貨幣,金額字段是唯一的字段,你可以對交易對象設置根據PayPal的API文檔:

transactions  
array of transaction objects  
Transactional details if updating a payment. Note that this instance of the transactions object accepts only the amount object. 

所以,我的問題是:如何獲得批准的付款,更新付款交易的價格,然後執行該付款?

+0

有沒有這個工作? – Rivka

+0

實際上,PayPal Rest API目前不支持我想要做的事情。我必須使用遺留框架重寫所有內容。在與PayPal支持交談後,我想到了這一點。該部分的文檔不太清楚。 – sheibeck

+0

謝謝,我最終與遺留庫一起進行了其他限制(例如,在批准的交易中檢索貨件信息)。 – Rivka

回答

0

我不是這方面的專家,但我剛剛實施了類似的付款交易,我認爲必須分兩步完成:創建付款然後執行付款,因爲買家必須登錄到他的PayPal帳戶,然後執行付款確認兩者之間的付款。這樣它爲我工作。

所以,你需要的是這樣的(對不起我的代碼是VB.NET):

'Create payment 
Dim createdPayment As Payment = payment.Create(apiContext) 

,然後從貝寶回傳回報,你可以執行付款:

'Execute payment 
Dim paymentExecution As New PaymentExecution() 
Dim executedPayment As Payment = payment.Execute(apiContext, paymentExecution) 

這裏是從API提供的樣本中抽取的完整示例:

// #Create Payment Using PayPal Sample 
// This sample code demonstrates how you can process a 
// PayPal Account based Payment. 
// API used: /v1/payments/payment 
using System; 
using System.Web; 
using PayPal; 
using PayPal.Api.Payments; 
using Newtonsoft.Json.Linq; 
using Newtonsoft.Json; 
using System.Collections.Generic; 

namespace RestApiSample 
{ 
    public partial class PaymentWithPayPal : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      HttpContext CurrContext = HttpContext.Current; 
      Payment pymnt = null; 

      // ### Api Context 
      // Pass in a `APIContext` object to authenticate 
      // the call and to send a unique request id 
      // (that ensures idempotency). The SDK generates 
      // a request id if you do not pass one explicitly. 
      // See [Configuration.cs](/Source/Configuration.html) to know more about APIContext.. 
      APIContext apiContext = Configuration.GetAPIContext(); 

      // ## ExecutePayment 
      if (Request.Params["PayerID"] != null) 
      { 
       pymnt = new Payment(); 
       if (Request.Params["guid"] != null) 
       { 
        pymnt.id = (string)Session[Request.Params["guid"]]; 

       } 
       try 
       { 
        PaymentExecution pymntExecution = new PaymentExecution(); 
        pymntExecution.payer_id = Request.Params["PayerID"]; 

        Payment executedPayment = pymnt.Execute(apiContext, pymntExecution); 
        CurrContext.Items.Add("ResponseJson", JObject.Parse(executedPayment.ConvertToJson()).ToString(Formatting.Indented)); 
       } 
       catch (PayPal.Exception.PayPalException ex) 
       { 
        CurrContext.Items.Add("Error", ex.Message); 
       } 
      } 

      // ## Creating Payment 
      else 
      { 
       // ###Items 
       // Items within a transaction. 
       Item item = new Item(); 
       item.name = "Item Name"; 
       item.currency = "USD"; 
       item.price = "15"; 
       item.quantity = "5"; 
       item.sku = "sku"; 

       List<Item> itms = new List<Item>(); 
       itms.Add(item); 
       ItemList itemList = new ItemList(); 
       itemList.items = itms; 

       // ###Payer 
       // A resource representing a Payer that funds a payment 
       // Payment Method 
       // as `paypal` 
       Payer payr = new Payer(); 
       payr.payment_method = "paypal"; 
       Random rndm = new Random(); 
       var guid = Convert.ToString(rndm.Next(100000)); 

       string baseURI = Request.Url.Scheme + "://" + Request.Url.Authority + "/PaymentWithPayPal.aspx?"; 

       // # Redirect URLS 
       RedirectUrls redirUrls = new RedirectUrls(); 
       redirUrls.cancel_url = baseURI + "guid=" + guid; 
       redirUrls.return_url = baseURI + "guid=" + guid; 

       // ###Details 
       // Let's you specify details of a payment amount. 
       Details details = new Details(); 
       details.tax = "15"; 
       details.shipping = "10"; 
       details.subtotal = "75"; 

       // ###Amount 
       // Let's you specify a payment amount. 
       Amount amnt = new Amount(); 
       amnt.currency = "USD"; 
       // Total must be equal to sum of shipping, tax and subtotal. 
       amnt.total = "100"; 
       amnt.details = details; 

       // ###Transaction 
       // A transaction defines the contract of a 
       // payment - what is the payment for and who 
       // is fulfilling it. 
       List<Transaction> transactionList = new List<Transaction>(); 
       Transaction tran = new Transaction(); 
       tran.description = "Transaction description."; 
       tran.amount = amnt; 
       tran.item_list = itemList; 
       // The Payment creation API requires a list of 
       // Transaction; add the created `Transaction` 
       // to a List 
       transactionList.Add(tran); 

       // ###Payment 
       // A Payment Resource; create one using 
       // the above types and intent as `sale` or `authorize` 
       pymnt = new Payment(); 
       pymnt.intent = "sale"; 
       pymnt.payer = payr; 
       pymnt.transactions = transactionList; 
       pymnt.redirect_urls = redirUrls; 

       try 
       { 
        // Create a payment using a valid APIContext 
        Payment createdPayment = pymnt.Create(apiContext); 

        CurrContext.Items.Add("ResponseJson", JObject.Parse(createdPayment.ConvertToJson()).ToString(Formatting.Indented)); 

        var links = createdPayment.links.GetEnumerator(); 

        while (links.MoveNext()) 
        { 
         Links lnk = links.Current; 
         if (lnk.rel.ToLower().Trim().Equals("approval_url")) 
         { 
          CurrContext.Items.Add("RedirectURL", lnk.href); 
         } 
        } 
        Session.Add(guid, createdPayment.id); 
       } 
       catch (PayPal.Exception.PayPalException ex) 
       { 
        CurrContext.Items.Add("Error", ex.Message); 
       } 
      } 
      CurrContext.Items.Add("RequestJson", JObject.Parse(pymnt.ConvertToJson()).ToString(Formatting.Indented)); 

      Server.Transfer("~/Response.aspx"); 

     } 
    } 
}