New Function #79
Updated by Deca Park over 1 year ago
<p>1.<strong>[Scheduler] VBank Payment Expire Scheduler</strong></p>
<p style="margin-left: 40px;">1.reference<br />
- non-violent #9874-note#18<br />
2.crontab<br />
- execute per 1 hour<br />
3.logic<br />
1) SELECT st_order_payment with payment_status = 'PS20' (wait deposit)<br />
a) get va_due_date<br />
b) if current datetime > va_due_date<br />
b-1) UPDATE st_order_payment<br />
- payment_status = 'PS22' (deposit expire)<br />
- mod_date / mod_user_no = NULL<br />
* define fee_payment_status value as constant</p>
<p>2<strong>.[API] VBank deposit complete process (가상계좌 웹훅)</strong></p>
<p style="margin-left: 40px;">1.document<br />
https://docs.tosspayments.com/guides/learn/virtual-account-webhook<br />
<br />
2.make <strong>Webhook endpoint</strong> to receive event payload from PG<br />
1) URL: <strong>POST {domain}/hook</strong><br />
- permitAll (don't check authentication)<br />
<br />
3.DEPOSIT_CALLBACK Webhook event data (JSON) from PG<br />
[example]<br />
{<br />
createdAt: '2023-05-23T14:42:26.000000',<br />
secret: 'ps_Z1aOwX7K8mYpalqAGRwj8yQxzvNP',<br />
orderId: '3f9c765d-60ed-4735-8af5-ab9d1142a3e8',<br />
status: 'DONE',<br />
transactionKey: '83B3CD71DF004878066FEDCB7C21E775'<br />
}<br />
<br />
4.process Logic<br />
1) SELECT DB (st_order_payment)<br />
condition: order_no = {orderId param}<br />
2) <strong>if No data OR {pg_secret} != {secret param}, SKIP<br />
- response status(200) ok</strong><br />
3) if {pg_secret} = {secret param}<br />
a) if {status param} =<strong> 'DONE'</strong><br />
UPDATE DB (st_order_payment)<br />
- payment_status = <strong>'PS21'</strong>, va_proc_date = {current date}<br />
b) if {status param} =<strong> 'WAITING_FOR_DEPOSIT'</strong><br />
UPDATE DB (st_order_payment)<br />
- payment_status =<strong> 'PS23'</strong>, va_proc_date = {current date}<br />
4)<strong> response status(200) ok</strong></p>
<p> </p>
<p>3.<strong>[Common] PG payment cancellation (결제취소)</strong></p>
<ul>
<li><strong>it's called on API and ADMIN both</strong></li>
</ul>
<p style="margin-left: 40px;">1.document<br />
https://docs.tosspayments.com/reference#%EA%B2%B0%EC%A0%9C-%EC%B7%A8%EC%86%8C<br />
2.Process<br />
1) call PG payment cancel API<br />
a) URL: POST /v1/payment/{paymentKey}/cancel<br />
- {paymentKey} : st_order_payment.payment_key (with order_no)<br />
b) header<br />
- Authorization: {same with pg confirm API}<br />
c) RequestBody<br />
c-1) cancelReason : {decided by process type}<br />
c-2) cancelAmount : don't set because cancel amount is total amount<br />
c-3) refundReceiveAccount object<br />
- <strong>if {st_order_payment.payment_method} = 'PV02' (VBank), set it. (it not, don't set)</strong><br />
c-3-1) bank : {st_order_payment.refund_bank_code}<br />
c-3-2) accountNumber : {refund_account_number}<br />
c-3-3) holderName : {refund_holder_name}</p>
<p style="margin-left: 80px;"> [example]<br />
curl --request POST \<br />
--url https://api.tosspayments.com/v1/payments/5zJ4xY7m0kODnyRpQWGrN2xqGlNvLrKwv1M9ENjbeoPaZdL6/cancel \<br />
--header 'Authorization: Basic dGVzdF9za196WExrS0V5cE5BcldtbzUwblgzbG1lYXhZRzVSOg==' \<br />
--header 'Content-Type: application/json' \<br />
--header 'Idempotency-Key: e9b779ed-3541-4b6e-aa95-88f710689a68' \<br />
--data '{"cancelReason":"고객 변심"}'</p>
<p style="margin-left: 40px;"> 2) if cancel API is success<br />
a) UPDATE st_order_payment<br />
payment_status = <strong>'PS11'</strong><br />
cancel_amount = {payment_amount}, cancel_reason = {decided by process type}<br />
cancel_proc_date = {current date}, cancel_user_seq = {decided by process type}<br />
3) if cancel API is fail<br />
a) return PG error_code / error_msg without DB UDPATE</p>
<p> </p>