加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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文档如下:

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",{"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");

        }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读