feat(connector): [JPMORGAN ORBITAL] add JP Morgan Orbital connector with Card Authorize (3DS + non-3DS) - #2187
Open
shuklatushar226 wants to merge 5 commits into
Open
feat(connector): [JPMORGAN ORBITAL] add JP Morgan Orbital connector with Card Authorize (3DS + non-3DS)#2187shuklatushar226 wants to merge 5 commits into
shuklatushar226 wants to merge 5 commits into
Conversation
…ith Card Authorize (3DS + non-3DS) Adds the `jpmorganorbital` connector (ConnectorEnum::JpmorganOrbital, display name "JP Morgan Orbital") implementing Card Authorize for non-3DS and external-3DS passthrough, plus PSync. This is the JPMorgan Orbital Gateway JSON API v4 (orbitalvar1.chasepaymentech.com/gwapi/v4/gateway), a different product from the existing `jpmorgan` connector (Payments API v2, api-ms.payments.jpmorgan.com). The existing `jpmorgan` connector is untouched. The naming mirrors the existing worldpay / worldpayvantiv sibling-suffix convention. Notable details: - order.amount uses two implied decimals for every currency including zero-exponent ones, so JPY 100 is sent as "10000". Currency is never sent; it is implied by the MID. - Mastercard ECI scale inversion: UCS ECI "02" maps to Orbital authenticationECIInd "5" (Orbital's MC scale is 5/6/7), not "2". - order.retryTrace is both the idempotency key and the PSync lookup key. It is numeric and <=16 chars, so it is derived deterministically (FNV-1a/64 folded into [1e15,1e16)) and also persisted to connector_metadata. - txRefIdx is persisted alongside txRefNum for future Capture/Void. - procStatus / respCode / avsRespCode / cvvRespCode are treated as opaque strings; no enum was invented. Scope: card one-time payments only. Mandates/MIT, wallets, bank transfers and BNPL are out of scope.
Auto-applied by CI: - cargo +nightly fmt --all - make -C sdk generate (if applicable) - make docs (if applicable) This commit was automatically generated by GitHub Actions.
Resolves the payment.proto conflict in ConnectorSpecificConfig: main claimed Connector enum 140 and oneof field 150 for GOTYME_SANLAM, so JP Morgan Orbital is renumbered to JPMORGAN_ORBITAL = 141 / jpmorgan_orbital = 151.
…ecs coverage
- clippy: use `len().is_multiple_of(4)` instead of `len() % 4 == 0` in the
base64 shape check (manual_is_multiple_of, denied under -D warnings).
- typos: rename the Rust field `retry_attemp_count` -> `retry_attempt_count`
and the `connector_metadata` JSON key `retry_attemp_count` ->
`retry_attempt_count`. Both are ours, so the rename is safe. The wire field
name stays `retryAttempCount` -- that is JPMorgan Orbital's own misspelling
in the Orbital Gateway JSON API and correcting it would break response
deserialization -- so it is allowlisted in .typos.toml instead. Also
reworded a doc comment ("mis-mapping" -> "mismapping").
NOTE: this changes the key persisted in `connector_metadata` from
"retry_attemp_count" to "retry_attempt_count".
- specs: add crates/internal/integration-tests/src/connector_specs/
jpmorganorbital/specs.json declaring only what the connector supports
(PaymentService/Authorize and PaymentService/Get). This restores
connector-list parity (108 integrations / 108 spec dirs) in
check_connector_specs.
- merge fallout: populate the new `payment_account_reference` field on both
`PaymentsResponseData::TransactionResponse` initializers.
Brings in the CI auto-fix commit (fmt + generated SDK/docs/examples). Resolves the generated _generated_grpc_client.ts ConnectorSpecificConfig map to carry both gotymeSanlam (from main) and jpmorganOrbital.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds a new connector
jpmorganorbital/ConnectorEnum::JpmorganOrbital/ display name "JP Morgan Orbital", implementing Card Authorize (non-3DS and 3DS) plus PSync.This is the JPMorgan Orbital Gateway JSON API v4 (
orbitalvar1.chasepaymentech.com/gwapi/v4/gateway) — a different product from the existingjpmorganconnector (Payments API v2,api-ms.payments.jpmorgan.com). The existingjpmorganconnector is untouched. The naming mirrors the existingworldpay/worldpayvantivsibling-suffix convention.Scope
Card one-time payments only. Out of scope for this PR: mandates / MIT / recurring, wallets, bank transfers, bank debits, and BNPL.
3DS model
Orbital is external-3DS passthrough only. There is no Orbital-hosted challenge, no ACS redirect, and no redirect URL in the response. Authorize is a single synchronous call for both non-3DS and 3DS; externally-produced authentication data is mapped onto the Orbital
cryptogramandadditionalAuthInfoobjects. NoRedirectFormflow exists.Auth
Three plain HTTP headers —
orbitalConnectionUsername,orbitalConnectionPassword,merchantID— plusmerchant.binandmerchant.terminalIDin the body, supplied viaConnectorSpecificConfig::JpmorganOrbital.Notable correctness details
These are non-obvious and worth reviewer attention:
order.amountuses two implied decimals for EVERY currency, including zero-exponent ones. ¥100 is sent as10000, not100. A plainStringMinorUnitwould have been a 100x under-charge for JPY/KRW. Currency is never sent — it is implied by the MID.02maps to OrbitalauthenticationECIInd5, not2(Orbital's Mastercard scale is 5/6/7). Sending2would be read by Orbital as "recurring CDPT".order.retryTraceis both Orbital's idempotency key and the PSync lookup key (/inquiry→order.inquiryRetryNumber). It is numeric and ≤16 chars, so a UUID does not fit. It is derived deterministically (FNV-1a/64 folded into[1e15, 1e16)) so PSync can re-derive it, and is also persisted toconnector_metadata.txRefIdxis persisted alongsidetxRefNumfor future Capture/Void.procStatus/respCode/avsRespCode/cvvRespCodeare treated as opaque strings. The exhaustive tables are not published in any machine-readable JPM asset, so no enum was invented.Files
Added
crates/integrations/connector-integration/src/connectors/jpmorganorbital.rscrates/integrations/connector-integration/src/connectors/jpmorganorbital/transformers.rsModified
crates/integrations/connector-integration/src/connectors.rscrates/integrations/connector-integration/src/types.rscrates/integrations/connector-integration/src/default_implementations.rscrates/types-traits/domain_types/src/connector_types.rscrates/types-traits/domain_types/src/router_data.rscrates/types-traits/domain_types/src/types.rscrates/types-traits/grpc-api-types/proto/payment.protocrates/internal/field-probe/src/auth.rsconfig/development.toml,config/sandbox.toml,config/production.toml,config/superposition.tomlTesting
cargo buildpasses on the full workspace with zero warnings from the new code.grpcurl calls and responses (credentials redacted)
Captured outbound HTTP requests — the key evidence (credentials redacted)
Validation checklist
cargo buildpasses on the full workspace with zero warnings from the new codelocalhostbase URLs and no card numbers in the committed diffjpmorganconnector is untouched