Chuyên mục Tích hợp Api

Cách tích hợp cổng thanh toán MOMO với PHP thuần trong vòng một nốt nhạc

Đăng bởi: Minacode|Cập nhật:13-12-2023

Ok anh em, Bài này mình hướng dẫn anh em cách tích hợp luôn cổng thanh toán MOMO vào dự án của chúng ta luôn nhé. 

Đầu tiên để nắm được nội dung bài này, các bạn cần phải tham khảo bài viết về tích hợp VNPAY trước nhé:

Let ‘s go thôi nào

Để thêm phương thức thanh toán mới mình sẽ chỉnh sửa giao diện một chút nhé

Code giao diện trên sẽ thay đổi như sau:

<?php 
include "PaymenVnpayClass.php";
$payment = new payment;
include "PaymentMomoClass.php";
$paymentMomo = new payment_momo;
?>
<?php

if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['redirect']) ) {
$order_id = $_POST['order_id'];
$order_price = $_POST['order_price'];
$payment-> vnpay_payment($order_id,$order_price);
}
?>
<?php

if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['momo-payment']) ) {
$order_id = $_POST['order_id'];
$order_price = $_POST['order_price'];
$paymentMomo-> payment_momo($order_id,$order_price);
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Payment-Vnpay</title>
</head>

<style>
    body {
        width: 100vw;
        height: 100vh;
        display: flex;
        align-items: center;
        justify-content: center;
    }
    button {
        text-decoration: none;
        display: inline-block;
        padding: 10px 12px;
        color: whitesmoke;
        border: none;
        cursor: pointer;
    }
</style>
<body>
    <form action="" method="post">
        <img src="noimage.jpeg" style="width: 500px" alt="">
        <input type="hidden" name="order_id" value="<?php echo time() ?>"> <br>
        <input type="hidden" name="order_price" value="50000"> <br>
        <p style="color:red">Bạn cần thành toán 50.000<sup>đ</sup> để nhìn thấy em nó</p>
        <button style="background-color: #005aa9;" name="redirect" type="submit">Thanh toán Vnpay</button>
        <button style="background-color: #a00061;" name="momo-payment"  type="submit">Thanh toán Momo</button>
    </form>
    
</body>
</html>

 

Tương tự như phương thức thanh toán vnpay, sau khi khách hàng của chúng ta chọn thanh toán ví MOMO. Màn hình sẽ tự động chuyển qua cổng thanh toán của MOMO

Các bạn dùng thông tin thẻ để test của MOMO dưới đây:

Hoặc tham khảo link dưới đây:

Sau khi nhập các thông tin thanh toán trên và thực hiện thanh toán thì màn hình sẽ báo thành công

Và chuyển qua màn hình kết quả của chúng ta

Đối với phần việc code trong trường hợp này

Mình sẽ tạo một một file mới để chứa class có tên là PaymentMomoClass.php và thêm đoạn code sau:

<?php 
class payment_momo
{
    public function payment_momo ($order_id,$order_price)
{
    
    $endpoint = "https://test-payment.momo.vn/v2/gateway/api/create";
    $partnerCode = 'MOMOBKUN20180529';
    $accessKey = 'klm05TvNBzhg7h7j';
    $secretKey = 'at67qH6mk8w5Y1nAyMoYKMWACiEi2bsa';
    $orderInfo = $order_id;
    $amount = $order_price;
    $orderId = $order_id;
    $redirectUrl = "http://localhost:82/PHP/payment/momo/success.php";
    $ipnUrl = "http://localhost:82/PHP/payment/momo/success.php";
    $extraData = "";
    
    
     
    $partnerCode = $partnerCode;
    $accessKey = $accessKey;
    $serectkey = $secretKey ;
    $orderId = $orderId; // Mã đơn hàng
    $orderInfo = $orderInfo;
    $amount = $amount;
    $ipnUrl = $ipnUrl;
    $redirectUrl = $redirectUrl;
    $requestId = time() . "";
    $requestType = "payWithATM";
    $rawHash = "accessKey=" . $accessKey . "&amount=" . $amount . "&extraData=" . $extraData . "&ipnUrl=" . $ipnUrl . "&orderId=" . $orderId . "&orderInfo=" . $orderInfo . "&partnerCode=" . $partnerCode . "&redirectUrl=" . $redirectUrl . "&requestId=" . $requestId . "&requestType=" . $requestType;
    $signature = hash_hmac("sha256", $rawHash, $serectkey);
    $data = array(
        'partnerCode' => $partnerCode,
        'partnerName' => "Test",
        "storeId" => "MomoTestStore",
        'requestId' => $requestId,
        'amount' => $amount,
        'orderId' => $orderId,
        'orderInfo' => $orderInfo,
        'redirectUrl' => $redirectUrl,
        'ipnUrl' => $ipnUrl,
        'lang' => 'vi',
        'extraData' => $extraData,
        'requestType' => $requestType,
        'signature' => $signature);
    $result = $this -> execPostRequest($endpoint, json_encode($data));
  
    $jsonResult = json_decode($result, true);  // decode json
    
    header('Location: ' . $jsonResult['payUrl']);
}
public function execPostRequest($url, $data)
{
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Content-Type: application/json',
            'Content-Length: ' . strlen($data))
    );
    curl_setopt($ch, CURLOPT_TIMEOUT, 5);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
    //execute post
    $result = curl_exec($ch);
    //close connection
    curl_close($ch);
    return $result;
}
}

File success_result.php sẽ không thay đổi, nhưng file success.php mình sẽ code lại một chút như sau:

<?php 
if ($_SERVER["REQUEST_METHOD"] == "GET")
{
    if ( isset($_GET['vnp_ResponseCode']) && $_GET['vnp_ResponseCode'] == '00'|| isset($_GET['resultCode']) && $_GET['resultCode'] == '00') 
    {
        header('Location: ' . 'http://localhost:82/PHP/payment/momo/success_result.php');
    }
    else {
    
    }
    exit();
}
?>

Bố cục sourcecode của mình hiện tại sẽ như sau:

Ok, giờ thì các bạn ra ngoài màn hình và thử thôi nào. Quá ngon lành cành đào đúng không! Thêm một phương thức để hỗ trợ việc nằm ngủ cũng có tiền rồi nhé!

Để Lại Ý Kiến Của bạn!
Bài Viết Chuyên Mục


Khóa Học Miễn Phí

IvyModa

FullStack

Chi tiết

Tạo tính năng CRUD với Livewire Laravel

FullStack

Chi tiết

Php-MySqli-DataBase Cơ Bản

FullStack

Chi tiết
Về MinaCode
Đọc Thơ Nhân Kỷ Niệm 10 Năm Thành Lập MB Nam Đà Nẵng

Banker To Coder

Hi All,


Nguyên đây! MinaCode là website mình tạo ra với mong muốn chia sẻ chút kiến thức liên quan đến lập trình FullStack.

Ngôn ngữ lập trình chủ yếu được sử dụng là Htm, Css, Javascript, Php cùng một số thư viện như Jquery, Fontawesome... Phía Frontend và Farmework Laravel phía Backend.

Mình chưa bao giờ tham gia bất cứ một trường lớp nào về lập trình. Tất cả kiến thức mình chia sẻ đều là trên tình thần tự học. Do đó:

+ MinaCode phù hợp với những tay ngang, xem lập trình như là một kỹ năng bổ trợ trong công việc hay là một kênh kiếm thêm thu nhập từ những very mini projects.

+ MinaCode không phù hợp với những bạn đang được đào tạo bài bản, chính quy.

Mình tin rằng, Trong tương lai không xa. Lập trình sẽ trở nên một kỹ năng không thể thiếu đối với các bạn trẻ.

Cuối cùng thì Ngôn ngữ lập trình không quan trọng bằng Tư duy lập trình. Mình chúc các bạn sẽ có được những kiến thức bổ ích với MinaCode.

--Ngô Sỹ Nguyên--

Coming Soon