When you create a CNY Alipay recipient via the Wise API, we automatically run a series of validations (format checks) and verifications (Confirmation of Payee, or CoP) before returning the response.
This guide provides details specific to the verification that occurs when creating CNY Alipay recipients.
CNY supports one recipient type only:
| Recipient type | API value | Verification provider | Description |
|---|---|---|---|
| Chinese Alipay | chinese_alipay | Alipay API | Alipay Login ID (phone or email) + name. |
Field-level validation checks the format and correctness of input fields. If any fail, the recipient is not created and the API returns a validation error.
The following validations occur when the recipient type is chinese_alipay:
| Field | Rules | Error if invalid |
|---|---|---|
| Account number (Alipay ID) | Can be a phone number or email address (6–254 characters). See format details below. | NOT_VALID |
| Name | At least one character for first name and family name. Only characters matching ^[0-9A-Za-z-_()'*,. ]+$ | NOT_VALID |
The Alipay ID accountNumber can be either:
Email format:
- Must match pattern:
^[^\s]+@[^\s]+\.[^\s]{2,}$ - Example:
user@example.com
Phone format (regional):
- China:
+86followed by digits (+8613812345678) - Hong Kong:
+852followed by digits - Macau:
+853followed by digits - Taiwan:
+886followed by digits - Global:
+CC-numberwhere CC is any country code
{
"errors": [
{
"code": "NOT_VALID",
"path": "name/fullName",
"message": "The name provided is not valid."
}
]
}Verification checks both account existence (type ACCOUNT_EXISTENCE) and name matching (type NAME_MATCHING) in a single call. This step verifies the Alipay account + name pair as a unit via the Alipay API. It only runs after all field validations pass.
Unlike currencies with separate name matching, Alipay validates both the account and name together. There is no separate name matching step and no resolved name returned. We would thus return an outcomes.[].type of type ACCOUNT_EXISTENCE.
- Wise calls the Alipay API with the recipient's Alipay ID and full name.
- Alipay verifies that the account exists AND the name matches as a combined check.
- If the account/name combination is invalid, the outcome is blocking so recipient creation fails with an error.
- If the combination is valid, the outcome is
SUCCESS.
Because Alipay validates account and name together as a unit, there is no partial matching — the result is either valid or invalid. The resolvedName and recommendedUpdates fields are always empty for CNY.
| Recipient type | Fields checked (V1) | Fields checked (V2) |
|---|---|---|
| Chinese Alipay | details/accountNumber, accountHolderName | details/accountNumber, name/fullName |
If verification discovers the account/name combination is invalid, this is a blocking outcome, meaning the recipient is not created.
| Blocking outcome | Error code | Error path | When it happens |
|---|---|---|---|
INVALID_ACCOUNT | ALIPAY_ACCOUNT_NUMBER_NOT_MATCHED | account/details/accountNumber | Alipay says the recipient name or Alipay login ID is invalid. |
Sample block error: Invalid account/name combination
{
"errors": [
{
"code": "ALIPAY_ACCOUNT_NUMBER_NOT_MATCHED",
"path": "account/details/accountNumber",
"message": "Invalid recipient name or Alipay login id."
}
]
}| Outcome | Blocking? | When it happens |
|---|---|---|
SUCCESS | No | Alipay confirms the account + name pair is valid. |
COULD_NOT_CHECK | No | Alipay API returned an error or timed out. |
| (blocks creation) | Yes | Alipay says the account/name combination is invalid. |
| Outcome | Recipient created? | What to do |
|---|---|---|
SUCCESS | Yes | Proceed with the transfer. No additional action needed. |
| (blocking error) | No | Fix the invalid input and retry recipient creation. The error means either the Alipay ID or the name (or both) are wrong. |
CNY never produces PARTIAL_FAILURE or non-blocking FAILURE outcomes. The only possible non-blocking outcomes are SUCCESS and COULD_NOT_CHECK.
Both V1 and V2 endpoints run the same validations and verifications. The difference is the field naming and how the confirmation result is returned.
| Aspect | /v1/accounts/ | /v2/accounts/ |
|---|---|---|
| Confirmations in response | Always included in the recipient response (if available) | Only included if you request them via responseConfiguration.additionalInformation |
| Name field path in confirmations | accountHolderName | name/fullName |
| Accept confirmation | PATCH /v1/accounts/{id}/confirmations | PATCH /v2/accounts/{id}/confirmations |
When creating a recipient with V2, include the following in your request to receive the confirmations field:
{
"type": "chinese_alipay",
"details": { ... },
"responseConfiguration": {
"additionalInformation": ["CONFIRMATION_RESULT"]
}
}Without this, V2 will create the recipient and run all checks, but will not include the confirmations field in the response. You would then need to fetch it separately via GET /v2/accounts/{id}.
All payloads below show the confirmations field as it appears in the response after creating a recipient. Because CNY Alipay is account-existence verification (account + name validated as a unit), there is no resolvedName or recommendedUpdates.
In production, the resolvedName and providedName fields are null for CNY outcomes. Null fields may be omitted entirely from the actual API response. They are shown here as null for documentation completeness.
{
"id": 123456,
"type": "chinese_alipay",
"accountHolderName": "Wang Wei",
"details": {
"accountNumber": "+8613812345678"
},
"confirmations": {
"acceptedOutcomes": false,
"acceptedAt": null,
"quoteId": null,
"outcomes": [
{
"type": "ACCOUNT_EXISTENCE",
"outcome": "SUCCESS",
"timestamp": "2026-03-08T10:30:00Z",
"requiresCustomerAcceptance": false,
"fieldsChecked": ["details/accountNumber", "accountHolderName"],
"message": null,
"resolvedName": null,
"providedName": null,
"recommendedUpdates": []
}
]
}
}V1 response:
{
"id": 123457,
"type": "chinese_alipay",
"accountHolderName": "Wang Wei",
"details": {
"accountNumber": "wangwei@example.com"
},
"confirmations": {
"acceptedOutcomes": false,
"acceptedAt": null,
"quoteId": null,
"outcomes": [
{
"type": "ACCOUNT_EXISTENCE",
"outcome": "SUCCESS",
"timestamp": "2026-03-08T10:30:00Z",
"requiresCustomerAcceptance": false,
"fieldsChecked": ["details/accountNumber", "accountHolderName"],
"message": null,
"resolvedName": null,
"providedName": null,
"recommendedUpdates": []
}
]
}
}{
"id": 123456,
"type": "chinese_alipay",
"accountHolderName": "Wang Wei",
"details": {
"accountNumber": "+8613812345678"
},
"confirmations": {
"acceptedOutcomes": false,
"acceptedAt": null,
"quoteId": null,
"outcomes": [
{
"type": "ACCOUNT_EXISTENCE",
"outcome": "COULD_NOT_CHECK",
"timestamp": "2026-03-08T10:30:00Z",
"requiresCustomerAcceptance": true,
"fieldsChecked": ["details/accountNumber", "accountHolderName"],
"message": "We couldn't verify the account right now. You can still proceed.",
"resolvedName": null,
"providedName": null,
"recommendedUpdates": []
}
]
}
}Returned when an internal Wise error occurs.
The requiresCustomerAcceptance field is true when the outcome value is COULD_NOT_CHECK.
Before you can use the recipient for a transfer, you must make a PATCH request to confirm the user has acknowledged the result.
For CNY, acceptance is only needed for COULD_NOT_CHECK. SUCCESS does not require acceptance, and FAILURE (invalid account/name) is blocking so there's no confirmation to accept.
Endpoint: PATCH /v1/accounts/{accountId}/confirmations or PATCH /v2/accounts/{accountId}/confirmations
Body:
{
"acceptedOutcomes": true
}The response mirrors the original confirmations object, but now acceptedOutcomes is true and acceptedAt contains a timestamp:
{
"confirmations": {
"acceptedOutcomes": true,
"acceptedAt": "2026-03-08T10:35:00Z",
"quoteId": null,
"outcomes": [
{
"type": "ACCOUNT_EXISTENCE",
"outcome": "COULD_NOT_CHECK",
"timestamp": "2026-03-08T10:30:00Z",
"requiresCustomerAcceptance": true,
"fieldsChecked": ["details/accountNumber", "accountHolderName"],
"message": "We couldn't verify the account right now. You can still proceed.",
"resolvedName": null,
"providedName": null,
"recommendedUpdates": []
}
]
}
}Recipient verification for CNY Alipay can be tested in sandbox, but results depend on Alipay’s sandbox behaviour.
- Create a recipient via
POST /v1/accounts/(or V2) with valid details. - Inspect the response. Check the
confirmations.outcomes.outcomefield. - If outcome requires acceptance (
requiresCustomerAcceptance: true), callPATCH /v1/accounts/{id}/confirmationswith{"acceptedOutcomes": true}. - Create a transfer using the accepted recipient.
| Test scenario | Expected outcome |
|---|---|
| Valid Alipay ID + matching name | SUCCESS |
| Invalid Alipay ID or wrong name | Blocking error: ALIPAY_ACCOUNT_NUMBER_NOT_MATCHED |
| Alipay sandbox API error/timeout | COULD_NOT_CHECK |
| Invalid Alipay ID format | Blocking field error: NOT_VALID on details/accountNumber |
| Invalid name characters | Blocking field error: NOT_VALID on name/fullName |
Because Alipay validates the account + name pair together, providing a valid Alipay ID with a wrong name produces the same blocking error as providing an invalid Alipay ID.
The error message is Invalid recipient name or Alipay login id. You cannot determine from the error alone which field is wrong.