Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   Какой язык для сервера (http://www.flasher.ru/forum/showthread.php?t=190048)

skolm 19.12.2012 22:45

Какой язык для сервера
 
Здравствуйте.

Подскажите пожалуйста,для оформления платежей в vk на чем лучше писать сервер.

Спасибо.

p.s. Ответ: на любом серверном - не вариант.

caseyryan 19.12.2012 22:49

Цитата:

p.s. Ответ: на любом серверном - не вариант.
И тем не менее )
Хоть на чем. Любой серверный язык подойдет.
У меня на джаве и на php есть

Ну, проще, конечно же на php, так как у них там и пример на php есть. Рабочий.

Хотя сводится все в конечном итоге к одному - принять запрос, отправить ответ с описанием товара - принять еще один запрос о подтверждении транзакции - записать в базу данных все что требуется - отправить ответ об успешной транзакции, ну или об ошибке.

skolm 19.12.2012 23:03

Значит java и php,но проще будет на php.Понял,спасибо,буду изучать :)

caseyryan 20.12.2012 10:28

Смотря для чего это нужно. У меня джава потому что сокет сервер на ней написан. Городить php-шный костыль как-то не по феншую, хотя на php код был бы реально проще. На джаве еще и http сервер приходится поднимать, тогда как в php это уже есть

skolm 20.12.2012 12:28

Так нужно,для платежей в контакте.

caseyryan 20.12.2012 13:42

skolm, вам бы сначала разобраться вообще с тем, что вы делаете, а потом уже лезть в платежи.
Я не платежи имел в виду когда сказал, "смотря для чего это нужно", а способ взаимодействия приложения с сервером. Либо это http запросы, либо сокеты. PHP для сокетов не подходящий вариант. Сокеты во многих других языках реализованы лучше, чем в php.

п.с. Вот пример модуля платежей на джаве, можете сравнить с php ради интереса
Код AS3:

package roommodule;
 
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.util.Iterator;
import java.util.concurrent.Executors;
import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpContext;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
import java.text.Collator;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import net.user1.union.api.Account;
import net.user1.union.api.Server;
import org.json.simple.JSONObject;
import statics.validation.Validation;
 
 
public class VKPaymentApi {
        public VKPaymentApi(LoginModule loginModule) {
                try {
                        InetSocketAddress addr                = null;
                        addr                                                                = new InetSocketAddress(80);
                        HttpServer server                                = HttpServer.create(addr, 0);
                        HttpContext context                        = server.createContext("/", new MyHandler(loginModule));
                        context.getFilters().add(new ParameterFilter());
                        server.setExecutor(Executors.newCachedThreadPool());
                        server.start();
                        System.out.println("Payment API started on port 80");
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }
}
class MyHandler implements HttpHandler {
 
        private LoginModule loginModule;
        private HashMap<String, Order> pendingOrders = new HashMap<String, Order>();
 
 
        public MyHandler(LoginModule loginModule) {
                this.loginModule = loginModule;
                System.out.println("HANDLER CREATED");
        }
 
        public void handle(HttpExchange exchange) {
                OutputStream responseBody = null;
                String requestMethod = exchange.getRequestMethod();
                try {
                        if (requestMethod.equalsIgnoreCase("POST") || requestMethod.equalsIgnoreCase("GET")) {
                                Map<String, Object> params = (Map<String, Object>)exchange.getAttribute("parameters");
 
                                Headers responseHeaders = exchange.getResponseHeaders();
                                responseHeaders.set("Content-Type", "application/json");
 
                                exchange.sendResponseHeaders(200, 0);
                                responseBody = exchange.getResponseBody();
 
                                String sig        = String.valueOf(params.get("sig"));
                                params.remove("sig");                                                                                                                                                                                       
                                System.out.println("SIGNATURE " + sig);
                                Iterator<String> iter = params.keySet().iterator();
                                String[] toSort        = new String[params.keySet().size()];
 
                                int i = 0;
                                while (iter.hasNext()) {
                                        String key                = iter.next();
                                        String value        = String.valueOf(params.get(key));
                                        toSort[i] = key + "=" + value;                                                                                                                                                       
                                        i++;
                                }
                                Arrays.sort(toSort, Collator.getInstance());
 
                                String strToHash        = "";
                                for (i = 0; i < toSort.length; i++) {
                                        strToHash += toSort[i];
                                }
                                String hash = MD5.encrypt(strToHash + VK.API_SECRET);
 
                                String notificationType        = String.valueOf(params.get("notification_type"));
 
                                System.out.println("NOTIFICATION TYPE " + notificationType);
 
                                if (notificationType != null) {
                                        if (notificationType.equals("get_item") || notificationType.equals("get_item_test")) {
                                                String userID                                = String.valueOf(params.get("user_id"));
                                                String item                                        = String.valueOf(params.get("item"));                                                                                       
                                                try {
                                                        if (item != null && item.length() >= 5) {
                                                                if (hash.equals(sig)) {
                                                                        String receiverID                = String.valueOf(params.get("receiver_id"));                               
                                                                        String orderID                        = String.valueOf(params.get("order_id"));
                                                                        Order order                                = new Order();
 
                                                                        order.userID                        = userID + "_v";
                                                                        String[] preparsed        = item.split("\\_");
                                                                        int code                                        = Integer.parseInt(preparsed[0]);
                                                                        int numCredits                        = Integer.parseInt(preparsed[1]);                                                       
                                                                        int numPacks                        = Integer.parseInt(preparsed[2]);                                                       
                                                                        int packPrice                        = Validation.getPrice(code);                                                                       
                                                                        int creditsInPack                = Validation.getItemsInPack(code);
 
                                                                        int totalPriceInVotes = packPrice * numPacks;
                                                                        int totalCreditsToBuy = creditsInPack * numPacks;
                                                                        if (totalCreditsToBuy != numCredits) {
                                                                                sendErrorResponce(responseBody, 1);
                                                                        } else {
                                                                                order.code        = code;
                                                                                order.creditsAmount        = totalCreditsToBuy;
                                                                                order.quantity = numPacks;
                                                                                order.votes        = totalPriceInVotes;
                                                                                pendingOrders.put(orderID, order);                                                                                                       
                                                                                if (order.code > 800 && order.code < 900) {
                                                                                        sendResponce(responseBody, totalCreditsToBuy + " кредитов на игровой счет", totalPriceInVotes);
                                                                                } else if (order.code > 900 && order.code < 1000) {
                                                                                        sendResponce(responseBody, totalCreditsToBuy + " золотых монет", totalPriceInVotes);
                                                                                } else {
                                                                                        sendErrorResponce(responseBody, 1);                                                                                               
                                                                                }
                                                                        }
                                                                } else {
                                                                        System.out.println("SIGNATURE IS WRONG " + sig);
                                                                        sendErrorResponce(responseBody, 10);                                                                                                       
                                                                }
                                                        }
                                                } catch (Exception e) {
                                                        sendErrorResponce(responseBody, 1);                                                                                                                               
                                                        e.printStackTrace();
                                                }
                                        } else if (notificationType.equals("order_status_change") ||
                                                          notificationType.equals("order_status_change_test")) {
                                                String status                                        = String.valueOf(params.get("status"));
                                                System.out.println("STATUS");
                                                if (status.equals("chargeable")) {
                                                        String orderID                                = String.valueOf(params.get("order_id"));
                                                        try {
                                                                Order order                                = pendingOrders.get(orderID);
                                                                if (order != null) {
                                                                        String userID                = order.userID;
                                                                        int credits                        = order.creditsAmount;
                                                                        try {
 
                                                                                Server server                = loginModule.getServer();
                                                                                Account account        = server.getAccount(userID);
                                                                                if (order.code >= 800 && order.code < 900) {
                                                                                        loginModule.addMoney(account, credits);
                                                                                } else if (order.code >= 900 && order.code < 1000) {
                                                                                        loginModule.addGoldCoins(account, credits);
                                                                                } else {
                                                                                        sendErrorResponce(responseBody, 1);                                                                                       
                                                                                        return;
                                                                                }
                                                                                sendApproval(responseBody, Integer.parseInt(orderID));
                                                                                pendingOrders.remove(orderID);
                                                                        } catch (Exception e) {
                                                                                sendErrorResponce(responseBody, 1);
                                                                        }
                                                                }
                                                        } catch (Exception e) {
                                                                e.printStackTrace();
                                                                sendErrorResponce(responseBody, 1);
                                                        }
                                                } else {
                                                        sendErrorResponce(responseBody, 100);
                                                }
                                        }
                                } else {
                                        System.out.println("NOT A VK PAYMENT REQUEST");
                                }
                                responseBody.close();
                        }
                } catch (Exception e) {
                        if (responseBody != null) {
                                try {
                                        responseBody.close();
                                } catch (Exception ex) {}
                        }
                        e.printStackTrace();
                }
        }
 
        private void sendApproval(OutputStream responseBody, int orderID) {
                System.out.println("APPROVAL SENT");
                try {
                        JSONObject response = new JSONObject();
                        response.put("app_order_id", 1);
                        response.put("order_id", orderID);
                        String stringResponse = "{\"response\":" + response.toJSONString() + "}";
                        responseBody.write(stringResponse.getBytes("UTF-8"));
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }
 
        private void sendResponce(OutputStream responseBody, String title, int priceInVotes) {
                try {
                        JSONObject response = new JSONObject();
                        response.put("title", title);
                        response.put("price", priceInVotes);
                        response.put("expiration", 3600);                                                                                                                                                       
                        String stringResponse = "{\"response\":" + response.toJSONString() + "}";
                        responseBody.write(stringResponse.getBytes("UTF-8"));
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }
 
 
        private void sendErrorResponce(OutputStream responseBody, int errorCode) {
                System.out.println("ERROR SENT");
                try {
                        JSONObject error                = new JSONObject();
                        error.put("error_code", errorCode);
                        error.put("error_msg", "");
                        error.put("critical", "true");
                        String response = "{\"response\":" + error.toJSONString() + "}";
                        responseBody.write(response.getBytes("UTF-8"));
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }
}



Часовой пояс GMT +4, время: 14:54.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.