Wrapper for Kakaopay REST API. Kakaopay provides convenient way to do internet transaction in Korea because it doesn't need a separate Payment Gateway (PG). The transaction is done only with the user's Kakaotalk account.
Official Kakaopay REST API documentation: here.
Example Implementation: here.
Demo: here.
Via Composer:
composer require se468/kakaopay-php
Used for requesting the user for the transaction. User will receive a message to confirm the transaction.
API Endpoint:
POST /v1/payment/ready HTTP/1.1
Usage Example:
$payment = new \se468\Kakaopay\Payment();
\se468\Kakaopay\Kakaopay::setAdminKey(env('KAKAOPAY_ADMIN_KEY'));
$result = $payment->ready([
'cid' => 'TC0ONETIME',
'partner_order_id' => 'partner_order_id',
'partner_user_id' => 'partner_user_id',
'item_name' => '초코파이',
'quantity' => '1',
'total_amount' => '2200',
'vat_amount' => '200',
'tax_free_amount' => '0',
'approval_url' => 'http://package-development.valet/kakaopay/success',
'cancel_url' => 'http://package-development.valet/kakaopay/fail',
'fail_url' => 'http://package-development.valet/kakaopay/cancel'
]);
Here's the explanation of the process:
-
Result from
payment/ready
will have transation ID, ortid
($result->tid
), which you can safely store in your session. -
Store the
tid
in session and redirect to$result->next_redirect_pc_url
. Customer will be prompted to enter their Kakaopay phone number and password. -
After the customer fills in the form, they will receive a message in their Kakaotalk to approve the transaction. The screen will then redirect to the
approval_url
that you've provided. -
You can then call
payment/approve
using thetid
stored in the session and it will process the payments.
With the given tid
from payment ready, approve the transaction to finalize.
POST /v1/payment/approve HTTP/1.1
Example:
$payment = new \se468\Kakaopay\Payment();
\se468\Kakaopay\Kakaopay::setAdminKey(env('KAKAOPAY_ADMIN_KEY'));
$result = $payment->approve([
'cid' => 'TC0ONETIME',
'tid' => 'T1234567890123456789', //tid received from result from 'ready'
'partner_order_id' => 'partner_order_id',
'partner_user_id' => 'partner_user_id',
'pg_token' => $input['pg_token']
]);
- You can delete the
tid
after you get the result from here, and store the$result
in your DB, which contains the information about the transaction and show it back to the customer.
Example Payment Ready for subscription
$payment = new \se468\Kakaopay\Payment();
\se468\Kakaopay\Kakaopay::setAdminKey(env('KAKAOPAY_ADMIN_KEY'));
$result = $payment->ready([
'cid' => 'TCSUBSCRIP',
'partner_order_id' => 'partner_order_id',
'partner_user_id' => 'partner_user_id',
'item_name' => '음악정기결제',
'quantity' => '1',
'total_amount' => '9900',
'vat_amount' => '900',
'tax_free_amount' => '0',
'approval_url' => 'http://package-development.valet/kakaopay/subscription/success',
'cancel_url' => 'http://package-development.valet/kakaopay/subscription/fail',
'fail_url' => 'http://package-development.valet/kakaopay/subscription/cancel'
]);
Note that only thing different here from single payment is the
cid
parameter.
Check the documentation for single payment. It is exactly same process.
On going subscription fees can be called like the following:
POST /v1/payment/subscription HTTP/1.1
Example:
$payment = new \se468\Kakaopay\Payment();
\se468\Kakaopay\Kakaopay::setAdminKey(env('KAKAOPAY_ADMIN_KEY'));
$result = $payment->subscription([
'cid' => 'TCSUBSCRIP', // cid for testing
'sid' => 'S1234567890987654321',
'partner_order_id' => 'subscription_order_id_1',
'partner_user_id' => 'subscription_user_id_1',
'item_name' => '음악정기결제',
'quantity' => '1',
'total_amount' => '9900',
'vat_amount' => '900',
'tax_free_amount' => '0',
]);
POST /v1/payment/cancel HTTP/1.1
$payment = new \se468\Kakaopay\Payment();
\se468\Kakaopay\Kakaopay::setAdminKey(env('KAKAOPAY_ADMIN_KEY'));
$result = $payment->cancel([
'cid' => 'TC0ONETIME', // cid for testing
'tid' => 'T1234567890123456789',
'cancel_amount' => '2200',
'cancel_tax_free_amount' => '0',
'cancel_vat_amount' => '200',
'cancel_available_amount' => '4000',
]);
GET/POST /v1/payment/order HTTP/1.1
Example:
$payment = new \se468\Kakaopay\Payment();
\se468\Kakaopay\Kakaopay::setAdminKey(env('KAKAOPAY_ADMIN_KEY'));
$result = $payment->order([
'cid' => 'TC0ONETIME', // cid for testing
'tid' => 'T1234567890123456789',
]);
POST /v1/payment/manage/subscription/status HTTP/1.1
Example:
$payment = new \se468\Kakaopay\Payment();
\se468\Kakaopay\Kakaopay::setAdminKey(env('KAKAOPAY_ADMIN_KEY'));
$result = $payment->order([
'cid' => 'TCSUBSCRIP', // cid for testing
'tid' => 'S1234567890987654321',
]);
POST /v1/payment/manage/subscription/inactive HTTP/1.1
Example:
$payment = new \se468\Kakaopay\Payment();
\se468\Kakaopay\Kakaopay::setAdminKey(env('KAKAOPAY_ADMIN_KEY'));
$result = $payment->inactive([
'cid' => 'TCSUBSCRIP', // cid for testing
'sid' => 'S1234567890987654321',
]);