Làm cách nào để lưu trữ chi tiết thanh toán trong cơ sở dữ liệu PHP?

Có nhiều dịch vụ thanh toán có sẵn trên thị trường. Ví dụ: PayPal, Stripe, Sage Pay, CCAvenue, v.v. Họ phải tích hợp một cổng thanh toán vào một ứng dụng

Tất cả đều cung cấp API để truy cập các dịch vụ thanh toán qua cổng. Stripe là một trong những cổng thanh toán được sử dụng rộng rãi trong số các tùy chọn có sẵn. Nó phổ biến để thực hiện các giao dịch trơn tru với thẻ tín dụng và thẻ ghi nợ

Bằng cách tích hợp API cổng thanh toán, chúng tôi có thể kích hoạt các tùy chọn thanh toán trong một ứng dụng

Chúng tôi cần chọn một nhà cung cấp thanh toán phổ biến có danh tiếng tốt vì nó liên quan đến tiền thật. Đó là để có sự hỗ trợ chuyên nghiệp và đáng tin cậy. Stripe sẽ là lựa chọn tốt nhất để có các giao dịch được đảm bảo

Về ví dụ này

Bài viết này sẽ hướng dẫn cách tích hợp cổng thanh toán Stripe trong ứng dụng PHP. Nó chứa mã ví dụ để tạo tùy chọn thanh toán một lần trong PHP

Nó triển khai phương thức biểu mẫu tùy chỉnh của Stripe để cho phép thanh toán. Stripe cung cấp phương thức thanh toán được lưu trữ ít mã hơn để chấp nhận thanh toán một lần

Trong hướng dẫn trước, chúng ta đã thấy phương thức thanh toán PayPal bằng PHP. Nếu bạn đang tìm mã tích hợp cổng thanh toán PayPal, bài viết được liên kết sẽ hữu ích

Ảnh chụp màn hình bên dưới hiển thị biểu mẫu tùy chỉnh với phần tử Thẻ sọc. Nó cho phép người dùng nhập thông tin thanh toán và chi tiết thẻ để thực hiện thanh toán

các sọc. js gắn phần tử giao diện người dùng để chấp nhận chi tiết thẻ khách hàng. Nó truy cập URL điểm cuối và gửi yêu cầu thanh toán tới API. Các khóa API được sử dụng để xác thực trước khi xử lý thanh toán

Làm cách nào để lưu trữ chi tiết thanh toán trong cơ sở dữ liệu PHP?

Các bước tích hợp cổng thanh toán Stripe

1. Tạo tài khoản Stripe và nhận khóa API

Tạo tài khoản Stripe và đăng nhập vào bảng điều khiển. Điều hướng qua menu Nhà phát triển -> Khóa API để lấy khóa API. Có hai loại khóa API tiêu chuẩn có tên là khóa bí mật và khóa có thể xuất bản. Khóa bí mật sẽ được ẩn theo mặc định, khóa này phải được tiết lộ bằng cách nhấp vào tiết lộ kiểm soát mã thông báo khóa một cách rõ ràng

Các khóa này được lưu trữ trong tệp cấu hình dưới dạng hằng số PHP và sẽ được sử dụng trong mã thanh toán Stripe sau này

2. Tạo biểu mẫu thanh toán và hiển thị phần tử Stripe để nhận thông tin chi tiết về thẻ của người dùng

Trong biểu mẫu HTML này, nó bao gồm các trường như tên chủ thẻ, số thẻ, CVC, tháng/năm hết hạn để người dùng nhập vào. Chúng tôi đã tạo biểu mẫu này với các trường như vậy cho ví dụ về trình xác thực thẻ tín dụng. Nó cũng bao gồm item_number, item_name, số lượng và currency_code làm đầu vào ẩn

Stripe API khuyến nghị sử dụng mã thông báo thay vì gửi chi tiết thẻ thử nghiệm trong khi thử nghiệm Tích hợp thanh toán. Các mã thông báo thử nghiệm được ánh xạ với các chi tiết thẻ được mã hóa bằng cách sử dụng thư viện Stripe JavaScript

hình thức thanh toán-ui. php


Stripe payment integration via custom form

Name

Email

Address

Country

$val) { ?>

Postal code

Description

Amount

Currency

$val) { ?>

Send Payment

Thank you for the payment.

3. bao gồm Sọc. js để xác thực, tạo và xác nhận thanh toán bằng thẻ một cách an toàn

Khi gửi chi tiết thẻ, dữ liệu đã nhập sẽ được xác thực ở phía máy khách. Sau khi xác thực trả về true, thì chi tiết thẻ sẽ được gửi đến máy chủ get Stripe để nhận mã thông báo. API Stripe sẽ trả lại mã thông báo và nó sẽ được thêm vào các trường biểu mẫu thanh toán bằng cách sử dụng Stripe ResponseHandler. Đây là tính năng đáng hoan nghênh nhất của chi tiết thẻ xử lý thanh toán Stripe và xác thực với máy chủ Stripe qua JavaScript

Sau khi chèn mã thông báo, biểu mẫu sẽ được gửi theo chương trình bằng Javascript. Trong khi triển khai tích hợp thanh toán Sage Pay, chúng tôi đã thấy cách gửi yêu cầu thanh toán bằng JavaScript

var stripeKey = document.querySelector('#payment-box').dataset.consumerKey;
var createOrderUrl = document.querySelector('#payment-box').dataset.createOrderUrl;
var returnUrl = document.querySelector('#payment-box').dataset.returnUrl;
var stripe = Stripe(stripeKey);
var elements = stripe.elements();
var style = {
	base: {
		color: "#32325d",
		fontFamily: 'Arial, sans-serif',
		fontSmoothing: "antialiased",
		fontSize: "16px",
		"::placeholder": {
			color: "#32325d"
		}
	},
	invalid: {
		fontFamily: 'Arial, sans-serif',
		color: "#fa755a",
		iconColor: "#fa755a"
	}
};
var card = elements.create("card", {
	hidePostalCode: true,
	style: style
});
// Stripe injects an iframe into the DOM
card.mount("#card-element");
card
	.on(
		"change",
		function(event) {
			// Disable the Pay button if there are no card details in
			// the Element
			document.querySelector("button").disabled = event.empty;
			document.querySelector("#card-error").textContent = event.error ? event.error.message
				: "";
		});

function confirmOrder(event) {
	var valid = formValidate();
	if (valid) {
		var purchase = {
			email: document.getElementById("email").value,
			notes: document.getElementById("notes").value,
			unitPrice: document.getElementById("price").value,
			currency: document.getElementById("currency").value,
			name: document.getElementById("customer_name").value,
			address: document.getElementById("address").value,
			country: document.getElementById("country").value,
			postalCode: document.getElementById("postal_code").value
		};

		// Disable the button until we have Stripe set up on the page
		// document.querySelector("btnSubmit").disabled = true;
		fetch(createOrderUrl, {
			method: "POST",
			headers: {
				"Content-Type": "application/json",

			},
			body: JSON.stringify(purchase)
		}).then(function(result) {
			return result.json();
		}).then(function(data) {
			// Complete payment when the submit button is clicked
			payWithCard(stripe, card, data.clientSecret, data.orderHash);
		});
		// Calls stripe.confirmCardPayment
		// If the card requires authentication Stripe shows a pop-up modal
		// to
		// prompt the user to enter authentication details without leaving
		// your
		// page.
		var payWithCard = function(stripe, card, clientSecret, orderHash) {
			loading(true);
			stripe.confirmCardPayment(clientSecret, {
				payment_method: {
					card: card
				}
			}).then(function(result) {
				if (result.error) {
					// Show error to your customer
					showError(result.error.message);
				} else {
					// The payment succeeded!
					orderComplete(result.paymentIntent.id, orderHash);
				}
			});
		};
		/* ------- UI helpers ------- */
		// Shows a success message when the payment is complete
		var orderComplete = function(paymentIntentId, orderHash) {
			loading(false);
			window.location.href = returnUrl + "?orderId=" + orderHash;
		};
		// Show the customer the error from Stripe if their card fails to
		// charge
		var showError = function(errorMsgText) {
			loading(false);
			var errorMsg = document.querySelector("#card-error");
			errorMsg.textContent = errorMsgText;
			setTimeout(function() {
				errorMsg.textContent = "";
			}, 10000);
		};
		// Show a spinner on payment submission
		var loading = function(isLoading) {
			if (isLoading) {
				// Disable the button and show a spinner
				document.querySelector("button").disabled = true;
				document.querySelector("#spinner").classList.remove("hidden");
				document.querySelector("#button-text").classList.add("hidden");
			} else {
				document.querySelector("button").disabled = false;
				document.querySelector("#spinner").classList.add("hidden");
				document.querySelector("#button-text").classList
					.remove("hidden");
			}

		};
	}
}

4. Xử lý yêu cầu thanh toán Stripe trong PHP

Tải xuống thư viện Stripe PHP cần thiết để xử lý phí bằng mã PHP. Các hàm liên quan đến thanh toán được tạo trong lớp StripePayment PHP. php. Nó xử lý các khoản phí của Stripe bằng cách gửi mã thông báo API và dữ liệu yêu cầu thanh toán khác như id khách hàng, số tiền, đơn vị tiền tệ, v.v. Sau khi xử lý yêu cầu thanh toán, Stripe API sẽ trả về phản hồi thanh toán dưới dạng đối tượng JSON

lib/SọcDịch vụ. php

apiKey = Config::STRIPE_SECRET_KEY;
        $this->stripeService = new Stripe();
        $this->stripeService->setVerifySslCerts(false);
        $this->stripeService->setApiKey($this->apiKey);
    }

    public function createPaymentIntent($orderReferenceId, $amount, $currency, $email, $customerDetailsArray, $notes, $metaData)
    {
        try {
            $this->stripeService->setApiKey($this->apiKey);

            $paymentIntent = \Stripe\PaymentIntent::create([
                'description' => $notes,
                'shipping' => [
                    'name' => $customerDetailsArray["name"],
                    'address' => [
                        'line1' => $customerDetailsArray["address"],
                        'postal_code' => $customerDetailsArray["postalCode"],
                        'country' => $customerDetailsArray["country"]
                    ]
                ],
                'amount' => $amount * 100,
                'currency' => $currency,
                'payment_method_types' => [
                    'card'
                ],
                'metadata' => $metaData
            ]);
            $output = array(
                "status" => "success",
                "response" => array('orderHash' => $orderReferenceId, 'clientSecret'=>$paymentIntent->client_secret)
            );
        } catch (\Error $e) {
            $output = array(
                "status" => "error",
                "response" => $e->getMessage()
            );
        }
        return $output;
    }


    public function getToken()
    {
        $token = "";
        $codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        $codeAlphabet .= "abcdefghijklmnopqrstuvwxyz";
        $codeAlphabet .= "0123456789";
        $max = strlen($codeAlphabet) - 1;
        for ($i = 0; $i < 17; $i ++) {
            $token .= $codeAlphabet[mt_rand(0, $max)];
        }
        return $token;
    }

}

Tạo và định cấu hình webhook để thông báo phản hồi

Điều hướng đến menu Stripe Developers->Webhook trong bảng điều khiển. Sau đó, tạo một URL điểm cuối webhook để thông báo các lần xảy ra sự kiện thanh toán cho ứng dụng

Cửa sổ tạo webhook sẽ yêu cầu ánh xạ sự kiện cho điểm cuối webhook. Ví dụ này sử dụng URL webhook được ánh xạ cho các sự kiện được liệt kê bên dưới

  1. thanh toán_intent. thành công
  2. thanh toán_intent. thanh toán không thành công

Sau khi tạo điểm cuối webhook trong bảng điều khiển, hãy định cấu hình điểm cuối đó trong ứng dụng. Nó sẽ hữu ích cho việc xác minh động điểm cuối trong khi yêu cầu API

5. Phân tích cú pháp đối tượng phản hồi thanh toán và lưu trữ nó vào cơ sở dữ liệu

Đối tượng JSON được tuần tự hóa được phân tích cú pháp để nhận trạng thái thanh toán và phản hồi. Các chi tiết như email, item_number, item_name, trạng thái thanh toán và phản hồi được lưu trữ trong bảng tbl_payment bằng cách sử dụng phần chèn MySQL. Tôi đã sử dụng câu lệnh đã chuẩn bị với MySQLi để xử lý các hoạt động cơ sở dữ liệu

type;
    fwrite($file, $event);

    $orderId = $event->data->object->metadata->order_id;
    $email = $event->data->object->metadata->email;
    $paymentIntentId = $event->data->object->id;
    $amount = $event->data->object->amount;
    $stripePaymentStatus = $event->data->object->status;

    if ($eventType == "payment_intent.payment_failed") {
        $orderStatus = 'Payement Failure';

        $paymentStatus = 'Unpaid';

        $amount = $amount / 100;

        require_once __DIR__ . '/../lib/StripePayment.php';
        $stripePayment = new StripePayment();

        $stripePayment->updateOrder($paymentIntentId, $orderId, $orderStatus, $paymentStatus, $stripePaymentStatus, $event);
    }
    if ($eventType == "payment_intent.succeeded") {
        /*
         * Json values assign to php variables
         *
         */
        $orderStatus = 'Completed';

        $paymentStatus = 'Paid';

        $amount = $amount / 100;

        require_once __DIR__ . '/../lib/StripePayment.php';
        $stripePayment = new StripePayment();

        $stripePayment->updateOrder($paymentIntentId, $orderId, $orderStatus, $paymentStatus, $stripePaymentStatus, $event);

        http_response_code(200);
    }
}

?>

Cấu trúc cơ sở dữ liệu thanh toán

Tập lệnh SQL sau hiển thị câu lệnh truy vấn để tạo bảng cơ sở dữ liệu thanh toán nhằm lưu trữ dữ liệu thanh toán do Stripe API trả về sau khi xử lý yêu cầu thanh toán của chúng tôi

--
-- Table structure for table `tbl_payment`
--

CREATE TABLE `tbl_payment` (
  `id` int(11) NOT NULL,
  `order_hash` varchar(255) NOT NULL,
  `payer_email` varchar(100) NOT NULL,
  `amount` double(10,2) NOT NULL,
  `currency` varchar(25) NOT NULL,
  `payment_type` varchar(25) NOT NULL,
  `order_date` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  `order_status` varchar(25) NOT NULL,
  `notes` text NOT NULL,
  `name` varchar(25) NOT NULL,
  `address` varchar(255) NOT NULL,
  `country` varchar(25) NOT NULL,
  `postal_code` varchar(25) NOT NULL,
  `stripe_payment_intent_id` varchar(255) NOT NULL,
  `payment_status` varchar(25) NOT NULL,
  `stripe_payment_status` varchar(25) NOT NULL,
  `stripe_payment_response` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

--
-- Indexes for dumped tables
--

--
-- Indexes for table `tbl_payment`
--
ALTER TABLE `tbl_payment`
  ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `tbl_payment`
--
ALTER TABLE `tbl_payment`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

Thử nghiệm với Cổng thanh toán Stripe

Tìm thêm dữ liệu thử nghiệm trong tài liệu thử nghiệm Stripe API. Bạn có thể sử dụng số thẻ thử nghiệm để chứng minh tích hợp thanh toán Stripe

Ghi chú. Trước khi đi vào hoạt động, chúng tôi cần kiểm tra thanh toán Stripe ở chế độ dữ liệu thử nghiệm. Sau khi chúng tôi nhận thấy mọi thứ đều hoạt động tốt với chế độ thử nghiệm, thì sẽ dễ dàng đưa vào hoạt động bằng cách bật chế độ dữ liệu

Làm cách nào để lưu trữ thông tin thanh toán trong cơ sở dữ liệu?

Cách lưu trữ thông tin thẻ tín dụng một cách an toàn .
Tìm hiểu các tiêu chuẩn PCI, từ trong ra ngoài. .
Sử dụng cổng thanh toán an toàn. .
Sử dụng hệ thống lưu trữ dữ liệu thẻ tín dụng chuyên dụng. .
Luôn cập nhật phần mềm. .
Sử dụng thiết bị tuân thủ PCI. .
Không bao giờ lưu trữ số bảo mật CVV

Chúng tôi có thể lưu thông tin thẻ tín dụng trong cơ sở dữ liệu không?

Không bao giờ lưu trữ dữ liệu theo dõi điện tử hoặc số bảo mật thẻ . Mặc dù bạn có thể có lý do kinh doanh để lưu trữ thông tin thẻ tín dụng, các quy định xử lý đặc biệt cấm lưu trữ mã bảo mật của thẻ hoặc bất kỳ “dữ liệu theo dõi” nào có trong dải từ ở mặt sau của thẻ tín dụng.

Làm cách nào để tạo một hệ thống thanh toán bằng PHP?

Cách tích hợp cổng thanh toán với cửa hàng trực tuyến của bạn bằng PHP .
Bước 1. Tạo biểu mẫu HTML để thu thập thông tin nguồn thanh toán của khách hàng. .
Bước 2. Tạo mã thông báo để truyền dữ liệu được mã hóa một cách an toàn. .
Bước 3. Cho phép gửi biểu mẫu cùng với thông tin thanh toán. .
Bước 4. Xác minh và xác thực các khoản phí

Làm cách nào để tạo API thanh toán bằng PHP?

Hướng dẫn 1. Tích hợp cổng thanh toán bằng PHP .
Chuẩn bị biểu mẫu HTML để thu thập thông tin thẻ tín dụng
Tạo mã thông báo Stripe để truyền thông tin thẻ một cách an toàn
Gửi biểu mẫu với chi tiết thẻ
Xác minh thẻ và xử lý các khoản phí
Chèn chi tiết thanh toán vào cơ sở dữ liệu để hiển thị trạng thái cho người dùng