Skip to content

Commit

Permalink
Bnpl payment integration (#156)
Browse files Browse the repository at this point in the history
* bnpl payment integration

* bnpl payment integration

* bnpl payment integration

* bnpl payment integration

* bnpl payment integration

* bnpl payment integration

* updates based on comments

* updates based on comments

* updates based on comments

* updates based on comments

* fixes bnplcard item type typo

* fixes type name

---------

Co-authored-by: Burak BALDIRLIOGLU <[email protected]>
  • Loading branch information
deryacakmak and MasterSlave authored Nov 14, 2023
1 parent e6da759 commit 9374503
Show file tree
Hide file tree
Showing 15 changed files with 226 additions and 2 deletions.
11 changes: 11 additions & 0 deletions samples/payment/ApproveBnplPayment.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
const Craftgate = require('../../dist');

const craftgate = new Craftgate.Client({
apiKey: 'api-key',
secretKey: 'secret-key',
baseUrl: 'https://sandbox-api.craftgate.io'
});

craftgate.payment().approveBnplPayment(1)
.then(results => console.info('Approve bnpl payment response ', results))
.catch(err => console.error('Failed to approve bnpl payment', err));
35 changes: 35 additions & 0 deletions samples/payment/BnplPaymentOffer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
const Craftgate = require('../../dist');

const craftgate = new Craftgate.Client({
apiKey: 'api-key',
secretKey: 'secret-key',
baseUrl: 'https://sandbox-api.craftgate.io'
});

const request = {
price: 10000,
currency: Craftgate.Model.Currency.TRY,
apmType : Craftgate.Model.ApmType.Maslak,
items: [
{
id: "200",
name: "Test Elektronik 2",
brandName:"iphone",
type: Craftgate.Model.BnplCartItemType.Other,
unitPrice: 3000,
quantity: 2,
},
{
id: "100",
name: "Test Elektronik 1",
brandName:"Samsung",
type: Craftgate.Model.BnplCartItemType.MobilePhoneOver5000Try,
unitPrice: 4000,
quantity: 1,
}
]
};

craftgate.payment().retrieveBnplOffers(request)
.then(results => console.info('Approve bnpl payment response', results))
.catch(err => console.error('Failed to approve bnpl payment', err));
54 changes: 54 additions & 0 deletions samples/payment/InitBnplPayment.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
const Craftgate = require('../../dist');

const craftgate = new Craftgate.Client({
apiKey: 'api-key',
secretKey: 'secret-key',
baseUrl: 'https://sandbox-api.craftgate.io'
});

const request = {
price: 10000,
paidPrice : 10000,
currency: Craftgate.Model.Currency.TRY,
apmType : Craftgate.Model.ApmType.Maslak,
apmOrderId: "",
paymentGroup : Craftgate.Model.PaymentGroup.Product,
conversationId : "29393-mXld92ko3",
externalId : "external_id-345",
callbackUrl : "callback",
bankCode: "103",
items: [
{
externalId: "38983903",
name: "item-1",
price: 6000,
},
{
externalId: "92983294",
name: "item-2",
price: 4000,
}
],
cartItems: [
{
id: "200",
name: "Test Elektronik 2",
brandName:"iphone",
type: Craftgate.Model.BnplCartItemType.Other,
unitPrice: 3000,
quantity: 2,
},
{
id: "100",
name: "Test Elektronik 1",
brandName:"Samsung",
type: Craftgate.Model.BnplCartItemType.MobilePhoneOver5000Try,
unitPrice: 4000,
quantity: 1,
}
]
};

craftgate.payment().initBnplPayment(request)
.then(results => console.info('Init bnpl payment response', results))
.catch(err => console.error('Failed to Init bnpl payment', err));
16 changes: 16 additions & 0 deletions src/adapter/PaymentAdapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import {calculateHash} from '../lib/utils';

import ApplePayMerchantSessionCreateRequest from '../request/ApplePayMerchantSessionCreateRequest';
import ApprovePaymentTransactionsRequest from '../request/ApprovePaymentTransactionsRequest';
import InitBnplPaymentRequest from '../request/InitBnplPaymentRequest';
import BnplPaymentOfferRequest from '../request/BnplPaymentOfferRequest';
import CompleteApmPaymentRequest from '../request/CompleteApmPaymentRequest';
import CompletePosApmPaymentRequest from '../request/CompletePosApmPaymentRequest';
import CompleteThreeDSPaymentRequest from '../request/CompleteThreeDSPaymentRequest';
Expand All @@ -28,6 +30,8 @@ import UpdateCardRequest from '../request/UpdateCardRequest';
import UpdatePaymentTransactionRequest from '../request/UpdatePaymentTransactionRequest';

import ApmDepositPaymentResponse from '../response/ApmDepositPaymentResponse';
import InitBnplPaymentResponse from '../response/InitBnplPaymentResponse';
import BnplPaymentOfferResponse from '../response/BnplPaymentOfferResponse';
import CompleteApmPaymentResponse from '../response/CompleteApmPaymentResponse';
import CompletePosApmPaymentResponse from '../response/CompletePosApmPaymentResponse';
import DataResponse from '../response/DataResponse';
Expand Down Expand Up @@ -181,6 +185,18 @@ export default class PaymentAdapter extends BaseAdapter {
return this._client.post(`/payment/v1/apple-pay/merchant-sessions`, request);
}

async retrieveBnplOffers(request: BnplPaymentOfferRequest): Promise<BnplPaymentOfferResponse> {
return this._client.post(`/payment/v1/bnpl-payments/offers`, request);
}

async initBnplPayment(request: InitBnplPaymentRequest): Promise<InitBnplPaymentResponse> {
return this._client.post(`/payment/v1/bnpl-payments/init`, request);
}

async approveBnplPayment(paymentId: number): Promise<void> {
return this._client.post(`/payment/v1/bnpl-payments/${paymentId}/approve`);
}

async is3DSecureCallbackVerified(threeDSecureCallbackKey: string, params: Map<string, string>): Promise<boolean> {
const hash = params['hash'];
const hashString: string = [
Expand Down
2 changes: 1 addition & 1 deletion src/lib/HttpClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ export class HttpClient {
config.headers['Content-Type'] = 'application/json';

const method: string = (config.method || '').toLowerCase();
if (method === 'put' || method === 'post' || method === 'patch') {
if ((method === 'put' || method === 'post' || method === 'patch') && requestBody !== null) {
config.data = requestBody;
}

Expand Down
4 changes: 3 additions & 1 deletion src/model/ApmType.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@ enum ApmType {
Stripe = 'STRIPE',
Tompay = 'TOMPAY',
FundTransfer = 'FUND_TRANSFER',
CashOnDelivery = 'CASH_ON_DELIVERY'
CashOnDelivery = 'CASH_ON_DELIVERY',
Maslak = 'MASLAK',
ALFABANK = 'ALFABANK'
}

export default ApmType;
28 changes: 28 additions & 0 deletions src/model/BnplCartItemType.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
enum BnplCartItemType {
MobilePhoneOver5000Try = 'MOBILE_PHONE_OVER_5000_TRY',
MobilePhoneBelow5000Try = 'MOBILE_PHONE_BELOW_5000_TRY',
Tablet = 'TABLET',
Computer = 'COMPUTER',
ConstructionMarket = 'CONSTRUCTION_MARKET',
Gold = 'GOLD',
DigitalProduct = 'DIGITAL_PRODUCTS',
Supermarket = 'SUPERMARKET',
WhiteGoods = 'WHITE_GOODS',
WearableTechnology = 'WEARABLE_TECHNOLOGY',
SmallHomeAppliance = 'SMALL_HOME_APPLIANCES',
Tv = 'TV',
GameConsoles = 'GAMES_CONSOLES',
AirConditionerAndHeater = 'AIR_CONDITIONER_AND_HEATER',
Electronics = 'ELECTRONICS',
Accessories = 'ACCESSORIES',
MomAndBabyAndKids = 'MOM_AND_BABY_AND_KIDS',
Shoes = 'SHOES',
Clothing = 'CLOTHING',
CosmeticsAndPersonalCare = 'COSMETICS_AND_PERSONAL_CARE',
Furniture = 'FURNITURE',
HomeLiving = 'HOME_LIVING',
AutomobileMotorcycle = 'AUTOMOBILE_MOTORCYCLE',
Other = 'OTHER'
}

export default BnplCartItemType;
2 changes: 2 additions & 0 deletions src/model/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import BounceStatus from './BounceStatus';
import CardAssociation from './CardAssociation';
import CardExpiryStatus from './CardExpiryStatus';
import CardType from './CardType';
import BnplCartItemType from './BnplCartItemType';
import Currency from './Currency';
import FileStatus from './FileStatus';
import FraudAction from './FraudAction';
Expand Down Expand Up @@ -49,6 +50,7 @@ export = {
BounceStatus,
CardAssociation,
CardType,
BnplCartItemType,
CardExpiryStatus,
Currency,
FileStatus,
Expand Down
14 changes: 14 additions & 0 deletions src/request/BnplPaymentOfferRequest.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import ApmType from '../model/ApmType';
import Currency from '../model/Currency';

import BnplPaymentCartItem from './dto/BnplPaymentCartItem';

type BnplPaymentOfferRequest = {
apmType: ApmType;
merchantApmId: number;
price: number;
currency: Currency;
items: BnplPaymentCartItem[];
};

export default BnplPaymentOfferRequest;
9 changes: 9 additions & 0 deletions src/request/InitBnplPaymentRequest.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import BnplPaymentCartItem from './dto/BnplPaymentCartItem';
import InitApmPaymentRequest from './InitApmPaymentRequest';

type InitBnplPaymentRequest = InitApmPaymentRequest & {
bankCode: string;
cartItems: BnplPaymentCartItem[];
};

export default InitBnplPaymentRequest;
12 changes: 12 additions & 0 deletions src/request/dto/BnplPaymentCartItem.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import BnplCartItemType from '../../model/BnplCartItemType';

type BnplPaymentCartItem = {
id: string;
name: string;
brandName: string;
type: BnplCartItemType;
unitPrice: number;
quantity: number;
};

export default BnplPaymentCartItem;
9 changes: 9 additions & 0 deletions src/response/BnplPaymentOfferResponse.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import BnplBankOffer from './dto/BnplBankOffer';

type BnplPaymentOfferResponse = {
offerId: string;
price: number;
bankOffers: BnplBankOffer[];
};

export default BnplPaymentOfferResponse;
14 changes: 14 additions & 0 deletions src/response/InitBnplPaymentResponse.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import ApmAdditionalAction from '../model/ApmAdditionalAction';
import PaymentStatus from '../model/PaymentStatus';

import PaymentError from './dto/PaymentError';

type InitBnplPaymentResponse = {
paymentId: number;
redirectUrl: string;
paymentStatus: PaymentStatus;
apmAdditionalAction: ApmAdditionalAction;
paymentError: PaymentError;
};

export default InitBnplPaymentResponse;
11 changes: 11 additions & 0 deletions src/response/dto/BnplBankOffer.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
type BnplBankOffer = {
bankCode: string;
bankName: string;
bankIconUrl: string;
bankTableBannerMessage: string;
bankSmallBannerMessage: string;
isSupportNonCustomer: boolean;
bankOfferTerms: BnplBankOfferTerm[];
};

export default BnplBankOffer;
7 changes: 7 additions & 0 deletions src/response/dto/BnplBankOfferTerm.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
type BnplBankOfferTerm = {
term: number;
amount: number;
totalAmount: number;
interestRate: number;
annualInterestRate: number;
};

0 comments on commit 9374503

Please sign in to comment.