Skip to content

Commit 341163b

Browse files
authored
feat(connector): [payme] Add support for dispute webhooks (#2089)
1 parent 4d3e6bc commit 341163b

File tree

2 files changed

+40
-17
lines changed

2 files changed

+40
-17
lines changed

crates/router/src/connector/payme.rs

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -992,23 +992,21 @@ impl api::IncomingWebhook for Payme {
992992
let id = match resource.notify_type {
993993
transformers::NotifyType::SaleComplete
994994
| transformers::NotifyType::SaleAuthorized
995-
| transformers::NotifyType::SaleFailure => {
996-
Ok(api::webhooks::ObjectReferenceId::PaymentId(
995+
| transformers::NotifyType::SaleFailure
996+
| transformers::NotifyType::SaleChargeback
997+
| transformers::NotifyType::SaleChargebackRefund => {
998+
api::webhooks::ObjectReferenceId::PaymentId(
997999
api_models::payments::PaymentIdType::ConnectorTransactionId(
9981000
resource.payme_sale_id,
9991001
),
1000-
))
1002+
)
10011003
}
1002-
transformers::NotifyType::Refund => Ok(api::webhooks::ObjectReferenceId::RefundId(
1004+
transformers::NotifyType::Refund => api::webhooks::ObjectReferenceId::RefundId(
10031005
api_models::webhooks::RefundIdType::ConnectorRefundId(
10041006
resource.payme_transaction_id,
10051007
),
1006-
)),
1007-
transformers::NotifyType::SaleChargeback
1008-
| transformers::NotifyType::SaleChargebackRefund => {
1009-
Err(errors::ConnectorError::WebhookEventTypeNotFound)
1010-
}
1011-
}?;
1008+
),
1009+
};
10121010
Ok(id)
10131011
}
10141012

@@ -1046,11 +1044,34 @@ impl api::IncomingWebhook for Payme {
10461044
.change_context(errors::ConnectorError::WebhookBodyDecodingFailed)
10471045
}
10481046
transformers::NotifyType::SaleChargeback
1049-
| transformers::NotifyType::SaleChargebackRefund => {
1050-
Err(errors::ConnectorError::WebhookEventTypeNotFound).into_report()
1051-
}
1047+
| transformers::NotifyType::SaleChargebackRefund => serde_json::to_value(resource)
1048+
.into_report()
1049+
.change_context(errors::ConnectorError::WebhookBodyDecodingFailed),
10521050
}?;
10531051

10541052
Ok(res_json)
10551053
}
1054+
1055+
fn get_dispute_details(
1056+
&self,
1057+
request: &api::IncomingWebhookRequestDetails<'_>,
1058+
) -> CustomResult<api::disputes::DisputePayload, errors::ConnectorError> {
1059+
let webhook_object =
1060+
serde_urlencoded::from_bytes::<payme::WebhookEventDataResource>(request.body)
1061+
.into_report()
1062+
.change_context(errors::ConnectorError::WebhookBodyDecodingFailed)?;
1063+
1064+
Ok(api::disputes::DisputePayload {
1065+
amount: webhook_object.price.to_string(),
1066+
currency: webhook_object.currency.to_string(),
1067+
dispute_stage: api_models::enums::DisputeStage::Dispute,
1068+
connector_dispute_id: webhook_object.payme_transaction_id,
1069+
connector_reason: None,
1070+
connector_reason_code: None,
1071+
challenge_required_by: None,
1072+
connector_status: webhook_object.sale_status.to_string(),
1073+
created_at: None,
1074+
updated_at: None,
1075+
})
1076+
}
10561077
}

crates/router/src/connector/payme/transformers.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -760,7 +760,7 @@ impl TryFrom<&types::PaymentsPreProcessingRouterData> for SaleType {
760760
}
761761
}
762762

763-
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
763+
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, strum::Display)]
764764
#[serde(rename_all = "kebab-case")]
765765
pub enum SaleStatus {
766766
Initial,
@@ -1013,6 +1013,8 @@ pub struct WebhookEventDataResource {
10131013
pub payme_transaction_id: String,
10141014
pub status_error_details: Option<String>,
10151015
pub status_error_code: Option<u32>,
1016+
pub price: i64,
1017+
pub currency: enums::Currency,
10161018
}
10171019

10181020
#[derive(Debug, Deserialize)]
@@ -1058,9 +1060,9 @@ impl From<NotifyType> for api::IncomingWebhookEvent {
10581060
NotifyType::SaleComplete => Self::PaymentIntentSuccess,
10591061
NotifyType::Refund => Self::RefundSuccess,
10601062
NotifyType::SaleFailure => Self::PaymentIntentFailure,
1061-
NotifyType::SaleAuthorized
1062-
| NotifyType::SaleChargeback
1063-
| NotifyType::SaleChargebackRefund => Self::EventNotSupported,
1063+
NotifyType::SaleChargeback => Self::DisputeOpened,
1064+
NotifyType::SaleChargebackRefund => Self::DisputeWon,
1065+
NotifyType::SaleAuthorized => Self::EventNotSupported,
10641066
}
10651067
}
10661068
}

0 commit comments

Comments
 (0)