Sandbox integration
This page is about how to perform the sandbox integration. The following graphic illustrates steps of a complete system development process.

Figure 1. System development process
#Before you begin
The following sample message contains no sensitive information, therefore, encryption is not required and only request signing and signature validation are illustrated. Before you integrate in the sandbox environment, ensure that the following information is ready.
Client ID and public key
For more information about how to retrieve Client ID and public key information that you can use in Sandbox environment, see Integration preparation.
Client Id sample:
clientId:SANDBOX_5Y036S2Y1W4D03493
Public key sample:
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAouaj1V+bzKl4Gb1Lqd0cEUcJ1s9X7NnqNtPcqODfxuusS3Q9GpakNyc3Oay+xng7faTSezsmFMOF72AKv/PLkyvxZawV1hcwknjfTSweWWwxmm8TDJ2gqSItKmbKQudAascMHacJLOfa/g19yuEAUULjc5ZsibD77PJ2FmP8A9xPmkRNJnu7ha/VBOOLCdZzXrysH9GBTneCDvdOx4ktn634timgqv0dpSvIt41IiDD5Ma2eMr2MAz1vViNhvYCsWuC7W71ow4g/Ub9EdOcLJd6N/BaARnY2EJSfRquq9enzgbogDfe5Nmp1NGLn6FnkCgOYjn+Cg62zj93xA3glcwIDAQABDomain name
Go to Alipay Developer Center, in Testing Resources, find the Gateway Endpoint (Domain name) under Integration Information.
SFTP account
Contact Technical Support (overseas_support@service.alibaba.com) to:
- Obtain the SFTP account that is used for accessing reports in sandbox environment.
- Submit your public IP address (through which you visit the SFTP server) to whitelist the IP address.
#Call an API
Take the payment interface for example, assume that the Client-Id is SANDBOX_5Y036S2Y1W4D03493 and the gateway is https://open-na.alipay.com/ams/sandbox/api/v1/payments/pay.
#Sample request
Sample request message body: {
{
"productCode": "CASHIER_PAYMENT",
"paymentRequestId": "pay_1089760038715669_11277574501112",
"order":{
"referenceOrderId": "102775745075669",
"orderDescription": "test orderDescription",
"orderAmount":{
"value":"100",
"currency":"PHP"
},
"env":{
"terminalType":"app"
},
"merchant": {
"referenceMerchantId": "seller231117459@login.com",
"merchantName": "cup Hu",
"merchantMCC": "1234",
"store": {
"referenceStoreId": "S0000000001",
"storeName": "UGG-2",
"storeMcc": "1405"
}
}
},
"paymentAmount":{
"value":"100",
"currency":"PHP"
},
"paymentMethod":{
"paymentMethodType": "GCASH"
},
"paymentNotifyUrl": "https://www.merchant.com/notifyUrl.htm",
"paymentRedirectUrl": "https://www.merchant.com/redirectUrl.htm"
}#Sign the request
- Obtain your private key to sign the request. For more information about obtaining keys, see Integration preparation.
- Create the string to sign. The content to be signed is:
<HTTP-method> <HTTP-URI-with-query-string>
<Client-Id>.<Request-Time>.<http body>
The following example illustrates how to generate the unsignedContent:
String unsignedContent = httpMethod + " " + path + "\n" + clientId + "." + requestTimeStr
+ "." + reqBody;where,
- httpMethod = "POST"; // Retrieve the value from http request line
- path = "/ams/sandbox/api/v1/payments/pay"; //Retrieve the value from the http request line
- clientId = "SANDBOX_5Y036S2Y1W4D03493"; // The unique ID assigned by Alipay to identify a merchant
- requestTimeStr = "2020-03-23T14:00:00+08:00"; //Take the value of Request-Time from header
- reqBody = "{
"productCode": "CASHIER_PAYMENT",
"paymentRequestId": "pay_1089760038715669_11277574501112",
"order":{
"referenceOrderId": "102775745075669",
"orderDescription": "test orderDescription",
"orderAmount":{
"value":"100",
"currency":"PHP"
},
"env":{
"terminalType":"app"
},
"merchant": {
"referenceMerchantId": "seller231117459@login.com",
"merchantName": "cup Hu",
"merchantMCC": "1234",
"store": {
"referenceStoreId": "S0000000001",
"storeName": "UGG-2",
"storeMcc": "1405"
}
}
},
"paymentAmount":{
"value":"100",
"currency":"PHP"
},
"paymentMethod":{
"paymentMethodType": "GCASH"
},
"paymentNotifyUrl": "https://www.merchant.com/notifyUrl.htm",
"paymentRedirectUrl": "https://www.merchant.com/redirectUrl.htm"
}"; // The request body
In this sample, the value of Request-Time is 2020-03-23T14:00:00+08:00. The generated content to be signed unsignedContent is:
POST /ams/sandbox/api/v1/payments/pay
SANDBOX_5Y036S2Y1W4D03493.2020-03-23T14:00:00+08:00.{
"productCode": "CASHIER_PAYMENT",
"paymentRequestId": "pay_1089760038715669_11277574501112",
"order":{
"referenceOrderId": "102775745075669",
"orderDescription": "test orderDescription",
"orderAmount":{
"value":"100",
"currency":"PHP"
},
"env":{
"terminalType":"app"
},
"merchant": {
"referenceMerchantId": "seller231117459@login.com",
"merchantName": "cup Hu",
"merchantMCC": "1234",
"store": {
"referenceStoreId": "S0000000001",
"storeName": "UGG-2",
"storeMcc": "1405"
}
}
},
"paymentAmount":{
"value":"100",
"currency":"PHP"
},
"paymentMethod":{
"paymentMethodType": "GCASH"
},
"paymentNotifyUrl": "https://www.merchant.com/notifyUrl.htm",
"paymentRedirectUrl": "https://www.merchant.com/redirectUrl.htm"
}- Generate the signature. Use the algorithm and private key obtained in step 1 to generate the signature. The following example assumes that RSA256 algorithm is used to generate the signature. Use the following code to perform the base64 URL encoding and generate the signature:
base64UrlEncode(sha256withrsa(<unsignedContent>), <privateKey>))The generated signature:
Oi50a6hX%2f7XgyX6NbAjlyU523gB2AhVKhJGxW%2f3ezjwUhzMnEmbMdznvVtXwtO%2fg2iLic3B%2ftpnxl7FYtGhQfal5ivvr3IMEjC%2bbT2%2b6%2bNuMwdeDSWq2dXyaY44wyhQFqzzfwdOg%2bX2TTGSzRpSN3KHFoGNUHMRxZElfw%2bz13neDJ9fnpr%2f4r6qrDnSB2eoGe293ez1bUFwtoM2sYGUP2vvXrLnaB%2bAEojLjiA1MY14%2bXD55RMBBwTOofteCEwgXwWFb6T6XFjlKK7Up7v2ps7IaOjo8QYHhgPMcxddpIh7JK9jwOej%2fWsL%2f3kckS6wy1OTyruUFq%2f7Ox1mTuzIxsg%3d%3d
- Add the signature to header. Assemble the signature algorithm, the key version used for the signature, and the signature into Signature header. The following example shows a finished Signature header:
key: Signature ;
value:algorithm=<algorithm>,keyVersion=<key-version>,signature=<signature>Sample:
"Signature": "algorithm=RSA256,keyVersion=1,signature=Oi50a6hX%2f7XgyX6NbAjlyU523gB2AhVKhJGxW%2f3ezjwUhzMnEmbMdznvVtXwtO%2fg2iLic3B%2ftpnxl7FYtGhQfal5ivvr3IMEjC%2bbT2%2b6%2bNuMwdeDSWq2dXyaY44wyhQFqzzfwdOg%2bX2TTGSzRpSN3KHFoGNUHMRxZElfw%2bz13neDJ9fnpr%2f4r6qrDnSB2eoGe293ez1bUFwtoM2sYGUP2vvXrLnaB%2bAEojLjiA1MY14%2bXD55RMBBwTOofteCEwgXwWFb6T6XFjlKK7Up7v2ps7IaOjo8QYHhgPMcxddpIh7JK9jwOej%2fWsL%2f3kckS6wy1OTyruUFq%2f7Ox1mTuzIxsg%3d%3d"#Construct the request
In this example, the request is sent by using cURL. Add Client-Id, Request-Time, and Signature to the request header:
curl -X POST \
https://open-na.alipay.com/ams/sandbox/api/v1/payments/pay \
-H 'Content-Type: application/json; charset=UTF-8' \
-H 'Client-Id: SANDBOX_5Y036S2Y1W4D03493' \
-H 'Request-Time: 2020-03-23T14:00:00+08:00' \
-H 'Signature: algorithm=RSA256, keyVersion=1, signature=Oi50a6hX%2f7XgyX6NbAjlyU523gB2AhVKhJGxW%2f3ezjwUhzMnEmbMdznvVtXwtO%2fg2iLic3B%2ftpnxl7FYtGhQfal5ivvr3IMEjC%2bbT2%2b6%2bNuMwdeDSWq2dXyaY44wyhQFqzzfwdOg%2bX2TTGSzRpSN3KHFoGNUHMRxZElfw%2bz13neDJ9fnpr%2f4r6qrDnSB2eoGe293ez1bUFwtoM2sYGUP2vvXrLnaB%2bAEojLjiA1MY14%2bXD55RMBBwTOofteCEwgXwWFb6T6XFjlKK7Up7v2ps7IaOjo8QYHhgPMcxddpIh7JK9jwOej%2fWsL%2f3kckS6wy1OTyruUFq%2f7Ox1mTuzIxsg%3d%3d' \
-d \
'{
"productCode": "CASHIER_PAYMENT",
"paymentRequestId": "pay_1089760038715669_11277574501112",
"order":{
"referenceOrderId": "102775745075669",
"orderDescription": "test orderDescription",
"orderAmount":{
"value":"100",
"currency":"PHP"
},
"env":{
"terminalType":"app"
},
"merchant": {
"referenceMerchantId": "seller231117459@login.com",
"merchantName": "cup Hu",
"merchantMCC": "1234",
"store": {
"referenceStoreId": "S0000000001",
"storeName": "UGG-2",
"storeMcc": "1405"
}
}
},
"paymentAmount":{
"value":"100",
"currency":"PHP"
},
"paymentMethod":{
"paymentMethodType": "GCASH"
},
"paymentNotifyUrl": "https://www.merchant.com/notifyUrl.htm",
"paymentRedirectUrl": "https://www.merchant.com/redirectUrl.htm"
}'For more information about message structure, message fields, and message transmission, see API fundamentals.
#Handle the response
After you receive a response, you need to validate the signature of the response.
#Receive the response
The response consists of response header and response body.
Sample response header:
Client-Id: SANDBOX_5Y036S2Y1W4D03493
Response-Time: 2020-03-23T06:08:53Z
Signature: algorithm=RSA256, keyVersion=1,
signature=Pz5cU8WFyOPteA9gyvbXbXIes9JHNafmv6hXWuwU0rC%2bSmnZpzGf3lGPkmGVWK6YptKRluHt9yGsfZhtPH%2bbZBG50fXHv%2bKVhJw4uLVOKcAK4wwP2PPnW4ICHjSqqqbuBIADVIeEoRXcxsUKtNH%2btoWmdtFnYtYFK%2fRXYgxvF1%2f6TK5SafrsEZCHXwVvzAqd1HG2Qs2UK6QEkZ5u3U6LSoXzGwSnB4usWkSRw2GP69fHUYWfi5r7AfjhDs%2bcZrUnlKCXpUAmeEGNJs8NTeV0GlYt3DCFVNwMc%2f%2bnJ%2bkwd%2fzi29cpAYCPzEdK6Qt8m8OEG6Hn0WtRew7EYrXwY0jpEg%3d%3d
Trace-Id: 0bfdda6f15815956184685437e0764.0.1.1
Sample response body:
{
"paymentAmount": {
"currency": "PHP",
"value": "100"
},
"paymentCreateTime": "2020-03-23T11:54:08+08:00",
"paymentId": "303540815849356482956531350278548000unSJuoDrlP202003220001430724",
"paymentRequestId": "pay_1089760038715669_11277574501112",
"redirectActionForm": {
"method": "GET",
"redirectUrl": "https://render.alipay.com/p/c/jzmcoal2/igg-checkout-counter.html?paymentId=303540815849356482956531350278548000unSJuoDrlP202003220001430724&callback=https%3A%2F%2Fwww.merchant.com%2FredirectUrl.htm&amountValue=100&amountCurrency=PHP&merchantName=cup%20Hu"
},
"result": {
"resultCode": "PAYMENT_IN_PROCESS",
"resultMessage": "payment in process",
"resultStatus": "U"
}
}#Validate the signature
Use the following information to validate the signature:
- Alipay public key: <alipayPublicKey>
- Algorithm: sha256withrsa_verify(base64UrlDecode(<signature>), <content_to_be_verified>, <alipayPublicKey>)
The signature verification process consists of the following steps:
1. Obtain the public key, see Preparing keys for details. Obtain Client-Id and algorithm from header.
2. Create the string to be validated. The string to be validated unsignedContent is:
String unsignedContent = httpMethod + " " + path + "\n" + clientId + "." + responseTimeStr + "." + rspBody;where,
- httpMethod = "POST"; //Take the value of request method out of the http request line
- path = "/ams/sandbox/api/v1/payments/pay"; // Take the value from the http request line
- clientId = "SANDBOX_5Y036S2Y1W4D03493"; // The unique ID assigned by Alipay to identify a merchant
- responseTimeStr = "2020-03-23T06:08:53Z"; // Take the value of Response-Time from header
- rspBody = "{
"paymentAmount": {
"currency": "PHP",
"value": "100"
},
"paymentCreateTime": "2020-03-23T11:54:08+08:00",
"paymentId": "303540815849356482956531350278548000unSJuoDrlP202003220001430724",
"paymentRequestId": "pay_1089760038715669_11277574501112",
"redirectActionForm": {
"method": "GET",
"redirectUrl": "https://render.alipay.com/p/c/jzmcoal2/igg-checkout-counter.html?paymentId=303540815849356482956531350278548000unSJuoDrlP202003220001430724&callback=https%3A%2F%2Fwww.merchant.com%2FredirectUrl.htm&amountValue=100&amountCurrency=PHP&merchantName=cup%20Hu"
},
"result": {
"resultCode": "PAYMENT_IN_PROCESS",
"resultMessage": "payment in process",
"resultStatus": "U"
}
}"; // Response body
The calculated unsignedContent is:
POST /ams/sandbox/api/v1/payments/pay
SANDBOX_5Y036S2Y1W4D03493.2020-03-23T06:08:53Z.{
"paymentAmount": {
"currency": "PHP",
"value": "100"
},
"paymentCreateTime": "2020-03-23T11:54:08+08:00",
"paymentId": "303540815849356482956531350278548000unSJuoDrlP202003220001430724",
"paymentRequestId": "pay_1089760038715669_11277574501112",
"redirectActionForm": {
"method": "GET",
"redirectUrl": "https://render.alipay.com/p/c/jzmcoal2/igg-checkout-counter.html?paymentId=303540815849356482956531350278548000unSJuoDrlP202003220001430724&callback=https%3A%2F%2Fwww.merchant.com%2FredirectUrl.htm&amountValue=100&amountCurrency=PHP&merchantName=cup%20Hu"
},
"result": {
"resultCode": "PAYMENT_IN_PROCESS",
"resultMessage": "payment in process",
"resultStatus": "U"
}
}3. Use the following algorithm to verify the signature. sha256withrsa_verify(base64UrlDecode(<signature>), <unsignedContent>, <alipayPublicKey>)
#Handle the notification
You must contact Alipay Technical Support (overseas_support@service.alibaba.com) to whitelist your server address to receive notifications from Alipay and be able to correctly implement the notification. See Setting notification endpoint for details.
Take the payment interface for example, assume that the Client-Id is SANDBOX_5Y036S2Y1W4D03493 and the gateway is https://open-na.alipay.com/ams/sandbox/api/v1/payments/notifyPayment
#Sample request
Sample request message body sent to the merchant: {
{"notifyType":"PAYMENT_RESULT","notifyUrl":"https://www.merchant.com/notifyUrl.htm","paymentAmount":{"currency":"PHP","value":"100"},"paymentCreateTime":"2020-03-23T16:13:59+08:00","paymentId":"308135915849512391636546941146548480PMgSUVTMFX202003220001430734","paymentRequestId":"pay_1089760038715669_11277574501113","paymentTime":"2020-03-23T16:13:59+08:00","result":{"resultCode":"SUCCESS","resultMessage":"success.","resultStatus":"S"}}Sample request message header:
{
"Content-Type": "application/json",
"Client-Id": "SANDBOX_5Y036S2Y1W4D03493",
"Request-Time": "2020-03-23T08:14:30Z",
"Signature": "algorithm=RSA256,keyVersion=1,signature=Cmq5WwooBaU%2b1uBvTCY49Fsyh7TZPZXwCCz3%2fLyZCFFsp94UISgSL0FaXRi0%2bvgweT%2fnxYPHPMM4LGGoWBI4NCdhLB0Q3xh0D4k337uRwaNcX10sN0u8MZBcwjHR4NJ50wP8mSVjsmF633AqNTJSOXv2ijSAQwRz09ozP%2f9AEQqNlRyyENKFcvaGaIIvomzbAD24R3BxIbL0T3C9Ajd5t6l5HrRkF0QxpjscAqxhyrD2c9JMo9AE3vT%2b17rAMu4hMmWrf2jFny%2bx26BPi8yHkzk8X8QbLSaobS1bP6WSkNxEcKUXPx9ffcMwiW7tGauhTfQwUVXTDCKcrU%2fJCBhxjw%3d%3d"
}#Validate the signature
- Obtain the public key, see Preparing keys for details. Obtain Client-Id and algorithm from header.
- Construct he content to be signed unsignedContent:
String unsignedContent = httpMethod + " " + path + "\n" + clientId + "." + requestTimeStr
+ "." + reqBody;where,
- httpMethod = "POST"; //Take the value from the http request line
- path = "/ams/sandbox/api/v1/payments/notifyPayment"; // Take the value from the http request line
- clientId = "SANDBOX_5Y036S2Y1W4D03493"; // The unique ID assigned by Alipay to identify a merchant
- requestTimeStr = "2020-03-23T08:14:30Z"; // Take the value of Request-Time from header
- reqBody = "{"notifyType":"PAYMENT_RESULT","notifyUrl":"https://www.merchant.com/notifyUrl.htm","paymentAmount":{"currency":"PHP","value":"100"},"paymentCreateTime":"2020-03-23T16:13:59+08:00","paymentId":"308135915849512391636546941146548480PMgSUVTMFX202003220001430734","paymentRequestId":"pay_1089760038715669_11277574501113","paymentTime":"2020-03-23T16:13:59+08:00","result":{"resultCode":"SUCCESS","resultMessage":"success.","resultStatus":"S"}}"; // Request body
The generated unsignedContent is:
POST /ams/sandbox/api/v1/payments/notifyPayment
SANDBOX_5Y036S2Y1W4D03493.2020-03-23T08:14:30Z.{"notifyType":"PAYMENT_RESULT","notifyUrl":"https://www.merchant.com/notifyUrl.htm","paymentAmount":{"currency":"PHP","value":"100"},"paymentCreateTime":"2020-03-23T16:13:59+08:00","paymentId":"308135915849512391636546941146548480PMgSUVTMFX202003220001430734","paymentRequestId":"pay_1089760038715669_11277574501113","paymentTime":"2020-03-23T16:13:59+08:00","result":{"resultCode":"SUCCESS","resultMessage":"success.","resultStatus":"S"}}- Retrieve the signature from http header, and then use the following algorithm to verify whether the result is true.
verifySignatureWithSHA256RSA(unsignedContent, decode(signature, "UTF-8"), alipayPublicKey)#Send the receipt acknowledgment
- After the signature validation, retrieve the result and then take actions following your business design. For example, if the notification transaction result is SUCCESS, the response body is as below:
{
"result": {
"resultCode": "SUCCESS",
"resultStatus": "S",
"resultMessage": "success"
}
}
If the notification transaction result is PROCESS_FAIL, the response body is as follows. If the notification delivery is failed, Alipay will retry for at most seven times a day.
{
"result": {
"resultCode": "PROCESS_FAIL",
"resultStatus": "F",
"resultMessage": "If the system can't process the notification due to internal system failure."
}
}- Sign the content to be returned. The content to be signed unsignedContent is:
String unsignedContent = httpMethod + " " + path + "\n" + clientId + "." + responseTimeStr
+ "." + rspBody;where,
- httpMethod = "POST"; // Take the value from the http request line
- path = "/ams/sandbox/api/v1/payments/notifyPayment"; // Take the value from the http request line
- clientId = "SANDBOX_5Y036S2Y1W4D03493"; // The unique ID assigned by Alipay to identify a merchant
- responseTimeStr = "2020-03-23T08:14:00+08:00"; // Take the value of Response-Time from header
- rspBody = "{
"result": {
"resultCode": "SUCCESS",
"resultStatus": "S",
"resultMessage": "success"
}
}"; // Response body, JSON.toJSONString(responseBody)
The generated unsignedContent is:
POST ams/sandbox/api/v1/payments/notifyPayment
SANDBOX_5Y036S2Y1W4D03493.2020-03-23T08:14:00+08:00.{
"result": {
"resultCode": "SUCCESS",
"resultStatus": "S",
"resultMessage": "success"
}
}- Sign the content. Use the following algorithm to perform the base64 URL encoding and sign the content.
base64UrlEncode(sha256withrsa(<unsignedContent>), <privateKey>))The generated sample signature is:
ZCrwoO8S%2b9vuf3%2f%2fHSxqJfWWO%2bGFzqYl6cYalwyLaxZ7sJluMr41H7wUzD4V4XSXARynbGp3TQY7AQV0epSwFlKGm5H2P5cg1m84pkjiYquFWHKOzrHRpURiESzIbTXuqrc8Luud2N%2bXT2A5kKRXyYYnKCf7n9g8849WJE%2fcgsg0%2fv19tUnWMLY3wSEufeEH1fCFrAX6aTl%2bliAXsn7Mqgjc8dtQov5l9Sl1RoziaCunNMBjHj98Z1fiw2IhlBeL4qCaLWJfaemqkQ9n3KbhiCc3Kv1wHkLNSLwWbDajMM6av4TX%2fJsbtidtP409oujlDc3H6%2bnL5ALJVrikTP0fzg%3d%3d- Add the signature to header and then send the receipt acknowledge. Assemble the signature algorithm, the key version used for the signature, and the signature into Signature header. The following example shows a finished Signature header:
key: Signature ;
value:algorithm=<algorithm>,keyVersion=<key-version>,signature=<signature>Sample:
"signature": "algorithm=RSA256,keyVersion=1,signature=ZCrwoO8S%2b9vuf3%2f%2fHSxqJfWWO%2bGFzqYl6cYalwyLaxZ7sJluMr41H7wUzD4V4XSXARynbGp3TQY7AQV0epSwFlKGm5H2P5cg1m84pkjiYquFWHKOzrHRpURiESzIbTXuqrc8Luud2N%2bXT2A5kKRXyYYnKCf7n9g8849WJE%2fcgsg0%2fv19tUnWMLY3wSEufeEH1fCFrAX6aTl%2bliAXsn7Mqgjc8dtQov5l9Sl1RoziaCunNMBjHj98Z1fiw2IhlBeL4qCaLWJfaemqkQ9n3KbhiCc3Kv1wHkLNSLwWbDajMM6av4TX%2fJsbtidtP409oujlDc3H6%2bnL5ALJVrikTP0fzg%3d%3d"Assembled header:
{
"content-length": "89",
"Content-type": "text/plain;charset=UTF-8",
"Response-time": "2020-03-23T08:14:00+08:00",
"Client-Id": "SANDBOX_5Y036S2Y1W4D03493",
"signature": "algorithm=RSA256,keyVersion=1,signature=ZCrwoO8S%2b9vuf3%2f%2fHSxqJfWWO%2bGFzqYl6cYalwyLaxZ7sJluMr41H7wUzD4V4XSXARynbGp3TQY7AQV0epSwFlKGm5H2P5cg1m84pkjiYquFWHKOzrHRpURiESzIbTXuqrc8Luud2N%2bXT2A5kKRXyYYnKCf7n9g8849WJE%2fcgsg0%2fv19tUnWMLY3wSEufeEH1fCFrAX6aTl%2bliAXsn7Mqgjc8dtQov5l9Sl1RoziaCunNMBjHj98Z1fiw2IhlBeL4qCaLWJfaemqkQ9n3KbhiCc3Kv1wHkLNSLwWbDajMM6av4TX%2fJsbtidtP409oujlDc3H6%2bnL5ALJVrikTP0fzg%3d%3d"
}#Test in sandbox environment
After you complete the integration in sandbox environment, execute test cases to see whether the services can work as expected. For a full list of sandbox test cases, see Test cases.