Java和AppStore收据验证

标签 java ios in-app-purchase

我正在尝试在服务器端验证付款收据。 我得到一个 {"status":21002, "exception":"java.lang.IllegalArgumentException"} 作为返回

代码如下:

private final static String _sandboxUriStr = "https://sandbox.itunes.apple.com/verifyReceipt";

public static void processPayment(final String receipt) throws SystemException
{
    final BASE64Encoder encoder = new BASE64Encoder();
    final String receiptData = encoder.encode(receipt.getBytes());


    final String jsonData = "{\"receipt-data\" : \"" + receiptData + "\"}";

    System.out.println(receipt);
    System.out.println(jsonData);

    try
    {
        final URL url = new URL(_sandboxUriStr);
        final HttpURLConnection conn = (HttpsURLConnection) url.openConnection();
        conn.setRequestMethod("POST");
        conn.setDoOutput(true);
        final OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
        wr.write(jsonData);
        wr.flush();

        // Get the response
        final BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String line;
        while ((line = rd.readLine()) != null)
        {
            System.out.println(line);
        }
        wr.close();
        rd.close();
    }
    catch (IOException e)
    {
        throw new SystemException("Error when trying to send request to '%s', %s", _sandboxUriStr, e.getMessage());
    }
}

我的收据是这样的:

{\n\t"signature" = "[exactly_1320_characters]";\n\t"purchase-info" =
"[exactly_868_characters]";\n\t"environment" = "Sandbox";\n\t"pod" =
"100";\n\t"signing-status" = "0";\n}

带有 BASE64 编码收据的收据数据如下所示:

{"receipt-data" : "[Block_of_chars_76x40+44=3084_chars_total]"}

是否有人有想法或示例代码如何从收据字符串中获取回复 JSON,提到 here

最佳答案

21002:问题出在 Java 中的 Base64 编码上。当我在 IOS 内部进行编码并将其用作来自服务器的请求而没有使用 Java 进行任何编码时,它就起作用了。

switch (status) {
        case 21000:
            msg = "The App Store could not read the JSON object you provided";
            logger.info("\n  21000 : The App Store could not read the JSON object you provided. ");

        break;
    case 21002:
        msg = "The data in the receipt-data property was malformed.";
        logger.info("\n  21002 : The data in the receipt-data property was malformed..   ");
        break;
    case 21003:
        msg = "The data in the receipt-data property was malformed.";
        logger.info("\n  21003 : The receipt could not be authenticated. ");
        break;
    case 21004:
        msg = "TThe shared secret you provided does not match the shared secret on file for your account.";
        logger.info("\n  21004 : The shared secret you provided does not match the shared secret on file for your account. ");
        break;
    case 21005:
        msg = "The receipt server is not currently available.";
        logger.info("\n  21005 : The receipt server is not currently available. ");
        break;
    case 21006:
        msg = "This receipt is valid but the subscription has expired. When this status code is returned to your server, the receipt data is also decoded and returned as part of the response.";
        logger.info("\n  21006 : This receipt is valid but the subscription has expired. When this status code is returned to your server, the receipt data is also decoded and returned as part of the response. ");
        break;
    case 21007:
        msg = "This receipt is a sandbox receipt, but it was sent to the production service for verification.";
        logger.info("\n  21007 : This receipt is a sandbox receipt, but it was sent to the production service for verification. ");
        break;
    case 21008:
        msg = "This receipt is a production receipt, but it was sent to the sandbox service for verification.";
        logger.info("\n  21008 : This receipt is a production receipt, but it was sent to the sandbox service for verification. ");
        break;

    default:
        msg = "Active subscription.";
        logger.info("\n  0 : valid ....Active subscription. ");
        break;
    }

关于Java和AppStore收据验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12432147/

相关文章:

iPhone 应用内购买订阅会自动续订吗?

java - 关系实体用于在单个实体的对象之间创建层次结构

ios - iCloud:在 IOS 和 OSX 之间同步核心数据

ios - 在 Phonegap 生成的应用商店中部署 .ipa 文件?

ios - NSJSONSerialization isValidJSONObject 为从 Venue 搜索端点接收到的数据返回 false

ios - 应用内购买错误,始终 myProduct 为 0

ios - 应用内购买拒绝和新的 IPA

java - Spring @RestController 无法返回 unicode

java - java中将日期和时间转换为其他时区

java - jvisualvm 线程 cpu 时间使用