承接 gonon/midtrans 相关项目开发

从需求分析到上线部署,全程专人跟进,保证项目质量与交付效率

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

gonon/midtrans

Composer 安装命令:

composer require gonon/midtrans

包简介

Framework-agnostic PHP SDK for Midtrans.

README 文档

README

Latest Version on Packagist PHP Version Tests License

A robust, framework-agnostic PHP SDK for interacting with the Midtrans Payment Gateway. Built on top of gonon/core, providing type safety, robust HTTP communication, and complete independence from any specific web framework (like Laravel or Symfony).

Table of Contents

  1. Features
  2. Requirements
  3. Installation
  4. Configuration
  5. Snap API (Payment Links)
  6. Core API (Direct Charges)
  7. Transaction Management
  8. Notifications (Webhooks)
  9. Exception Handling
  10. Testing
  11. License

Features

  • Framework Agnostic: Seamlessly integrates with Laravel, Symfony, Slim, or plain vanilla PHP.
  • Strictly Typed: Eliminates ambiguous array payloads. All requests and responses are encapsulated in strictly-typed, immutable DTOs (Data Transfer Objects).
  • Unified Client: A single, clean MidtransClient instance utilizing gonon/core and PSR-18 standard HTTP adapters (with built-in exponential backoff retries).
  • Secure Webhooks: Includes a built-in NotificationParser that securely validates Midtrans SHA512 signatures to prevent malicious spoofing.

Requirements

  • PHP >= 8.2
  • gonon/core

Installation

Install the package via Composer:

composer require gonon/midtrans

Configuration

To begin interacting with Midtrans, you need to instantiate the MidtransConfig and pass it to the MidtransClient.

use Gonon\Midtrans\Config\MidtransConfig;
use Gonon\Midtrans\Client\MidtransClient;
use Gonon\Core\Configuration\Environment;

// 1. Define your configuration
$config = new MidtransConfig(
    serverKey: 'SB-Mid-server-YOUR_SERVER_KEY',
    clientKey: 'SB-Mid-client-YOUR_CLIENT_KEY', // Optional, required for frontend integrations
    environment: Environment::Sandbox,          // Use Environment::Production for live apps
    timeout: 30                                 // Optional, HTTP timeout in seconds
);

// 2. Initialize the client
$client = new MidtransClient($config);

Snap API (Payment Links)

The Snap API is the fastest way to accept payments. It provides a ready-to-use checkout interface hosted by Midtrans.

Create Redirect URL

Generates a URL that you can redirect your customers to for payment.

use Gonon\Midtrans\DTO\Snap\CreateSnapTransactionRequest;
use Gonon\Midtrans\DTO\Shared\TransactionDetails;
use Gonon\Midtrans\DTO\Shared\CustomerDetails;
use Gonon\Midtrans\DTO\Snap\Callbacks;

$request = new CreateSnapTransactionRequest(
    transactionDetails: new TransactionDetails(
        orderId: 'ORDER-' . time(),
        grossAmount: 150000
    ),
    customerDetails: new CustomerDetails(
        firstName: 'John',
        lastName: 'Doe',
        email: 'john@example.com',
        phone: '08123456789'
    ),
    callbacks: new Callbacks(
        finish: 'https://yourwebsite.com/payment/success'
    )
);

$snapResponse = $client->snap()->createRedirectUrl($request);

echo $snapResponse->redirectUrl; // Redirect user to this URL

Create Snap Token

Generates a token used to open the Snap popup modal directly on your frontend via snap.js.

// Assuming the same $request object from above...
$snapResponse = $client->snap()->createToken($request);

echo $snapResponse->token; // Pass this token to your frontend JavaScript

Core API (Direct Charges)

If you are building your own checkout page and do not want to use the Snap popup, you can interact directly with the Midtrans Core API.

Supported Payment Methods

Payment Method payment_type value Required DTO Property Valid Codes / Description
Bank Transfer (VA) bank_transfer bankTransfer Bank codes: bca, bni, bri, cimb, mandiri, permata
Credit Card credit_card creditCard Requires token_id generated securely on frontend
GoPay gopay gopay GoPay E-wallet
ShopeePay shopeepay shopeepay ShopeePay E-wallet
Convenience Store cstore cstore Store codes: indomaret, alfamart

Bank Transfer (Virtual Account)

use Gonon\Midtrans\DTO\Core\CreateChargeRequest;
use Gonon\Midtrans\DTO\Core\BankTransferDetails;
use Gonon\Midtrans\DTO\Shared\TransactionDetails;

$request = new CreateChargeRequest(
    paymentType: 'bank_transfer',
    transactionDetails: new TransactionDetails('ORDER-CORE-123', 50000),
    bankTransfer: new BankTransferDetails(
        bank: 'bca'
    )
);

$response = $client->charge()->charge($request);

echo $response->transactionId;
echo $response->transactionStatus; // e.g., 'pending'

Credit Card

Note: For Credit Cards, you must first obtain a token_id from your frontend using midtrans-new-3ds.min.js.

use Gonon\Midtrans\DTO\Core\CreditCardDetails;
use Gonon\Midtrans\DTO\Shared\CustomerDetails;
use Gonon\Midtrans\DTO\Shared\TransactionDetails;
use Gonon\Midtrans\DTO\Core\CreateChargeRequest;

$request = new CreateChargeRequest(
    paymentType: 'credit_card',
    transactionDetails: new TransactionDetails('order102', 789000),
    customerDetails: new CustomerDetails(
        firstName: 'budi',
        lastName: 'pratama',
        email: 'budi.pra@example.com',
        phone: '08111222333'
    ),
    creditCard: new CreditCardDetails(
        tokenId: '<token_id from Get Card Token Step>',
        authentication: true
    )
);

$response = $client->charge()->charge($request);

E-Wallet (GoPay / ShopeePay)

use Gonon\Midtrans\DTO\Core\GopayDetails;
use Gonon\Midtrans\DTO\Core\ShopeepayDetails;

// GoPay Example
$gopayRequest = new CreateChargeRequest(
    paymentType: 'gopay',
    transactionDetails: new TransactionDetails('ORDER-GOPAY-123', 50000),
    gopay: new GopayDetails(
        enableCallback: true,
        callbackUrl: 'https://yourwebsite.com/gopay/callback'
    )
);

$response = $client->charge()->charge($gopayRequest);

// ShopeePay Example
$shopeepayRequest = new CreateChargeRequest(
    paymentType: 'shopeepay',
    transactionDetails: new TransactionDetails('ORDER-SHOPEEPAY-123', 50000),
    shopeepay: new ShopeepayDetails(
        callbackUrl: 'https://yourwebsite.com/shopeepay/callback'
    )
);

$response = $client->charge()->charge($shopeepayRequest);

Convenience Store (Indomaret / Alfamart)

use Gonon\Midtrans\DTO\Core\CstoreDetails;

$request = new CreateChargeRequest(
    paymentType: 'cstore',
    transactionDetails: new TransactionDetails('ORDER-CSTORE-123', 50000),
    cstore: new CstoreDetails(
        store: 'indomaret', // or 'alfamart'
        message: 'Payment for Order 123'
    )
);

$response = $client->charge()->charge($request);

Transaction Management

The TransactionResource allows you to manage existing transactions directly.

$orderId = 'ORDER-123';

Check Status

Check the real-time status of a transaction.

$status = $client->transactions()->status($orderId);
echo $status->transactionStatus; // 'settlement', 'pending', etc.

Cancel Transaction

Cancel a transaction before it is paid.

$cancelResult = $client->transactions()->cancel($orderId);

Approve / Deny

Approve or deny a Credit Card transaction flagged as challenge by the Fraud Detection System.

$client->transactions()->approve($orderId);
$client->transactions()->deny($orderId);

Expire Transaction

Force a pending transaction to expire immediately.

$client->transactions()->expire($orderId);

Notifications (Webhooks)

Midtrans will send asynchronous HTTP notifications to your server whenever a transaction status changes. To ensure the notification actually came from Midtrans and hasn't been tampered with, this SDK provides a secure NotificationParser.

use Gonon\Midtrans\Exceptions\NotificationException;

// Retrieve the raw JSON payload sent by Midtrans
$jsonPayload = file_get_contents('php://input');

try {
    // This strictly validates the SHA512 signature automatically using the serverKey configured in MidtransClient.
    // If the signature is invalid, it throws a NotificationException.
    $notification = $client->notifications()->parse($jsonPayload);
    
    $orderId = $notification->orderId;
    $status = $notification->transactionStatus;
    
    if ($status === 'settlement' || $status === 'capture') {
        // Safe to mark the order as paid in your database!
        echo "Payment successful for order: {$orderId}";
    } elseif ($status === 'cancel' || $status === 'deny' || $status === 'expire') {
        // Mark as failed
    }

    // Always return a 200 OK to Midtrans so they stop retrying
    http_response_code(200);
    echo "OK";
    
} catch (NotificationException $e) {
    // The signature was invalid or the JSON was malformed.
    // Do NOT process the order.
    http_response_code(403);
    echo "Invalid Signature: " . $e->getMessage();
}

Exception Handling

All exceptions thrown by this package implement a base MidtransException. Specific operations will throw domain-specific exceptions containing the status_message returned from Midtrans.

use Gonon\Midtrans\Exceptions\MidtransException;
use Gonon\Midtrans\Exceptions\ChargeException;
use Gonon\Midtrans\Exceptions\SnapException;

try {
    $snap->createToken($request);
} catch (SnapException $e) {
    // Handle Snap API specific failure
    echo $e->getMessage();
} catch (MidtransException $e) {
    // Catch-all for any Midtrans SDK exception
    echo $e->getMessage();
}

Testing

Run the automated test suite securely using PHPUnit:

composer test

To run static analysis using PHPStan (Level Max):

composer analyse

License

The MIT License (MIT). Please see the License File for more information.

统计信息

  • 总下载量: 0
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 2
  • 依赖项目数: 1
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2026-07-10

承接程序开发

PHP开发

VUE

Vue开发

前端开发

小程序开发

公众号开发

系统定制

数据库设计

云部署

网站建设

安全加固