با سلام خدمت جامعه توسعه دهندگان بلاکچین و قرار داد های هوشمند
من 0xlive هستم و در این تاپیک همونطور که در تاپیک قبلی گفتیم یک سیستم پرداخت ساده مبتنی بر وب رو با web3.js و coinex.net api پیاده سازی کنیم
نصب و اضافه کردن web3.js
برای نصب کردن این کتابخونه با استفاده از پکیج منیجر npm به این شکل عمل میکنیم:
npm install web3
و اگر از yarn استفاده میکنید به این شکل:
yarn add web3
و یا اگر میخواید از فایل پکیج شده استفاده کنید کافیه این تگ رو به بخش head اضافه کنید:
<script src="https://cdnjs.cloudflare.com/ajax/libs/web3/1.7.3/web3.min.js" integrity="sha512-Ws+qbaGHSFw2Zc1e7XRpvW+kySrhmPLFYTyQ95mxAkss0sshj6ObdNP3HDWcwTs8zBJ60KpynKZywk0R8tG1GA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
خیلی خب حالا میریم یک فایل html با نام payment.html میسازیم و و این کد رو درونش قرار میدیم:
<!DOCTYPE html>
<html>
<head>
<title>Payment Gateway</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/web3/1.7.3/web3.min.js" integrity="sha512-Ws+qbaGHSFw2Zc1e7XRpvW+kySrhmPLFYTyQ95mxAkss0sshj6ObdNP3HDWcwTs8zBJ60KpynKZywk0R8tG1GA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<<link rel="stylesheet" href="style.css">
</head>
<body>
<section id="payment" class="payment">
<form class="credit-card">
<div class="form-header">
<h4 class="title">Payment</h4>
</div>
<div class="form-body">
<input class="card-number" id="Amount" type="number" placeholder="Amount">
<div class="date-field">
</div>
<button class="pay-button" type="submit"> <a href="#">Buy</a></button>
<div id="status"></div>
</div>
</form>
</section>
</body>
</html>
در کد بالا من یک سکشن ایجاد کردم و توی اون یک فرمی برای پرداخت ایجاد کردم
حالا میخوام با جاوا اسکریپت کاری کنم که کاربر مقداری که میخواد رو وارد کنه و بعد از زدن دکمه buy از متامسک اجازه اتصال بگیره و پرداخت رو انجام بده.
دسترسی کیف پول
از اونجایی که متامسک خودشو توی هر صفحه اینجکت میکنه ازش میخوایم که دسترسی اکانت به ما بده :
window.addEventListener('load', async () => {
if (window.ethereum) {
window.web3 = new Web3(ethereum);
try {
await ethereum.eth_requestAccounts;
initPayButton()
} catch (err) {
$('#status').html('User denied account access', err)
}
} else if (window.web3) {
window.web3 = new Web3(web3.currentProvider)
initPayButton()
} else {
$('#status').html('No Metamask (or other Web3 Provider) installed')
}
})
تو کد بالا ما اول درخواست اتصال کیف پول رو میدیم اگر کاربر دسترسی رو قطع کنه پیغام ندادن دسترسی چاپ بشه و اگر متامسک نصب نبود میگیم که متامسک نصب نیست
پرداخت
در بخش بعدی کد ما با DOM مقداری رو از ورودی میگیریم و به ادرسی که در payment address هست میریزیم
اگر که تراکنش موفقیت امیز بود میگه موفق بود و هش اون رو نمایش میده و برای احراز به pay.php میفرسته اگر نه میگه تراکنش با شکست مواجه شد
const initPayButton = () => {
$('.pay-button').click(() => {
const paymentAddress = 'YOUR ADDRESS'
const amountEth = document.getElementById("Amount").value;
web3.eth.sendTransaction({
to: paymentAddress,
value: web3.toWei(amountEth, 'ether')
}, function(err, transactionHash) {
if (err) {
console.log('Payment failed', err)
$('#status').html('Payment failed')
} else {
document.getElementById("status").innerHTML = transactionHash;
$('#status').html('Payment successful')
var httpc = new XMLHttpRequest();
var url = "pay.php";
httpc.open("POST", url, true);
httpc.onreadystatechange = function() {.
if(httpc.readyState == 4 && httpc.status == 200) {
alert(httpc.responseText);
}
};
httpc.send(transactionHash);
}})
تقریبا کارمون با بخش کلاینت تموم شد میریم سراغ بک اند و pay.php
کار با api
ما برای کار کردن با api coinex.net نیاز به یک کلید داریم که نحوه گرفتنش رو در این تاپیک شرح دادم:
حالا نیاز داریم که pay.php رو پیکربندی کنیم:
<?php
$tx= $_POST['Amount'];
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://www.coinex.net/api/v1/transactions/".$tx,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"apikey: YOUR KEY",
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
$data = json_decode($response, true);
if ($err) {
echo "cURL Error #:" . $err;
} else {
if (strlen($data["data"]["error"]) == 0) {
echo "successful";
else{
echo"a mistake was made";
}}}
?>
توی کد بالا ما هش تراکنش رو میگیریم و به api url الصاق میکنیم و با یک ریکوئست با متود GET و کلید خودمون دیتا رو دریافت میکنیم
اون رو دیکود میکنیم
اگر اتصال ناموفق بود پیغام خطا و خطا رو به کاربر نشون میدیم و اگر موفق بود طول ایتم error رو بررسی میکنیم اگر برابر صفر بود یعنی تراکنش با موفقیت انجام شده و اگر مقدار داشت تراکنش با موفقیت با شکست مواجه شده
تبریک میگم ما یک سیستم پرداخت ساده ساختیم که تراکنشی که کاربر با متامسک اون رو انجام داده رو احراز میکنه