Advertisement
  1. Code
  2. PayPal

Integrasi PayPal Bagian 2: REST API PayPal

Scroll to top
Read Time: 19 min
This post is part of a series called PayPal Integration.
PayPal Integration Part 1: PayPal Payment Buttons
PayPal Integration Part 3: PayPal Webhooks

Indonesian (Bahasa Indonesia) translation by Ari Ana (you can also view the original English article)

Final product imageFinal product imageFinal product image
What You'll Be Creating

Dalam tutorial ini saya akan menunjukkan bagaimana Anda bisa melakukan pembayaran dengan menggunakan REST API PayPal dan C#. Semua perpustakaan yang mereka miliki untuk bahasa yang berbeda seperti Ruby, Node.js, Python, PHP sangat mirip, jadi semua konsep di sini berlaku untuk semua perpustakaan.

Setup Proyek

Untuk memulai, saya telah membuat sebuah proyek MVC di Visual Studio 2015: File > New > Project, dan pilih ASP.NET Application.

Setting up a ProjectSetting up a ProjectSetting up a Project

Pilih ASP.NET 5 Web Application Template, yang menggunakan MVC 6 yang baru. Hal ini mirip dengan MVC 5 jika Anda sudah mengenalnya.

ASPNET MVC5ASPNET MVC5ASPNET MVC5

Seperti yang bisa Anda lihat di foto di bawah ini, saya telah menambahkan beberapa file dan folder ke solusinya. Dua hal utama yang harus diperhatikan adalah:

  1. Dalam References saya telah menghapus target DNX Core 5.0, yang memungkinkan kita menjalankan proyek ini di Mac OS X atau Linux, namun perpustakaan PayPal yang kita butuhkan belum diperbarui.
  2. Saya telah menambahkan folder "Services", di mana saya akan membungkus logika untuk panggilan PayPal, jadi kita dapat menjaga kontroler tetap bagus dan singkat.
Solution ExplorerSolution ExplorerSolution Explorer

Menginstal SDK PayPal menggunakan NuGet. Klik kanan pada nama solusinya dan pilih Manage NuGet Packages, lalu cari "PayPal" dan menginstalnya.

Package ManagerPackage ManagerPackage Manager

Membuat Aplikasi PayPal

Untuk mengintegrasikan aplikasi kita dengan PayPal, kita perlu menavigasi ke PayPal Developers, dan kemudian di bawah REST API apps, klik Create App.

PayPal Developer App DashboardPayPal Developer App DashboardPayPal Developer App Dashboard

Berikan nama aplikasi Anda dan pilih akun pengembang sandbox yang terkait dengan aplikasi. Untuk tujuan pengujian, kita bisa menavigasi ke http://sandbox.paypal.com dan login dengan detail login sandbox untuk melihat akun PayPal uji coba dan transaksi.

PayPal Developer AppPayPal Developer AppPayPal Developer App

Setelah mengklik Create App, kita melihat layar konfirmasi dengan Client ID dan token Secret.

PayPal App CredentialsPayPal App CredentialsPayPal App Credentials

Salin clientId dan token clientSecret ke appsettings.json, seperti yang dapat Anda lihat pada gambar di bawah ini:

Application Settings JSONApplication Settings JSONApplication Settings JSON

Pengujian Pembayaran

PayPal menyediakan lingkungan Sandbox untuk pengujian. Anda bisa membuat akun uji coba pembeli dan penjual dari sana. Saat Anda mendaftar, Anda akan memiliki akun Business di Sandbox yang terkait dengan akun pengembang Anda.

Untuk membuat akun uji coba baru, login ke situs Developer, lalu klik tab Dashboard dan navigasikan ke Sandbox > Accounts. Di sini Anda dapat melihat daftar akun uji jika Anda memilikinya:

PayPal SandboxPayPal SandboxPayPal Sandbox

Jika belum membuat akun uji coba, teruskan dan klik Create Account, di kanan atas, untuk membuat setidaknya satu akun pribadi dan satu akun bisnis uji coba.

PayPal Test AccountPayPal Test AccountPayPal Test Account

Setelah membuat akun uji coba, Anda bisa login melalui www.sandbox.paypal.com dengan alamat email uji coba dan kata sandi yang Anda tetapkan ke setiap akun pada formulir sebelumnya. Ini sangat berguna untuk menguji bahwa ketika Anda membeli sesuatu dengan 'akun uji coba pribadi' Anda, dana akan ditransfer ke 'akun bisnis uji coba' Anda. Sekarang Anda siap untuk mulai mengintegrasikan dengan PayPal dan menguji bahwa dananya bergerak dari satu akun ke akun lainnya.

Pembayaran PayPal Tunggal

PayPal menawarkan berbagai metode pembayaran. Anda bisa menggunakan pembayaran kartu kredit langsung, yang berarti pelanggan Anda tidak perlu melihat halaman login PayPal atau ringkasannya—semuanya terjadi di situs Anda. Anda harus sesuai dengan PCI untuk ini, dan saya sarankan untuk menggunakan Stripe, karena Anda hanya memerlukan SSL menggunakan perpustakaan JavaScript mereka. Di sisi lain, untuk melakukan pembayaran melalui pembayaran PayPal, dibutuhkan tiga langkah:

  1. Tentukan informasi pembayaran untuk melakukan pembayaran.
  2. Dapatkan persetujuan pembayaran, dengan mengalihkan pelanggan Anda ke PayPal untuk menyetujui transaksi.
  3. Jalankan pembayaran untuk menangkap dana setelah PayPal mengalihkan pelanggan Anda kembali ke situs web Anda.

Dalam proyek MVC saya, di folder Services, saya telah membuat kelas PayPalPaymentService di mana saya telah menambahkan metode-metode ini:

1
public static Payment CreatePayment(string baseUrl, string intent)
2
{
3
    // ### Api Context

4
    // Pass in a `APIContext` object to authenticate 

5
    // the call and to send a unique request id 

6
    // (that ensures idempotency). The SDK generates

7
    // a request id if you do not pass one explicitly. 

8
    var apiContext = PayPalConfiguration.GetAPIContext();
9
10
    // Payment Resource

11
    var payment = new Payment()
12
    {
13
        intent = intent,    // `sale` or `authorize`

14
        payer = new Payer() { payment_method = "paypal" },
15
        transactions = GetTransactionsList(),
16
        redirect_urls = GetReturnUrls(baseUrl, intent)
17
    };
18
19
    // Create a payment using a valid APIContext

20
    var createdPayment = payment.Create(apiContext);
21
22
    return createdPayment;
23
}
24
25
private static List<Transaction> GetTransactionsList()
26
{
27
    // A transaction defines the contract of a payment

28
    // what is the payment for and who is fulfilling it. 

29
    var transactionList = new List<Transaction>();
30
31
    // The Payment creation API requires a list of Transaction; 

32
    // add the created Transaction to a List

33
    transactionList.Add(new Transaction()
34
    {
35
        description = "Transaction description.",
36
        invoice_number = GetRandomInvoiceNumber(),
37
        amount = new Amount()
38
        {
39
            currency = "USD",
40
            total = "100.00",       // Total must be equal to sum of shipping, tax and subtotal.

41
            details = new Details() // Details: Let's you specify details of a payment amount.

42
            {
43
                tax = "15",
44
                shipping = "10",
45
                subtotal = "75"
46
            }
47
        },
48
        item_list = new ItemList()
49
        {
50
            items = new List<Item>()
51
            {
52
                new Item()
53
                {
54
                    name = "Item Name",
55
                    currency = "USD",
56
                    price = "15",
57
                    quantity = "5",
58
                    sku = "sku"
59
                }
60
            }
61
        }
62
    });
63
    return transactionList;
64
}
65
66
private static RedirectUrls GetReturnUrls(string baseUrl, string intent)
67
{
68
    var returnUrl = intent == "sale" ? "/Home/PaymentSuccessful" : "/Home/AuthorizeSuccessful";
69
70
    // Redirect URLS

71
    // These URLs will determine how the user is redirected from PayPal 

72
    // once they have either approved or canceled the payment.

73
    return new RedirectUrls()
74
    {
75
        cancel_url = baseUrl + "/Home/PaymentCancelled",
76
        return_url = baseUrl + returnUrl
77
    };
78
}
79
80
public static Payment ExecutePayment(string paymentId, string payerId)
81
{
82
    // ### Api Context

83
    // Pass in a `APIContext` object to authenticate 

84
    // the call and to send a unique request id 

85
    // (that ensures idempotency). The SDK generates

86
    // a request id if you do not pass one explicitly. 

87
    var apiContext = PayPalConfiguration.GetAPIContext();
88
    
89
    var paymentExecution = new PaymentExecution() { payer_id = payerId };
90
    var payment = new Payment() { id = paymentId };
91
92
    // Execute the payment.

93
    var executedPayment = payment.Execute(apiContext, paymentExecution);
94
95
    return executedPayment;
96
}

Ada beberapa parameter yang dilewatkan dalam panggilan ini:

  • Intent: Tiga kemungkinan nilai: 'sale' untuk pembayaran segera, 'authorize' untuk memberi otorisasi pembayaran untuk ditangkap nanti, atau 'order' untuk membuat pesanan. Bila Anda mendapatkan otorisasi untuk pembayaran yang akan diambil nanti, Anda memiliki garansi 3 hari, meskipun Anda dapat mencoba untuk menangkap pembayaran hingga 29 hari kemudian.
  • Payer: Sumber dana untuk pembayaran ini, metode pembayaran yang digunakan—pembayaran PayPal Wallet, Bank Direct Debit atau Direct Credit card.
  • Transactions: Ini digunakan untuk menentukan jumlah pembayaran, dan menentukan secara opsional item yang harus dibayar. Anda juga bisa menentukan subtotal, pengiriman dan pajak jika diperlukan.
  • Redirect URLs: Tentukan URL yang akan mengalihkan pelanggan PayPal Anda setelah melakukan transaksi, sehingga Anda dapat memperbarui database Anda dan menampilkan pesan konfirmasi.

Fungsi sebelumnya bisa digunakan dari controller Anda seperti ini:

1
public IActionResult CreatePayment()
2
{
3
    var payment = PayPalPaymentService.CreatePayment(GetBaseUrl(), "sale");
4
    
5
    return Redirect(payment.GetApprovalUrl());
6
}
7
8
public IActionResult PaymentCancelled()
9
{
10
    // TODO: Handle cancelled payment

11
    return RedirectToAction("Error");
12
}
13
14
public IActionResult PaymentSuccessful(string paymentId, string token, string PayerID)
15
{
16
    // Execute Payment

17
    var payment = PayPalPaymentService.ExecutePayment(paymentId, PayerID);
18
19
    return View();
20
}

Seperti yang Anda lihat, saya telah membuat tiga tindakan:

  • CreatePayment: Ini adalah tindakan yang memicu pembayaran. Ini membuat panggilan ke PayPal untuk membuat Payment, lalu mengalihkan pengguna ke PayPal untuk menyetujui transaksi tersebut.
  • PaymentSuccessful: Ini adalah tindakan di mana PayPal mengalihkan pelanggan kita kembali setelah pembayaran berhasil. Pada titik ini kita bisa melakukan pembayaran untuk mendapatkan dana yang ditransfer ke akun penjual kita.
  • PaymentCancelled: Tindakan ini adalah dimana pengguna dialihkan dari PayPal jika pengguna membatalkan proses persetujuan. Pada saat ini Anda mungkin ingin memberi pilihan kepada pelanggan untuk mencoba lagi atau menghubungi dengan Anda.

Otorisasi Pembayaran untuk Ditangkap Nanti

Skenario ini sangat mirip dengan kasus sebelumnya. Anda mungkin ingin menggunakan metode ini jika Anda mencoba melakukan pre-order untuk produk yang belum tersedia. Langkah-langkah untuk mendapatkan pembayaran ini adalah:

  1. Otorisasi pembayaran: Parameter 'intent' untuk panggilan ini harus 'authorize'.
  2. Menangkap pembayaran: Ingatlah bahwa otorisasi dijamin hingga 3 hari, meskipun Anda dapat mencoba untuk menangkap pembayaran hingga 29 hari.

Untuk menerapkan jenis pembayaran ini, saya hanya menambahkan satu metode baru ke kelas PayPalPaymentService untuk menangkap pembayarannya:

1
public static Capture CapturePayment(string paymentId)
2
{
3
    var apiContext = PayPalConfiguration.GetAPIContext();
4
5
    var payment = Payment.Get(apiContext, paymentId);
6
    var auth = payment.transactions[0].related_resources[0].authorization;
7
8
    // Specify an amount to capture.  By setting 'is_final_capture' to true, all remaining funds held by the authorization will be released from the funding instrument.

9
    var capture = new Capture()
10
    {
11
        amount = new Amount()
12
        {
13
            currency = "USD",
14
            total = "4.54"
15
        },
16
        is_final_capture = true
17
    };
18
19
    // Capture an authorized payment by POSTing to

20
    // URI v1/payments/authorization/{authorization_id}/capture

21
    var responseCapture = auth.Capture(apiContext, capture);
22
23
    return responseCapture;
24
}

Kemudian dari HomeController, saya telah menambahkan dua tindakan baru untuk menunjukkan jenis pembayaran ini:

1
public IActionResult AuthorizePayment()
2
{
3
    var payment = PayPalPaymentService.CreatePayment(GetBaseUrl(), "authorize");
4
    
5
    return Redirect(payment.GetApprovalUrl());
6
}
7
8
public IActionResult AuthorizeSuccessful(string paymentId, string token, string PayerID)
9
{
10
    // Capture Payment

11
    var capture = PayPalPaymentService.CapturePayment(paymentId);
12
13
    return View();
14
}
  • AuthorizePayment adalah tindakan yang memicu pembayaran. Ini sangat mirip dengan fungsi 'CreatePayment' sebelumnya, tapi kami mengirimkan 'authorize' sebagai parameter intent dalam kasus ini.
  • AuthorizeSuccessful adalah tindakan di mana pelanggan Anda akan diarahkan setelah berhasil menyetujui pembayaran di PayPal. Pada titik ini saya menangkap pembayaran, namun Anda dapat menyimpan paymentId di database dan menangkap pembayaran saat Anda membutuhkannya.

Dalam contoh kode ini, untuk kesederhanaan, saya mengkode langsung nilai variabel pembayarannya. Dalam aplikasi nyata Anda, Anda mungkin akan membungkusnya dengan metode yang mengambil semua nilai tersebut sebagai variabel sehingga semuanya dapat diatur secara dinamis dan digunakan kembali.

Berlangganan

Ini disebut "Billing Plans" di PayPal—Anda dapat membuat rencana pembayaran berulang, dan mengikutkan pelanggan Anda ke paket penagihan dengan membuat perjanjian penagihan. Dengan menggunakan REST API PayPal Anda dapat membuat, memperbarui atau menghapus rencana penagihan; ini adalah sesuatu yang mungkin Anda gunakan jika Anda ingin membuat panel admin untuk mengelola hal-hal ini untuk bisnis Anda.

Langkah-langkah untuk membuat tagihan rutin kepada pelanggan Anda adalah:

  1. Buat sebuah rencana penagihan dan aktifkan. Setelah membuat sebuah Rencana Penagihan, itu ada dalam keadaan CREATED. Perlu diaktifkan dengan membuat permintaan PATCH.
  2. Buat perjanjian penagihan dan jalankan: Tanggapan terhadap panggilan untuk Membuat perjanjian penagihan mencakup tautan ke approval_url dan execute_url. Kita perlu mendapatkan persetujuan untuk perjanjian penagihan dan kemudian melaksanakan perjanjian penagihan.

Rencana Penagihan

Membuat Sebuah Rencana Penagihan

Buat rencana penagihan yang menentukan periode penagihan. Ini adalah rangkuman parameter yang harus kita kirimkan untuk membuat sebuah rencana.

  • Name: Nama rencana penagihan.
  • Description: Deskripsi rencana penagihan.
  • Type: Nilai yang diizinkan adalah 'FIXED' untuk sejumlah pembayaran berulang, atau 'INFINITE' untuk paket yang berulang sampai dibatalkan secara manual.
  • Merchant Preferences: Ini adalah objek yang menentukan preferensi seperti biaya setup, upaya kegagalan pembayaran maksimum, URL pengembalian, URL pembatalan, URL pemberitahuan, dimana PayPal akan mengalihkan pengguna setelah pembayaran.
  • Payment Definitions: Array definisi pembayaran untuk rencana ini. Biasanya array ini akan memiliki satu atau dua definisi pembayaran. Jika kita ingin menawarkan uji coba gratis atau uji coba dengan harga diskon, maka kita menetapkan dua definisi pembayaran. Yang pertama akan menjadi definisi untuk masa percobaan, dan definisi kedua adalah pembayaran reguler. Properti untuk Payment Definition adalah nama, jenis (percobaan atau reguler), frekuensi (hari, minggu, bulan, tahun), interval frekuensi (jika kita mengatur frekuensi ke 'WEEK' dan interval frekuensi ke '1', kita menentukan pembayaran mingguan), jumlah untuk menagih pelanggan, dan siklus adalah jumlah total pembayaran. Charge Models adalah untuk menentukan biaya pengiriman dan pajak tambahan untuk jumlah nilai untuk rencananya.

Ini adalah cuplikan kode yang menunjukkan cara membuat Rencana Penagihan:

1
// Define the plan and attach the payment definitions and merchant preferences.

2
// More Information: https://developer.paypal.com/webapps/developer/docs/api/#create-a-plan

3
var billingPlan = new Plan
4
{
5
    name = "Tuts+ Plus",
6
    description = "Monthly plan for courses.",
7
    type = "fixed",
8
    // Define the merchant preferences.

9
    // More Information: https://developer.paypal.com/webapps/developer/docs/api/#merchantpreferences-object

10
    merchant_preferences = new MerchantPreferences()
11
    {
12
        setup_fee = GetCurrency("0"), // $0

13
        return_url = "returnURL", // Retrieve from config

14
        cancel_url = "cancelURL", // Retrieve from config

15
        auto_bill_amount = "YES",
16
        initial_fail_amount_action = "CONTINUE",
17
        max_fail_attempts = "0"
18
    },
19
    payment_definitions = new List<PaymentDefinition>
20
    {
21
        // Define a trial plan that will only charge $9.99 for the first

22
        // month. After that, the standard plan will take over for the

23
        // remaining 11 months of the year.

24
        new PaymentDefinition()
25
        {
26
            name = "Trial Plan",
27
            type = "TRIAL",
28
            frequency = "MONTH",
29
            frequency_interval = "1",
30
            amount = GetCurrency("0"), // Free for the 1st month

31
            cycles = "1",
32
            charge_models = new List<ChargeModel>
33
            {
34
                new ChargeModel()
35
                {
36
                    type = "TAX",
37
                    amount = GetCurrency("1.65") // If we need to charge Tax

38
                },
39
                new ChargeModel()
40
                {
41
                    type = "SHIPPING",
42
                    amount = GetCurrency("9.99") // If we need to charge for Shipping

43
                }
44
            }
45
        },
46
        // Define the standard payment plan. It will represent a monthly

47
        // plan for $19.99 USD that charges once month for 11 months.

48
        new PaymentDefinition
49
        {
50
            name = "Standard Plan",
51
            type = "REGULAR",
52
            frequency = "MONTH",
53
            frequency_interval = "1",
54
            amount = GetCurrency("15.00"),
55
            // > NOTE: For `IFNINITE` type plans, `cycles` should be 0 for a `REGULAR` `PaymentDefinition` object.

56
            cycles = "11",
57
            charge_models = new List<ChargeModel>
58
            {
59
                new ChargeModel
60
                {
61
                    type = "TAX",
62
                    amount = GetCurrency("2.47")
63
                },
64
                new ChargeModel()
65
                {
66
                    type = "SHIPPING",
67
                    amount = GetCurrency("9.99")
68
                }
69
            }
70
        }
71
    }
72
};
73
74
// Get PayPal Config

75
var apiContext = PayPalConfiguration.GetAPIContext();
76
77
// Create Plan

78
plan.Create(apiContext);

Rencana penagihan yang baru dibuat adalah dalam keadaan CREATED. Aktifkan ke status ACTIVE, jadi pelanggan Anda dapat berlangganan ke rencana tersebut. Untuk mengaktifkan rencananya, kita perlu membuat permintaan PATCH:

1
// Activate the plan

2
var patchRequest = new PatchRequest()
3
{
4
    new Patch()
5
    {
6
        op = "replace",
7
        path = "/",
8
        value = new Plan() { state = "ACTIVE" }
9
    }
10
};
11
plan.Update(apiContext, patchRequest);

Seperti yang Anda lihat, perpustakaan PayPal adalah pembungkus langsung REST API mereka, yang bagus, namun API-nya juga sangat kompleks dibandingkan dengan yang lain seperti Stripe. Untuk alasan ini, ini benar-benar pilihan yang baik untuk membungkus semua komunikasi PayPal di objek dengan API yang lebih jelas dan sederhana untuk aplikasi kita. Di sini Anda dapat melihat kode yang dibungkus dalam beberapa fungsi dengan parameter seperti ini:

1
public static Plan CreatePlanObject(string planName, string planDescription, string returnUrl, string cancelUrl,
2
    string frequency, int frequencyInterval, decimal planPrice,
3
    decimal shippingAmount = 0, decimal taxPercentage = 0, bool trial = false, int trialLength = 0, decimal trialPrice = 0)
4
{
5
    // Define the plan and attach the payment definitions and merchant preferences.

6
    // More Information: https://developer.paypal.com/docs/rest/api/payments.billing-plans/

7
    return new Plan
8
    {
9
        name = planName,
10
        description = planDescription,
11
        type = PlanType.Fixed,
12
13
        // Define the merchant preferences.

14
        // More Information: https://developer.paypal.com/webapps/developer/docs/api/#merchantpreferences-object

15
        merchant_preferences = new MerchantPreferences()
16
        {
17
            setup_fee = GetCurrency("1"),
18
            return_url = returnUrl,
19
            cancel_url = cancelUrl,
20
            auto_bill_amount = "YES",
21
            initial_fail_amount_action = "CONTINUE",
22
            max_fail_attempts = "0"
23
        },
24
        payment_definitions = GetPaymentDefinitions(trial, trialLength, trialPrice, frequency, frequencyInterval, planPrice, shippingAmount, taxPercentage)
25
    };
26
}
27
28
private static List<PaymentDefinition> GetPaymentDefinitions(bool trial, int trialLength, decimal trialPrice,
29
    string frequency, int frequencyInterval, decimal planPrice, decimal shippingAmount, decimal taxPercentage)
30
{
31
    var paymentDefinitions = new List<PaymentDefinition>();
32
33
    if (trial)
34
    {
35
        // Define a trial plan that will charge 'trialPrice' for 'trialLength'

36
        // After that, the standard plan will take over.

37
        paymentDefinitions.Add(
38
            new PaymentDefinition()
39
            {
40
                name = "Trial",
41
                type = "TRIAL",
42
                frequency = frequency,
43
                frequency_interval = frequencyInterval.ToString(),
44
                amount = GetCurrency(trialPrice.ToString()),
45
                cycles = trialLength.ToString(),
46
                charge_models = GetChargeModels(trialPrice, shippingAmount, taxPercentage)
47
            });
48
    }
49
50
    // Define the standard payment plan. It will represent a 'frequency' (monthly, etc)

51
    // plan for 'planPrice' that charges 'planPrice' (once a month) for #cycles.

52
    var regularPayment = new PaymentDefinition
53
    {
54
        name = "Standard Plan",
55
        type = "REGULAR",
56
        frequency = frequency,
57
        frequency_interval = frequencyInterval.ToString(),
58
        amount = GetCurrency(planPrice.ToString()),
59
        // > NOTE: For `IFNINITE` type plans, `cycles` should be 0 for a `REGULAR` `PaymentDefinition` object.

60
        cycles = "11",
61
        charge_models = GetChargeModels(trialPrice, shippingAmount, taxPercentage)
62
    };
63
    paymentDefinitions.Add(regularPayment);
64
65
    return paymentDefinitions;
66
}
67
68
private static List<ChargeModel> GetChargeModels(decimal planPrice, decimal shippingAmount, decimal taxPercentage)
69
{
70
    // Create the Billing Plan

71
    var chargeModels = new List<ChargeModel>();
72
    if (shippingAmount > 0)
73
    {
74
        chargeModels.Add(new ChargeModel()
75
        {
76
            type = "SHIPPING",
77
            amount = GetCurrency(shippingAmount.ToString())
78
        });
79
    }
80
    if (taxPercentage > 0)
81
    {
82
        chargeModels.Add(new ChargeModel()
83
        {
84
            type = "TAX",
85
            amount = GetCurrency(String.Format("{0:f2}", planPrice * taxPercentage / 100))
86
        });
87
    }
88
89
    return chargeModels;
90
}

Memperbarui Rencana Penagihan

Anda dapat memperbarui informasi untuk rencana penagihan yang ada dengan mengajukan permintaan 'PATCH'. Ini adalah fungsi yang membungkus panggilan itu:

1
public static void UpdateBillingPlan(string planId, string path, object value)
2
{
3
    // PayPal Authentication tokens

4
    var apiContext = PayPalConfiguration.GetAPIContext();
5
6
    // Retrieve Plan

7
    var plan = Plan.Get(apiContext, planId);
8
9
    // Activate the plan

10
    var patchRequest = new PatchRequest()
11
    {
12
        new Patch()
13
        {
14
            op = "replace",
15
            path = path,
16
            value = value
17
        }
18
    };
19
    plan.Update(apiContext, patchRequest);
20
}

Untuk memperbarui deskripsi Rencana Penagihan, kita dapat memanggil fungsi ini dan mengirimkan parameter yang tepat:

1
UpdateBillingPlan(
2
    planId: "P-5FY40070P6526045UHFWUVEI", 
3
    path: "/", 
4
    value: new Plan { description = "new description" });

Menghapus Rencana Penagihan

Idealnya, bila Anda tidak ingin menerima pelanggan baru ke sebuah Rencana Penagihan, Anda pasti ingin memperbaruinya ke status 'INACTIVE'. Ini tidak akan mempengaruhi perjanjian penagihan yang ada pada rencana ini. Hal ini bisa dilakukan hanya dengan memanggil fungsi UpdateBillingPlan:

1
UpdateBillingPlan(
2
    planId: "P-5FY40070P6526045UHFWUVEI",
3
    path: "/",
4
    value: new Plan { state = "INACTIVE" });

Perjanjian Penagihan

Membuat Perjanjian Penagihan

Setelah membuat satu atau beberapa rencana penagihan, Anda ingin mulai membuat pelanggan mendaftar ke rencana berlangganan Anda. Untuk melakukan ini, Anda perlu mengumpulkan detail pelanggan Anda dan mengajukan permintaan ke PayPal. Untuk dapat menguji fungsi ini, saya telah menambahkan beberapa tindakan ke HomeController:

1
public IActionResult Subscribe()
2
{
3
    var plan = PayPalSubscriptionsService.CreateBillingPlan("Tuts+ Plan", "Test plan for this article", GetBaseUrl());
4
5
    var subscription = PayPalSubscriptionsService.CreateBillingAgreement(plan.id, 
6
        new PayPal.Api.ShippingAddress
7
        {
8
            city = "London", 
9
            line1 = "line 1",
10
            postal_code = "SW1A 1AA",
11
            country_code = "GB"
12
        }, "Pedro Alonso", "Tuts+", DateTime.Now);
13
    
14
    return Redirect(subscription.GetApprovalUrl());
15
}
16
17
public IActionResult SubscribeSuccess(string token)
18
{
19
    // Execute approved agreement

20
    PayPalSubscriptionsService.ExecuteBillingAgreement(token);
21
22
    return View();
23
}
24
25
public IActionResult SubscribeCancel(string token)
26
{
27
    // TODO: Handle cancelled payment

28
    return RedirectToAction("Error");
29
}
  • Subscribe: Ini adalah tindakan pertama yang dipanggil. Ini membuat uji coba Rencana Penagihan, dan kemudian Perjanjian Penagihan (langganan) ke rencana itu dibuat, dan pengguna dialihkan ke PayPal untuk mengkonfirmasi pembayaran.
  • SubscribeSuccess: Tindakan ini adalah yang digunakan sebagai 'Return URL' setelah berlangganan yang sukses. Pengenal token persetujuan dilewatkan dalam string kueri, dan kita menggunakan token ini untuk melaksanakan perjanjian penagihan dan membuatnya aktif.
  • SubscribeCancel: Tindakan ini adalah yang digunakan sebagai 'Cancel URL'. Jika karena alasan tertentu pembayaran gagal, atau pelanggan Anda membatalkan pembayaran di PayPal, pengguna akan dibawa ke tindakan ini, dan Anda harus menangani hal ini. Mungkin menawarkan pilihan untuk mencoba lagi.

Seperti yang dapat Anda lihat di cuplikan kode sebelumnya, saya telah membungkus sebagian besar fungsi dalam beberapa metode. Yang pertama adalah "CreateBillingPlan" yang sudah dijelaskan di bagian sebelumnya. Yang kedua adalah "CreateBillingAgreement" yang digunakan untuk berlangganan pengguna ke sebuah rencana:

1
public static Agreement CreateBillingAgreement(string planId, ShippingAddress shippingAddress, 
2
    string name, string description, DateTime startDate)
3
{
4
    // PayPal Authentication tokens

5
    var apiContext = PayPalConfiguration.GetAPIContext();
6
7
    var agreement = new Agreement()
8
    {
9
        name = name,
10
        description = description,
11
        start_date = startDate.ToString("yyyy-MM-ddTHH:mm:ss") + "Z",
12
        payer = new Payer() { payment_method = "paypal" },
13
        plan = new Plan() { id = planId },
14
        shipping_address = shippingAddress
15
    };
16
    
17
    var createdAgreement = agreement.Create(apiContext);
18
    return createdAgreement;
19
}

Metode ketiga adalah "ExecuteBillingAgreement". Setelah mendapatkan persetujuan berlangganan yang berhasil, kami menggunakan token tersebut untuk mengaktifkan langganan:

1
public static void ExecuteBillingAgreement(string token)
2
{
3
    // PayPal Authentication tokens

4
    var apiContext = PayPalConfiguration.GetAPIContext();
5
6
    var agreement = new Agreement() { token = token };
7
    var executedAgreement = agreement.Execute(apiContext);
8
}

Menangguhkan Perjanjian Penagihan

Gunakan metode ini untuk menangguhkan sebuah kesepakatan:

1
public static void SuspendBillingAgreement(string agreementId)
2
{
3
    var apiContext = PayPalConfiguration.GetAPIContext();
4
5
    var agreement = new Agreement() { id = agreementId };
6
    agreement.Suspend(apiContext, new AgreementStateDescriptor()
7
        { note = "Suspending the agreement" });
8
}

Mengaktifkan kembali Perjanjian Penagihan

Yang satu ini benar-benar mirip dengan yang sebelumnya:

1
public static void ReactivateBillingAgreement(string agreementId)
2
{
3
    var apiContext = PayPalConfiguration.GetAPIContext();
4
5
    var agreement = new Agreement() { id = agreementId };
6
    agreement.ReActivate(apiContext, new AgreementStateDescriptor()
7
        { note = "Reactivating the agreement" });
8
}

Membatalkan Perjanjian Penagihan

Gunakan fungsi ini untuk membatalkan sebuah rencana:

1
public static void CancelBillingAgreement(string agreementId)
2
{
3
    var apiContext = PayPalConfiguration.GetAPIContext();
4
5
    var agreement = new Agreement() { id = agreementId };
6
    agreement.Cancel(apiContext, new AgreementStateDescriptor()
7
        { note = "Cancelling the agreement" });
8
}

Memperbarui Perjanjian Penagihan

Pilihan ini sangat terbatas, dan yang saya harapkan dari panggilan ini adalah kemungkinan untuk mengubah rencana berlangganan, untuk meningkatkan atau menurunkan pelanggan. Ini tidak didukung dalam satu panggilan seperti di Stripe. Anda perlu menangani skenario ini dengan membatalkan perjanjian saat ini dan membuat yang baru untuk menaikkan atau menurunkan. Ini tidak ideal, tapi mungkin akan berubah di masa depan.

Kesimpulan

Ini adalah ikhtisar dari fungsi yang paling umum yang digunakan orang untuk berintegrasi dengan PayPal. API mereka jauh lebih besar daripada metode integrasi yang dijelaskan dalam artikel ini—Anda juga dapat mengeluarkan pengembalian dana dan pengembalian dana sebagian, dan mereka memiliki banyak opsi berbeda untuk kasus tepi dalam sampel yang tercakup dalam artikel ini. Jika Anda tertarik untuk mendapatkan rincian lebih lanjut tentang integrasi tertentu, silakan tinggalkan saran di komentar.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.