Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor refund, update docs #13

Merged
merged 5 commits into from
May 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
File renamed without changes.
4 changes: 0 additions & 4 deletions docs/docs/installation.md → docs/docs/02_installation.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
---
sidebar_position: 2
---

# Hướng dẫn cài đặt

## Cài đặt với các trình quản lý thư viện
Expand Down
29 changes: 29 additions & 0 deletions docs/docs/03_get-bank-list.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Danh sách ngân hàng {#get-bank-list}

:::info
Danh sách ngân hàng, sử dụng cho `vnp_BankCode`
:::

## Lấy danh sách ngân hàng

```typescript
import { Bank } from 'vnpay';

/* ... */

const bankList: Bank[] = await vnpay.getBankList();
```

## Các thuộc tính của đối tượng `Bank`

| Thuộc tính | Kiểu dữ liệu | Mô tả |
| --------------- | ------------ | ---------------------------- |
| `bank_code` | `string` | Mã ngân hàng |
| `bank_name` | `string` | Tên ngân hàng |
| `logo_link` | `string` | Đường dẫn logo của ngân hàng |
| `bank_type` | `number` | Loại ngân hàng |
| `display_order` | `number` | Thứ tự hiển thị |

:::info
Xem thêm [tại đây](https://sandbox.vnpayment.vn/apis/docs/chuyen-doi-thuat-toan/changeTypeHash.html#tao-url-thanh-toan)
:::
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
---
sidebar_position: 3
---

# Tạo URL thanh toán

Tạo đường dẫn thanh toán cho VNPay.
Expand Down Expand Up @@ -41,6 +37,7 @@ buildPaymentUrl(params: BuildPaymentUrl, options?: BuildPaymentUrlOptions): stri
| vnp_OrderType | Loại đơn hàng | Mỗi hàng hóa sẽ thuộc một nhóm danh mục do VNPAY quy định. Sử dụng enum có sẵn từ `ProductCode` hoặc xem thêm bảng [Danh mục hàng hóa](https://sandbox.vnpayment.vn/apis/docs/loai-hang-hoa/) |
| vnp_ReturnUrl | Đường dẫn trả về sau khi thanh toán | URL thông báo kết quả giao dịch khi Khách hàng kết thúc thanh toán. Ví dụ: https://domain.vn/VnPayReturn |
| vnp_Locale | Ngôn ngữ hiển thị trên cổng thanh toán | Hiện tại hỗ trợ Tiếng Việt (vn), Tiếng Anh (en) |
| vnp_BankCode | Mã ngân hàng | Mã ngân hàng lựa chọn thanh toán, xem thêm [tại đây](get-bank-list) |

Xem thêm các thuộc tính khác tại [VNPay](https://sandbox.vnpayment.vn/apis/docs/thanh-toan-pay/pay.html#danh-s%C3%A1ch-tham-s%E1%BB%91).

Expand Down
4 changes: 0 additions & 4 deletions docs/docs/config-ipn.md → docs/docs/05_ipn/01_config-ipn.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
---
sidebar_position: 4
---

# Cài đặt IPN url

Khi thanh toán hoàn tất, VNPay sẽ gửi lời gọi IPN (Instant Payment Notification) đến URL IPN mà bạn đã cài đặt. Để xác thực lời gọi IPN, bạn có thể sử dụng thư viện VNPay.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
---
sidebar_position: 5
---

# Xác thực lời gọi IPN

Khi thanh toán hoàn tất, VNPay sẽ gửi lời gọi IPN (Instant Payment Notification) đến URL IPN mà bạn đã cài đặt. Để xác thực lời gọi IPN, bạn có thể sử dụng thư viện VNPay.
Expand Down Expand Up @@ -38,7 +34,7 @@ Các tham số mà VNPay trả về cũng nằm trong đối tượng `VerifyIpn
### Sử dụng logger

- Tương tự như khi tạo URL thanh toán, bạn có thể sử dụng logger để ghi log thông tin xác thực IPN
[xem tại đây](./create-payment-url.md#use-logger).
[xem tại đây](create-payment-url.md#use-logger).

lehuygiang28 marked this conversation as resolved.
Show resolved Hide resolved
### Với Express

Expand Down
5 changes: 5 additions & 0 deletions docs/docs/05_ipn/_category_.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"label": "IPN",
"collapsible": true,
"collapsed": false
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
---
sidebar_position: 6
---

# Xác thực URL thông báo trả về

Khi khách hàng thanh toán thành công, VNPay sẽ chuyển hướng khách hàng đến URL thông báo trả về (`vnp_ReturnUrl`) mà bạn đã cung cấp.
Expand Down
4 changes: 0 additions & 4 deletions docs/docs/query-dr.md → docs/docs/07_query-dr.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
---
sidebar_position: 7
---

# Truy vấn kết quả giao dịch (queryDr) {#query-dr}

lehuygiang28 marked this conversation as resolved.
Show resolved Hide resolved
Đây là API để hệ thống merchant truy vấn kết quả thanh toán của giao dịch tại hệ thống VNPAY.
Expand Down
71 changes: 71 additions & 0 deletions docs/docs/08_refund.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# Giao dịch hoàn tiền (refund) {#refund}
lehuygiang28 marked this conversation as resolved.
Show resolved Hide resolved

Đây là API để hệ thống merchant gửi yêu cầu hoàn tiền cho giao dịch qua hệ thống Cổng thanh toán VNPAY.

:::warning Chú ý:

- `refund` là một trong các chức năng bị hạn chế bởi VNPAY trong môi trường sandbox, bạn cần liên hệ VNPAY để được hỗ trợ.
- Xem thêm tại [issue#12](https://github.com/lehuygiang28/vnpay/issues/12)

:::

## Refund

```typescript
import { Refund, RefundResponse, dateFormat, getDateInGMT7, VnpTransactionType } from 'vnpay';

/* ... */

/**
* Date phải là timezone GMT+7
* Và format theo định dạng `yyyyMMddHHmmss`
* Dùng 2 hàm `getDateInGMT7` và `dateFormat` để chuyển đổi
*/
const refundRequestDate = dateFormat(getDateInGMT7(new Date('2024/05/26')));
const orderCreatedAt = dateFormat(getDateInGMT7(new Date('2024/05/21')));

const result: RefundResponse = await vnpay.refund({
vnp_Amount: 10000,
vnp_CreateBy: 'giang',
vnp_CreateDate: refundRequestDate,
vnp_IpAddr: '127.0.0.1',
vnp_OrderInfo: 'Test order',
vnp_RequestId: '123456',
vnp_TransactionDate: orderCreatedAt,
vnp_TransactionType: VnpTransactionType.FULL_REFUND,
vnp_TxnRef: '123456',
vnp_Locale: VnpLocale.EN,
// vnp_TransactionNo: 123456, // optional
} as Refund);
```

## Các thuộc tính

### `Refund` {#Refund-properties}

| Thuộc tính | Kiểu dữ liệu | Mô tả |
| --------------------- | -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `vnp_Amount` | `number` | Số tiền hoàn trả lại cho khách hàng. Số tiền này nhỏ hơn hoặc bằng số tiền của giao dịch |
| `vnp_CreateBy` | `string` | Người khởi tạo hoàn tiền. Có thể là tên user thực hiện hoàn tiền của merchant. |
| `vnp_CreateDate` | `number` | Thời gian phát sinh request hoàn (Request Date) GMT+7 |
| `vnp_IpAddr` | `string` | Địa chỉ IP của máy chủ thực hiện gọi API |
| `vnp_OrderInfo` | `string` | Mô tả thông tin yêu cầu hoàn( Request description) |
| `vnp_RequestId` | `string` | Mã hệ thống merchant tự sinh ứng với mỗi yêu cầu hoàn trả giao dịch. Mã này là duy nhất dùng để phân biệt các yêu cầu hoàn trả giao dịch. Không được trùng lặp trong ngày. |
| `vnp_TransactionDate` | `number` | Thời gian ghi nhận giao dịch tại website của merchant tính theo GMT+7 |
| `vnp_TransactionNo` | `number` | Mã giao dịch ghi nhận tại hệ thống VNPAY |
| `vnp_TransactionType` | `VnpTransactionType` | Loại giao dịch tại hệ thống VNPAY |
| `vnp_TxnRef` | `string` | Là mã giao dịch thanh toán của hệ thống merchant gửi VNPAY yêu cầu thanh toán. |

### `RefundResponse` {#refund-response-properties}

| Thuộc tính | Kiểu dữ liệu | Mô tả |
| ---------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| isSuccess | boolean | Kết quả của yêu cầu |
| isVerified | boolean | Kết quả xác thực tính toàn vẹn của dữ liệu khi nhận về từ VNPay |
| message | string | Thông báo xác thực |
| ... | ... | Các tham số khác của VNPay sẽ trả về, tham khảo tại [đây](https://sandbox.vnpayment.vn/apis/docs/truy-van-hoan-tien/querydr&refund.html#danh-s%C3%A1ch-tham-s%E1%BB%91-refund) |

Xem thêm các thuộc tính VNPay sẽ trả về tại [VNPay](https://sandbox.vnpayment.vn/apis/docs/truy-van-hoan-tien/querydr&refund.html#danh-s%C3%A1ch-tham-s%E1%BB%91-refund).
:::tip
Các tham số mà [VNPay trả về](https://sandbox.vnpayment.vn/apis/docs/truy-van-hoan-tien/querydr&refund.html#danh-s%C3%A1ch-tham-s%E1%BB%91-refund) cũng nằm trong đối tượng `RefundResponse`.
:::
4 changes: 0 additions & 4 deletions docs/docs/examples.md → docs/docs/20_examples.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
---
sidebar_position: 8
---

# Các ví dụ

## Dự án mẫu với Express MVC
Expand Down
File renamed without changes.
5 changes: 3 additions & 2 deletions src/types/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@ export * from './common.type';
export * from './vnpay-config.type';
export * from './build-payment-url.type';
export * from './return-from-vnpay.type';
export { QueryDr, QueryDrResponse } from './query-dr.type';
export { Refund } from './refund.type';
export { QueryDr, QueryDrResponse, QueryDrResponseFromVNPay } from './query-dr.type';
export { Refund, RefundResponse, RefundResponseFromVNPay } from './refund.type';
export * from './logger.type';
export * from './verify-return-url.type';
export * from './verify-ipn-call.type';
export * from './bank.type';
26 changes: 20 additions & 6 deletions src/types/refund.type.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import { RefundTransactionType } from '../enums';
import { BuildPaymentUrl } from './build-payment-url.type';
import { ResultVerified } from './common.type';
import { LoggerData, LoggerOptions } from './logger.type';
import { QueryDr, QueryDrResponseFromVNPay } from './query-dr.type';

export type Refund = Pick<
QueryDr,
'vnp_RequestId' | 'vnp_TransactionNo' | 'vnp_TransactionDate' | 'vnp_IpAddr'
> &
Pick<BuildPaymentUrl, 'vnp_Amount' | 'vnp_OrderInfo' | 'vnp_TxnRef'> & {
export type Refund = Partial<Pick<QueryDr, 'vnp_TransactionNo'>> &
Pick<QueryDr, 'vnp_RequestId' | 'vnp_TransactionDate' | 'vnp_IpAddr'> &
Pick<BuildPaymentUrl, 'vnp_Amount' | 'vnp_OrderInfo' | 'vnp_TxnRef'> &
Partial<Pick<BuildPaymentUrl, 'vnp_Locale'>> & {
/**
* Loại giao dịch tại hệ thống VNPAY:
* - `02`: Giao dịch hoàn trả toàn phần
Expand Down Expand Up @@ -35,7 +36,7 @@ export type Refund = Pick<
vnp_CreateDate: number;
};

export type RefundResponse = Pick<
export type RefundResponseFromVNPay = Pick<
QueryDrResponseFromVNPay,
| 'vnp_TxnRef'
| 'vnp_Amount'
Expand Down Expand Up @@ -78,3 +79,16 @@ export type RefundResponse = Pick<
*/
vnp_OrderInfo: string;
};

export type RefundResponse = ResultVerified & RefundResponseFromVNPay;

export type RefundResponseLogger = LoggerData<
{
createdAt: Date;
} & RefundResponse
>;

export type RefundOptions<Fields extends keyof RefundResponseLogger> = LoggerOptions<
RefundResponseLogger,
Fields
>;
12 changes: 10 additions & 2 deletions src/utils/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,17 @@ export function isValidVnpayDateFormat(date: number): boolean {
return regex.test(dateString);
}

export function generateRandomString(length: number) {
export function generateRandomString(
length: number,
options?: {
onlyNumber?: boolean;
},
) {
let result = '';
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
let characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
if (options?.onlyNumber) {
characters = '0123456789';
}
const charactersLength = characters.length;
for (let i = 0; i < length; i++) {
result += `${characters[(Math.random() * charactersLength) | 0]}`;
Expand Down
Loading
Loading