MomoController.php
iamvu
php
2 months ago
5.9 kB
7
Indexable
<?php namespace App\Controllers; use App\Core\BladeServiceProvider; use App\Models\OrderModel; use App\Models\MailModel; class MomoController { private $partnerCode; private $accessKey; private $secretKey; private $momoUrl; private $returnUrl; private $orderModel; private $mailModel; public function __construct() { $this->partnerCode = 'MOMO'; $this->accessKey = $_ENV['MOMO_ACCESS_KEY']; $this->secretKey = $_ENV['MOMO_SECRET_KEY']; $this->momoUrl = $_ENV['MOMO_URL']; $this->returnUrl = $_ENV['MOMO_RETURN_URL']; $this->orderModel = new OrderModel(); $this->mailModel = new MailModel(); } public function createPayment() { if ($_SERVER['REQUEST_METHOD'] === 'POST') { $orderId = time(); $amount = $_POST['amount']; $requestId = $this->partnerCode . time(); $orderInfo = "Thanh toán đơn hàng #$orderId"; $requestType = "payWithATM"; $extraData = ""; $rawSignature = "accessKey={$this->accessKey}" . "&amount=$amount" . "&extraData=$extraData" . "&ipnUrl={$this->returnUrl}" . "&orderId=$orderId" . "&orderInfo=$orderInfo" . "&partnerCode={$this->partnerCode}" . "&redirectUrl={$this->returnUrl}" . "&requestId=$requestId" . "&requestType=$requestType"; $signature = hash_hmac('sha256', $rawSignature, $this->secretKey); $requestData = json_encode([ "partnerCode" => $this->partnerCode, "accessKey" => $this->accessKey, "requestId" => $requestId, "amount" => $amount, "orderId" => $orderId, "orderInfo" => $orderInfo, "redirectUrl" => $this->returnUrl, "ipnUrl" => $this->returnUrl, "extraData" => $extraData, "requestType" => $requestType, "signature" => $signature, "lang" => "vi" ]); // Gửi request đến MoMo API $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $this->momoUrl); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Content-Length: ' . strlen($requestData) ]); curl_setopt($ch, CURLOPT_POSTFIELDS, $requestData); $response = curl_exec($ch); curl_close($ch); $result = json_decode($response, true); if (!empty($result['payUrl'])) { header("Location: " . $result['payUrl']); exit; } else { echo "Lỗi khi tạo thanh toán MoMo"; } } } public function momoCallback() { $data = $_GET; if (!isset($data['orderId']) || !isset($data['resultCode'])) { echo "Dữ liệu callback không hợp lệ"; return; } $secretKey = $_ENV['MOMO_SECRET_KEY']; $orderId = $data['orderId']; $amount = $data['amount']; $extraData = $data['extraData'] ?? ''; $message = $data['message'] ?? ''; $orderInfo = $data['orderInfo'] ?? ''; $orderType = $data['orderType'] ?? ''; $partnerCode = $data['partnerCode'] ?? ''; $payType = $data['payType'] ?? ''; $requestId = $data['requestId'] ?? ''; $responseTime = $data['responseTime'] ?? ''; $resultCode = $data['resultCode'] ?? ''; $transId = $data['transId'] ?? ''; $rawSignature = "accessKey=$this->accessKey" . "&amount=$amount" . "&extraData=$extraData" . "&message=$message" . "&orderId=$orderId" . "&orderInfo=$orderInfo" . "&orderType=$orderType" . "&partnerCode=$partnerCode" . "&payType=$payType" . "&requestId=$requestId" . "&responseTime=$responseTime" . "&resultCode=$resultCode" . "&transId=$transId"; $calculatedSignature = hash_hmac('sha256', $rawSignature, $secretKey); if ($calculatedSignature === $data['signature']) { if ($resultCode == '0') { // echo "Thanh toán thành công. Đơn hàng #$orderId"; // $amount = $amount / 100; $this->orderModel->createOrder( $_SESSION['order_data']['user_id'], "completed", $_SESSION['order_data']['payment_method'], $amount, $_SESSION['order_data']['compact_address'] ); $this->mailModel->send( $_SESSION['order_data']['email'], "Xác nhận đơn hàng", "mail_order", ['order_id' => $orderId] ); unset($_SESSION['order_data']); header("Location: /payment/success"); } else { echo "Thanh toán thất bại."; header("Location: /payment/errors"); } } else { echo "Chữ ký không hợp lệ! <br>"; echo "Chữ ký tính toán: $calculatedSignature <br>"; echo "Chữ ký MoMo gửi về: " . $data['signature'] . "<br>"; echo "Chuỗi dữ liệu ký: $rawSignature"; } } }
Editor is loading...
Leave a Comment