оплата товара по кнопке 'купить'

This commit is contained in:
Sergey Yarkov 2020-01-08 18:52:16 +03:00
parent 2de28b8b9a
commit 4412de2cf4
13 changed files with 82 additions and 8287 deletions

View File

@ -1,4 +1,5 @@
const fs = require('fs'); const fs = require('fs');
const ObjectID = require('mongodb').ObjectID;
function checkAuthenticated(req, res, next) { function checkAuthenticated(req, res, next) {
if (req.isAuthenticated()) return next(); if (req.isAuthenticated()) return next();
@ -12,9 +13,13 @@ module.exports = function(server, db) {
res.json(items); res.json(items);
} else { } else {
const items = await db.collection('items').find({}).toArray(), const items = await db.collection('items').find({}).toArray(),
info = await db.collection('info').find({}).toArray(),
sortBy = req.query.sorting; sortBy = req.query.sorting;
if (items.length > 0) { if (items.length > 0) {
// устанавливаем count для каждого товара.
info.forEach(info => db.collection('items').updateOne({"_id": ObjectID(info._id)}, {$set: {count: info.data.length}}));
switch (sortBy) { switch (sortBy) {
case 'ascending': case 'ascending':
res.json(items.sort((a, b) => a.price - b.price)); res.json(items.sort((a, b) => a.price - b.price));

View File

@ -215,7 +215,7 @@ module.exports = function (server, db) {
category: JSON.parse(req.body.category), category: JSON.parse(req.body.category),
info: req.body.data.split(',') info: req.body.data.split(',')
} }
db.collection('items').updateOne({"_id": ObjectID(data.id)}, {$set: {title: data.title, count: data.info.length, price: data.price, description: data.description, category: data.category.title}}); db.collection('items').updateOne({"_id": ObjectID(data.id)}, {$set: {title: data.title, price: data.price, description: data.description, category: data.category.title}});
db.collection('info').updateOne({"_id": ObjectID(data.id)}, {$set: {title: data.title, data: data.info}}); db.collection('info').updateOne({"_id": ObjectID(data.id)}, {$set: {title: data.title, data: data.info}});
res.redirect('/control-panel/items'); res.redirect('/control-panel/items');
} catch (error) { } catch (error) {

View File

@ -1,3 +1,5 @@
const ObjectID = require('mongodb').ObjectID;
module.exports = function(server, db, qiwiApi) { module.exports = function(server, db, qiwiApi) {
server.get('/success', (req, res) => { server.get('/success', (req, res) => {
const query = req.query; const query = req.query;
@ -13,12 +15,17 @@ module.exports = function(server, db, qiwiApi) {
if (status === 'PAID') { if (status === 'PAID') {
const findBill = await db.collection('buyers').findOne({bill_id: query.bill_id}); const findBill = await db.collection('buyers').findOne({bill_id: query.bill_id});
if (findBill == null) { if(findBill == null) {
// создаем покупателя // выдаем данные и создаем покупателя
const item = await db.collection('info').findOne({"_id": ObjectID(query.item_id)}),
data = item.data,
invoiceResult = data.splice(-1, 1);
db.collection('info').updateOne({"_id": ObjectID(query.item_id)}, {$set: {data: data}})
db.collection('buyers').insertOne({bill_id, email, method, date, amount}); db.collection('buyers').insertOne({bill_id, email, method, date, amount});
res.send('Выдаем данные!'); res.send(invoiceResult);
} else { } else {
res.send('Ошибка'); res.send('Этот заказ уже был оплачен. Данные были высланы покупателю.');
} }
} else if (status === 'WAITING') { } else if (status === 'WAITING') {
res.send('Инвоис ждет оплаты'); res.send('Инвоис ждет оплаты');
@ -27,10 +34,10 @@ module.exports = function(server, db, qiwiApi) {
} }
}) })
.catch(() => { .catch(() => {
res.send('произошла ошибка!'); res.render('main/404');
}); });
} else { } else {
res.send('bad request'); res.render('main/404');
} }
}); });
} }

View File

@ -1,17 +1,27 @@
const ObjectID = require('mongodb').ObjectID;
module.exports = function(server, db, qiwiApi) { module.exports = function(server, db, qiwiApi) {
server.put('/payment', (req, res) => { server.put('/payment', async (req, res) => {
// проверяем товар на его наличие
const item = await db.collection('info').findOne({"_id": ObjectID(req.body.items[0].id)});
if (item.data.length > 0) {
const billId = qiwiApi.generateId(); const billId = qiwiApi.generateId();
const fields = { const fields = {
amount: req.body.totalPrice, amount: req.body.totalPrice,
currency: 'RUB', currency: 'RUB',
comment: `Оплата товара "${req.body.items[0].title}" Счёт: ${billId}`, comment: `Оплата товара "${req.body.items[0].title}" Счёт: ${billId}`,
expirationDateTime: qiwiApi.getLifetimeByDay(), expirationDateTime: qiwiApi.getLifetimeByDay(),
customFields: {themeCode: 'Sergei-YaS7mIY0CQe'}, customFields: {
themeCode: 'Sergei-YaS7mIY0CQe'
},
email: req.body.email, email: req.body.email,
successUrl: `https://polar-peak-95205.herokuapp.com/success?bill_id=${billId}&item_id=${req.body.items[0].id}&payment=qiwi` successUrl: `https://polar-peak-95205.herokuapp.com/success?bill_id=${billId}&item_id=${req.body.items[0].id}&payment=qiwi`
} }
qiwiApi.createBill(billId, fields).then((data) => { qiwiApi.createBill(billId, fields).then((data) => {
res.send(data); res.send(data);
}); });
} else {
res.send('Товара нет в наличии.');
}
}); });
} }

View File

@ -16,7 +16,7 @@ const methodOverride = require('method-override');
const multer = require('multer'); const multer = require('multer');
const QiwiBillPaymentsAPI = require('@qiwi/bill-payments-node-js-sdk'); const QiwiBillPaymentsAPI = require('@qiwi/bill-payments-node-js-sdk');
const SECRET_KEY = '/'; const SECRET_KEY = 'eyJ2ZXJzaW9uIjoiUDJQIiwiZGF0YSI6eyJwYXlpbl9tZXJjaGFudF9zaXRlX3VpZCI6ImlsYzZ5Yy0wMCIsInVzZXJfaWQiOiI3OTMxMjc2NDY3NCIsInNlY3JldCI6ImFkZWJmMWU2NjYyMmJjZTViODE2NzE3YTU4ZmJkZDc1NTUwNzMyYWI5NGY2OTU0ZTg5NjljNjUzMGZkM2U0M2YifX0=';
const qiwiApi = new QiwiBillPaymentsAPI(SECRET_KEY); const qiwiApi = new QiwiBillPaymentsAPI(SECRET_KEY);
MongoClient.connect(db_config.url, {useNewUrlParser: true, useUnifiedTopology: true}) MongoClient.connect(db_config.url, {useNewUrlParser: true, useUnifiedTopology: true})
@ -48,9 +48,9 @@ MongoClient.connect(db_config.url, {useNewUrlParser: true, useUnifiedTopology: t
require('./routes/admin')(server, db); // маршрут с формой авторизации админа require('./routes/admin')(server, db); // маршрут с формой авторизации админа
require('./routes/control-panel')(server, db); // маршруты с панелью управления require('./routes/control-panel')(server, db); // маршруты с панелью управления
require('./routes/api')(server, db); // отдача данных клиенту require('./routes/api')(server, db); // отдача данных клиенту
require('./routes/invoice')(server, db, qiwiApi);
// Payments // Payments
require('./routes/invoice')(server, db, qiwiApi);
require('./routes/payments/qiwi.payment')(server, db, qiwiApi); require('./routes/payments/qiwi.payment')(server, db, qiwiApi);
// 404 Redirect // 404 Redirect

4151
dist/public/js/admin.js vendored

File diff suppressed because one or more lines are too long

4127
dist/public/js/main.js vendored

File diff suppressed because one or more lines are too long

View File

@ -1,3 +1,3 @@
script(async defer src="https://buttons.github.io/buttons.js") script(async defer src="https://buttons.github.io/buttons.js")
//script(src='../js/admin.js') script(src='../js/admin.js')
script(src="http://localhost:8080/admin.js") //script(src="http://localhost:8080/admin.js")

View File

@ -1,3 +1,3 @@
// Script JS // Script JS
//script(src='../js/main.js') script(src='../js/main.js')
script(src='http://localhost:8080/main.js') //script(src='http://localhost:8080/main.js')

View File

@ -4,7 +4,7 @@
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"build": "webpack --mode development", "build": "webpack --mode production",
"wp-server": "webpack-dev-server --mode development" "wp-server": "webpack-dev-server --mode development"
}, },
"repository": { "repository": {

View File

@ -94,4 +94,4 @@ async function useRequest(request) {
return await JSON.parse(response.request.response); return await JSON.parse(response.request.response);
} }
export const apiService = new ApiService('http://localhost:3000'); export const apiService = new ApiService('https://polar-peak-95205.herokuapp.com');

View File

@ -41,7 +41,6 @@ export class PayModal extends Modal {
payInfo.payMethod = this.$el.querySelector('.payment-field input').value; payInfo.payMethod = this.$el.querySelector('.payment-field input').value;
payInfo.email = this.$el.querySelector('.email-field input').value; payInfo.email = this.$el.querySelector('.email-field input').value;
const response = await axios.put('/payment', payInfo); const response = await axios.put('/payment', payInfo);
//console.log(response.data); response.data.payUrl ? document.location.href = response.data.payUrl : alert(response.data);
document.location.href = response.data.payUrl;
} }
} }

View File

@ -1,4 +1,4 @@
import axios from "axios"; import axios from 'axios';
class ApiService { class ApiService {
constructor(baseUrl) { constructor(baseUrl) {
@ -58,4 +58,4 @@ async function useRequest(request) {
return await JSON.parse(response.request.response); return await JSON.parse(response.request.response);
} }
export const apiService = new ApiService('http://localhost:3000'); export const apiService = new ApiService('https://polar-peak-95205.herokuapp.com');