9

サーバー側で支払い領収書を確認しようとしています。私は{"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 を取得する方法のアイデアまたはサンプル コードを誰かが持っていますか?

4

4 に答える 4

4

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;
    }
于 2014-09-06T08:47:09.940 に答える
2
CloseableHttpClient client = HttpClients.createDefault();

JSONObject requestData = new JSONObject();
requestData.put("receipt-data", recept);
requestData.put("password", password);


HttpPost httpPost = new HttpPost("https://sandbox.itunes.apple.com/verifyReceipt");
StringEntity entity = new StringEntity(requestData.toString());
httpPost.setEntity(entity);
httpPost.setHeader("Content-type", "application/x-www-form-urlencoded");

CloseableHttpResponse response = client.execute(httpPost);
BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

StringBuffer result = new StringBuffer();
String line = "";
while ((line = rd.readLine()) != null) {
    result.append(line);
}
System.out.println(result.toString());
response.close();
于 2017-02-21T11:15:55.293 に答える
0

私はそのサービスに精通していませんが、コンテンツタイプまたは適切に設定されていないヘッダーを受け入れる場合、他のサービスでも同様のエラーが発生します。

次のようなものを試してください

 con.setRequestProperty("Content-Type", "application/json");
 con.setRequestProperty("Accept", "application/json");

(または彼らが期待しているものは何でも。私はjsonを想定しています)

于 2012-09-14T21:35:58.133 に答える