Skip to content

Commit 936a291

Browse files
committed
chore: merge with 'main' and resolve conflicts/errors
2 parents 15cb72b + 7391416 commit 936a291

File tree

122 files changed

+4129
-376
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

122 files changed

+4129
-376
lines changed

CHANGELOG.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,38 @@ All notable changes to HyperSwitch will be documented here.
44

55
- - -
66

7+
## 2024.03.11.0
8+
9+
### Features
10+
11+
- **connector:**
12+
- Add threedsecureio three_ds authentication connector ([#4004](https://github.com/juspay/hyperswitch/pull/4004)) ([`06c3096`](https://github.com/juspay/hyperswitch/commit/06c30967cf626e7406aa9be8643fb73288aae383))
13+
- [Checkout] add support for external authentication for checkout connector ([#4006](https://github.com/juspay/hyperswitch/pull/4006)) ([`142a22c`](https://github.com/juspay/hyperswitch/commit/142a22c752a7c623cee62a6d552e6ffda73df777))
14+
- **router:** Add payments authentication api flow ([#3996](https://github.com/juspay/hyperswitch/pull/3996)) ([`41556ba`](https://github.com/juspay/hyperswitch/commit/41556baed98c59373e0a053c023c32f2f7346b51))
15+
16+
**Full Changelog:** [`2024.03.09.0...2024.03.11.0`](https://github.com/juspay/hyperswitch/compare/2024.03.09.0...2024.03.11.0)
17+
18+
- - -
19+
20+
## 2024.03.09.0
21+
22+
### Features
23+
24+
- **core:** Add core functions for external authentication ([#3969](https://github.com/juspay/hyperswitch/pull/3969)) ([`897e264`](https://github.com/juspay/hyperswitch/commit/897e264ad9e26df9877a18eef26a24e05de78528))
25+
- **payment_link:** Add shimmer page before payment_link loads starts ([#4014](https://github.com/juspay/hyperswitch/pull/4014)) ([`ba9d465`](https://github.com/juspay/hyperswitch/commit/ba9d465483edcefeacc7ace0fc8efc86ca0f813c))
26+
27+
### Bug Fixes
28+
29+
- **deserialization:** Error message is different when invalid data is passed for payment method data ([#4022](https://github.com/juspay/hyperswitch/pull/4022)) ([`f1fe295`](https://github.com/juspay/hyperswitch/commit/f1fe295475adb0e827bd713be036687da662b361))
30+
31+
### Miscellaneous Tasks
32+
33+
- **postman:** Update Postman collection files ([`a7d0487`](https://github.com/juspay/hyperswitch/commit/a7d04873d63c1f007d0081f02ba9a373e24ae882))
34+
35+
**Full Changelog:** [`2024.03.08.0...2024.03.09.0`](https://github.com/juspay/hyperswitch/compare/2024.03.08.0...2024.03.09.0)
36+
37+
- - -
38+
739
## 2024.03.08.0
840

941
### Features

Cargo.lock

Lines changed: 46 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/config.example.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ square.base_url = "https://connect.squareupsandbox.com/"
216216
square.secondary_base_url = "https://pci-connect.squareupsandbox.com/"
217217
stax.base_url = "https://apiprod.fattlabs.com/"
218218
stripe.base_url = "https://api.stripe.com/"
219+
threedsecureio.base_url = "https://service.sandbox.3dsecure.io"
219220
stripe.base_url_file_upload = "https://files.stripe.com/"
220221
trustpay.base_url = "https://test-tpgw.trustpay.eu/"
221222
trustpay.base_url_bank_redirects = "https://aapi.trustpay.eu/"
@@ -273,6 +274,7 @@ cards = [
273274
"square",
274275
"stax",
275276
"stripe",
277+
"threedsecureio",
276278
"worldpay",
277279
"zen",
278280
]

config/development.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ cards = [
133133
"square",
134134
"stax",
135135
"stripe",
136+
"threedsecureio",
136137
"trustpay",
137138
"tsys",
138139
"volt",
@@ -210,6 +211,7 @@ square.base_url = "https://connect.squareupsandbox.com/"
210211
square.secondary_base_url = "https://pci-connect.squareupsandbox.com/"
211212
stax.base_url = "https://apiprod.fattlabs.com/"
212213
stripe.base_url = "https://api.stripe.com/"
214+
threedsecureio.base_url = "https://service.sandbox.3dsecure.io"
213215
stripe.base_url_file_upload = "https://files.stripe.com/"
214216
wise.base_url = "https://api.sandbox.transferwise.tech/"
215217
worldline.base_url = "https://eu.sandbox.api-ingenico.com/"

config/docker_compose.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ square.base_url = "https://connect.squareupsandbox.com/"
150150
square.secondary_base_url = "https://pci-connect.squareupsandbox.com/"
151151
stax.base_url = "https://apiprod.fattlabs.com/"
152152
stripe.base_url = "https://api.stripe.com/"
153+
threedsecureio.base_url = "https://service.sandbox.3dsecure.io"
153154
stripe.base_url_file_upload = "https://files.stripe.com/"
154155
trustpay.base_url = "https://test-tpgw.trustpay.eu/"
155156
trustpay.base_url_bank_redirects = "https://aapi.trustpay.eu/"
@@ -211,6 +212,7 @@ cards = [
211212
"square",
212213
"stax",
213214
"stripe",
215+
"threedsecureio",
214216
"trustpay",
215217
"tsys",
216218
"volt",

crates/api_models/src/enums.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ pub enum Connector {
116116
Square,
117117
Stax,
118118
Stripe,
119+
Threedsecureio,
119120
Trustpay,
120121
// Tsys,
121122
Tsys,

crates/api_models/src/payments.rs

Lines changed: 86 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1095,12 +1095,19 @@ mod payment_method_data_serde {
10951095
#[serde(untagged)]
10961096
enum __Inner {
10971097
RewardString(String),
1098-
OptionalPaymentMethod(Box<PaymentMethodDataRequest>),
1098+
OptionalPaymentMethod(serde_json::Value),
10991099
}
11001100

11011101
let deserialize_to_inner = __Inner::deserialize(deserializer)?;
11021102
match deserialize_to_inner {
1103-
__Inner::OptionalPaymentMethod(value) => Ok(Some(*value)),
1103+
__Inner::OptionalPaymentMethod(value) => {
1104+
let parsed_value = serde_json::from_value::<PaymentMethodDataRequest>(value)
1105+
.map_err(|serde_json_error| {
1106+
serde::de::Error::custom(serde_json_error.to_string())
1107+
})?;
1108+
1109+
Ok(Some(parsed_value))
1110+
}
11041111
__Inner::RewardString(inner_string) => {
11051112
let payment_method_data = match inner_string.as_str() {
11061113
"reward" => PaymentMethodData::Reward,
@@ -2710,6 +2717,13 @@ pub struct PaymentsResponse {
27102717

27112718
/// Payment Fingerprint
27122719
pub fingerprint: Option<String>,
2720+
2721+
/// Payment Method Id
2722+
pub payment_method_id: Option<String>,
2723+
2724+
/// Payment Method Status
2725+
#[schema(value_type = Option<PaymentMethodStatus>)]
2726+
pub payment_method_status: Option<common_enums::PaymentMethodStatus>,
27132727
}
27142728

27152729
#[derive(Setter, Clone, Default, Debug, PartialEq, serde::Serialize, ToSchema)]
@@ -4048,3 +4062,73 @@ pub enum PaymentLinkStatusWrap {
40484062
PaymentLinkStatus(PaymentLinkStatus),
40494063
IntentStatus(api_enums::IntentStatus),
40504064
}
4065+
4066+
#[cfg(test)]
4067+
mod payments_request_api_contract {
4068+
#![allow(clippy::unwrap_used)]
4069+
#![allow(clippy::panic)]
4070+
use std::str::FromStr;
4071+
4072+
use super::*;
4073+
4074+
#[test]
4075+
fn test_successful_card_deser() {
4076+
let payments_request = r#"
4077+
{
4078+
"amount": 6540,
4079+
"currency": "USD",
4080+
"payment_method": "card",
4081+
"payment_method_data": {
4082+
"card": {
4083+
"card_number": "4242424242424242",
4084+
"card_exp_month": "10",
4085+
"card_exp_year": "25",
4086+
"card_holder_name": "joseph Doe",
4087+
"card_cvc": "123"
4088+
}
4089+
}
4090+
}
4091+
"#;
4092+
4093+
let expected_card_number_string = "4242424242424242";
4094+
let expected_card_number = CardNumber::from_str(expected_card_number_string).unwrap();
4095+
4096+
let payments_request = serde_json::from_str::<PaymentsRequest>(payments_request);
4097+
assert!(payments_request.is_ok());
4098+
4099+
if let PaymentMethodData::Card(card_data) = payments_request
4100+
.unwrap()
4101+
.payment_method_data
4102+
.unwrap()
4103+
.payment_method_data
4104+
{
4105+
assert_eq!(card_data.card_number, expected_card_number);
4106+
} else {
4107+
panic!("Received unexpected response")
4108+
}
4109+
}
4110+
4111+
#[test]
4112+
fn test_successful_payment_method_reward() {
4113+
let payments_request = r#"
4114+
{
4115+
"amount": 6540,
4116+
"currency": "USD",
4117+
"payment_method": "reward",
4118+
"payment_method_data": "reward",
4119+
"payment_method_type": "evoucher"
4120+
}
4121+
"#;
4122+
4123+
let payments_request = serde_json::from_str::<PaymentsRequest>(payments_request);
4124+
assert!(payments_request.is_ok());
4125+
assert_eq!(
4126+
payments_request
4127+
.unwrap()
4128+
.payment_method_data
4129+
.unwrap()
4130+
.payment_method_data,
4131+
PaymentMethodData::Reward
4132+
);
4133+
}
4134+
}

crates/cards/src/validate.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,15 @@ impl FromStr for CardNumber {
5252

5353
fn from_str(s: &str) -> Result<Self, Self::Err> {
5454
// Valid test cards for threedsecureio
55-
let valid_test_cards = ["4000100511112003", "6000100611111203", "3000100811111072"];
55+
let valid_test_cards = match router_env::which() {
56+
router_env::Env::Development | router_env::Env::Sandbox => vec![
57+
"4000100511112003",
58+
"6000100611111203",
59+
"3000100811111072",
60+
"9000100111111111",
61+
],
62+
router_env::Env::Production => vec![],
63+
};
5664
if luhn::valid(s) || valid_test_cards.contains(&s) {
5765
let cc_no_whitespace: String = s.split_whitespace().collect();
5866
Ok(Self(StrongSecret::from_str(&cc_no_whitespace)?))

crates/common_enums/src/enums.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1205,6 +1205,36 @@ pub enum PaymentMethodStatus {
12051205
Processing,
12061206
}
12071207

1208+
impl From<AttemptStatus> for PaymentMethodStatus {
1209+
fn from(attempt_status: AttemptStatus) -> Self {
1210+
match attempt_status {
1211+
AttemptStatus::Charged | AttemptStatus::Authorized => Self::Active,
1212+
AttemptStatus::Failure => Self::Inactive,
1213+
AttemptStatus::Voided
1214+
| AttemptStatus::Started
1215+
| AttemptStatus::Pending
1216+
| AttemptStatus::Unresolved
1217+
| AttemptStatus::CodInitiated
1218+
| AttemptStatus::Authorizing
1219+
| AttemptStatus::VoidInitiated
1220+
| AttemptStatus::AuthorizationFailed
1221+
| AttemptStatus::RouterDeclined
1222+
| AttemptStatus::AuthenticationSuccessful
1223+
| AttemptStatus::PaymentMethodAwaited
1224+
| AttemptStatus::AuthenticationFailed
1225+
| AttemptStatus::AuthenticationPending
1226+
| AttemptStatus::CaptureInitiated
1227+
| AttemptStatus::CaptureFailed
1228+
| AttemptStatus::VoidFailed
1229+
| AttemptStatus::AutoRefunded
1230+
| AttemptStatus::PartialCharged
1231+
| AttemptStatus::PartialChargedAndChargeable
1232+
| AttemptStatus::ConfirmationAwaited
1233+
| AttemptStatus::DeviceDataCollectionPending => Self::Processing,
1234+
}
1235+
}
1236+
}
1237+
12081238
/// To indicate the type of payment experience that the customer would go through
12091239
#[derive(
12101240
Eq,

0 commit comments

Comments
 (0)