2013-10-28 79 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"); 

     } 
    } 
}