Dunguyen
Dunguyen

Reputation: 81

Integrate Paypal into ASP.NET MVC website

I copy ClientId and ClientSecret from Paypal:

enter image description here

to web.config like this:

<configSections>
    <section name="paypal" type="PayPal.SDKConfigHandler, PayPal"/>
</configSections>
<[email protected]>
<paypal>
    <settings>
        <add name="mode" value="sandbox"/>
        <add name="connectionTimeout" value="360000"/>
        <add name="requestRetries" value="1"/>
        <add name="clientId" value="---Key---"/>
        <add name="clientSecret" value="---Secret Key---"/>
    </settings>
</paypal>

Then I created a class PaypalConfiguration:

public class PaypalConfiguration
{
    // Variables for storing the clientID and clientSecret key
    public readonly static string clientId;
    public readonly static string clientSecret;

    // Constructor
    static PaypalConfiguration()
    {
        var config = GetConfig();
        clientId = "---Key---";
        clientSecret = "---Secret Key---";
    }

    // getting properties from the web.config
    public static Dictionary<string, string> GetConfig()
    {
        return PayPal.Api.ConfigManager.Instance.GetProperties();
    }

    private static string GetAccessToken()
    {
        // getting accesstocken from paypal
        string accessToken = new OAuthTokenCredential(clientId, clientSecret, GetConfig()).GetAccessToken();
        return accessToken;
    }
    public static APIContext GetAPIContext()
    {
        // return apicontext object by invoking it with the accesstoken
        APIContext apiContext = new APIContext(GetAccessToken());
        apiContext.Config = GetConfig();
        return apiContext;
    }
}

And the last I created the PaymentController like this:

public class PaymentController : Controller
{
    // GET: Payment
    public ActionResult PaymentWithPaypal()
    {
        APIContext apicontext = PaypalConfiguration.GetAPIContext();

        try
        {
            string payerID = Request.Params["PayerID"];

            if (string.IsNullOrEmpty(payerID))
            {
                string baseURi = Request.Url.Scheme + "://" + Request.Url.Authority + "/Payment/PaymentWithPapal?";
                var Guid = Convert.ToString((new Random()).Next(100000000));
                var createPayment = this.CreatePayment(apicontext, baseURi+"guid="+Guid);

                var links = createPayment.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, createPayment.id);
                return Redirect(paypalRedirectURL);
            }
            else
            {
                var guid = Request.Params["guid"];
                var executePayment = ExecutePayment(apicontext, payerID, Session[guid] as string);

                if(executePayment.ToString().ToLower()!= "approved")
                {
                    return View("FailureView");
                }
            }
        }
        catch(Exception e)
        {
            return View("FailureView");
        }

        return View("successView");
    }

    private object ExecutePayment(APIContext apicontext, string payerID, string PaymentID)
    {
        var paymentExecution = new PaymentExecution() {payer_id = payerID };
        this.payment = new Payment() { id = PaymentID};
        return this.payment.Execute(apicontext, paymentExecution);
    }

    private PayPal.Api.Payment payment;

    private Payment CreatePayment(APIContext apicontext, string redirectURl)
    {
        var ItemList = new ItemList() { 
            items = new List<Item>()
        };

        if(Session["cart"]!="")
        {
            List<Models.Home.Items> carts = (List<Models.Home.Items>)(Session["cart"]);
            foreach (var item in carts)
            {
                ItemList.items.Add(new Item()
                {
                    name = item.product.ten_xe.ToString(),
                    currency = "TK",
                    price = item.product.gia_ban.ToString(),
                    quantity = item.quantity.ToString(),
                    sku = "sku"
                }) ;
            }

            var payer = new Payer() { payment_method = "paypal" };

            var redirectUrl = new RedirectUrls()
            {
                cancel_url = redirectURl + "&Cancel=true" ,
                return_url = redirectURl
            };

            var details = new Details()
            {
                tax = "1",
                shipping = "1",
                subtotal = "1"
            };

            var amount = new Amount()
            {
                currency = "USD",
                //tax+shipping+subtotal
                total = Session["SesTotal"].ToString(),

                details = details
            };

            var transactionList = new List<Transaction>();
            transactionList.Add(new Transaction()
            {
                description = "Transaction Description",
                invoice_number = "#100000",
                amount = amount,
                item_list = ItemList
            });

            this.payment = new Payment()
            {
                intent = "sale",
                payer = payer,
                transactions = transactionList,
                redirect_urls = redirectUrl
            };
        }

        return this.payment.Create(apicontext);
    }
}

When I debug I realize that

return this.payment.Create(apicontext);

When I execute the line I get an error

The remote server returned an error: (400) Bad Request.

Why?

I have tried many way to solve this problem in the internet,youtube even stackoverflow but all have no result .Hoping you guys help me solve this problem.Thank you

Upvotes: 0

Views: 1696

Answers (2)

Mohammad Shakir
Mohammad Shakir

Reputation: 1

At every transection time invoice_number must be different i.e try by changing invoice_number = "#100000".

Upvotes: 0

Preston PHX
Preston PHX

Reputation: 30379

It appears you're attempting to use a deprecated SDK to integrate with the deprecated v1/payments API.

Abandon that effort, and switch to the current v2 Checkout-NET-SDK


If you continue to have problems such as a 400 error, log and post the full details of the API response that gives the 400 (there should be a debug_id from PayPal, as well as other messaging).

Upvotes: 1

Related Questions