| 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();
}
}
}
|