public byte[] bytesValue() { return Base64.decodeFast(this.buf, this.np + 1, this.sp); }
public byte[] bytesValue() { return Base64.decodeFast(this.text, this.np + 1, this.sp); }
public void writeByteArray(byte[] bytes) { int bytesLen = bytes.length; boolean singleQuote = isEnabled(SerializerFeature.UseSingleQuotes); char quote = singleQuote ? '\'' : '\"'; if (bytesLen == 0) { write(singleQuote ? "''" : "\"\""); return; } int s; int i; int left; char[] CA = Base64.CA; int eLen = (bytesLen / 3) * 3; int charsLen = (((bytesLen - 1) / 3) + 1) << 2; int offset = this.count; int newcount = (this.count + charsLen) + 2; if (newcount > this.buf.length) { if (this.writer != null) { write(quote); s = 0; while (s < eLen) { int s2 = s + 1; s = s2 + 1; s2 = s + 1; i = (((bytes[s] & 255) << 16) | ((bytes[s2] & 255) << 8)) | (bytes[s] & 255); write(CA[(i >>> 18) & 63]); write(CA[(i >>> 12) & 63]); write(CA[(i >>> 6) & 63]); write(CA[i & 63]); s = s2; } left = bytesLen - eLen; if (left > 0) { i = ((bytes[eLen] & 255) << 10) | (left == 2 ? (bytes[bytesLen - 1] & 255) << 2 : 0); write(CA[i >> 12]); write(CA[(i >>> 6) & 63]); write(left == 2 ? CA[i & 63] : '='); write('='); } write(quote); return; } expandCapacity(newcount); } this.count = newcount; int offset2 = offset + 1; this.buf[offset] = quote; int d = offset2; s = 0; while (s < eLen) { s2 = s + 1; s = s2 + 1; s2 = s + 1; i = (((bytes[s] & 255) << 16) | ((bytes[s2] & 255) << 8)) | (bytes[s] & 255); int i2 = d + 1; this.buf[d] = CA[(i >>> 18) & 63]; d = i2 + 1; this.buf[i2] = CA[(i >>> 12) & 63]; i2 = d + 1; this.buf[d] = CA[(i >>> 6) & 63]; d = i2 + 1; this.buf[i2] = CA[i & 63]; s = s2; } left = bytesLen - eLen; if (left > 0) { i = ((bytes[eLen] & 255) << 10) | (left == 2 ? (bytes[bytesLen - 1] & 255) << 2 : 0); this.buf[newcount - 5] = CA[i >> 12]; this.buf[newcount - 4] = CA[(i >>> 6) & 63]; this.buf[newcount - 3] = left == 2 ? CA[i & 63] : '='; this.buf[newcount - 2] = '='; } this.buf[newcount - 1] = quote; }
public byte[] bytesValue() { return Base64.decodeFast(buf, np + 1, sp); }
public byte[] bytesValue() { return Base64.decodeFast(text, np + 1, sp); }
/** * Check if the receipt sent by client is for us and valid. * * @param json * @return */ public static boolean checkIAPReceipt(User user, String productId, String json) { try { String roleName = Constant.EMPTY; if ( user != null ) { roleName = user.getRoleName(); } String decodeJson = new String(Base64.decodeFast(json)); decodeJson = decodeJson.replaceAll("=", ":"); decodeJson = decodeJson.replaceAll(";", ","); Object obj = com.alibaba.fastjson.JSON.parse(decodeJson); // String receipt = ((Map)obj).get("receipt-data").toString(); // /** // * receipt: // * { // "signature" = "ApdxJdtNwPU2rA5/cn3kIO1OTk25feDKa0aagyyRveWlcFlglv6RF6znkiBS3um9Uc7pVob+PqZR2T8wyVrHNplof3DX3IqDOlWq+90a7Yl+qrR7A7jWwviw708PS+67PyHRnhO/G7bVqgRpEr6EuFybiU1FXAiXJc6ls1YAssQxAAADVzCCA1MwggI7oAMCAQICCGUUkU3ZWAS1MA0GCSqGSIb3DQEBBQUAMH8xCzAJBgNVBAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSYwJAYDVQQLDB1BcHBsZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEzMDEGA1UEAwwqQXBwbGUgaVR1bmVzIFN0b3JlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA5MDYxNTIyMDU1NloXDTE0MDYxNDIyMDU1NlowZDEjMCEGA1UEAwwaUHVyY2hhc2VSZWNlaXB0Q2VydGlmaWNhdGUxGzAZBgNVBAsMEkFwcGxlIGlUdW5lcyBTdG9yZTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMrRjF2ct4IrSdiTChaI0g8pwv/cmHs8p/RwV/rt/91XKVhNl4XIBimKjQQNfgHsDs6yju++DrKJE7uKsphMddKYfFE5rGXsAdBEjBwRIxexTevx3HLEFGAt1moKx509dhxtiIdDgJv2YaVs49B0uJvNdy6SMqNNLHsDLzDS9oZHAgMBAAGjcjBwMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUNh3o4p2C0gEYtTJrDtdDC5FYQzowDgYDVR0PAQH/BAQDAgeAMB0GA1UdDgQWBBSpg4PyGUjFPhJXCBTMzaN+mV8k9TAQBgoqhkiG92NkBgUBBAIFADANBgkqhkiG9w0BAQUFAAOCAQEAEaSbPjtmN4C/IB3QEpK32RxacCDXdVXAeVReS5FaZxc+t88pQP93BiAxvdW/3eTSMGY5FbeAYL3etqP5gm8wrFojX0ikyVRStQ+/AQ0KEjtqB07kLs9QUe8czR8UGfdM1EumV/UgvDd4NwNYxLQMg4WTQfgkQQVy8GXZwVHgbE/UC6Y7053pGXBk51NPM3woxhd3gSRLvXj+loHsStcTEqe9pBDpmG5+sk4tw+GK3GMeEN5/+e1QT9np/Kl1nj+aBw7C0xsy0bFnaAd1cSS6xdory/CUvM6gtKsmnOOdqTesbp0bs8sn6Wqs0C9dgcxRHuOMZ2tm8npLUm7argOSzQ=="; // "purchase-info" = "ewoJIm9yaWdpbmFsLXB1cmNoYXNlLWRhdGUtcHN0IiA9ICIyMDEyLTA3LTEyIDA1OjU0OjM1IEFtZXJpY2EvTG9zX0FuZ2VsZXMiOwoJInB1cmNoYXNlLWRhdGUtbXMiID0gIjEzNDIwOTc2NzU4ODIiOwoJIm9yaWdpbmFsLXRyYW5zYWN0aW9uLWlkIiA9ICIxNzAwMDAwMjk0NDk0MjAiOwoJImJ2cnMiID0gIjEuNCI7CgkiYXBwLWl0ZW0taWQiID0gIjQ1MDU0MjIzMyI7CgkidHJhbnNhY3Rpb24taWQiID0gIjE3MDAwMDAyOTQ0OTQyMCI7CgkicXVhbnRpdHkiID0gIjEiOwoJIm9yaWdpbmFsLXB1cmNoYXNlLWRhdGUtbXMiID0gIjEzNDIwOTc2NzU4ODIiOwoJIml0ZW0taWQiID0gIjUzNDE4NTA0MiI7CgkidmVyc2lvbi1leHRlcm5hbC1pZGVudGlmaWVyIiA9ICI5MDUxMjM2IjsKCSJwcm9kdWN0LWlkIiA9ICJjb20uemVwdG9sYWIuY3RyYm9udXMuc3VwZXJwb3dlcjEiOwoJInB1cmNoYXNlLWRhdGUiID0gIjIwMTItMDctMTIgMTI6NTQ6MzUgRXRjL0dNVCI7Cgkib3JpZ2luYWwtcHVyY2hhc2UtZGF0ZSIgPSAiMjAxMi0wNy0xMiAxMjo1NDozNSBFdGMvR01UIjsKCSJiaWQiID0gImNvbS56ZXB0b2xhYi5jdHJleHBlcmltZW50cyI7CgkicHVyY2hhc2UtZGF0ZS1wc3QiID0gIjIwMTItMDctMTIgMDU6NTQ6MzUgQW1lcmljYS9Mb3NfQW5nZWxlcyI7Cn0="; // "pod" = "17"; // "signing-status" = "0"; // } // */ // String decodeReceipt = new String(Base64.decodeFast(receipt)); // decodeReceipt = decodeReceipt.replaceAll("=", ":"); // decodeReceipt = decodeReceipt.replaceAll(";", ","); // obj = com.alibaba.fastjson.JSON.parse(decodeReceipt); String purchaseInfo = ((Map)obj).get("purchase-info").toString(); String decodePurchaseInfo = new String(Base64.decodeFast(purchaseInfo)); /* { "original-purchase-date-pst" = "2012-07-12 05:54:35 America/Los_Angeles"; "purchase-date-ms" = "1342097675882"; "original-transaction-id" = "170000029449420"; "bvrs" = "1.4"; "app-item-id" = "450542233"; "transaction-id" = "170000029449420"; "quantity" = "1"; "original-purchase-date-ms" = "1342097675882"; "item-id" = "534185042"; "version-external-identifier" = "9051236"; "product-id" = "com.zeptolab.ctrbonus.superpower1"; "purchase-date" = "2012-07-12 12:54:35 Etc/GMT"; "original-purchase-date" = "2012-07-12 12:54:35 Etc/GMT"; "bid" = "com.zeptolab.ctrexperiments"; "purchase-date-pst" = "2012-07-12 05:54:35 America/Los_Angeles"; } */ decodePurchaseInfo = decodePurchaseInfo.replaceAll("=", ":"); decodePurchaseInfo = decodePurchaseInfo.replaceAll(";", ","); logger.info("User {} decode purchase-info: {}", roleName, decodePurchaseInfo); obj = com.alibaba.fastjson.JSON.parse(decodePurchaseInfo); String pid = ((Map)obj).get("product-id").toString(); String purchaseDate = ((Map)obj).get("purchase-date-pst").toString(); Date date = DateUtil.parseApplePurchaseDate(purchaseDate); if ( productId.equals(pid) ) { long currentMillis = System.currentTimeMillis(); int timeDiff = (int)(currentMillis - date.getTime()); if ( timeDiff > 0 && timeDiff < 86400000 ) { return true; } else { logger.info("The {} use a fake purchaseDate:{}", roleName, purchaseDate); } } else { logger.info("The {} use a fake productId:{}", roleName, pid); } } catch (Exception e) { logger.warn("Failed to check IAP receipt json:{}, exception:{}", json, e.getMessage()); logger.info("Parse IAP receipt exception: ", e); } return false; }