# PayNow Implementation
### Sequence of payment with PayNow
```sequence
User->Give.asia: Fill email, phone or NRIC
Note right of Give.asia: Validating
Give.asia-->User: Show page with payment methods
Note left of User: Select a PayNow
User->Give.asia: Pay with PayNow
Give.asia->PayNow: Send enquiry API request
Note right of PayNow: Checking possibility for pay\n by phone or NRIC
PayNow-->Give.asia: Success
Give.asia->PayNow: Send request for QR code API
Note right of PayNow: Generating QR code
PayNow-->Give.asia: Base64 QR code
Note left of Give.asia: (maybe) Extract an account number\nfrom QR code
Note left of Give.asia: Create draft transaction
Give.asia-->User: Show the QR code for payment
Note left of User: Pay with mobile phone
User->PayNow: Payment via PayNow
Note right of PayNow: Payment complete
PayNow-->Give.asia: Send a webhook
Note left of Give.asia: Create transaction from draft
Give.asia-->User: Show a success page
Note left of Give.asia: Worker for finish transaction
```
#### The `draft_paynow_transactions` Table
| column | type |
| ---------------------------- | --------- |
| id | Long |
| amount | Long |
| tip_amount | Long |
| currency | String |
| donor_is_anonymous | Boolean |
| donor_name | String |
| donor_email | String |
| donor_phone_number_opt | String |
| **donor_nric_opt** | String |
| donor_user_id_opt | Long |
| donor_utm_source_opt | Text |
| donor_utm_medium_opt | Text |
| donor_ip_address | Text |
| donor_tax_deduction_info | Key-Value |
| donor_info | Key-Value |
| recipient_charity_id | Long |
| recipient_campaign_id_opt | Long |
| donation_package_summary | Text |
| donation_package_description | Text |
| agent_user_id_opt | Long |
| agent_commission_opt | Long |
| agent_check_in_id_opt | Long |
| giviki_id | Long |
| give_fee | Long |
| ads_budget | Long |
| lang | String |
| suggested_tip_version_opt | String |
| suggested_tip_amount_opt | String |
| **qr_code_size** | Int |
| **qr_code_base64** | Text |
| **qr_code_expired_at** | Long |
| **paynow_account_number** | Text |
| **paynow_reference_text** | Text |
| **paynow_amount** | Long |
| **paynow_currency** | String |
| **exchange_rate** | Float |
| created_at | Long |
#### The `paynow_transactions` Table
| column | type |
| ------------------------------------ | --------- |
| id | Long |
| public_key | String |
| secret_key | String |
| amount | Long |
| tip_amount | Long |
| currency | String |
| donor_is_anonymous | Boolean |
| donor_name | String |
| donor_email | String |
| donor_phone_number_opt | String |
| **donor_nric_opt** | String |
| donor_user_id_opt | Long |
| donor_utm_source_opt | Text |
| donor_utm_medium_opt | Text |
| donor_ip_address | Text |
| donor_tax_deduction_info | Key-Value |
| donor_info | Key-Value |
| ==donor_answers== | Key-Value |
| ==comment (WhyIGave)== | Text |
| recipient_charity_id | Long |
| recipient_campaign_id_opt | Long |
| status | String |
| donation_package_summary | Text |
| donation_package_description | Text |
| agent_user_id_opt | Long |
| agent_commission_opt | Long |
| agent_check_in_id_opt | Long |
| giviki_id | Long |
| give_fee | Long |
| ads_budget | Long |
| lang | String |
| suggested_tip_version_opt | String |
| suggested_tip_amount_opt | String |
| **qr_code_size** | Int |
| **qr_code_base64** | Text |
| **qr_code_expired_at** | Long |
| **paynow_account_number** | Text |
| **==paynow_bank_reference_number==** | Text |
| **paynow_reference_text** | Text |
| **paynow_amount** | Long |
| **paynow_currency** | String |
| **==paynow_fee==** | Long |
| **==paynow_fee_currency==** | String |
| **exchange_rate** | Float |
| created_at | Long |
| ==refunded_at_opt== | Long |
*\* **Specific** for PayNow*
*\* ==Specific== for transactions table*
I suppose we can pay only in SGD via PayNow so we need to store an exchange rate for the charge.
#### Recurring Transactions (postponed)
According PayNow API we can pay without an QR code via their `PayNow Payment API` but we need Sender's Account Number. I suppose that this account number we can extract from QR code because in their docs has note with link to Account Number field:
> There are 25 characters in QR Code. OCBC will reserve the first 3 characters. Customer can only use 22 characters. The report will extract those client reference that starts with QR Tracker Digit.
So it might be require to decode a QR code for extract `Account Number`.
Or maybe we can get it from the webhook. Actually I don't know yet which webhook returns in the request.
###### tags: `paynow` `work`