question

Kim Strasser avatar image
Kim Strasser asked

Problem with receipt's orderId on iOS in CloudScript

I always get an exception after purchasing virtual currency on my iOS device(Sandbox for testing):

"Error": { "Error": "JavascriptException", "Message": "JavascriptException", "StackTrace": "SyntaxError: Unexpected token M in JSON at position 0\n at JSON.parse (<anonymous>)\n at handlers.StoreOrderId (E5E2C-main.js:8962:24)\n at Object.invokeFunction (Script:117:33)" }

CloudScript:

handlers.StoreOrderId = function (args, context)
{
    var psEvent = context.playStreamEvent; 
    var receiptcontent = context.playStreamEvent.ReceiptContent;
    log.info("ReceiptContent: " + receiptcontent);
    var orderid = JSON.parse(receiptcontent).orderId;
    log.info("orderid: " + orderid);

}

I don't get the exception on Android. Is something wrong with my CloudScript code? Why is it not working on iOS?

log.info("ReceiptContent: " + receiptcontent);
        "Logs": [
            {
                "Level": "Info",
                "Message": "ReceiptContent: MIIT2wYJKoZIhvcNAQcCoIITzDCCE8gCAQExCzAJBgUrDgMCGgUAMIIDfAYJKoZIhvcNAQcBoIIDbQSCA2kxggNlMAoCAQgCAQEEAhYAMAoCARQCAQEEAgwAMAsCAQECAQEEAwIBADALAgELAgEBBAMCAQAwCwIBDwIBAQQDAgEAMAsCARACAQEEAwIBADALAgEZAgEBBAMCAQMwDAIBCgIBAQQEFgI0KzAMAgEOAgEBBAQCAgDUMA0CAQMCAQEEBQwDMS4xMA0CAQ0CAQEEBQIDAkpUMA0CARMCAQEEBQwDMS4wMA4CAQkCAQEEBgIEUDI1NjAYAgEEAgECBBCEV2B3o8k9mNY2tImP8twmMBsCAQACAQEEEwwRUHJvZHVjdGlvblNhbmRib3gwHAIBBQIBAQQUJ7NiIRRcNVgBVpk+MZ3Gi57hXhswHgIBDAIBAQQWFhQyMDIyLTAyLTEwVDA5OjQ0OjU4WjAeAgESAgEBBBYWFDIwMTMtMDgtMDFUMDc6MDA6MDBaMCMCAQICAQEEGwwZY29tLmtpbXN0cmFzc2VyLnNoYWdneXJ1bjBKAgEGAgEBBELB0dBUSGD9teAXKLUb/28zgCjAnkcBLLzwlgjHoRaZUiq9t4zCVzq5o6gwS1E908dQZuux0dHqhnOfnn+JqZQ7jRQwSgIBBwIBAQRCa+voJjomZSRTYFa9l+YUCtLXh1hVKvsxadj2/RjV5TNBPv1dlBJBNP0RiO9+QuRF08WYmP6DyZKhxjKAQyZvxKFWMIIBXQIBEQIBAQSCAVMxggFPMAsCAgasAgEBBAIWADALAgIGrQIBAQQCDAAwCwICBrACAQEEAhYAMAsCAgayAgEBBAIMADALAgIGswIBAQQCDAAwCwICBrQCAQEEAgwAMAsCAga1AgEBBAIMADALAgIGtgIBAQQCDAAwDAICBqUCAQEEAwIBATAMAgIGqwIBAQQDAgEBMAwCAgauAgEBBAMCAQAwDAICBq8CAQEEAwIBADAMAgIGsQIBAQQDAgEAMAwCAga6AgEBBAMCAQAwFQICBqYCAQEEDAwKY29pbnMxMDAwMDAbAgIGpwIBAQQSDBAxMDAwMDAwOTY2MjM2NTE3MBsCAgapAgEBBBIMEDEwMDAwMDA5NjYyMzY1MTcwHwICBqgCAQEEFhYUMjAyMi0wMi0xMFQwOTo0NDo1OFowHwICBqoCAQEEFhYUMjAyMi0wMi0xMFQwOTo0NDo1OFqggg5lMIIFfDCCBGSgAwIBAgIIDutXh+eeCY0wDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNVBAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTUxMTEzMDIxNTA5WhcNMjMwMjA3MjE0ODQ3WjCBiTE3MDUGA1UEAwwuTWFjIEFwcCBTdG9yZSBhbmQgaVR1bmVzIFN0b3JlIFJlY2VpcHQgU2lnbmluZzEsMCoGA1UECwwjQXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMxEzARBgNVBAoMCkFwcGxlIEluYy4xCzAJBgNVBAYTAlVTMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApc+B/SWigVvWh+0j2jMcjuIjwKXEJss9xp/sSg1Vhv+kAteXyjlUbX1/slQYncQsUnGOZHuCzom6SdYI5bSIcc8/W0YuxsQduAOpWKIEPiF41du30I4SjYNMWypoN5PC8r0exNKhDEpYUqsS4+3dH5gVkDUtwswSyo1IgfdYeFRr6IwxNh9KBgxHVPM3kLiykol9X6SFSuHAnOC6pLuCl2P0K5PB/T5vysH1PKmPUhrAJQp2Dt7+mf7/wmv1W16sc1FJCFaJzEOQzI6BAtCgl7ZcsaFpaYeQEGgmJjm4HRBzsApdxXPQ33Y72C3ZiB7j7AfP4o7Q0/omVYHv4gNJIwIDAQABo4IB1zCCAdMwPwYIKwYBBQUHAQEEMzAxMC8GCCsGAQUFBzABhiNodHRwOi8vb2NzcC5hcHBsZS5jb20vb2NzcDAzLXd3ZHIwNDAdBgNVHQ4EFgQUkaSc/MR2t5+givRN9Y82Xe0rBIUwDAYDVR0TAQH/BAIwADAfBgNVHSMEGDAWgBSIJxcJqbYYYIvs67r2R1nFUlSjtzCCAR4GA1UdIASCARUwggERMIIBDQYKKoZIhvdjZAUGATCB/jCBwwYIKwYBBQUHAgIwgbYMgbNSZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRlIHBvbGljeSBhbmQgY2VydGlmaWNhdGlvbiBwcmFjdGljZSBzdGF0ZW1lbnRzLjA2BggrBgEFBQcCARYqaHR0cDovL3d3dy5hcHBsZS5jb20vY2VydGlmaWNhdGVhdXRob3JpdHkvMA4GA1UdDwEB/wQEAwIHgDAQBgoqhkiG92NkBgsBBAIFADANBgkqhkiG9w0BAQUFAAOCAQEADaYb0y4941srB25ClmzT6IxDMIJf4FzRjb69D70a/CWS24yFw4BZ3+Pi1y4FFKwN27a4/vw1LnzLrRdrjn8f5He5sWeVtBNephmGdvhaIJXnY4wPc/zo7cYfrpn4ZUhcoOAoOsAQNy25oAQ5H3O5yAX98t5/GioqbisB/KAgXNnrfSemM/j1mOC+RNuxTGf8bgpPyeIGqNKX86eOa1GiWoR1ZdEWBGLjwV/1CKnPaNmSAMnBjLP4jQBkulhgwHyvj3XKablbKtYdaG6YQvVMpzcZm8w7HHoZQ/Ojbb9IYAYMNpIr7N4YtRHaLSPQjvygaZwXG56AezlHRTBhL8cTqDCCBCIwggMKoAMCAQICCAHevMQ5baAQMA0GCSqGSIb3DQEBBQUAMGIxCzAJBgNVBAYTAlVTMRMwEQYDVQQKEwpBcHBsZSBJbmMuMSYwJAYDVQQLEx1BcHBsZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEWMBQGA1UEAxMNQXBwbGUgUm9vdCBDQTAeFw0xMzAyMDcyMTQ4NDdaFw0yMzAyMDcyMTQ4NDdaMIGWMQswCQYDVQQGEwJVUzETMBEGA1UECgwKQXBwbGUgSW5jLjEsMCoGA1UECwwjQXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMxRDBCBgNVBAMMO0FwcGxlIFdvcmxkd2lkZSBEZXZlbG9wZXIgUmVsYXRpb25zIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyjhUpstWqsgkOUjpjO7sX7h/JpG8NFN6znxjgGF3ZF6lByO2Of5QLRVWWHAtfsRuwUqFPi/w3oQaoVfJr3sY/2r6FRJJFQgZrKrbKjLtlmNoUhU9jIrsv2sYleADrAF9lwVnzg6FlTdq7Qm2rmfNUWSfxlzRvFduZzWAdjakh4FuOI/YKxVOeyXYWr9Og8GN0pPVGnG1YJydM05V+RJYDIa4Fg3B5XdFjVBIuist5JSF4ejEncZopbCj/Gd+cLoCWUt3QpE5ufXN4UzvwDtIjKblIV39amq7pxY1YNLmrfNGKcnow4vpecBqYWcVsvD95Wi8Yl9uz5nd7xtj/pJlqwIDAQABo4GmMIGjMB0GA1UdDgQWBBSIJxcJqbYYYIvs67r2R1nFUlSjtzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFCvQaUeUdgn+9GuNLkCm90dNfwheMC4GA1UdHwQnMCUwI6AhoB+GHWh0dHA6Ly9jcmwuYXBwbGUuY29tL3Jvb3QuY3JsMA4GA1UdDwEB/wQEAwIBhjAQBgoqhkiG92NkBgIBBAIFADANBgkqhkiG9w0BAQUFAAOCAQEAT8/vWb4s9bJsL4/uE4cy6AU1qG6LfclpDLnZF7x3LNRn4v2abTpZXN+DAb2yriphcrGvzcNFMI+jgw3OHUe08ZOKo3SbpMOYcoc7Pq9FC5JUuTK7kBhTawpOELbZHVBsIYAKiU5XjGtbPD2m/d73DSMdC0omhz+6kZJMpBkSGW1X9XpYh3toiuSGjErr4kkUqqXdVQCprrtLMK7hoLG8KYDmCXflvjSiAcp/3OIK5ju4u+y6YpXzBWNBgs0POx1MlaTbq/nJlelP5E3nJpmB6bz5tCnSAXpm4S6M9iGKxfh44YGuv9OQnamt86/9OBqWZzAcUaVc7HGKgrRsDwwVHzCCBLswggOjoAMCAQICAQIwDQYJKoZIhvcNAQEFBQAwYjELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1BcHBsZSBSb290IENBMB4XDTA2MDQyNTIxNDAzNloXDTM1MDIwOTIxNDAzNlowYjELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1BcHBsZSBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5JGpCR+R2x5HUOsF7V55hC3rNqJXTFXsixmJ3vlLbPUHqyIwAugYPvhQCdN/QaiY+dHKZpwkaxHQo7vkGyrDH5WeegykR4tb1BY3M8vED03OFGnRyRly9V0O1X9fm/IlA7pVj01dDfFkNSMVSxVZHbOU9/acns9QusFYUGePCLQg98usLCBvcLY/ATCMt0PPD5098ytJKBrI/s61uQ7ZXhzWyz21Oq30Dw4AkguxIRYudNU8DdtiFqujcZJHU1XBry9Bs/j743DN5qNMRX4fTGtQlkGJxHRiCxCDQYczioGxMFjsWgQyjGizjx3eZXP/Z15lvEnYdp8zFGWhd5TJLQIDAQABo4IBejCCAXYwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFCvQaUeUdgn+9GuNLkCm90dNfwheMB8GA1UdIwQYMBaAFCvQaUeUdgn+9GuNLkCm90dNfwheMIIBEQYDVR0gBIIBCDCCAQQwggEABgkqhkiG92NkBQEwgfIwKgYIKwYBBQUHAgEWHmh0dHBzOi8vd3d3LmFwcGxlLmNvbS9hcHBsZWNhLzCBwwYIKwYBBQUHAgIwgbYagbNSZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRlIHBvbGljeSBhbmQgY2VydGlmaWNhdGlvbiBwcmFjdGljZSBzdGF0ZW1lbnRzLjANBgkqhkiG9w0BAQUFAAOCAQEAXDaZTC14t+2Mm9zzd5vydtJ3ME/BH4WDhRuZPUc38qmbQI4s1LGQEti+9HOb7tJkD8t5TzTYoj75eP9ryAfsfTmDi1Mg0zjEsb+aTwpr/yv8WacFCXwXQFYRHnTTt4sjO0ej1W8k4uvRt3DfD0XhJ8rxbXjt57UXF6jcfiI1yiXV2Q/Wa9SiJCMR96Gsj3OBYMYbWwkvkrL4REjwYDieFfU9JmcgijNq9w2Cz97roy/5U2pbZMBjM3f3OgcsVuvaDyEO2rpzGU+12TZ/wYdV2aeZuTJC+9jVcZ5+oVK3G72TQiQSKscPHbZNnF5jyEuAF1CqitXa5PzQCQc3sHV1ITGCAcswggHHAgEBMIGjMIGWMQswCQYDVQQGEwJVUzETMBEGA1UECgwKQXBwbGUgSW5jLjEsMCoGA1UECwwjQXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMxRDBCBgNVBAMMO0FwcGxlIFdvcmxkd2lkZSBEZXZlbG9wZXIgUmVsYXRpb25zIENlcnRpZmljYXRpb24gQXV0aG9yaXR5AggO61eH554JjTAJBgUrDgMCGgUAMA0GCSqGSIb3DQEBAQUABIIBACRPUb9M+psxK4xY8MdLgTP0lu2dcFMYm/MZn6RFO55dXylHdGxr+I6jvYkffvP1SvIQRrf7eboHQEUz4CzPjcNHjyqDhaI//tfqPToChW8MLsbUh73ldvAGtX9QKae+QLlyp3XyEAwzvKYszXYMYHqDLBgGhnEEOke35BW0DVWFySQbq7+gYdKERCG9vbnLvYNIRcj97VxdZgNk7aIzS8XP1J+GwvT8i8GWpsRJ0PZ8glDLq0wgETxXxu9WeMHV2ywoclruSeN12wB9xdJGJn7j2PQD9qbhdc1XauNvCZ5YDJAmedreFhy4hDSVDd1MIZsKjak+W1s048Tsu6tayz0=",
                "Data": null
            }
        ],


CloudScript
2 comments
10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Gosen Gao avatar image Gosen Gao commented ·

May I know the details of the log which is generated by line 5? Please remove any sensitive info.

0 Likes 0 ·
Kim Strasser avatar image Kim Strasser Gosen Gao commented ·

I have added the details of the iOS log to my question.

In addition, on Android I get an orderId in the ReceiptContent when I make a test purchase. But on iOS the ReceiptContent looks completely different, there is no orderId in the iOS ReceiptContent.

How can I get the orderId on iOS?

Android ReceiptContent:

 "Logs": [
                {
                    "Level": "Info",
                    "Message": "ReceiptContent: {\"orderId\":\"GPA.3300-0254-7054-53473\",\"packageName\":\"...\",\"productId\":\"...\",\"purchaseTime\":1644768767890,\"purchaseState\":0,\"purchaseToken\":\"kbjlkdonahopnkldohabjbkh.AO-J1OxdPlKtzdZ8nodeBxe5jCjCt81OlU_46Li7NgMM0PQdtSL1s2qS0sitFa7v72ijdkfT3MsLXHu39hdRmIvf2YuDlPAevn3RD0MO3HPjatgoWl7eH9c\",\"acknowledged\":false}"
                },
                {
                    "Level": "Info",
                    "Message": "orderid: GPA.3300-0254-7054-53473"
                },
                {
                    "Level": "Info",
                    "Message": "PaymentType: ReceiptValidation"
                }
            ],
0 Likes 0 ·

1 Answer

·
Gosen Gao avatar image
Gosen Gao answered

This receiptcontent should be a Base64 encoded string, if you want to get the receipt info from it, you have to decode it. You can refer to this Unity forum case.

3 comments
10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Kim Strasser avatar image Kim Strasser commented ·

I have changed my code but I still get the JavascriptException. I only want to execute the following code if an orderId exists in the ReceiptContent.

handlers.StoreOrderId = function (args, context)
{
    var psEvent = context.playStreamEvent; 
    var receiptcontent = context.playStreamEvent.ReceiptContent;
    var receiptjson = JSON.parse(receiptcontent);
    if (receiptjson.hasOwnProperty("orderId"))
    {
    log.info("android device");
    var orderid = JSON.parse(receiptcontent).orderId;

 "Error": {
            "Error": "JavascriptException",
            "Message": "JavascriptException",
            "StackTrace": "SyntaxError: Unexpected token M in JSON at position 0\n    at JSON.parse (<anonymous>)\n    at handlers.StoreOrderId (E5E2C-main.js:8962:28)\n    at Object.invokeFunction (Script:117:33)"
        }

What can I do so that my code doesn't fail when there is no orderId in the ReceiptContent?

0 Likes 0 ·
Gosen Gao avatar image Gosen Gao commented ·

Because the error occurs at this line.

var receiptjson = JSON.parse(receiptcontent);

Your operation of checking orderId is after an error, which cannot be performed. You can use try-catch for error handling. The code below for your reference.

try {
        var receiptjson = JSON.parse(receiptcontent);
        log.debug("Android receipt");
    } catch {
        log.debug("iOS receipt");
    };
0 Likes 0 ·
Kim Strasser avatar image Kim Strasser commented ·

Thanx. It works with a try/catch block.

0 Likes 0 ·

Write an Answer

Hint: Notify or tag a user in this post by typing @username.

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.