|
|
|||||
Banned
Регистрация: Dec 2012
Сообщений: 20
|
Какой язык для сервера
Здравствуйте.
Подскажите пожалуйста,для оформления платежей в vk на чем лучше писать сервер. Спасибо. p.s. Ответ: на любом серверном - не вариант. |
|
|||||
Цитата:
Хоть на чем. Любой серверный язык подойдет. У меня на джаве и на php есть Ну, проще, конечно же на php, так как у них там и пример на php есть. Рабочий. Хотя сводится все в конечном итоге к одному - принять запрос, отправить ответ с описанием товара - принять еще один запрос о подтверждении транзакции - записать в базу данных все что требуется - отправить ответ об успешной транзакции, ну или об ошибке. |
|
|||||
Banned
Регистрация: Dec 2012
Сообщений: 20
|
Значит java и php,но проще будет на php.Понял,спасибо,буду изучать
|
|
|||||
Смотря для чего это нужно. У меня джава потому что сокет сервер на ней написан. Городить php-шный костыль как-то не по феншую, хотя на php код был бы реально проще. На джаве еще и http сервер приходится поднимать, тогда как в php это уже есть
|
|
|||||
Banned
Регистрация: Dec 2012
Сообщений: 20
|
Так нужно,для платежей в контакте.
|
|
|||||
skolm, вам бы сначала разобраться вообще с тем, что вы делаете, а потом уже лезть в платежи.
Я не платежи имел в виду когда сказал, "смотря для чего это нужно", а способ взаимодействия приложения с сервером. Либо это http запросы, либо сокеты. PHP для сокетов не подходящий вариант. Сокеты во многих других языках реализованы лучше, чем в php. п.с. Вот пример модуля платежей на джаве, можете сравнить с php ради интереса 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, время: 01:04. |
|
« Предыдущая тема | Следующая тема » |
|
|