c# – PayPal Rest API – 使用更新的交易信息执行付款
发布时间:2020-12-15 21:58:08 所属栏目:百科 来源:网络整理
导读:我正在使用C#和PayPal Rest API来获得批准的付款并执行它.但是,我需要更新与已批准付款相关的交易. PayPal文档如下: Use this call to execute (complete) a PayPal payment that has been approved by the payer. You can optionally update transaction i
我正在使用C#和PayPal Rest API来获得批准的付款并执行它.但是,我需要更新与已批准付款相关的交易. PayPal文档如下:
这是我的代码 //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",{"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"} 这告诉我,我缺少.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. 所以,我的问题是:我如何获得批准的付款,更新付款交易的价格,然后执行该付款? 解决方法
我不是这方面的专家,但我刚刚实施了类似的支付交易,我认为必须分两步完成:创建付款然后执行付款,因为买方必须登录他的PayPal帐户并确认付款之间.这样它对我有用.
所以你需要的是这样的(抱歉我的代码是VB.NET): 'Create payment Dim createdPayment As Payment = payment.Create(apiContext) 然后从PayPal返回回复,您可以执行付款: '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"); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |