hyperswitch
hyperswitch copied to clipboard
refactor(connector): [Multisafepay] handle authorize and psync 2xx failure error response
payment failure
Type of Change
- [x] Bugfix
- [ ] New feature
- [ ] Enhancement
- [ ] Refactoring
- [ ] Dependency updates
- [ ] Documentation
- [ ] CI/CD
Description
We don't capture the error code and error message sent by Multisafepay in case of 2xx error response. In this PR we are capturing error details, if it is sent by the connector.
Test Case
- Create a failed payment with Multisafepay
curl --location 'http://localhost:8080/payments' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'api-key: {{}}' \
--data-raw '{
"amount": 6540,
"currency": "USD",
"confirm": true,
"capture_method": "automatic",
"capture_on": "2022-09-10T10:11:12Z",
"customer_id": "StripeCustomer",
"email": "[email protected]",
"name": "John Doe",
"phone": "999999999",
"phone_country_code": "+65",
"description": "Its my first payment request",
"authentication_type": "no_three_ds",
"return_url": "https://google.com",
"billing": {
"address": {
"line1": "1467",
"line2": "Harrison Street",
"line3": "Harrison Street",
"city": "San Fransico",
"state": "California",
"zip": "94122",
"country": "US",
"first_name": "John",
"last_name": "Doe"
}
},
"browser_info": {
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36",
"accept_header": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"language": "nl-NL",
"color_depth": 24,
"screen_height": 723,
"screen_width": 1536,
"time_zone": 0,
"java_enabled": true,
"java_script_enabled": true,
"ip_address": "127.0.0.1"
},
"shipping": {
"address": {
"line1": "1467",
"line2": "Harrison Street",
"line3": "Harrison Street",
"city": "San Fransico",
"state": "California",
"zip": "94122",
"country": "US",
"first_name": "John",
"last_name": "Doe"
}
},
"statement_descriptor_name": "joseph",
"statement_descriptor_suffix": "JS",
"metadata": {
"udf1": "value1",
"new_customer": "true",
"login_date": "2019-09-10T10:11:12Z"
},
"payment_method": "card",
"payment_method_data": {
"card": {
"card_number": "374200000000004",
"card_exp_month": "10",
"card_exp_year": "25",
"card_holder_name": "Joseph Doe",
"card_cvc": "1235"
}
}
}'
Response
{
"payment_id": "pay_Uav7HwjchG8t6nPCaUGU",
"merchant_id": "merchant_1710833493",
"status": "failed",
"amount": 6540,
"net_amount": 6540,
"amount_capturable": 0,
"amount_received": null,
"connector": "multisafepay",
"client_secret": "pay_Uav7HwjchG8t6nPCaUGU_secret_qD58piwmNxQ8Nuynl7t3",
"created": "2024-03-19T07:57:44.522Z",
"currency": "USD",
"customer_id": "StripeCustomer",
"description": "Its my first payment request",
"refunds": null,
"disputes": null,
"mandate_id": null,
"mandate_data": null,
"setup_future_usage": null,
"off_session": null,
"capture_on": null,
"capture_method": "automatic",
"payment_method": "card",
"payment_method_data": {
"card": {
"last4": "0004",
"card_type": null,
"card_network": null,
"card_issuer": null,
"card_issuing_country": null,
"card_isin": "374200",
"card_extended_bin": "37420000",
"card_exp_month": "10",
"card_exp_year": "25",
"card_holder_name": "Joseph Doe"
},
"billing": null
},
"payment_token": null,
"shipping": {
"address": {
"city": "San Fransico",
"country": "US",
"line1": "1467",
"line2": "Harrison Street",
"line3": "Harrison Street",
"zip": "94122",
"state": "California",
"first_name": "John",
"last_name": "Doe"
},
"phone": null,
"email": null
},
"billing": {
"address": {
"city": "San Fransico",
"country": "US",
"line1": "1467",
"line2": "Harrison Street",
"line3": "Harrison Street",
"zip": "94122",
"state": "California",
"first_name": "John",
"last_name": "Doe"
},
"phone": null,
"email": null
},
"order_details": null,
"email": "[email protected]",
"name": "John Doe",
"phone": "999999999",
"return_url": "https://google.com/",
"authentication_type": "no_three_ds",
"statement_descriptor_name": "joseph",
"statement_descriptor_suffix": "JS",
"next_action": null,
"cancellation_reason": null,
"error_code": "1024",
"error_message": "declined",
"unified_code": null,
"unified_message": null,
"payment_experience": null,
"payment_method_type": null,
"connector_label": null,
"business_country": null,
"business_label": "default",
"business_sub_label": null,
"allowed_payment_method_types": null,
"ephemeral_key": {
"customer_id": "StripeCustomer",
"created_at": 1710835064,
"expires": 1710838664,
"secret": "epk_94c61af5c6d7410a90704accda162a40"
},
"manual_retry_allowed": true,
"connector_transaction_id": null,
"frm_message": null,
"metadata": {
"udf1": "value1",
"login_date": "2019-09-10T10:11:12Z",
"new_customer": "true"
},
"connector_metadata": null,
"feature_metadata": null,
"reference_id": null,
"payment_link": null,
"profile_id": "pro_HuKc2nIVVnMi5v4fxqh8",
"surcharge_details": null,
"attempt_count": 1,
"merchant_decision": null,
"merchant_connector_id": "mca_jRZEMqxrZ8YPXIq08AED",
"incremental_authorization_allowed": false,
"authorization_count": null,
"incremental_authorizations": null,
"external_authentication_details": null,
"external_3ds_authentication_attempted": false,
"expires_on": "2024-03-19T08:12:44.522Z",
"fingerprint": null,
"payment_method_id": null,
"payment_method_status": null
}
Note: If connector does not sent error code or error message, we don't populate it
- Create a payment with card number
4462000000000003. Response status must beprocessing
{
"payment_id": "pay_wJxM4q0uCYj9wqyjhyps",
"merchant_id": "merchant_1710833493",
"status": "processing",
"amount": 6540,
"net_amount": 6540,
"amount_capturable": 0,
"amount_received": null,
"connector": "multisafepay",
"client_secret": "pay_wJxM4q0uCYj9wqyjhyps_secret_pz7xV39nfrVdS6mUra1V",
"created": "2024-03-19T08:06:35.128Z",
"currency": "USD",
"customer_id": "StripeCustomer",
"description": "Its my first payment request",
"refunds": null,
"disputes": null,
"mandate_id": null,
"mandate_data": null,
"setup_future_usage": null,
"off_session": null,
"capture_on": null,
"capture_method": "automatic",
"payment_method": "card",
"payment_method_data": {
"card": {
"last4": "0003",
"card_type": null,
"card_network": null,
"card_issuer": null,
"card_issuing_country": null,
"card_isin": "446200",
"card_extended_bin": "44620000",
"card_exp_month": "10",
"card_exp_year": "25",
"card_holder_name": "Joseph Doe"
},
"billing": null
},
"payment_token": null,
"shipping": {
"address": {
"city": "San Fransico",
"country": "US",
"line1": "1467",
"line2": "Harrison Street",
"line3": "Harrison Street",
"zip": "94122",
"state": "California",
"first_name": "John",
"last_name": "Doe"
},
"phone": null,
"email": null
},
"billing": {
"address": {
"city": "San Fransico",
"country": "US",
"line1": "1467",
"line2": "Harrison Street",
"line3": "Harrison Street",
"zip": "94122",
"state": "California",
"first_name": "John",
"last_name": "Doe"
},
"phone": null,
"email": null
},
"order_details": null,
"email": "[email protected]",
"name": "John Doe",
"phone": "999999999",
"return_url": "https://google.com/",
"authentication_type": "no_three_ds",
"statement_descriptor_name": "joseph",
"statement_descriptor_suffix": "JS",
"next_action": null,
"cancellation_reason": null,
"error_code": null,
"error_message": null,
"unified_code": null,
"unified_message": null,
"payment_experience": null,
"payment_method_type": null,
"connector_label": null,
"business_country": null,
"business_label": "default",
"business_sub_label": null,
"allowed_payment_method_types": null,
"ephemeral_key": {
"customer_id": "StripeCustomer",
"created_at": 1710835595,
"expires": 1710839195,
"secret": "epk_d1fd20a627eb47fb83ae5361e148b4eb"
},
"manual_retry_allowed": false,
"connector_transaction_id": "pay_wJxM4q0uCYj9wqyjhyps_1",
"frm_message": null,
"metadata": {
"udf1": "value1",
"login_date": "2019-09-10T10:11:12Z",
"new_customer": "true"
},
"connector_metadata": null,
"feature_metadata": null,
"reference_id": "pay_wJxM4q0uCYj9wqyjhyps_1",
"payment_link": null,
"profile_id": "pro_HuKc2nIVVnMi5v4fxqh8",
"surcharge_details": null,
"attempt_count": 1,
"merchant_decision": null,
"merchant_connector_id": "mca_jRZEMqxrZ8YPXIq08AED",
"incremental_authorization_allowed": null,
"authorization_count": null,
"incremental_authorizations": null,
"external_authentication_details": null,
"external_3ds_authentication_attempted": false,
"expires_on": "2024-03-19T08:21:35.128Z",
"fingerprint": null,
"payment_method_id": null,
"payment_method_status": null
}
- Create failed threeDs payment, card number:
4012001038488884. Then do a Psync
curl --location 'http://localhost:8080/payments/{{paymentId}}?expand_captures=true' \
--header 'Accept: application/json' \
--header 'api-key: {{}}'
Response
{
"payment_id": "pay_Zu5pZDWAb8LPCoejkOvA",
"merchant_id": "merchant_1710833493",
"status": "failed",
"amount": 6540,
"net_amount": 6540,
"amount_capturable": 0,
"amount_received": null,
"connector": "multisafepay",
"client_secret": "pay_Zu5pZDWAb8LPCoejkOvA_secret_mbelOS267MGlNRiUWbRv",
"created": "2024-03-19T08:09:27.507Z",
"currency": "USD",
"customer_id": "StripeCustomer",
"description": "Its my first payment request",
"refunds": null,
"disputes": null,
"mandate_id": null,
"mandate_data": null,
"setup_future_usage": null,
"off_session": null,
"capture_on": null,
"capture_method": "automatic",
"payment_method": "card",
"payment_method_data": {
"card": {
"last4": "8884",
"card_type": null,
"card_network": null,
"card_issuer": null,
"card_issuing_country": null,
"card_isin": "401200",
"card_extended_bin": "40120010",
"card_exp_month": "10",
"card_exp_year": "25",
"card_holder_name": "Joseph Doe"
},
"billing": null
},
"payment_token": null,
"shipping": {
"address": {
"city": "San Fransico",
"country": "US",
"line1": "1467",
"line2": "Harrison Street",
"line3": "Harrison Street",
"zip": "94122",
"state": "California",
"first_name": "John",
"last_name": "Doe"
},
"phone": null,
"email": null
},
"billing": {
"address": {
"city": "San Fransico",
"country": "US",
"line1": "1467",
"line2": "Harrison Street",
"line3": "Harrison Street",
"zip": "94122",
"state": "California",
"first_name": "John",
"last_name": "Doe"
},
"phone": null,
"email": null
},
"order_details": null,
"email": "[email protected]",
"name": "John Doe",
"phone": "999999999",
"return_url": "https://google.com/",
"authentication_type": "no_three_ds",
"statement_descriptor_name": "joseph",
"statement_descriptor_suffix": "JS",
"next_action": null,
"cancellation_reason": null,
"error_code": "4002",
"error_message": "Insufficient funds",
"unified_code": null,
"unified_message": null,
"payment_experience": null,
"payment_method_type": null,
"connector_label": null,
"business_country": null,
"business_label": "default",
"business_sub_label": null,
"allowed_payment_method_types": null,
"ephemeral_key": null,
"manual_retry_allowed": true,
"connector_transaction_id": "pay_Zu5pZDWAb8LPCoejkOvA_1",
"frm_message": null,
"metadata": {
"udf1": "value1",
"login_date": "2019-09-10T10:11:12Z",
"new_customer": "true"
},
"connector_metadata": null,
"feature_metadata": null,
"reference_id": "pay_Zu5pZDWAb8LPCoejkOvA_1",
"payment_link": null,
"profile_id": "pro_HuKc2nIVVnMi5v4fxqh8",
"surcharge_details": null,
"attempt_count": 1,
"merchant_decision": null,
"merchant_connector_id": "mca_jRZEMqxrZ8YPXIq08AED",
"incremental_authorization_allowed": false,
"authorization_count": null,
"incremental_authorizations": null,
"external_authentication_details": null,
"external_3ds_authentication_attempted": false,
"expires_on": "2024-03-19T08:24:27.507Z",
"fingerprint": null,
"payment_method_id": null,
"payment_method_status": null
}
Checklist
- [x] I formatted the code
cargo +nightly fmt --all - [x] I addressed lints thrown by
cargo clippy - [x] I reviewed the submitted code
- [ ] I added unit tests for my changes where possible
- [ ] I added a CHANGELOG entry if applicable