PHPackages                             pay2pay/php-sdk - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Payment Processing](/categories/payments)
4. /
5. pay2pay/php-sdk

ActiveLibrary[Payment Processing](/categories/payments)

pay2pay/php-sdk
===============

PHP SDK cho Pay2Pay (PayPay) Payment Gateway: Collection API, Collection Redirect va Payout API

1.0.0(today)01↑2900%MITPHPPHP &gt;=7.0

Since Aug 24Pushed todayCompare

[ Source](https://github.com/giaiphapai/pay2pay-php-sdk)[ Packagist](https://packagist.org/packages/pay2pay/php-sdk)[ RSS](/packages/pay2pay-php-sdk/feed)WikiDiscussions main Synced today

READMEChangelogDependencies (1)Versions (2)Used By (0)

Pay2Pay PHP SDK
===============

[](#pay2pay-php-sdk)

Thư viện Composer cho **Pay2Pay (PayPay) Payment Gateway**, tương thích **PHP &gt;= 7.0**.

Bao phủ đầy đủ ba tài liệu tích hợp chính thức:

Tài liệuPhiên bảnĐược hỗ trợ bởi`PP-COLLECTION-API`v1.2`$pay2pay->collection()``PP-COLLECTION-REDIRECT-API`v1.3`$pay2pay->checkout()`, `$pay2pay->returnUrl()``PP-PAYOUT-API`v1.4`$pay2pay->payout()`Bản PDF gốc được lưu trong [docs/pdf/](docs/pdf/).

Vì sao cần thư viện này
-----------------------

[](#vì-sao-cần-thư-viện-này)

Phần khó nhất khi tích hợp Pay2Pay không phải là gọi HTTP mà là **ba loại chữ ký khác nhau, dễ nhầm lẫn**:

1. `p-signature` — RSA-2048 (`SHA256withRSA`) trên header đã sắp xếp + body, cho mọi API.
2. Chữ ký link redirect — `base64(sha256_raw(giá trị tham số sort a-z + merchant_key))`.
3. Chữ ký IPN / URL callback — `base64(sha256_raw(raw body + secretKey))`.

Cộng thêm việc mật khẩu lại băm theo kiểu thứ tư — `base64(sha256_hex(...))` — nên copy nhầm một hàm là hỏng cả luồng. SDK gói toàn bộ chuyện đó vào một chỗ, có test đối chiếu trực tiếp với ví dụ in trong tài liệu.

Cài đặt
-------

[](#cài-đặt)

Yêu cầu: PHP &gt;= 7.0 (đã kiểm thử tới PHP 8.5), `ext-curl`, `ext-json`, `ext-openssl`.

> **Gói này chưa có trên Packagist.** `composer require pay2pay/php-sdk` sẽ báo *Could not find a matching version of package* — hãy chọn một trong ba cách dưới.

### Cách 1 — Composer với repository dạng `path` (khuyến nghị khi cùng máy)

[](#cách-1--composer-với-repository-dạng-path-khuyến-nghị-khi-cùng-máy)

Trong `composer.json` của **dự án đang dùng**:

```
{
    "repositories": [
        { "type": "path", "url": "/duong/dan/toi/pay2pay-php-sdk", "options": { "symlink": true } }
    ],
    "require": {
        "pay2pay/php-sdk": "*"
    }
}
```

```
composer update pay2pay/php-sdk
```

Với `symlink: true`, sửa code trong thư mục SDK là dự án thấy ngay.

Gói này khai sẵn `"version": "1.0.0"` trong `composer.json` — nếu bỏ dòng đó đi, Composer sẽ suy ra version từ Git; repo chưa có tag thì thành `dev-main` và bạn gặp:

```
Could not find a version of package pay2pay/php-sdk matching your
minimum-stability (stable).

```

Ba cách chữa, chọn một:

CáchLàm gìGiữ `"version"` trong `composer.json` của SDKKhông phải làm gì thêm — mặc định hiện tạiGắn tag cho repo SDK`git tag v1.0.0` (không cần push nếu dùng repo dạng `path`)Cho phép bản dev ở dự án tiêu thụĐổi constraint thành `"pay2pay/php-sdk": "@dev"`> Nếu sau này bạn publish lên Packagist, hãy **xoá** dòng `"version"` — khi đó Packagist lấy version từ Git tag, và để lại field này sẽ gây xung đột.

### Cách 2 — Composer qua Git

[](#cách-2--composer-qua-git)

Đẩy thư mục này lên một repository Git (GitHub, GitLab, Bitbucket hoặc Git nội bộ), gắn tag phiên bản, rồi khai báo:

```
{
    "repositories": [
        { "type": "vcs", "url": "git@github.com:cong-ty-cua-ban/pay2pay-php-sdk.git" }
    ],
    "require": {
        "pay2pay/php-sdk": "^1.0"
    }
}
```

```
git init && git add . && git commit -m "Pay2Pay PHP SDK"
git tag v1.0.0 && git push origin main --tags
```

### Cách 3 — Không dùng Composer

[](#cách-3--không-dùng-composer)

```
require '/duong/dan/toi/pay2pay-php-sdk/autoload.php';

$pay2pay = Pay2Pay\Pay2Pay::make([...]);
```

`autoload.php` ở gốc thư mục là một PSR-4 autoloader độc lập, không phụ thuộc gì cả.

### Nếu Composer in đầy cảnh báo Deprecated

[](#nếu-composer-in-đầy-cảnh-báo-deprecated)

Đó là Composer cũ chạy trên PHP 8.x, không liên quan tới thư viện này:

```
composer self-update            # cập nhật Composer 2.x mới nhất
composer --version              # nên >= 2.7
```

Và đừng chạy Composer bằng `root` — nó sẽ cảnh báo và có thể tạo file sai quyền.

Dùng nhanh
----------

[](#dùng-nhanh)

```
use Pay2Pay\Pay2Pay;

$pay2pay = Pay2Pay::make([
    'environment' => 'uat',              // uat | production
    'tenant'      => 'MERCHANT-WEB',
    'username'    => '0982569888',
    'password'    => 'mat-khau-goc',     // mật khẩu GỐC, SDK tự băm
    'private_key' => file_get_contents('/etc/pay2pay/private.pem'),
    'merchant_id' => 'PP0000024',
    'merchant_key'=> 'm3arCAFqqRQuSh1tQwsJJg==',
    'secret_key'  => 'MySecretKey',
]);

// Thu hộ: tạo QR động cho một đơn hàng
$qr = $pay2pay->collection()->initializeDynamicQr('DH001', 500000, 'Thanh toan don hang');
echo $qr->getData('qrInfo');

// Thu hộ: chuyển hướng sang trang thanh toán Pay2Pay
header('Location: ' . $pay2pay->checkout()->build([
    'order_code'   => 'DH001',
    'total_amount' => 108000,
    'content'      => 'Thanh toan don hang',
]));

// Chi hộ: chuyển tiền 24/7
$pay2pay->payout()->transfer247([
    'amount'        => 200000,
    'bankId'        => 'BIDV',
    'bankCode'      => '970418',
    'bankRefNumber' => '1023020330000',
    'bankRefName'   => 'NGUYEN VAN A',
    'content'       => 'Hoan tien DH001',
]);
```

SDK tự lo access token (login, cache, refresh) và tự xin `verifiedKey` trước lệnh chi.

Tài liệu
--------

[](#tài-liệu)

TrangNội dung[01 — Cài đặt &amp; cấu hình](docs/01-cai-dat-va-cau-hinh.md)Tham số cấu hình, sinh khoá RSA, lưu token[02 — Chữ ký &amp; xác thực](docs/02-chu-ky-va-xac-thuc.md)Bốn thuật toán chữ ký, cách gỡ khi lệch[03 — Thu hộ qua API](docs/03-thu-ho-api.md)QR tĩnh/động, inquiry, hoàn tiền[04 — Thu hộ qua Redirect](docs/04-thu-ho-redirect.md)Tạo link thanh toán, xử lý URL trả về[05 — Chi hộ](docs/05-chi-ho.md)Số dư, danh sách bank, chuyển tiền 24/7[06 — IPN](docs/06-ipn.md)Xác thực và xử lý callback an toàn[07 — Mã lỗi &amp; trạng thái](docs/07-ma-loi-va-trang-thai.md)Bảng mã, cách phản ứng với từng nhóm[08 — Tham chiếu API](docs/08-tham-chieu.md)Danh sách đầy đủ lớp và phương thứcVí dụ chạy được nằm trong [examples/](examples/).

Ba điều dễ sai nhất
-------------------

[](#ba-điều-dễ-sai-nhất)

**1. Đừng bao giờ tin URL trả về.** Tham số trên `url_redirect` do trình duyệt của người dùng mang về. Chỉ dùng nó để hiển thị; ghi nhận đơn hàng phải dựa vào IPN hoặc `inquiryV2()`.

**2. IPN phải băm đúng raw body.** `$pay2pay->ipn()->handle()` đọc thẳng `php://input`. Nếu bạn `json_decode` rồi `json_encode` lại để tính chữ ký thì chỉ cần lệch một dấu cách là sai.

**3. Timeout khi chi hộ không có nghĩa là thất bại.** Với `ERR_BANK_TIMEOUT`, `ERR_MERCHANT_CORE_TIMEOUT`, `ERR_MERCHANT_BANK_TIMEOUT` hoặc timeout tầng mạng, tiền có thể đã đi. Phải gọi `inquiry()` theo `auditNumber` — dùng `transfer247Safe()`để SDK làm việc đó thay bạn.

Chạy test
---------

[](#chạy-test)

```
composer install && vendor/bin/phpunit

# hoặc không cần composer:
php tests/run.php
```

Bộ test đối chiếu trực tiếp với các ví dụ chữ ký in trong tài liệu Pay2Pay.

Giấy phép
---------

[](#giấy-phép)

MIT.

###  Health Score

34

—

LowBetter than 74% of packages

Maintenance100

Actively maintained with recent releases

Popularity2

Limited adoption so far

Community2

Small or concentrated contributor base

Maturity28

Early-stage or recently created project

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

0d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/254163924?v=4)[giaiphapai](/maintainers/giaiphapai)[@giaiphapai](https://github.com/giaiphapai)

---

Tags

qrpaymentgatewaypayoutpaypayvietnamnapaspay2pay

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/pay2pay-php-sdk/health.svg)

```
[![Health](https://phpackages.com/badges/pay2pay-php-sdk/health.svg)](https://phpackages.com/packages/pay2pay-php-sdk)
```

###  Alternatives

[paypayopa/php-sdk

PHP SDK for PayPay Open Payment API

18329.8k5](/packages/paypayopa-php-sdk)[sudiptpa/omnipay-nabtransact

National Australia Bank (NAB) Transact driver for the Omnipay payment processing library.

1020.1k](/packages/sudiptpa-omnipay-nabtransact)[baklysystems/laravel-paymob

Laravel PayMob online payment gateway package

292.4k](/packages/baklysystems-laravel-paymob)[lucassmacedo/omnipay-mercadopago

MercadoPago gateway for OmniPay

155.7k](/packages/lucassmacedo-omnipay-mercadopago)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
