Advertisement
  1. Code
  2. PHP

Cara Mengatur Pembayaran Berulang

Scroll to top
Read Time: 8 min

Indonesian (Bahasa Indonesia) translation by Nurul Fatimah (you can also view the original English article)

Kemungkinan, pada titik tertentu, Anda ingin menerapkan pembayaran berulang atau berlangganan untuk SaaS atau layanan lainnya. Untungnya, PayPal menawarkan tool yang dibutuhkan untuk mengimplementasikan solusi pembayaran berlangganan yang terintegrasi.


Apa Yang Akan Kita Buat

Catatan: Saya menggunakan Laravel dalam tutorial ini, tetapi Anda dapat menerapkan konsep-konsep ini ke bahasa dan framework lain.

Kita akan menyiapkan PayPal untuk menerima pembayaran berlangganan dan mengonfigurasi listener instant payment notification (IPN). Setelah menyelesaikan komponen pendaftaran, kita akan melihat proses pembatalan melalui API PayPal. Saya mulai dengan aplikasi Laravel barebones dengan registrasi dan login sederhana, dan kita akan menambahkan komponen yang dibutuhkan untuk memperkenalkan pembayaran berlangganan saat kita melanjutkan melalui tutorial.


Langkah 1: Menyiapkan Tombol Langganan Anda

PayPal menyediakan bidang khusus yang dapat digunakan untuk memberikan ID pengguna.

Sebelum kami mulai, pastikan Anda memiliki akun bisnis PayPal. Ini gratis, tetapi Anda harus memiliki akun bisnis untuk menerapkan pembayaran berlangganan di situs Anda.

PayPal menawarkan beberapa jenis tombol yang dapat kita gunakan, termasuk: Beli Sekarang, Berlangganan, dan Penagihan Otomatis. Sekarang, kita akan melihat tombol berlangganan. Tombol berlangganan memungkinkan Anda untuk mengatur jumlah penagihan, serta periode waktu pembayaran berulang. Anda juga dapat mengatur periode uji coba dan membiarkan PayPal membuat akun pengguna saat mereka melakukan ping ke server Anda.

Pertama, masuk ke akun PayPal Anda dan arahkan ke Profile -> My Selling Preferences. Kemudian cari bagian PayPal Buttons dan pilih Subscriptions dari daftar drop-down. Pastikan untuk mengisi sisa informasi.

Saya sarankan untuk membiarkan kotak "Have PayPal create user names and passwords for customers" tidak dicentang dan pilih opsi "Use my secure merchant account ID".

Kita akan mengizinkan pengguna untuk mendaftar akun gratis dan kemudian meningkatkannya nanti.

Buat tombol Anda dan copy kode yang dihasilkan; Anda akan menggunakannya dalam aplikasi Anda.

Melewati Informasi Tambahan

Saat kita menautkan langganan ke akun, kita harus tahu siapa yang melakukan pembayaran. Cara termudah untuk melakukannya adalah mencocokkan alamat email transaksi PayPal dengan akun email yang digunakan untuk masuk ke aplikasi kita. Ini tidak mudah, karena banyak orang menggunakan alamat email yang berbeda. Jadi kita perlu memberikan ID pengguna dari aplikasi kita ke PayPal.

Untungnya, PayPal menyediakan bidang khusus yang dapat digunakan untuk melewati ID pengguna. Memiliki batas 256 karakter. Jadi saya akan menggunakan struktur JSON, memungkinkan kita untuk memberikan informasi tambahan jika perlu.

1
<input type="hidden" name="custom" value="{{json_encode(array('user_id' => Auth::user()->id))}}">

Pastikan untuk memeriksa daftar lengkap variabel HTML yang diterima.


Langkah 2: Mempersiapkan Aplikasi Anda

Pertama-tama kita perlu mengatur tabel pembayaran, tempat kita akan menyimpan transaksi. Mari buat dengan kolom berikut:

  • id: Integer kenaikan-otomatis dan kunci utama kita.
  • txn_id: ID transaksi yang akan diberikan PayPal kepada kita. Tetapkan ini sebagai varchar.
  • user_id: Kita akan menggunakan ini untuk mengatur hubungan ke tabel pengguna, integer akan melakukannya.
  • paypal_id: ID Profil PayPal yang akan ditangani untuk pembatalan nanti. Tetapkan ini sebagai varchar.
  • created_at: Kita akan menggunakan ini untuk melihat kapan transaksi selesai dan mulai berlangganan.

Juga, tambahkan kolom subscription ke tabel user Anda. Saya akan mengatur ini sebagai bilangan bulat untuk memungkinkan beberapa level: satu, dua, dan tiga untuk membuka kunci fitur tambahan. Saya juga telah maju dan menciptakan model yang akan memungkinkan kita berinteraksi dengan tabel pembayaran.


Langkah 3: Menulis Listener Anda

PayPal memberikan solusi sederhana untuk memberi tahu kita ketika pembayaran telah diproses; mereka menyebutnya Instant Payment Notifications (IPN). Untuk memanfaatkan IPN, kita perlu membuat listener IPN untuk aplikasi kita. Listener memvalidasi data, memasukkannya ke dalam tabel pembayaran, dan menetapkan tingkat berlangganan pengguna.

Untungnya kita tidak harus berputar-putar berkat kelas praktis ini. Kita akan menggunakan kelas IpnListener untuk memverifikasi data dengan cepat, dan kemudian dapat memproses ini untuk memasukkannya ke dalam basis data. Dengan Laravel, kita dapat menempatkan kelas ke dalam folder library kita, menjadikannya autoload.

Buat controller atau rute baru dan tambahkan kode berikut:

1
$listener = new IpnListener();
2
3
try {
4
    $verified = $listener->processIpn();
5
} catch (Exception $e) {
6
    exit(0);
7
}
8
9
if ($verified) {
10
    // IPN response was "VERIFIED"

11
} else {
12
    // IPN response was "INVALID"

13
}

Saya memanggil file saya ipn.php, dan saya akan memetakannya ke /ipn. Jangan lupa bahwa PayPal akan POST ke URL ini; jadi jika Anda menggunakan kata kerja HTTP/REST, atur sesuai. Dari sini kita dapat memproses data:

1
$listener = new IpnListener();
2
3
try {
4
    $verified = $listener->processIpn();
5
} catch (Exception $e) {
6
    return Log::error($e->getMessage());
7
}
8
9
if ($verified) {
10
11
    $data = $_POST;
12
    $user_id = json_decode($data['custom'])->user_id;
13
14
    $subscription = ($data['mc_gross_1'] == '10') ? 2 : 1;
15
16
    $txn = array(
17
        'txn_id'       => $data['txn_id'],
18
        'user_id'      => $user_id,
19
        'paypal_id'    => $data['subscr_id'],
20
        'subscription' => $subscription,
21
        'expires'      => date('Y-m-d H:i:s', strtotime('+1 Month')),
22
    );
23
24
    Payment::create($txn);
25
26
} else {
27
    Log::error('Transaction not verified');
28
}

Dalam kode ini, pertama-tama kita mendekode JSON yang diteruskan ke bidang khusus, memberikan akses mudah ke ID pengguna. Kemudian mengatur tingkat berlangganan berdasarkan jumlah transaksi dan menyimpannya dalam database. Kita juga mencatat kesalahan apa pun menggunakan kelas Log Laravel. Mungkin bagus juga mengirim tanda terima kepada pengguna, tetapi saya akan menyerahkannya kepada Anda.


Langkah 4: Mengaktifkan IPN

Selanjutnya, kita perlu mengaktifkan IPN dan mengatur PayPal untuk melakukan ping listener. Karena panel admin PayPal sulit untuk dinavigasi, saya telah menyertakan screenshots berikut untuk membantu memandu Anda. Pergi ke Profile -> Selling Preferences:

Kemudian cari Instant Payment Notifications:

Selanjutnya, klik Choose IPN Settings:

Dan kemudian masukkan URL ke listener Anda:


Langkah 5: Dapatkan Username, Password, dan Signature API Anda

Saat kita berada di dasbor, ada baiknya mendapatkan kredensial API sebelum kita menyortir proses pembatalan. Pergi ke Profile -> Selling Preferences:

Cari API Access:

Pilih option  2:

Minta signature API:

Dan perhatikan credentials Anda:


Langkah 6: Menangani Pembatalan

Anda harus memiliki akun bisnis untuk menerapkan pembayaran berlangganan.

Catatan: Anda akan memerlukan sertifikat SSL untuk menangani pembatalan, atau PayPal dengan kesalahan yang terjadi.

Untuk memberikan pengalaman pengguna terbaik, kemungkinan Anda menginginkan menangani pembatalan di dalam aplikasi atau layanan Anda. PayPal menyediakan beberapa API yang memungkinkannya melakukan ini: NVP atau SOAP. Saya akan merekomendasikan dengan NVP.

Dokumentasi PayPal tampaknya terlalu memperumit masalah, tetapi NVP (Name-Value-Pair) pada dasarnya hanyalah sebuah string URL yang disandikan yang dapat kita cURL.

Metode yang kami minati adalah ManageRecurringPaymentsProfileStatus. Kita dapat mengubah status langganan dengan memilih salah satu dari tiga tindakan berikut:

  • Cancel: Hanya langganan aktif atau suspended yang dapat dibatalkan. Memilih tindakan ini mencegah pengguna mengaktifkan kembali di lain waktu.
  • Suspend: Hanya langganan aktif yang dapat disuspend. Tindakan ini memungkinkan pengguna untuk mengaktifkan kembali langganan mereka nanti.
  • Reactivate: Hanya langganan yang ditangguhkan yang dapat diaktifkan kembali, instasikan kembali langganan.

Kita akan menggunakan tindakan pembatalan, karena tombol berlangganan kita membuat langganan yang sama sekali baru jika pengguna ingin mengaktifkan kembali di lain waktu. Jadi permintaan akan terlihat seperti ini:

1
$input = Input::all();
2
3
$req = array(
4
    'USER'      => 'YOUR_API_USER',
5
    'PASSWORD'  => 'YOUR_API_PASSWORD',
6
    'SIGNATURE' => 'YOUR_API_SIGNATURE',
7
    'VERSION'   => '76.0',
8
    'METHOD'    => 'ManageRecurringPaymentsProfileStatus',
9
    'PROFILEID' => urlencode($input['paypal_id']),
10
    'ACTION'    => 'Cancel',
11
    'NOTE'      => 'User cancelled on website',
12
);
13
14
$ch = curl_init();
15
16
// Swap these if you're testing with the sandbox

17
// curl_setopt($ch, CURLOPT_URL, 'https://api-3t.sandbox.paypal.com/nvp');

18
curl_setopt($ch, CURLOPT_URL, 'https://api-3t.paypal.com/nvp');
19
curl_setopt($ch, CURLOPT_VERBOSE, 1);
20
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
21
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
22
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
23
curl_setopt($ch, CURLOPT_POST, 1);
24
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($req));
25
curl_exec($ch);
26
curl_close($ch);
27
28
return Redirect::to('settings')->with('cancelled', true);

Kita sekarang dapat dengan mudah membatalkan langganan, tetapi karena alasan tertentu PayPal memilih untuk tidak mengirim permintaan IPN. Ini bukan masalah, karena kita menyiapkan aplikasi untuk menyertakan kolom expires. Jadi kita dapat memeriksa bidang itu untuk menentukan apakah pengguna berlangganan.


Langkah 7: Bermain di Sandbox

PayPal menyediakan sandbox sehingga kita dapat menguji implementasi. Jika Anda belum pernah menggunakan ini sebelumnya, Anda harus membuat akun gratis. Dari sana, Anda akan dapat menguji dengan beberapa pengguna dan transaksi untuk memastikan bahwa kode Anda berfungsi seperti yang diharapkan.

Kita akan menguji listener, memastikan itu berfungsi dengan benar tanpa harus melakukan transaksi nyata. Sebelum kita melakukan sesuatu di kotak pasir, kita perlu mengkonfigurasi pendengar IPN kita untuk melakukan ping kotak pasir daripada server langsung.

1
$listener->use_sandbox = true;

Sekarang pergilah ke PayPal Sandbox, masuk, klik Test Tools di sebelah kiri dan buka simulator IPN.

Masukkan URL pendengar Anda dan pilih Express Checkout dari drop down. Anda dapat menggunakan sebagian besar detail default, tetapi jangan lupa untuk menempatkan JSON Anda ke bidang khusus di bagian bawah halaman.


Langkah 8: Memeriksa Langganan

Jadi kita telah mengatur langganan dan memungkinkan pengguna untuk membatalkan layanan, sekarang bagaimana kita memeriksa ini? Laravel membuatnya mudah, dan metodenya menerjemahkan berbagai bahasa dan framework. Saya akan menambahkan metode ke model User saya yang memberikan akses ke langganan menggunakan kelas Auth Laravel:

1
public function subscription(){
2
    return Payment::where('user_id', '=', Auth::user()->id)
3
                ->where('expires', '>', date('Y-m-d H:i:s', time()))
4
                ->first(array('subscription', 'expires', 'paypal_id', 'txn_id'));
5
}

Kita sekarang dapat mengakses ini dan memeriksa dengan mudah controllers dan tampilan. Sebagai contoh:

1
<?php
2
$sub = Auth::user()->subscription();
3
if($sub && $sub->subscription == 1){
4
    echo 'You\'re on the standard plan';
5
} elseif($sub && $sub->subscription == 2){
6
    echo 'You\'re on the premium plan';
7
} else {
8
    echo 'You\'re not subscribed';
9
}
10
?>

Kesimpulan

Semoga tutorial ini memberi Anda gambaran betapa mudahnya mengatur pembayaran berulang atau berlangganan di aplikasi Anda. PayPal tidak berarti satu-satunya pemroses pembayaran, tetapi merupakan salah satu yang paling dikenal dan digunakan secara luas.

Dari sini, Anda dapat menambahkan tanda terima, pengingat pembayaran, dan pemberitahuan pembatalan untuk membangun solusi yang sepenuhnya terintegrasi.

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.