Deployment Notice

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:

  1. Change on token_id length from 48 digit to 50 digit.
StageSampleLengthDescription
Before481111-1114-7baba36c-5698-47cf-9170-80efd6a2e973486 first digit + "-" + 4 last digit + "-" + 36 random digit
After48111111-1114-7baba36c-5698-47cf-9170-80efd6a2e973508 first digit + "-" + 4 last digit + "-" + 36 random digit
  1. Change on saved_token_id format.
StageSampleLengthDescription
Before481111sHdcfSakAvHvFQFEjTivUV1114326 first digit + 22 random digit + 4 last digit
After48111111sHfSakAvHvFQFEjTivUV1114328 first digit + 20 random digit + 4 last digit
  1. Change of masked_card in response body, event, and notification.
StageSampleLengthDescription
Before481111-1114116 first digit + 1 digit delimiter + 4 last digit
After48111111-1114138 first digit + 1 digit delimiter + 4 last digit
  1. Support 8 digit bin in Midtrans Fraud Detection System/Aegis.
  2. 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:


BankPrevious ChannelNew Channel
BCAMIGSMPGS
BRIMIGSMPGS

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"
}
TermsDefinition
Deny errorAn 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 codeError code that Midtrans received from payment provider
Channel response messageError message that Midtrans received from payment provider
4xx errorstatus code 4xx
5xx errorstatus code 5xx

Change List :


  1. Update on behaviour for listed GoPay errors below :
GoPay error codeGoPay error messageNew status codeNew HTTP codeBeforeAfter
310Malformed data400400{
"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"
}
2901Duplicate transaction406200{
"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"
}
2701The currency is not supported for the country400400{
"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"
}
4060Fraud validation202200{
"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"
}
303Field cannot be blank402200{
"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"
}
112User Blocked402200{
"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"
}
1703Midtrans merchant not active400400{
"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"
}
153The token is invalid for the payment400400{
"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"
}
5009Auth token already expired400400{
"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"
}
110Unauthorized402200{
"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",

}
132Transaction in progress406200{
"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"

}
2903Invalid Request402200{
"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"
}
902Malformed JSON413200{
"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"
}
101Wallet not found404200{
"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"
}
900Internal server erroreither 500 or 202200{
"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"
}

  1. 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


TermsDefinition
Transaction timestampTimestamp at which transaction is initiated via Charge API
Expiry timestampTimestamp at which the order will be expired
Expiry timeTime between transaction timestamp and expiry timestamp

Change list:


  1. 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"
}

  1. 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 time
  • transaction_time: 10:00:30 GMT+7
  • expiry_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+7
  • transaction_time: 10:00:30 GMT+7
  • expiry_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"
        ]
}

  1. 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 time
  • transaction_time: 2023-01-16 10:00:00 GMT+7
  • expiry_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+7
  • transaction_time: 2023-01-16 10:00:00 GMT+7
  • expiry_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" 
}