· 9 years ago · Nov 10, 2016, 01:40 PM
1import java.io.ByteArrayInputStream;
2import java.io.InputStream;
3import java.io.PrintStream;
4import java.net.URI;
5import java.util.ArrayList;
6import java.util.Date;
7import java.util.List;
8
9import javax.xml.parsers.DocumentBuilderFactory;
10
11import org.apache.http.HttpResponse;
12import org.apache.http.NameValuePair;
13import org.apache.http.client.HttpClient;
14import org.apache.http.client.methods.HttpGet;
15import org.apache.http.client.utils.URIUtils;
16import org.apache.http.client.utils.URLEncodedUtils;
17import org.apache.http.impl.client.DefaultHttpClient;
18import org.apache.http.impl.conn.PoolingClientConnectionManager;
19import org.apache.http.message.BasicNameValuePair;
20import org.apache.http.params.BasicHttpParams;
21import org.apache.http.params.HttpConnectionParams;
22import org.apache.http.params.HttpParams;
23import org.apache.http.util.EntityUtils;
24import org.joda.time.format.DateTimeFormat;
25import org.joda.time.format.DateTimeFormatter;
26import org.springframework.util.DigestUtils;
27import org.w3c.dom.Document;
28import org.w3c.dom.Node;
29
30import com.google.common.base.Charsets;
31
32import dmz.pay.xsolla.XsollaMobilePaymentResult;
33import dmz.tanks.model.tasks.impl.TasksFactory;
34import dmz.time.TimeConstants;
35import dmz.time.TimeInterval;
36
37public class SandBox {
38
39 private static final DateTimeFormatter FMT = DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss.SSS");
40 private static URI createURI(long userId, String phone, int goldAmount) throws Exception {
41 List<NameValuePair> qparams = new ArrayList<NameValuePair>();
42 qparams.add(new BasicNameValuePair("command", "invoice"));
43 qparams.add(new BasicNameValuePair("project", "111111")); //TODO
44 qparams.add(new BasicNameValuePair("v1", userId + ""));
45 qparams.add(new BasicNameValuePair("v2", "s6"));
46 qparams.add(new BasicNameValuePair("phone", phone));
47 qparams.add(new BasicNameValuePair("out", goldAmount + ""));
48 String md5 = "";
49 for (NameValuePair p : qparams) {
50 md5 += p.getValue();
51 }
52 md5 += "secretkey"; //TODO
53 md5 = DigestUtils.md5DigestAsHex(md5.getBytes(Charsets.UTF_8));
54 qparams.add(new BasicNameValuePair("md5", md5));
55 return URIUtils.createURI(null, secureXsollaUrl + "/api/mobile/payment", -1, null, URLEncodedUtils.format(qparams, "UTF-8"), null);
56 //XXX
57 }
58
59 private static String secureXsollaUrl = "https://secure.xsolla.com";
60
61 private static HttpClient createHttpClient() {
62 PoolingClientConnectionManager cm = new PoolingClientConnectionManager();
63 cm.setMaxTotal(8);
64 final HttpParams params = new BasicHttpParams();
65 HttpConnectionParams.setConnectionTimeout(params, (int)TimeConstants.SECOND_MILLIS * 15);
66 HttpConnectionParams.setSoTimeout(params, (int)TimeConstants.SECOND_MILLIS * 15);
67 HttpConnectionParams.setTcpNoDelay(params, true);
68 return new DefaultHttpClient(cm, params);
69 }
70
71 private static XsollaMobilePaymentResult doDirectMobilePayment0(Long userId, String phone, int goldAmount) {
72 HttpGet httpGet = new HttpGet();
73 long start = System.currentTimeMillis();
74 try {
75 URI uri = createURI(userId, phone, goldAmount);
76 System.out.println("doDirectMobilePayment0: user=" + userId + ", phone=" + phone + ", url [" + uri + "]");
77 httpGet.setURI(uri);
78 HttpResponse rsp = createHttpClient().execute(httpGet);
79 String answer = EntityUtils.toString(rsp.getEntity(), Charsets.UTF_8.name());
80 InputStream stream = new ByteArrayInputStream(answer.getBytes(Charsets.UTF_8));
81 Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(stream);
82 Node rootNode = d.getChildNodes().item(0);
83 String resultCode = "-1";
84 String comment = null;
85 for (int i=0; i<rootNode.getChildNodes().getLength(); i++) {
86 Node node = rootNode.getChildNodes().item(i);
87 String name = node.getNodeName();
88 String value = getNodeValue(node);
89 if ("result".equalsIgnoreCase(name)) {
90 resultCode = value;
91 } else if ("comment".equalsIgnoreCase(name)) {
92 comment = value;
93 }
94 }
95 if ("0".equals(resultCode)) {
96 return XsollaMobilePaymentResult.ok(userId, phone);
97 } else {
98 return XsollaMobilePaymentResult.failed(userId, phone, resultCode, "result [" + resultCode + "], comment [" + comment + "]");
99 }
100 } catch (Exception e) {
101 System.out.println("Error occured at doDirectMobilePayment"); //, e);
102 e.printStackTrace(new PrintStream(System.out));
103 return XsollaMobilePaymentResult.failed(userId, phone, "-1", "error");
104 } finally {
105 httpGet.reset();
106 System.out.println("doDirectMobilePayment done in " + (System.currentTimeMillis() - start) + "mls");
107 }
108 }
109
110 private static String getNodeValue(Node node) {
111 if(node == null) {
112 return "";
113 }
114 Node firstChild = node.getFirstChild();
115 if (firstChild == null) {
116 return "";
117 } else {
118 if (firstChild.getNodeValue() == null) {
119 return "";
120 } else {
121 return firstChild.getNodeValue().trim();
122 }
123 }
124 }
125
126 public static void main(String[] args) throws Exception {
127 doDirectMobilePayment0(1L, "9529008657", 100);
128 }
129
130}