From ad47590ff63855be1683e15f1276cfc59831ba0f Mon Sep 17 00:00:00 2001 From: ParkSuMin Date: Thu, 20 Feb 2025 18:52:51 +0300 Subject: [PATCH] Pay method --- frontend/style/app/pay/pay.go | 218 +++++++++++++++++++++++++++++ frontend/style/app/pay/urls_pay.db | Bin 0 -> 24576 bytes 2 files changed, 218 insertions(+) create mode 100644 frontend/style/app/pay/pay.go create mode 100644 frontend/style/app/pay/urls_pay.db diff --git a/frontend/style/app/pay/pay.go b/frontend/style/app/pay/pay.go new file mode 100644 index 00000000..7f269698 --- /dev/null +++ b/frontend/style/app/pay/pay.go @@ -0,0 +1,218 @@ +package main + +import ( + "bytes" + "database/sql" + "encoding/json" + "fmt" + "log" + "net/http" + "os" + "strconv" + "time" + + "github.com/google/uuid" + "github.com/gorilla/handlers" + _ "github.com/mattn/go-sqlite3" +) + +// Структура для тела запроса на localhost:5000 +type PaymentRequest struct { + ID string `json:"id"` + Sum float64 `json:"sum"` +} + +// Структура для ответа от localhost:5000 +type PaymentResponse struct { + Message string `json:"message"` + URL string `json:"redir_url"` +} + +var db *sql.DB + +func initDB() { + var err error + dbFile := "urls_pay.db" + db, err = sql.Open("sqlite3", dbFile) + if err != nil { + log.Fatal("Ошибка подключения к базе данных:", err) + } + + // Создаем таблицу pay_urls, если она не существует + createTableSQL := ` + CREATE TABLE IF NOT EXISTS pay_urls ( + id TEXT PRIMARY KEY, + url TEXT NOT NULL + );` + _, err = db.Exec(createTableSQL) + if err != nil { + log.Fatal("Ошибка при создании таблицы pay_urls:", err) + } + + fmt.Println("База данных готова к работе.") +} + +func payHandler(w http.ResponseWriter, r *http.Request) { + + cookie, err := r.Cookie("totalPrice") + if err != nil { + http.Error(w, "Не удалось получить amount из cookies", http.StatusBadRequest) + return + } + + // Преобразуем amount из строки в float64 + amount, err := strconv.ParseFloat(cookie.Value, 64) + if err != nil { + http.Error(w, "Некорректное значение amount в cookies", http.StatusBadRequest) + return + } + // Генерируем новый UUID + newUUID := uuid.New().String() + + // Создаем тело запроса для localhost:5000 + paymentRequest := PaymentRequest{ + ID: newUUID, + Sum: amount, + } + + // Преобразуем тело запроса в JSON + requestBody, err := json.Marshal(paymentRequest) + if err != nil { + http.Error(w, "Ошибка при создании запроса", http.StatusInternalServerError) + return + } + + // Отправляем POST-запрос на localhost:5000 + resp, err := http.Post("http://localhost:5000/pay", "application/json", bytes.NewBuffer(requestBody)) + if err != nil { + http.Error(w, "Ошибка при отправке запроса на сервер", http.StatusInternalServerError) + return + } + defer resp.Body.Close() + + // Читаем ответ от сервера + var paymentResponse PaymentResponse + if err := json.NewDecoder(resp.Body).Decode(&paymentResponse); err != nil { + http.Error(w, "Ошибка при чтении ответа от сервера", http.StatusInternalServerError) + return + } + + // Сохраняем данные в базу данных + insertSQL := `INSERT INTO pay_urls (uuid, url) VALUES (?, ?)` + _, err = db.Exec(insertSQL, newUUID, paymentResponse.URL) + if err != nil { + http.Error(w, "Ошибка при сохранении данных в базу данных", http.StatusInternalServerError) + return + } + + // Формируем ответ клиенту в виде простого текста + response := fmt.Sprintf("UUID: %s\nURL: %s", newUUID, paymentResponse.URL) + + // Set uuid cookie + cookie = &http.Cookie{ + Name: "uuid", + Value: newUUID, + Expires: time.Now().Add(30 * time.Minute), + } + http.SetCookie(w, cookie) + // Отправляем ответ в виде простого текста + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + w.Write([]byte(response)) +} + +func checkPayHandler(w http.ResponseWriter, r *http.Request) { + // Извлекаем uuid из cookie + cookie, err := r.Cookie("uuid") + if err != nil { + http.Error(w, "Не найден cookie с uuid", http.StatusBadRequest) + return + } + uuid := cookie.Value + if uuid == "" { + http.Error(w, "Пустое значение uuid", http.StatusBadRequest) + return + } + + // Проверяем существование uuid в базе данных + var exists bool + querySQL := `SELECT EXISTS(SELECT 1 FROM pay_urls WHERE uuid = ?)` + err = db.QueryRow(querySQL, uuid).Scan(&exists) + if err != nil { + http.Error(w, "Ошибка при проверке uuid в базе данных", http.StatusInternalServerError) + return + } + + if !exists { + http.Error(w, "UUID не найден", http.StatusNotFound) + return + } + + // Создаем тело запроса для localhost:5000/check_pay + checkRequest := struct { + UUID string `json:"uuid"` + }{ + UUID: uuid, + } + + requestBody, err := json.Marshal(checkRequest) + if err != nil { + http.Error(w, "Ошибка при создании запроса", http.StatusInternalServerError) + return + } + + // Отправляем POST-запрос на localhost:5000/check_pay + resp, err := http.Post("http://localhost:5000/check_pay", "application/json", bytes.NewBuffer(requestBody)) + if err != nil { + http.Error(w, "Ошибка при отправке запроса на сервер", http.StatusInternalServerError) + return + } + defer resp.Body.Close() + + // Читаем ответ от сервера + var checkResponse struct { + Mes string `json:"mes"` + } + if err := json.NewDecoder(resp.Body).Decode(&checkResponse); err != nil { + http.Error(w, "Ошибка при чтении ответа от сервера", http.StatusInternalServerError) + return + } + + // Формируем ответ клиенту в зависимости от полученного результата + var response string + if checkResponse.Mes == "OK" { + response = "OK" + } else { + response = "GTHO" + } + + // Отправляем ответ в виде простого текста + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + w.Write([]byte(response)) +} + +func main() { + + initDB() + defer db.Close() + // Setup CORS + cors := handlers.CORS( + handlers.AllowedOrigins([]string{"*"}), + handlers.AllowedMethods([]string{"GET", "POST"}), + handlers.AllowedHeaders([]string{"Content-Type"}), + ) + + // Register handlers + http.HandleFunc("/api/pay", payHandler) + http.HandleFunc("/api/check_pay", checkPayHandler) + + // Start server with CORS middleware + port := os.Getenv("PORT") + if port == "" { + port = "8081" + } + + fmt.Println("Go-сервер запущен на порту", port) + log.Fatal(http.ListenAndServe(":"+port, cors(http.DefaultServeMux))) +} diff --git a/frontend/style/app/pay/urls_pay.db b/frontend/style/app/pay/urls_pay.db new file mode 100644 index 0000000000000000000000000000000000000000..9787b2ba119e4505b534b938f769cd0d7651af86 GIT binary patch literal 24576 zcmeI4&u<(>7RP%s0)wWH*~M5J(cRdsb0V(m4^LeYj_!IsF$s{W-|BzEkX zk??UM#C^~F0Z1#vbtO(5xO2-tzy%IDu+p-JU9I-}dNKh5M1v-YKzd_$cXd^D_4j?= ztFqnd=Xc+^dN?e5)$!>qKkTXCnV``K{?h9OL9l^s@&0xW$1b)Ow&|xaEj;455xjJ; z-VXagvy%s%yPZ7zD*Q0~@DW#V6BA$pOn?b60Vco%m;e)C0!)AjObLYj#>MXDW@CIZ zMDh8$`1;UiH_O4v&Fo-U-nxBIpB}_Nt2p=CwcVY)-QM2Lt57k<`$q1RtsxiA_X z78h3bcHi5(OlPMzCnvo(-`eZFxqtO4YTv$g<&B+d*L#26z22YnzqEP@f9K)*qgqk& zK+(zCQg>scF`m@i_GbqeaWFkTq-a__pOCkki`^GrY+Rpez@NAWgYsll9_0k-$EU5I z5P7Jvf8=kKmvQAK!2hJ%?KbXQtj8P;%F{u;`;q>g<;Cv)W+ON}D#{P;kK{+godFTf>MrZVW zHX3h*t^GUBCwWokJ`-7Lz0jHV!YNY-Wph)-Ni204-53sU4_@BfJUc$Vb$nEwy>vR- z9G?24K~N~1zLQmnKSIxn1XE^@-hsfp68 z(o)+w4UmwkYXe9=ofxXg1ds&p6~&2t)1Q%ow{9FS@u;0MA0NhCoRCe`Hx!pL8#Qm9X1 z3XDWegmbAROridCGztcsCj$yw7#&wqq}EkrfEJlDsnA8`W2;@3m}D*kK#Oh(10Wv) zAP<{Eod!t?9*YtJ4bsq13nWA9t@c3Oh9(3ZS{=Mat^S&*wCNZclT7B3wa;B|-27LJHC; zG$iCkWFFed2t!jCB@NmXGMMzBj&f}t`k)mCtdIdoRV0|nsqiW;;DI6+KC7HC-fJ1z z0(VO1GJw`0NI(dIFhpy}Bf1pLDb^qojk$(0&ae@83Oib}sLkLStVHB9d||G@YBFEF zu-x2lmoh?-J1JzTq|j-U3m2`3fGde z%y@mV72KIe9K}!_E)WM%6d$-TKw@}Egj5OAw8B!1(DFor>Q+P?xh<)slB>u?v?^f! zL!KS4FFY1;SiTV>7!kL?!h!;#1h=6mp=D;WVv<-8!yYwtz|%5Bp>83W2-7-B!%& zZl1#qzrrlESHu4XVdpRi{~i7_ycd2GejRRyH#%R2&vi~a_rkx0pLae+Gk=%>6JP>N zfC(@GCcp%k025#WOn?c@Mqs(wU8$c)_nZ5TS)M|N)Nz)ly&dW}%Tv`hb)4nt<$3Bj z%TvNN>Nv~OxK-*n%Tuov>Nv~urDf_k%hRQ$Rx@ZU(r$rvE!s6{NAL8v=qUhR`VYc? z&E`h##RQlD6JP>NfC(@GCcp%k025#WOn?deaR{t6>g(H4L=Rp& z#|l=;1egF5U;<2l2`~XBzyz286L>lV#@mYv0p*jZ3UA%pRAgm=bd1bb0tp(aK+*=X z0+KwA{5;tVPx3YT?SwR2JTteuH}I!bZ+{C1f5W zQ7h5724qBmgrNfYMrD%f`!j|9m*2uP1K{b*9=;0`U;<2l2`~XBzyz286JP>NfC(@G UCh!;u(7XP>`2Iis6Tr&<0h09@$N&HU literal 0 HcmV?d00001