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.
Pilih ASP.NET 5 Web Application Template, yang menggunakan MVC 6 yang baru. Hal ini mirip dengan MVC 5 jika Anda sudah mengenalnya.
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:
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.
Saya telah menambahkan folder "Services", di mana saya akan membungkus logika untuk panggilan PayPal, jadi kita dapat menjaga kontroler tetap bagus dan singkat.
Menginstal SDK PayPal menggunakan NuGet. Klik kanan pada nama solusinya dan pilih Manage NuGet Packages, lalu cari "PayPal" dan menginstalnya.
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.
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.
Setelah mengklik Create App, kita melihat layar konfirmasi dengan Client ID dan token Secret.
Salin clientId dan token clientSecret ke appsettings.json, seperti yang dapat Anda lihat pada gambar di bawah ini:
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:
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.
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:
Tentukan informasi pembayaran untuk melakukan pembayaran.
Dapatkan persetujuan pembayaran, dengan mengalihkan pelanggan Anda ke PayPal untuk menyetujui transaksi.
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:
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:
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:
Otorisasi pembayaran: Parameter 'intent' untuk panggilan ini harus 'authorize'.
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:
// 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
varcapture=newCapture()
10
{
11
amount=newAmount()
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
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:
Buat sebuah rencana penagihan dan aktifkan. Setelah membuat sebuah Rencana Penagihan, itu ada dalam keadaan CREATED. Perlu diaktifkan dengan membuat permintaan PATCH.
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
varbillingPlan=newPlan
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=newMerchantPreferences()
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=newList<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
newPaymentDefinition()
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=newList<ChargeModel>
33
{
34
newChargeModel()
35
{
36
type="TAX",
37
amount=GetCurrency("1.65")// If we need to charge Tax
38
},
39
newChargeModel()
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
newPaymentDefinition
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.
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
varpatchRequest=newPatchRequest()
3
{
4
newPatch()
5
{
6
op="replace",
7
path="/",
8
value=newPlan(){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:
Anda dapat memperbarui informasi untuk rencana penagihan yang ada dengan mengajukan permintaan 'PATCH'. Ini adalah fungsi yang membungkus panggilan itu:
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:newPlan{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
publicIActionResultSubscribe()
2
{
3
varplan=PayPalSubscriptionsService.CreateBillingPlan("Tuts+ Plan","Test plan for this article",GetBaseUrl());
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:
Metode ketiga adalah "ExecuteBillingAgreement". Setelah mendapatkan persetujuan berlangganan yang berhasil, kami menggunakan token tersebut untuk mengaktifkan langganan:
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.