February 9, 2023
Card transactions that are made using a card that is still using outdated 3DS version 1 will be denied immediately on Midtrans when merchants send /charge
API request, to prevent from proceeding it to Card Principal’s network (Visa, MasterCard, JCB, Amex). Midtrans will only proceed normally if the card supports 3DS version 2. With main benefits of improving processing time & efficiency.
As compared to before: Midtrans would still proceed with 3DS version 1 card, even though Principal no longer supports 3DS version 1 (cards that do not support 3DS version 2 will be rejected). This would often result in rejection on the Principal side instead, which is less efficient.
{
"status_code": "402",
"status_message": "Cards with 3DS version 1 or lower are not supported. Please retry with another card that supports the minimum 3DS version 2.",
"id": "dc948e9d-21c1-438d-9e4d-6ee5268b2ac7"
}
August 30, 2022
The allowed maximum time of expiry for GoPay is now adjusted to 7 days.
June 17, 2022
Starting on 22nd July, 2022, we are going to Implement 8 Digit bin.
Note: 8 Digit Bin
With the oncoming mandates from Visa and other principals, Midtrans will start supporting 8-digit BIN's for card transaction processing flows.
The 8-digit bin changes on CoreAPI and will impact the length of token_id and format of saved_token_id.
Changes list:
- Change on token_id length from 48 digit to 50 digit.
Stage | Sample | Length | Description |
---|---|---|---|
Before | 481111-1114-7baba36c-5698-47cf-9170-80efd6a2e973 | 48 | 6 first digit + "-" + 4 last digit + "-" + 36 random digit |
After | 48111111-1114-7baba36c-5698-47cf-9170-80efd6a2e973 | 50 | 8 first digit + "-" + 4 last digit + "-" + 36 random digit |
- Change on saved_token_id format.
Stage | Sample | Length | Description |
---|---|---|---|
Before | 481111sHdcfSakAvHvFQFEjTivUV1114 | 32 | 6 first digit + 22 random digit + 4 last digit |
After | 48111111sHfSakAvHvFQFEjTivUV1114 | 32 | 8 first digit + 20 random digit + 4 last digit |
- Change of masked_card in response body, event, and notification.
Stage | Sample | Length | Description |
---|---|---|---|
Before | 481111-1114 | 11 | 6 first digit + 1 digit delimiter + 4 last digit |
After | 48111111-1114 | 13 | 8 first digit + 1 digit delimiter + 4 last digit |
- Support 8 digit bin in Midtrans Fraud Detection System/Aegis.
- Support 8 digit bin in BIN API.
October 7, 2022
Starting on 7th Oct 2022, all MIGS MID has been migrated to MPGS MID.
Migrate MIGS to MPGS for BCA & BRI except Maybank
In relation to 3DS2.0 mandate from principal, we need to migrate all of existing BCA and BRI MID from MIGS to MPGS because MIGS BCA & BRI only support 3DS 1.0
The MID migration will affect channel_response_code and channel_response_message format.For more MPGS response details, please refer to MPGS Response code
Affected Banks:
Bank | Previous Channel | New Channel |
---|---|---|
BCA | MIGS | MPGS |
BRI | MIGS | MPGS |
if you have any inquiry, please contact [email protected]
December 6, 2022
GoPay Deny Error
Starting in January 2023 there will be an update on Midtrans deny error for GoPay payment channel. The transition phase will start in January upto April 2023, Please ensure that merchant's system can accommodate both behavior (before and after) within this period.
Update on behavior of Midtrans deny errors for GoPay payment channel.
Midtrans will change the behavior of Midtrans deny error for GoPay payment channel - Some of GoPay error will be mapped to Midtrans error (4xx/5xx) - GoPay error that is mapped to 4xx error won’t have HTTP post notification.
{
"Status_code":"202",
"status_message":"GoPay transaction is denied",
"channel_response_code":"201",
"channel_response_message":"insufficient balance"
…
}
{
"status_code":"400",
"status_message":"One or more parameters in the payload is invalid.",
"validation_messages":[
"Gopay.account_id is required"
],
"id":"1a3fef7b-c034-4cf2-98d6-e239594976f3"
}
{
"status_code":"500",
"status_message":"Sorry. Our system is recovering from unexpected issues. Please retry.",
"Id":"6a782ad4-1e18-4df5-b5bd-dbf94ce15ddc"
}
Terms | Definition |
---|---|
Deny error | An error that Midtrans return back to merchant, if Midtrans got rejection from payment provider (status code 202). For this error Merchant can call GET Status API to retrieve payment provider error data |
Channel response code | Error code that Midtrans received from payment provider |
Channel response message | Error message that Midtrans received from payment provider |
4xx error | status code 4xx |
5xx error | status code 5xx |
Change List :
- Update on behaviour for listed GoPay errors below :
GoPay error code | GoPay error message | New status code | New HTTP code | Before | After |
---|---|---|---|---|---|
310 | Malformed data | 400 | 400 | { "Status_code":"202", "status_message":"GoPay transaction is denied", "channel_response_code":"310", "channel_response_message":"Malformed data … } | { "status_code": "400", "status_message": "One or more parameters in the payload is invalid.", "validation_messages": [ "Malformed data" ], "id": "f7f6463e-d46b-4b4e-9027-8d8104ac34c6" } |
2901 | Duplicate transaction | 406 | 200 | { "Status_code":"202", "status_message":"GoPay transaction is denied", "channel_response_code":"2901", "channel_response_message":"Duplicate transaction", … } | { "status_code":"406", "status_message":"The request could not be completed due to a conflict with the current state of the target resource, please try again", "id":"be929ec4-19cb-458b-85e4-43869ada0597" } |
2701 | The currency is not supported for the country | 400 | 400 | { "status_code":"202", "status_message":"GoPay transaction is denied", "channel_response_code":"2701", "channel_response_message":"The currency is not supported for the country", … } | { "status_code": "400", "status_message": "One or more parameters in the payload is invalid.", "validation_messages": [ "The currency is not supported for the country" ], "id": "f7f6463e-d46b-4b4e-9027-8d8104ac34c6" } |
4060 | Fraud validation | 202 | 200 | { "Status_code":"202", "status_message":"GoPay transaction is denied", "channel_response_code":"4060", "channel_response_message":"Fraud validation error", … "fraud_status":"accept" } | { "status_code": "202", "status_message": "GoPay transaction is rejected by FDS", "transaction_id": "171dba71-6d5c-4bb8-8fd7-3ad44fdeb8fb", ... "fraud_status": "deny" } |
303 | Field cannot be blank | 402 | 200 | { "Status_code":"202", "status_message":"GoPay transaction is denied", "channel_response_code":"303", "channel_response_message":"Field cannot be blank" … } | { "status_code":"402", "status_message":"Missing GoPay merchant setting data", "id":"363a8d7f-92d5-4232-9c2d-7e6de2dafa33" } |
112 | User Blocked | 402 | 200 | { "Status_code":"202", "status_message":"GoPay transaction is denied", "channel_response_code":"112", "channel_response_message":"User Blocked" … } | { "status_code":"402", "status_message":"GoPay user is blocked", "id":"363a8d7f-92d5-4232-9c2d-7e6de2dafa33" } |
1703 | Midtrans merchant not active | 400 | 400 | { "Status_code":"202", "status_message":"GoPay transaction is denied", "channel_response_code":"1703", "channel_response_message":"Midtrans merchant not active", … } | { "status_code":"402", "status_message":"GoPay merchant is not active.", "id":"363a8d7f-92d5-4232-9c2d-7e6de2dafa33" } |
153 | The token is invalid for the payment | 400 | 400 | { "status_code":"202","status_message":"GoPay transaction is denied", "channel_response_code":"153", "channel_response_message":"The token is invalid for the payment", … } | { "status_code": "400", "status_message": "One or more parameters in the payload is invalid.", "validation_messages": [ "GoPay token is invalid for the payment" ], "id": "f7f6463e-d46b-4b4e-9027-8d8104ac34c6" } |
5009 | Auth token already expired | 400 | 400 | { "Status_code":"202", "status_message":"GoPay transaction is denied", "channel_response_code":"5009", "channel_response_message":"Auth token already expired", … } | { "status_code": "400", "status_message": "One or more parameters in the payload is invalid.", "validation_messages": [ "GoPay challenge token is already expired" ], "id": "f7f6463e-d46b-4b4e-9027-8d8104ac34c6" } |
110 | Unauthorized | 402 | 200 | { "status_code":"202", "status_message":"GoPay transaction is denied", "channel_response_code":"110", "channel_response_message":"Unauthorized", … } | { "status_code":"402", "status_message":"GoPay merchant is unauthorized.", "id":"363a8d7f-92d5-4232-9c2d-7e6de2dafa33", } |
132 | Transaction in progress | 406 | 200 | { "Status_code":"202", "status_message":"GoPay transaction is denied", "channel_response_code":"132", "channel_response_message":"Transaction in progress", … } | { "status_code":"406", "status_message":"The request could not be completed due to a conflict with the current state of the target resource, please try again", "id":"be929ec4-19cb-458b-85e4-43869ada0597" } |
2903 | Invalid Request | 402 | 200 | { "Status_code":"202", "status_message":"GoPay transaction is denied", "channel_response_code":"2903", "channel_response_message":"Invalid Request", … } | { "status_code":"402", "status_message":"Missing GoPay merchant setting data", "id":"363a8d7f-92d5-4232-9c2d-7e6de2dafa33" } |
902 | Malformed JSON | 413 | 200 | { "Status_code":"202", "status_message":"GoPay transaction is denied", "channel_response_code":"902", "channel_response_message":"Malformed JSON", … } | { "status_code": "413", "status_message": "The request cannot be processed due to malformed syntax in the request body" } |
101 | Wallet not found | 404 | 200 | { "Status_code":"202", "status_message":"GoPay transaction is denied", "channel_response_code":"101", "channel_response_message":"Wallet not found", … } | { "status_code": "404", "status_message": "GoPay Wallet doesn't exist.", "id": "7d17e7e6-4272-42ac-be95-f728a42c6b78" } |
900 | Internal server error | either 500 or 202 | 200 | { "status_code":"202", "status_message":"GoPay transaction is denied", "channel_response_code":"900", "channel_response_message":"Internal server error", … } | 500: { "status_code":"500", "status_message":"Sorry. Our system is recovering from unexpected issues. Please retry.", "id":"6a782ad4-1e18-4df5-b5bd-dbf94ce15ddc" } 202: { "status_code":"202", "status_message":"GoPay transaction is denied", "channel_response_code":"900", "channel_response_message":"Internal server error", "transaction_id":"c4f05215-1044-4740-b1b9-6154a73fc433", "order_id":"893016743", "merchant_id":"G253339736", "gross_amount":"61499.00", "currency":"IDR", "payment_type":"gopay", "transaction_time":"2022-11-22 09:30:29", "transaction_status":"deny","fraud_status":"accept" } |
- GoPay error that is mapped to 4xx error won’t have HTTP post notification.
Expiry Threshold
Starting on January 16th 2023, we will apply minimum and maximum expiry time threshold.
New minimum and maximum expiry time threshold
Midtrans will apply minimum and maximum expiry time threshold on all payment channels. - Transaction with expiry time less than 20 seconds will be rejected. - Transaction with expiry time more than 180 days will be accepted, but expiry time will be trimmed to 180 days*
*except for GoPay transaction. GoPay have maximum expiry time of 7 days
Terms | Definition |
---|---|
Transaction timestamp | Timestamp at which transaction is initiated via Charge API |
Expiry timestamp | Timestamp at which the order will be expired |
Expiry time | Time between transaction timestamp and expiry timestamp |
Change list:
- Added field
expiry_time
on charge response, get status response and notification.expiry_time
field will be returned in API response (charge and status API) and also HTTP notification
{
"transaction_time":"2023-01-16 10:00:00",
"Transaction_status":"pending",
"transaction_id":"ce0a3584-5a0c-4049-ad88-5590a96be4fe",
…
"expiry_time":"2023-07-16 10:00:00"
}
{
"transaction_time": "2023-01-16 10:00:00",
"transaction_status": "pending",
"transaction_id": "ce0a3584-5a0c-4049-ad88-5590a96be4fe",
"status_message": "midtrans payment notification",
…
"expiry_time":"2023-07-16 10:00:00"
}
- Transaction with expiry time less than 20 seconds will be rejected
Sample scenario of Charge API with Custom Expiry object :
a. charge request without order time
If merchant send the sample request (seen on right side) without order_time
at 10:00:30 GMT+7, then the calculated expiry time is 10 seconds, as follow:
order_time
: not specified hence will follow transaction timetransaction_time
: 10:00:30 GMT+7expiry_duration
: 10 seconds- Expiry timestamp: 10:00:40 GMT+7
- Expiry time: 10 seconds
Therefore the transaction will be rejected.
b. charge request with order time
If merchant send the sample request (seen on right side) with order_time at 10:00:30 GMT+7, then the calculated expiry time is 10 seconds, as follow:
order_time
: 10:00:00 GMT+7transaction_time
: 10:00:30 GMT+7expiry_duration
: 40 seconds- Expiry timestamp: 10:00:40 GMT+7
- Expiry time: 10 seconds
Therefore the transaction will be rejected.
"custom_expiry": {
"expiry_duration": 10,
"unit": "second"
}
"custom_expiry": {
"order_time": "2023-01-16 10:00:00 +0700",
"expiry_duration": 40,
"unit": "second"
}
{
"status_code": "400",
"status_message": "One or more parameters in the payload is invalid.",
"id": "1a1a66f7-27a7-4844-ba1f-d86dcc16ab27",
"validation_messages":
[
"custom_expiry is below minimum threshold"
]
}
- Transaction with expiry time more than 180 days will be accepted but expiry time will be trimmed to 180 days (except for GoPay transaction which is 7 days)
Sample scenario of Charge API with Custom Expiry object :
a. charge request without order time
If merchant send the sample request (seen on right side) request at 2023-01-16, then the calculated expiry time is 210 days, as follow:
order_time
: not specified hence will follow transaction timetransaction_time
: 2023-01-16 10:00:00 GMT+7expiry_duration
: 210 days (approx 7 months)- Expiry timestamp withouth trim should be: 2023-08-16 10:00:00 GMT+7
We will trim the expiry time to 180 days with new expiry timestamp: 2023-07:16 10:00:00 GMT+7.
b. charge request with order time
If merchant send the sample request (seen on right side) request at 2023-01-16, then the calculated expiry time is 209 days, as follow:
order_time
: 2023-01-15 10:00:00 GMT+7transaction_time
: 2023-01-16 10:00:00 GMT+7expiry_duration
: 210 days (approx 7 months)- Expiry time: 209 days
- Expiry timestamp withouth trim should be: 2023-08-15 10:00:00 GMT+7
Therefore we will trim the expiry time to 180 days with new expiry timestamp: 2023-07:16 10:00:00 GMT+7.
"custom_expiry": {
"expiry_duration": 210,
"unit": "day"
}
"custom_expiry": {
"order_time": "2023-01-15 10:00:00 +0700",
"expiry_duration": 210,
"unit": "day"
}
{
"transaction_time":"2023-01-16 10:00:00",
"transaction_status":"pending",
"transaction_id":"ce0a3584-5a0c-4049-ad88-5590a96be4fe",
....
"expiry_time":"2023-07-16 10:00:00"
}