package com.braintreegateway.util; import com.braintreegateway.Configuration; import com.braintreegateway.Request; import java.net.URLEncoder; import java.util.Calendar; import java.util.Map; import java.util.TimeZone; import static com.braintreegateway.util.QueryString.encode; import static com.braintreegateway.util.QueryString.encodeParam; public class TrUtil { private Configuration configuration; public TrUtil(Configuration configuration) { this.configuration = configuration; } public String buildTrData(Request request, String redirectURL) { Calendar now = Calendar.getInstance(TimeZone.getTimeZone("UTC")); String dateString = String.format("%1$tY%1$tm%1$td%1$tH%1$tM%1$tS", now); QueryString trContent = new QueryString() .append("api_version", Configuration.apiVersion()) .append("public_key", configuration.getPublicKey()) .append("redirect_url", redirectURL) .append("time", dateString) .append("kind", request.getKind()) .appendEncodedData(request.toQueryString()); return new SignatureService(configuration.getPrivateKey(), new Sha1Hasher()).sign(trContent.toString()); } public boolean isValidTrQueryString(String queryString) { String[] pieces = queryString.split("&hash="); String queryStringWithoutHash = pieces[0]; String hash = pieces[1]; return hash.equals(new Sha1Hasher().hmacHash(configuration.getPrivateKey(), queryStringWithoutHash)); } protected String encodeMap(Map<String, String> map) { StringBuilder builder = new StringBuilder(); String[] keys = map.keySet().toArray(new String[0]); for (int i = 0; i < keys.length; i++) { String key = keys[i]; builder.append(encodeParam(key, map.get(key))); if (i + 1 < keys.length) { builder.append("&"); } } return builder.toString(); } public String url() { return configuration.getBaseURL() + configuration.getMerchantPath() + "/transparent_redirect_requests"; } }