Wysłany: 2020-09-03, 16:28
Hokan
Wiek: 24 Na forum: 2979 dni Posty: 15
Nick w MP: Hokan
Witam mam skrypt na kupno premium na serwerze. Ju? kiedy? pyta?em si? w tej kwestii na forum lecz skrypt dalej sprawia problemy.
Strona Clienta:
function isEventHandlerAdded ( sEventName , pElementAttachedTo , func )
if type ( sEventName )== 'string' and isElement ( pElementAttachedTo ) and type ( func )== 'function' then local aAttachedFunctions = getEventHandlers ( sEventName , pElementAttachedTo )
if type ( aAttachedFunctions )== 'table' and #aAttachedFunctions > 0 then for i,v in ipairs(aAttachedFunctions) do if v==func then return true end end end
end return false
end
ww , hh = 1920 , 1080
www , hhh = guiGetScreenSize ()
wn , hn = ( www / ww ), ( hhh / hh )
local screenW , screenH = guiGetScreenSize ()
local sx , sy = guiGetScreenSize ()
function mysz ( psx , psy , pssx , pssy , abx , aby )
if not isCursorShowing () then return end
cx , cy = getCursorPosition ()
cx , cy = cx * sx , cy * sy
if cx >= psx and cx <= psx + pssx and cy >= psy and cy <= psy + pssy then
return true , cx , cy
else
return false
end
end
local dxfont0_droidsans = dxCreateFont ( "font.ttf" , 12 )
local dxfont1_droidsans = dxCreateFont ( "font.ttf" , 14 )
local dxfont2_droidsans = dxCreateFont ( "font.ttf" , 15 )
local gp = {}
editbox = guiCreateEdit ( 0.43 , 0.49 , 0.14 , 0.04 , "" , true )
komboboks = guiCreateComboBox ( 0.44 , 0.34 , 0.12 , 0.13 , "" , true )
guiComboBoxAddItem ( komboboks , "1 dzie?" )
guiComboBoxAddItem ( komboboks , "3 dni" )
guiComboBoxAddItem ( komboboks , "7 dni" )
guiComboBoxAddItem ( komboboks , "14 dni" )
guiComboBoxAddItem ( komboboks , "30 dni" )
guiComboBoxAddItem ( komboboks , "60 dni" )
guiSetVisible ( komboboks , false )
guiSetVisible ( editbox , false )
local pp = false
function guiPremka ()
local a = interpolateBetween ( 0 , 0 , 255 , 255 , 0 , 255 ,(( getTickCount ()- tick )/ 3350 ), "Linear" )
local a2 = interpolateBetween ( 0 , 0 , 141 , 141 , 0 , 141 ,(( getTickCount ()- tick )/ 3350 ), "Linear" )
local wybrane = guiComboBoxGetSelected ( komboboks )
if not wybrane then return end
local tekst = guiComboBoxGetItemText ( komboboks , wybrane )
if tekst == "1 dzie?" then
txt = "Tre?? sms: AA.SP\nNumer: 7136\nKoszt: 1,23 z?\nPoni?ej wpisz otrzymany w sms kod:"
elseif tekst == "3 dni" then
txt = "Tre?? sms: AA.SP\nNumer: 7355\nKoszt: 3,69 z?\nPoni?ej wpisz otrzymany w sms kod:"
elseif tekst == "7 dni" then
txt = "Tre?? sms: AA.SP\nNumer: 7555\nKoszt: 6,15 z?\nPoni?ej wpisz otrzymany w sms kod:"
elseif tekst == "14 dni" then
txt = "Tre?? sms: AA.SP\nNumer: 7936\nKoszt: 11,07 z?\nPoni?ej wpisz otrzymany w sms kod:"
elseif tekst == "30 dni" then
txt = "Tre?? sms: AA.SP\nNumer: 91955\nKoszt: 23,37 z?\nPoni?ej wpisz otrzymany w sms kod:"
elseif tekst == "60 dni" then
txt = "Tre?? sms: AA.SP\nNumer: 92555\nKoszt: 30,75 z?\nPoni?ej wpisz otrzymany w sms kod:"
else
txt = "Tre?? sms: --\nNumer: --\nKoszt: --\nPoni?ej wpisz otrzymany w sms kod:"
end
exports [ "buttons" ]: createCustomWindow ( "Premium" , screenW * 0.3755 , screenH * 0.2833 , screenW * 0.2495 , screenH * 0.4333 , tocolor ( 1 , 0 , 0 , a ), false )
exports [ "buttons" ]: createCustomButton ( "Zakup" , screenW * 0.4307 , screenH * 0.5750 , screenW * 0.1396 , screenH * 0.0583 , tocolor ( 0 , 102 , 204 , a ), false )
exports [ "buttons" ]: createCustomButton ( "X" , screenW * 0.5984 , screenH * 0.6685 , screenW * 0.0214 , screenH * 0.0389 , tocolor ( 0 , 102 , 204 , a2 ), false )
dxDrawText ( txt , ( screenW * 0.4385 ) + 1 , ( screenH * 0.3648 ) + 1 , ( screenW * 0.5615 ) + 1 , ( screenH * 0.4954 ) + 1 , tocolor ( 0 , 0 , 0 , a ), 1 * wn , dxfont1_droidsans , "center" , "center" , false , false , false , false , false )
dxDrawText ( txt , screenW * 0.4385 , screenH * 0.3648 , screenW * 0.5615 , screenH * 0.4954 , tocolor ( 255 , 255 , 255 , a ), 1 * wn , dxfont1_droidsans , "center" , "center" , false , false , false , false , false )
end
addEventHandler ( "onClientClick" , root , function( b , s )
if b ~= "state" and s ~= "down" then return end
if mysz ( screenW * 0.4307 , screenH * 0.5750 , screenW * 0.1396 , screenH * 0.0583 ) and pp == true then
if guiGetText ( editbox ) == "" then return end
local dni = 0
local netto = 0
local wybrane = guiComboBoxGetSelected ( komboboks )
if not wybrane then return end
local tekst = guiComboBoxGetItemText ( komboboks , wybrane )
if tekst == "1 dzie?" then
dni = 1
netto = 1
elseif tekst == "3 dni" then
dni = 3
netto = 3
elseif tekst == "7 dni" then
dni = 7
netto = 5
elseif tekst == "14 dni" then
dni = 14
netto = 9
elseif tekst == "30 dni" then
dni = 30
netto = 19
elseif tekst == "60 dni" then
dni = 60
netto = 25
else
dni = 0
end
if dni == 0 then
outputChatBox ( "Nie wybra?e? ilo?ci dni, wybierz i kliknij ponownie." )
return
end
triggerServerEvent ( "skPremium" , localPlayer , guiGetText ( editbox ), dni , netto )
elseif mysz ( screenW * 0.5984 , screenH * 0.6685 , screenW * 0.0214 , screenH * 0.0389 ) and pp == true then
pp = false
guiSetVisible ( komboboks , false )
guiSetVisible ( editbox , false )
showCursor ( false )
setElementFrozen ( localPlayer , false )
removeEventHandler ( "onClientPreRender" , root , guiPremka )
end
end )
addCommandHandler ( "premium" , function()
tick = getTickCount ()
--if getPlayerSerial ( localPlayer ) == "E31AEC4C62F98B8C0EA93CFB5A469042" or getPlayerSerial ( localPlayer ) == "AC3E4952A412CBDDDB0DA7021C88D484" then
if not pp then
pp = true
guiSetVisible ( komboboks , true )
guiSetVisible ( editbox , true )
showCursor ( true , false )
setElementFrozen ( localPlayer , true )
addEventHandler ( "onClientPreRender" , root , guiPremka )
else
pp = false
guiSetVisible ( komboboks , false )
guiSetVisible ( editbox , false )
showCursor ( false )
setElementFrozen ( localPlayer , false )
removeEventHandler ( "onClientPreRender" , root , guiPremka )
-- end
-- end
end
end )
function roundedRectangle ( x , y , w , h , color )
dxDrawRectangle ( x , y , w , h , color , false )
dxDrawRectangle ( x + 2 , y - 1 , w - 4 , 1 , color , false )
dxDrawRectangle ( x + 2 , y + h , w - 4 , 1 , color , false )
dxDrawRectangle ( x - 1 , y + 2 , 1 , h - 4 , color , false )
dxDrawRectangle ( x + w , y + 2 , 1 , h - 4 , color , false )
end
Strona Servera:
function sprawdzIloscDni ( gracz )
local spr = exports [ 'pystories-db' ]: dbGet ( "SELECT * FROM pystories_users WHERE id=? AND premiumdate>NOW() LIMIT 1" , getElementData ( gracz , "player:sid" ))
if ( spr and #spr > 0) then
return spr [ 1 ]. premiumdate
end
return false
end
function ustawIloscDni ( gracz , dni )
if sprawdzIloscDni ( gracz ) then
local wyk = exports [ 'pystories-db' ]: dbSet ( string . format ( "UPDATE pystories_users SET premiumdate = DATE(premiumdate) + INTERVAL %d DAY WHERE id=%d" , dni , getElementData ( gracz , "player:sid" )))
return end
local wyk = exports [ 'pystories-db' ]: dbSet ( string . format ( "UPDATE pystories_users SET premiumdate = DATE(curdate()) + INTERVAL %d DAY WHERE id=%d" , dni , getElementData ( gracz , "player:sid" )))
end
addEvent ( "skPremium" , true )
addEventHandler ( "skPremium" , root , function( kod , dni , netto )
local spr = "https://admin.serverproject.eu/api/smsapi.php?key=TW2Gb9M5uICLCH84rZr19FoDg&amount=" .. netto .. "&code=" .. kod
fetchRemote ( spr , wyk , "" , false , client , dni )
end )
function wyk ( responseData , errno , playerToReceive , amount )
if errno == 0 then
if string . find ( responseData , "kod" ) then
amount = nil
if string . find ( responseData , '"number":"7136"' ) then
amount = 1
elseif string . find ( responseData , '"number":"7355"' ) then
amount = 3
elseif string . find ( responseData , '"number":"7555"' ) then
amount = 7
elseif string . find ( responseData , '"number":7936"' ) then
amount = 14
elseif string . find ( responseData , '"number":"91955"' ) then
amount = 30
elseif string . find ( responseData , '"number":"92555"' ) then
amount = 60
end
if not amount then return end
outputChatBox ( "Zakupi?e? premium na " .. amount .. " dni." , playerToReceive )
setElementData ( playerToReceive , "player:premium" , true )
ustawIloscDni ( playerToReceive , amount )
setPlayerNametagColor ( playerToReceive , 255 , 200 , 0 )
triggerEvent ( "save:player" , root , playerToReceive )
triggerEvent ( "load:player" , root , playerToReceive )
else
outputChatBox ( "Podany kod jest nieprawid?owy. (" .. responseData .. ")" , playerToReceive )
end
end
end
function findPlayer ( p , ph )
for i , v in ipairs ( getElementsByType ( "player" )) do
if tonumber ( ph ) then
if getElementData ( v , "id" ) == tonumber ( ph ) then
return getPlayerFromName ( getPlayerName ( v ))
end
else
if string . find ( string . gsub ( getPlayerName ( v ): lower (), "#%x%x%x%x%x%x" , "" ), ph : lower (), 1 , true ) then
return getPlayerFromName ( getPlayerName ( v ))
end
end
end
end
Skrypt jest dodany do acl.xml i w debugscript 3 nie ma ?adnych problem?w lecz wydaj? mi si? ?e kod wpisywany w gui po stronie clienta nie wysy?a si? poprawnie na stron? servera. Przy probie kupna premium za 1.23zl z serverproject Ci?gle pojawia si? komunikat o b??dny kod. Obs?uga Klienta z serverproject napisa?a mi, ?e kody by?y poprawne i za pierwszym razem przy wysy?aniu na stron? linka pierwsze podanie kodu zako?czy?o si? sukcesem. Prosz? o pomoc.
Oto co napisa?a mi Pomoc Klienta na serverproject:
"Witam,
b??dna implementacja u Pana. Sprawdzi?em kod 8wbuk4 i wielokrotnie odpytywa? Pan API o niego. Tylko pierwsze odpytanie zwr?ci sukces i tak by?o."
Wysłany: 2020-09-03, 16:41
Wilq
Wiek: 24 Na forum: 4428 dni Posty: 3410
Piwa : 739
Ale jakie problemy? Komunikaty si? pojawiaj?, czy nie? API wykonuje zapytanie do SP, czyli dzia?a. Jakie? konkrety..
Wysłany: 2020-09-03, 16:52
Hokan
Wiek: 24 Na forum: 2979 dni Posty: 15
Nick w MP: Hokan
Wed?ug odpowiedzi od serverprojekt Api wykonuje zapytanie do strony serverprojekt lecz przy wpisywaniu otrzymanego kodu z sms pojawia si? komunikat: Podany kod jest nieprawid?owy. ({"status":"fail","error":"bad_code"}) ?wiadcz?cy o tym ?e podany kod jest nieprawid?owy lub wykorzystany. Skrypt nie nadaje rangi premium na serwerze. Zastanawiam sie czy problem nie le?y po stronie klienta kt?ry b??dnie wysy?a na serwer kod z sms.
Wysłany: 2020-09-03, 18:46
Wilq
Wiek: 24 Na forum: 4428 dni Posty: 3410
Piwa : 739
No tak, pierwsze zapytanie zako?czy si? sukcesem - kod zostanie wykorzystany. Drugi raz ju? odrzuci, poniewa? dany kod zosta? ju? wykorzystany. Nawet obs?uga SP potwierdzi?a dzia?anie - kod by? poprawny, czyli do fetchRemote dobrze go przekazuje. Na nowym kodzie sprawd?, czy za 1 razem nadaje Ci premium itd.
Wysłany: 2020-09-03, 20:48
Hokan
Wiek: 24 Na forum: 2979 dni Posty: 15
Nick w MP: Hokan
Za pierwszym razem jak u?ywa?em kod skrypt nie zadzia?a? poprawnie, nie nada?o konta Premium i chodzi o to ?e nie mog? zlokalizowa? b?edu, my?la?em ?e mo?e kod si? b??dnie przesy?a Ale w?a?nie skoro wykonuje si? dobrze za pierwszym razem po stronie serverprojekta, to nie mam poj?cia gdzie tu m?g? ukra?? si? b??d, dlatego zwracam si? O pomoc w znalezieniu b?edu
Wysłany: 2020-09-03, 21:02
Wilq
Wiek: 24 Na forum: 4428 dni Posty: 3410
Piwa : 739
Chyba co? z t? linijk?:
if string . find ( responseData , "kod" ) then
Poka? ze strony SP co zwraca zapytanie w API. T? tabelk? z "number":"7355" itd.
Wysłany: 2020-09-03, 22:53
Hokan
Wiek: 24 Na forum: 2979 dni Posty: 15
Nick w MP: Hokan
Odno?nie serverproject to do API trzeba odnie?? sie stosuj?c cene netto za podan? opcje, np. kod 7136 odpowiada 1.23zl brutto czyli 1zl netto. W linku kt?ry ma si? porozumiewa? z API ServerProject musi by? podana w?a?nie cena netto oraz kod z sms. Wi?c link kt?ry skrypt powinien wysy?a? wygl?da nast?puj?co: https://admin.serverproject.eu/api/smsapi.php?key=TW2Gb9M5uICLCH84rZr19FoDg&amount=1&code=8wbuk4
I gdy wejde tam zdalnie ze swojego komputera nie pojawia si? na nim nic poza linijk? odpowiadaj?c? z?emu kodowi sms: {"status":"fail","error":"bad_code"}
Wysłany: 2020-09-04, 07:27
Wilq
Wiek: 24 Na forum: 4428 dni Posty: 3410
Piwa : 739
Ale poka? mi tabel? z tym co zwraca API ze strony SP. Jakie konkretnie dane kiedy kod jest b??dny albo tabel? z warto?ciami SMSow.
Wysłany: 2020-09-04, 19:23
Hokan
Wiek: 24 Na forum: 2979 dni Posty: 15
Nick w MP: Hokan
Nie posiadam takowej tabeli, z tego co wiem nigdzie nie zapisuje mi si? co zwraca serverproject, ani w bazie danych ani w skrypcie
Wysłany: 2020-09-04, 20:47
Wilq
Wiek: 24 Na forum: 4428 dni Posty: 3410
Piwa : 739
Ale ze strony serverproject w zak?adce o API.
Wysłany: 2020-09-04, 22:23
Hokan
Wiek: 24 Na forum: 2979 dni Posty: 15
Nick w MP: Hokan
Odpowied? serwera
Serwer zwraca zestaw danych w formacie JSON.
Je?eli podano prawid?owy zestaw parametr?w serwer zw?rci komunikat, zawieraj?cy status transakcji "ok" oraz kwot? (amount) jak? zosta? do?adowany portfel klienta, do kt?rego nale?a? dany klucz API:
{"status":"ok","amount":"1.00"}
W przypadku niepowodzenia serwer zwr?ci:
{"status":"fail","error":"kod b??du"}
Kody b??d?w:
wrong_key nieprawid?owy klucz API
wrong_amount nieprawid?owa kwota netto SMS'a
wrong_code nieprawid?owy kod do?adowuj?cy (nie podano lub z?a ilo?? znak?w)
bad_desc nieprawid?owy opis (maksymalnie 20 znak?w)
internal_error b??d wewn?trzny, problem zg?o? do BOKu
bad_code z?y kod do?adowuj?cy (wykorzystany lub nieprawid?owy)
[ Dodano : 2020-09-04, 22:23 ]
Czy chodzi o to?
Wysłany: 2020-09-05, 22:23
Wilq
Wiek: 24 Na forum: 4428 dni Posty: 3410
Piwa : 739
Tak, to jest to. Zaraz dam zna? co b?dziemy robi?.
Zauwa?, ?e nigdzie w tej wiadomo?ci co wys?a?e? nie ma mowy o jaki? parametrach "number" tylko "netto". Musisz to zedytowa? pod to "netto".
Linijk?
if string . find ( responseData , "kod" ) then
zmie? na
if string . find ( responseData , "ok" ) then
I daj zna? o efektach. Wklej funkcj? "wyk" po swoich zmianach.
Tagi: premium
Anonymous
Na forum: 245 dni
Posty: 1
Anonymous Koniecznie zajrzyj na: