Alipay+Alipay+

Accept payment

The Acquiring Partner (ACQP) collects the information of purchase order and user payment code submitted by Merchant, and then constructs the payment request to Alipay+. After Alipay+ returns the payment result, the ACQP notifies Merchant about the result.

To integrate the User-presented Mode Payment, the ACQP needs to complete the following steps.

Merchant registration

In certain countries or regions, for legal or compliance reasons, the merchant information that is related to this payment must be registered before a payment can be processed. The merchant registration process only needs to be performed once.

The following figure illustrates the merchant registration flow:

商户报备流程图.png

Figure 2. Merchant registration flow

Processing logic

When processing merchant registration requests, Mobile Payment Partner must pay attention to the following items:

  • Batch operations are not supported. Each time, only one merchant or store can be registered.
  • For the cashier payment scenario, at least the merchant information must be registered.
  • The response of the merchant registration request only indicates that the registration request is successfully accepted.
  • Mobile Payment Partner returns the registration status to Alipay+ asynchronously (normally within 7 days), the ACQP can obtain the registration result by using inquiryRegistrationStatus interface.
  • Alipay+ will notify the ACQP of the merchant registration status via notifyRegistrationStatus interface if the ACQP integrates this interface.

Sample

Alipay+ sends merchant registration request to Mobile Payment Partner.

copy
{
  "registrationRequestId": "202009181105860200000600142****",
  "merchantInfo": {
    "referenceMerchantId": "218812000019****",
    "merchantDisplayName": "Example",
    "merchantMCC": "5735",
    "logo": {
      "logoUrl": "www.example.com",
      "logoName": "Example Inc"
    },
    "merchantAddress": {
      "region": "CN",
      "address1": "浙江省杭州市..."
    },
    "registrationDetail": {
      "legalName": "Example.com",
      "contactInfo": [{
        "contactNo": "abc@example.com",
        "contactType": "EMAIL"
      }, {
        "contactNo": "9326*****56",
        "contactType": "MOBILE_PHONE"
      }],
      "registrationType": "ENTERPRISE_REGISTRATION_NO",
      "registrationNo": "RN1**",
      "registrationEffectiveDate": "2019-01-01T12:08:55+08:00",
      "registrationExpireDate": "2020-01-01T12:08:55+08:00",
      "registrationAddress": {
        "region": "CN",
        "address1": "浙江省杭州市"
      },
      "websites": [{
        "url": "http://electrolibs.com",
        "websiteType": "WEB"
      }],
      "businessType": "ENTERPRISE"
    },
    "shareholderName": "Zhangsan",
    "shareholderId": "69833444422"
  },
  "storeInfo": {
    "referenceStoreId": "218812****",
    "storeName": "Example",
    "storeMCC": "5735",
    "storeAddress": {
      "region": "CN",
      "address1": "浙江省杭州市..."
    }
  },
  "productCodes": ["IN_STORE_PAYMENT"]
}

Mobile Payment Partner returns result to Alipay+.

copy
{
  "result": {
    "resultCode": "SUCCESS",
    "resultStatus": "S",
    "resultMessage": "Success"
  }
}

More information

For more information about how to use the APIs (such as the field description), see registration.

Identify Alipay+ payment code

The ACQP needs to identify whether the payment code submitted by merchant is an Alipay+ payment code.

In addition, the ACQP needs to ensure that the Alipay+ payment code can be recognized by the merchant scanners by following the code rules below:

  • The payment codes are in the length of 16 ~ 24 digits and start with 25, 26, 27, 28, 29, or 30.
  • Preserve the ability of code length expansion. It's recommended that your terminal can support the length of 32 digits for further use.

Create a payment

To initiate a payment, the ACQP needs to call the pay interface.

Processing logic

When calling the pay interface, pay attention to the following items:

  • Specify paymentMethod.paymentMethodId by using the value of the payment code that is collected by the merchant from the customer's e-wallet.
  • Specify paymentMethod.paymentMethodType as CONNECT_WALLET in the pay interface.
  • Represent transaction amount in the smallest unit of a currency. For example, when currency code is HKD, $5.99 is represented as 599. When currency code is JPY, ¥599 is represented as 599. See ISO 4217 Currency Code for details.
  • Assign a unique paymentRequestId for the payment request to avoid any failures casued by duplicate number.
  • In certain cases, if the payment is not completed but needs to be closed from the merchant side, use the cancelPayment API to close it.
  • The default timeout in the Alipay+ system is 1 minute, which means the transaction will be closed in the Alipay+ sysytem if payment is not completed.
  • You might receive different results from Alipay+, follow instructions below to handle the result:

result.resultStatus

result.resultCode

Payment status

Actions

S

SUCCESS

Payment succeeds

Update the status from merchant side.

F

...

Payment fails

Take actions according to the error message in result.resultCode.

U

...

Payment in processing

Call the inquiryPayment interface to inquire the payment result. The inquiry request can be sent 10 to 20 times within 60 seconds.

No result received

Unknown

Retry the same request until getting the response. Please make sure that the paymentRequestId parameter must be the same as the previous one.

Samples

The ACQP sends a request to Alipay+.

copy
{
    "paymentExpiryTime": "2019-06-01T12:01:01+08:30",
    "paymentNotifyUrl": "http://xmock.inc.alipay.net/api/Ipay/globalSite/automtion/paymentNotify.htm",
    "paymentRequestId": "pay_1089760038715669_102775745075669",
    "paymentFactor": {
        "isInStorePayment": "true",
    "inStorePaymentScenario": "PaymentCode"
    },
    "order": {
        "referenceOrderId": "102775745075669",
        "orderDescription": "Mi Band 3 Wrist Strap Metal Screwless Stainless Steel For Xiaomi Mi Band 3 ",
        "orderAmount": {
            "currency": "JPY",
            "value": "100"
        },
        "merchant": {
            "referenceMerchantId": "M00000000001",
            "merchantName": "cup Hu",
            "merchantMCC": "1405",
            "store": {
                "referenceStoreId": "S0000000001",
                "storeName": "UGG-2",
                "storeMcc": "1405"
            },
      "merchantAddress": {
        "region": "JP",
        "city": "xxx"
      }
        },
    "env":{
        "storeTerminalId":"122222",
      "storeTerminalRequestTime": "2019-06-01T12:01:01+08:00"
    }
    },
    "settlementStrategy": {
        "settlementCurrency": "USD"
    },
    "paymentAmount": {
        "currency": "JPY",
        "value": "100"
    },
    "paymentMethod": {
        "paymentMethodType": "CONNECT_WALLET",
    "paymentMethodId": "28100602000000000012"
    }
}

Alipay+ returns a response to the ACQP.

  • Response of a successful payment:
copy
{
    "acquirerId": "2021228100000000",
  "pspId": "120120012012",
    "result": {
        "resultCode": "SUCCESS",
        "resultStatus": "S",
        "resultMessage": "success"
    },
    "paymentId": "20190608114010800100188820200355883",
    "paymentAmount": {
        "value": "100",
        "currency": "JPY"
    },
   "paymentTime": "2021-04-08T14:48:50+08:00",
  "customerId": "208812211212001",
  "walletBrandName":"KAKAOPAY"
}
  • For a failed payment, result.resultStatus is F, and a sample response is as below:
copy
{
   "result": {
       "resultCode": "PROCESS_FAIL",
       "resultMessage": "A general business failure occurred. Don't retry.",
       "resultStatus": "F"
   }
}
  • For an unknown payment status, result.resultStatus is U, and a sample response is as below:
copy
{
   "result": {
       "resultCode": "UNKNOWN_EXCEPTION",
       "resultMessage": "API failed due to unknown reason.",
       "resultStatus": "U"
   }
}

More information

For more information about how to use the interface (such as the field description), see pay.

Handle payment result notifications

Alipay+ calls the notifyPayment interface to notify the ACQP about the payment result when a payment reaches a final state of success or failure. After that, the ACQP needs to notify merchant the result accordingly.

Processing logic

Accept notifications

For a successful payment transaction, an HTTP POST is fired once the transaction is successfully completed. The HTTP request is sent in the raw JSON, of which the Content-Type request header is specified as application/json. Ensure that you can access the HTTP body accordingly.

For more information about what the request header, the successful payment notification request body and the failed payment notification body look like, see the samples below.

Verify the signature

The notification request that Alipay+ sends to the ACQP is signed. The merchant needs to verify the signature to confirm whether the notification is sent from Alipay+. For how to validate a signature, see Validate a signature.

After the notification is delieverd successfully, verify whether the values of the paymentAmount and paymentRequestId parameters are as you expect (for exmaple, the amount that you have calculated for the order that you are going to ship).

Acknowledge the notification with the required response

After receiving the notification, no matter whether the order processing succeeds or fails, you must return a receipt acknowledgment message to Alipay+. Meanwhile, the required response must also be signed.

For more information about what the header and body of the response look like, see the samples below.

Note:The notifyPayment interface cannot accept the failure that is caused by business reasons, for example, risk control validation failure. If the payment fails due to some business reasons, ACQP must firstly accept the payment notification and return SUCCESS to Alipay+, and then call the cancelPayment interface to perform refund.

Retrial mechanism

After receiving the notification, you must respond with an HTTP status code of 200 and send an acknowledgement with result.resultStatus of S to indicate that your server received and processed the call. If you respond with other status code, or acknowledge with other values, Alipay+ takes the notification delivery as unsuccessful. Therefore, Alipay+ will retry the notification sending.

  • The interval between two adjacent times is: 2m, 10m, 10m, 1h, 2h, 6h, 15h
  • 7 times - up to 24 hours 22 minutes

Samples

Alipay+ sends a request to the ACQP.

  • Request header:
copy
"Content-Type": "application/json",
"Request-Time": "2019-07-12T12:08:56.253+05:30",
"client-id": "T_111222333",
"Signature": "algorithm=RSA256,keyVersion=1,signature=jTOHqknjk%2fnDjEn8lfg%2beNODdoh2eHGJV%2blvrKaDwP782WxJ7ro49giqUu23MUM8sFVVNvhg32qHS3sd4O6uf5kAVLqztqNOPJFZcjw141EVi1vrs%2bIB4vU0%2fK%2f8z2GyWUByh2lHOWFsp%2b5QKCclXp%2bjacYqWYUur5IVbuebR1LoD5IiJ7u7J9qYriFxodkxmIAJYJyJs7mks2FWHh2YePLj3K%2f4B65"
  • Successful payment notification body:
copy
{
 "acquirerId": "1111088000000000002",
 "pspId":"1022172000000000001",
 "paymentResult": {
    "resultCode":"SUCCESS",
    "resultStatus":"S",
    "resultMessage":"success"
 },
 "paymentRequestId":"pay_1089760038715669_102775745075669", 
 "paymentId":"20200101234567890134567", 
 "paymentTime": "2020-01-01T12:01:01+08:30",
 "paymentAmount":{
    "value":"100",
    "currency":"JPY"
 },
 "customerId":"1235678",
 "walletBrandName":"KAKAOPAY"
}
  • Failed payment notification request body:
copy
{
"acquirerId":"1022165000000000001",
"customerId":"210220900020254424845",
"paymentAmount": {
"currency":"THB",
"value":"565900"
 },
"paymentId":"2021032919074101000220016046283",
"paymentRequestId":"2021032989031300002162325476274",
"paymentResult": {
"resultCode":"PROCESS_FAIL",
"resultMessage":"General business failure. No retry.",
"resultStatus":"F"
 },
"paymentTime":"2021-03-29T11:00:52+08:00",
"pspId":"2021226300000000"
}

The ACQP returns a response to Alipay+.

  • Response header:
copy
"Content-Type": "application/json",
"response-time": "2019-07-12T12:08:56+05:30",
"client-id": "T_111222333",
"Signature": "algorithm=RSA256,keyVersion=1,signature=jTOHqknjk%2fnDjEn8lfg%2beNODdoh2eHGJV%2blvrKaDwP782WxJ7ro49giqUu23MUM8sFVVNvhg32qHS3sd4O6uf5kAVLqztqNOPJFZcjw141EVi1vrs%2bIB4vU0%2fK%2f8z2GyWUByh2lHOWFsp%2b5QKCclXp%2bjacYqWYUur5IVbuebR1LoD5IiJ7u7J9qYriFxodkxmIAJYJyJs7mks2FWHh2YePLj3K%2f4B65"
  • Response body
copy
{
 "result": {
    "resultCode":"SUCCESS",
    "resultStatus":"S",
    "resultMessage":"Success"
 }
}

More information

For more information about how to use the interface (such as the field description), see notifyPayment.