@paykit-sdk/gopay 1.1.1 → 1.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/gopay-provider.d.mts +1 -5
- package/dist/gopay-provider.d.ts +1 -5
- package/dist/gopay-provider.js +63 -85
- package/dist/gopay-provider.mjs +64 -86
- package/dist/index.js +64 -86
- package/dist/index.mjs +65 -87
- package/dist/schema.d.mts +1 -15
- package/dist/schema.d.ts +1 -15
- package/package.json +7 -7
- package/dist/controllers/auth.d.mts +0 -19
- package/dist/controllers/auth.d.ts +0 -19
- package/dist/controllers/auth.js +0 -61
- package/dist/controllers/auth.mjs +0 -59
|
@@ -13,10 +13,6 @@ interface GoPayOptions extends PaykitProviderOptions {
|
|
|
13
13
|
* The GoID for the GoPay API
|
|
14
14
|
*/
|
|
15
15
|
goId: string;
|
|
16
|
-
/**
|
|
17
|
-
* Whether to use the sandbox environment
|
|
18
|
-
*/
|
|
19
|
-
isSandbox: boolean;
|
|
20
16
|
/**
|
|
21
17
|
* The webhook URL for the GoPay API
|
|
22
18
|
*/
|
|
@@ -27,7 +23,7 @@ declare class GoPayProvider extends AbstractPayKitProvider implements PayKitProv
|
|
|
27
23
|
readonly providerName = "gopay";
|
|
28
24
|
private _client;
|
|
29
25
|
private baseUrl;
|
|
30
|
-
private
|
|
26
|
+
private tokenManager;
|
|
31
27
|
constructor(opts: GoPayOptions);
|
|
32
28
|
createCheckout: (params: CreateCheckoutSchema) => Promise<Checkout>;
|
|
33
29
|
retrieveCheckout: (id: string) => Promise<Checkout | null>;
|
package/dist/gopay-provider.d.ts
CHANGED
|
@@ -13,10 +13,6 @@ interface GoPayOptions extends PaykitProviderOptions {
|
|
|
13
13
|
* The GoID for the GoPay API
|
|
14
14
|
*/
|
|
15
15
|
goId: string;
|
|
16
|
-
/**
|
|
17
|
-
* Whether to use the sandbox environment
|
|
18
|
-
*/
|
|
19
|
-
isSandbox: boolean;
|
|
20
16
|
/**
|
|
21
17
|
* The webhook URL for the GoPay API
|
|
22
18
|
*/
|
|
@@ -27,7 +23,7 @@ declare class GoPayProvider extends AbstractPayKitProvider implements PayKitProv
|
|
|
27
23
|
readonly providerName = "gopay";
|
|
28
24
|
private _client;
|
|
29
25
|
private baseUrl;
|
|
30
|
-
private
|
|
26
|
+
private tokenManager;
|
|
31
27
|
constructor(opts: GoPayOptions);
|
|
32
28
|
createCheckout: (params: CreateCheckoutSchema) => Promise<Checkout>;
|
|
33
29
|
retrieveCheckout: (id: string) => Promise<Checkout | null>;
|
package/dist/gopay-provider.js
CHANGED
|
@@ -4068,60 +4068,6 @@ var coerce = {
|
|
|
4068
4068
|
date: ((arg) => ZodDate.create({ ...arg, coerce: true }))
|
|
4069
4069
|
};
|
|
4070
4070
|
var NEVER = INVALID;
|
|
4071
|
-
var AuthController = class {
|
|
4072
|
-
constructor(opts) {
|
|
4073
|
-
this.opts = opts;
|
|
4074
|
-
const debug = opts.debug ?? true;
|
|
4075
|
-
this._client = new core.HTTPClient({
|
|
4076
|
-
baseUrl: this.opts.baseUrl,
|
|
4077
|
-
headers: {},
|
|
4078
|
-
retryOptions: { max: 3, baseDelay: 1e3, debug }
|
|
4079
|
-
});
|
|
4080
|
-
}
|
|
4081
|
-
_client;
|
|
4082
|
-
_accessToken = null;
|
|
4083
|
-
getAccessToken = async () => {
|
|
4084
|
-
if (this._accessToken) {
|
|
4085
|
-
const [token, , expiryStr] = this._accessToken.split("::paykit::");
|
|
4086
|
-
const expiry = parseInt(expiryStr || "0", 10);
|
|
4087
|
-
if (expiry > Date.now()) return token;
|
|
4088
|
-
}
|
|
4089
|
-
const credentials = Buffer.from(
|
|
4090
|
-
`${this.opts.clientId}:${this.opts.clientSecret}`
|
|
4091
|
-
).toString("base64");
|
|
4092
|
-
const body = new URLSearchParams({
|
|
4093
|
-
grant_type: "client_credentials",
|
|
4094
|
-
scope: "payment-all"
|
|
4095
|
-
}).toString();
|
|
4096
|
-
const response = await this._client.post("/oauth2/token", {
|
|
4097
|
-
headers: {
|
|
4098
|
-
Authorization: `Basic ${credentials}`,
|
|
4099
|
-
"Content-Type": "application/x-www-form-urlencoded",
|
|
4100
|
-
Accept: "application/json"
|
|
4101
|
-
},
|
|
4102
|
-
body
|
|
4103
|
-
});
|
|
4104
|
-
if (!response.ok || !response.value?.access_token) {
|
|
4105
|
-
throw new core.OperationFailedError("getAccessToken", "gopay", {
|
|
4106
|
-
cause: new Error(
|
|
4107
|
-
`Failed to obtain GoPay access token: ${JSON.stringify(response.value || response.error)}`
|
|
4108
|
-
)
|
|
4109
|
-
});
|
|
4110
|
-
}
|
|
4111
|
-
const expiryTime = Date.now() + (response.value.expires_in - 300) * 1e3;
|
|
4112
|
-
const accessToken = `${response.value.access_token}::paykit::${expiryTime}`;
|
|
4113
|
-
this._accessToken = accessToken;
|
|
4114
|
-
return response.value.access_token;
|
|
4115
|
-
};
|
|
4116
|
-
getAuthHeaders = async () => {
|
|
4117
|
-
const token = await this.getAccessToken();
|
|
4118
|
-
return {
|
|
4119
|
-
Authorization: `Bearer ${token}`,
|
|
4120
|
-
"Content-Type": "application/json",
|
|
4121
|
-
Accept: "application/json"
|
|
4122
|
-
};
|
|
4123
|
-
};
|
|
4124
|
-
};
|
|
4125
4071
|
var decodeHtmlEntities = (str) => {
|
|
4126
4072
|
return str.replace(/"/g, '"').replace(/'/g, "'").replace(/"/g, '"').replace(/'/g, "'");
|
|
4127
4073
|
};
|
|
@@ -4328,16 +4274,36 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4328
4274
|
headers: {},
|
|
4329
4275
|
retryOptions: { max: 3, baseDelay: 1e3, debug }
|
|
4330
4276
|
});
|
|
4331
|
-
this.
|
|
4277
|
+
this.tokenManager = new core.OAuth2TokenManager({
|
|
4278
|
+
client: this._client,
|
|
4279
|
+
provider: this.providerName,
|
|
4280
|
+
tokenEndpoint: "/oauth2/token",
|
|
4281
|
+
credentials: { username: opts.clientId, password: opts.clientSecret },
|
|
4282
|
+
responseAdapter: (response) => ({
|
|
4283
|
+
accessToken: response.access_token,
|
|
4284
|
+
expiresIn: response.expires_in
|
|
4285
|
+
}),
|
|
4286
|
+
expiryBuffer: 5 * 60,
|
|
4287
|
+
// 5 minutes
|
|
4288
|
+
requestBody: "grant_type=client_credentials&scope=payment-all",
|
|
4289
|
+
requestHeaders: {
|
|
4290
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
4291
|
+
Accept: "application/json"
|
|
4292
|
+
},
|
|
4293
|
+
authHeaders: {
|
|
4294
|
+
"Content-Type": "application/json",
|
|
4295
|
+
Accept: "application/json"
|
|
4296
|
+
}
|
|
4297
|
+
});
|
|
4332
4298
|
}
|
|
4333
4299
|
providerName = providerName;
|
|
4334
4300
|
_client;
|
|
4335
4301
|
baseUrl;
|
|
4336
|
-
|
|
4302
|
+
tokenManager;
|
|
4337
4303
|
createCheckout = async (params) => {
|
|
4338
4304
|
const { error, data } = core.createCheckoutSchema.safeParse(params);
|
|
4339
4305
|
if (error) throw core.ValidationError.fromZodError(error, "gopay", "createCheckout");
|
|
4340
|
-
if (
|
|
4306
|
+
if (!core.isEmailCustomer(data.customer)) {
|
|
4341
4307
|
throw new core.InvalidTypeError("customer", "object (customer) with email", "string", {
|
|
4342
4308
|
provider: this.providerName,
|
|
4343
4309
|
method: "createCheckout"
|
|
@@ -4397,7 +4363,7 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4397
4363
|
"/payments/payment",
|
|
4398
4364
|
{
|
|
4399
4365
|
body: JSON.stringify(goPayRequest),
|
|
4400
|
-
headers: await this.
|
|
4366
|
+
headers: await this.tokenManager.getAuthHeaders()
|
|
4401
4367
|
}
|
|
4402
4368
|
);
|
|
4403
4369
|
if (!response.ok) {
|
|
@@ -4412,7 +4378,7 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4412
4378
|
`/payments/payment/${id}`,
|
|
4413
4379
|
{
|
|
4414
4380
|
headers: {
|
|
4415
|
-
...await this.
|
|
4381
|
+
...await this.tokenManager.getAuthHeaders(),
|
|
4416
4382
|
"Content-Type": "application/x-www-form-urlencoded"
|
|
4417
4383
|
}
|
|
4418
4384
|
}
|
|
@@ -4474,9 +4440,9 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4474
4440
|
"The following fields must be present in the provider_metadata of createCheckout: {keys}"
|
|
4475
4441
|
);
|
|
4476
4442
|
if (this.opts.debug) {
|
|
4477
|
-
if (data.billing_interval
|
|
4443
|
+
if (data.billing_interval === "year") {
|
|
4478
4444
|
console.info(
|
|
4479
|
-
"GoPay does not support yearly subscriptions,
|
|
4445
|
+
"GoPay does not support yearly subscriptions, the available options are `day`, `week`, `month` and `ON_DEMAND` \n raise an issue at https://github.com/usepaykit/paykit-sdk/issues if you need this feature"
|
|
4480
4446
|
);
|
|
4481
4447
|
}
|
|
4482
4448
|
if (!data.provider_metadata?.description) {
|
|
@@ -4489,21 +4455,29 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4489
4455
|
day: "DAY",
|
|
4490
4456
|
week: "WEEK",
|
|
4491
4457
|
month: "MONTH",
|
|
4492
|
-
year: "
|
|
4458
|
+
year: "ON_DEMAND"
|
|
4493
4459
|
};
|
|
4460
|
+
const recurrenceCycle = intervalMap?.[data.billing_interval] ?? "ON_DEMAND";
|
|
4494
4461
|
const currentPeriodEnd = (() => {
|
|
4495
|
-
if (
|
|
4462
|
+
if (recurrenceCycle === "DAY") {
|
|
4496
4463
|
return new Date(Date.now() + 1 * 24 * 60 * 60 * 1e3).toISOString();
|
|
4497
4464
|
}
|
|
4498
|
-
if (
|
|
4465
|
+
if (recurrenceCycle === "WEEK") {
|
|
4499
4466
|
return new Date(Date.now() + 7 * 24 * 60 * 60 * 1e3).toISOString();
|
|
4500
4467
|
}
|
|
4501
|
-
if (
|
|
4468
|
+
if (recurrenceCycle === "MONTH") {
|
|
4502
4469
|
return new Date(Date.now() + 30 * 24 * 60 * 60 * 1e3).toISOString();
|
|
4503
4470
|
}
|
|
4504
|
-
|
|
4471
|
+
if (recurrenceCycle === "ON_DEMAND") {
|
|
4472
|
+
throw new core.ConfigurationError(
|
|
4473
|
+
"ON_DEMAND subscriptions is not yet implemented by PayKit, please open an issue at https://github.com/usepaykit/paykit-sdk/issues",
|
|
4474
|
+
{
|
|
4475
|
+
provider: this.providerName
|
|
4476
|
+
}
|
|
4477
|
+
);
|
|
4478
|
+
}
|
|
4479
|
+
throw new Error("Invalid billing interval: " + data.billing_interval);
|
|
4505
4480
|
})();
|
|
4506
|
-
const recurrenceCycle = intervalMap[data.billing_interval] ?? "ON_DEMAND";
|
|
4507
4481
|
const goPaySubscriptionOptions = {
|
|
4508
4482
|
payer: {
|
|
4509
4483
|
allowed_payment_instruments: ["PAYMENT_CARD"],
|
|
@@ -4537,7 +4511,7 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4537
4511
|
"/payments/payment",
|
|
4538
4512
|
{
|
|
4539
4513
|
body: JSON.stringify(goPaySubscriptionOptions),
|
|
4540
|
-
headers: await this.
|
|
4514
|
+
headers: await this.tokenManager.getAuthHeaders()
|
|
4541
4515
|
}
|
|
4542
4516
|
);
|
|
4543
4517
|
if (!response.ok) {
|
|
@@ -4566,7 +4540,7 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4566
4540
|
}
|
|
4567
4541
|
const response = await this._client.post(`/payments/payment/${id}/void-recurrence`, {
|
|
4568
4542
|
headers: {
|
|
4569
|
-
...await this.
|
|
4543
|
+
...await this.tokenManager.getAuthHeaders(),
|
|
4570
4544
|
"Content-Type": "application/x-www-form-urlencoded"
|
|
4571
4545
|
}
|
|
4572
4546
|
});
|
|
@@ -4583,7 +4557,7 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4583
4557
|
const response = await this._client.get(
|
|
4584
4558
|
`/payments/payment/${id}`,
|
|
4585
4559
|
{
|
|
4586
|
-
headers: await this.
|
|
4560
|
+
headers: await this.tokenManager.getAuthHeaders()
|
|
4587
4561
|
}
|
|
4588
4562
|
);
|
|
4589
4563
|
if (!response.ok) {
|
|
@@ -4612,12 +4586,23 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4612
4586
|
}
|
|
4613
4587
|
);
|
|
4614
4588
|
}
|
|
4589
|
+
const successUrl = data.provider_metadata?.success_url;
|
|
4590
|
+
if (!successUrl) {
|
|
4591
|
+
throw new core.ConfigurationError(
|
|
4592
|
+
"success_url is required, this is the URL to redirect the user to the success page after the payment is successful",
|
|
4593
|
+
{
|
|
4594
|
+
provider: this.providerName,
|
|
4595
|
+
missingKeys: ["success_url"]
|
|
4596
|
+
}
|
|
4597
|
+
);
|
|
4598
|
+
}
|
|
4615
4599
|
const goPayRequest = {
|
|
4616
4600
|
payer: {
|
|
4617
4601
|
allowed_payment_instruments: ["PAYMENT_CARD", "BANK_ACCOUNT"],
|
|
4618
4602
|
default_payment_instrument: "PAYMENT_CARD",
|
|
4619
4603
|
contact: { email: data.customer.email }
|
|
4620
4604
|
},
|
|
4605
|
+
callback: { return_url: successUrl, notification_url: this.opts.webhookUrl },
|
|
4621
4606
|
target: { type: "ACCOUNT", goid: parseInt(this.opts.goId) },
|
|
4622
4607
|
amount: data.amount,
|
|
4623
4608
|
currency: data.currency ?? "CZK",
|
|
@@ -4638,7 +4623,7 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4638
4623
|
"/payments/payment",
|
|
4639
4624
|
{
|
|
4640
4625
|
body: JSON.stringify(goPayRequest),
|
|
4641
|
-
headers: await this.
|
|
4626
|
+
headers: await this.tokenManager.getAuthHeaders()
|
|
4642
4627
|
}
|
|
4643
4628
|
);
|
|
4644
4629
|
if (!response.ok) {
|
|
@@ -4653,7 +4638,7 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4653
4638
|
`/payments/payment/${id}`,
|
|
4654
4639
|
{
|
|
4655
4640
|
headers: {
|
|
4656
|
-
...await this.
|
|
4641
|
+
...await this.tokenManager.getAuthHeaders(),
|
|
4657
4642
|
"Content-Type": "application/x-www-form-urlencoded"
|
|
4658
4643
|
}
|
|
4659
4644
|
}
|
|
@@ -4674,9 +4659,7 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4674
4659
|
capturePayment = async (id, params) => {
|
|
4675
4660
|
const payment = await this._client.get(
|
|
4676
4661
|
`/payments/payment/${id}/capture`,
|
|
4677
|
-
{
|
|
4678
|
-
headers: await this.authController.getAuthHeaders()
|
|
4679
|
-
}
|
|
4662
|
+
{ headers: await this.tokenManager.getAuthHeaders() }
|
|
4680
4663
|
);
|
|
4681
4664
|
if (!payment.ok) {
|
|
4682
4665
|
throw new core.OperationFailedError("capturePayment", this.providerName, {
|
|
@@ -4701,19 +4684,16 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4701
4684
|
`/payments/payment/${id}/capture`,
|
|
4702
4685
|
{
|
|
4703
4686
|
body: JSON.stringify(captureBody),
|
|
4704
|
-
headers: await this.
|
|
4687
|
+
headers: await this.tokenManager.getAuthHeaders()
|
|
4705
4688
|
}
|
|
4706
4689
|
);
|
|
4707
4690
|
return paykitPayment$InboundSchema(payment.value);
|
|
4708
4691
|
};
|
|
4709
4692
|
cancelPayment = async (id) => {
|
|
4710
|
-
|
|
4693
|
+
await this._client.post(
|
|
4711
4694
|
`/payments/payment/${id}/void-authorization`,
|
|
4712
|
-
{
|
|
4713
|
-
headers: await this.authController.getAuthHeaders()
|
|
4714
|
-
}
|
|
4695
|
+
{ headers: await this.tokenManager.getAuthHeaders() }
|
|
4715
4696
|
);
|
|
4716
|
-
console.dir({ response }, { depth: 100 });
|
|
4717
4697
|
const payment = await this.retrievePayment(id);
|
|
4718
4698
|
if (!payment) {
|
|
4719
4699
|
throw new core.OperationFailedError("cancelPayment", this.providerName, {
|
|
@@ -4749,7 +4729,7 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4749
4729
|
const response = await this._client.post(`/payments/payment/${data.payment_id}/refund`, {
|
|
4750
4730
|
body: new URLSearchParams({ amount: String(data.amount) }).toString(),
|
|
4751
4731
|
headers: {
|
|
4752
|
-
...await this.
|
|
4732
|
+
...await this.tokenManager.getAuthHeaders(),
|
|
4753
4733
|
"Content-Type": "application/x-www-form-urlencoded"
|
|
4754
4734
|
}
|
|
4755
4735
|
});
|
|
@@ -4770,7 +4750,6 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4770
4750
|
const { fullUrl } = payload;
|
|
4771
4751
|
const paymentId = new URL(fullUrl).searchParams.get("id");
|
|
4772
4752
|
const parentId = new URL(fullUrl).searchParams.get("parent_id");
|
|
4773
|
-
console.log({ paymentId, parentId });
|
|
4774
4753
|
if (!paymentId) {
|
|
4775
4754
|
throw new core.WebhookError("Payment ID is required", { provider: this.providerName });
|
|
4776
4755
|
}
|
|
@@ -4780,12 +4759,11 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4780
4759
|
const [payment, error] = await core.tryCatchAsync(
|
|
4781
4760
|
this._client.get(`/payments/payment/${paymentId}`, {
|
|
4782
4761
|
headers: {
|
|
4783
|
-
...await this.
|
|
4762
|
+
...await this.tokenManager.getAuthHeaders(),
|
|
4784
4763
|
"Content-Type": "application/x-www-form-urlencoded"
|
|
4785
4764
|
}
|
|
4786
4765
|
})
|
|
4787
4766
|
);
|
|
4788
|
-
console.log({ payment });
|
|
4789
4767
|
if (error) {
|
|
4790
4768
|
throw new core.WebhookError("Failed to retrieve payment", {
|
|
4791
4769
|
provider: this.providerName
|
package/dist/gopay-provider.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { schema, AbstractPayKitProvider, HTTPClient, createCheckoutSchema, ValidationError, InvalidTypeError, validateRequiredKeys, PAYKIT_METADATA_KEY, OperationFailedError, ProviderNotSupportedError, createSubscriptionSchema,
|
|
1
|
+
import { schema, AbstractPayKitProvider, HTTPClient, OAuth2TokenManager, createCheckoutSchema, ValidationError, isEmailCustomer, InvalidTypeError, validateRequiredKeys, PAYKIT_METADATA_KEY, OperationFailedError, ProviderNotSupportedError, createSubscriptionSchema, ConfigurationError, createPaymentSchema, createRefundSchema, WebhookError, tryCatchAsync, paykitEvent$InboundSchema, omitInternalMetadata } from '@paykit-sdk/core';
|
|
2
2
|
import * as crypto from 'crypto';
|
|
3
3
|
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -4046,60 +4046,6 @@ var coerce = {
|
|
|
4046
4046
|
date: ((arg) => ZodDate.create({ ...arg, coerce: true }))
|
|
4047
4047
|
};
|
|
4048
4048
|
var NEVER = INVALID;
|
|
4049
|
-
var AuthController = class {
|
|
4050
|
-
constructor(opts) {
|
|
4051
|
-
this.opts = opts;
|
|
4052
|
-
const debug = opts.debug ?? true;
|
|
4053
|
-
this._client = new HTTPClient({
|
|
4054
|
-
baseUrl: this.opts.baseUrl,
|
|
4055
|
-
headers: {},
|
|
4056
|
-
retryOptions: { max: 3, baseDelay: 1e3, debug }
|
|
4057
|
-
});
|
|
4058
|
-
}
|
|
4059
|
-
_client;
|
|
4060
|
-
_accessToken = null;
|
|
4061
|
-
getAccessToken = async () => {
|
|
4062
|
-
if (this._accessToken) {
|
|
4063
|
-
const [token, , expiryStr] = this._accessToken.split("::paykit::");
|
|
4064
|
-
const expiry = parseInt(expiryStr || "0", 10);
|
|
4065
|
-
if (expiry > Date.now()) return token;
|
|
4066
|
-
}
|
|
4067
|
-
const credentials = Buffer.from(
|
|
4068
|
-
`${this.opts.clientId}:${this.opts.clientSecret}`
|
|
4069
|
-
).toString("base64");
|
|
4070
|
-
const body = new URLSearchParams({
|
|
4071
|
-
grant_type: "client_credentials",
|
|
4072
|
-
scope: "payment-all"
|
|
4073
|
-
}).toString();
|
|
4074
|
-
const response = await this._client.post("/oauth2/token", {
|
|
4075
|
-
headers: {
|
|
4076
|
-
Authorization: `Basic ${credentials}`,
|
|
4077
|
-
"Content-Type": "application/x-www-form-urlencoded",
|
|
4078
|
-
Accept: "application/json"
|
|
4079
|
-
},
|
|
4080
|
-
body
|
|
4081
|
-
});
|
|
4082
|
-
if (!response.ok || !response.value?.access_token) {
|
|
4083
|
-
throw new OperationFailedError("getAccessToken", "gopay", {
|
|
4084
|
-
cause: new Error(
|
|
4085
|
-
`Failed to obtain GoPay access token: ${JSON.stringify(response.value || response.error)}`
|
|
4086
|
-
)
|
|
4087
|
-
});
|
|
4088
|
-
}
|
|
4089
|
-
const expiryTime = Date.now() + (response.value.expires_in - 300) * 1e3;
|
|
4090
|
-
const accessToken = `${response.value.access_token}::paykit::${expiryTime}`;
|
|
4091
|
-
this._accessToken = accessToken;
|
|
4092
|
-
return response.value.access_token;
|
|
4093
|
-
};
|
|
4094
|
-
getAuthHeaders = async () => {
|
|
4095
|
-
const token = await this.getAccessToken();
|
|
4096
|
-
return {
|
|
4097
|
-
Authorization: `Bearer ${token}`,
|
|
4098
|
-
"Content-Type": "application/json",
|
|
4099
|
-
Accept: "application/json"
|
|
4100
|
-
};
|
|
4101
|
-
};
|
|
4102
|
-
};
|
|
4103
4049
|
var decodeHtmlEntities = (str) => {
|
|
4104
4050
|
return str.replace(/"/g, '"').replace(/'/g, "'").replace(/"/g, '"').replace(/'/g, "'");
|
|
4105
4051
|
};
|
|
@@ -4306,16 +4252,36 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4306
4252
|
headers: {},
|
|
4307
4253
|
retryOptions: { max: 3, baseDelay: 1e3, debug }
|
|
4308
4254
|
});
|
|
4309
|
-
this.
|
|
4255
|
+
this.tokenManager = new OAuth2TokenManager({
|
|
4256
|
+
client: this._client,
|
|
4257
|
+
provider: this.providerName,
|
|
4258
|
+
tokenEndpoint: "/oauth2/token",
|
|
4259
|
+
credentials: { username: opts.clientId, password: opts.clientSecret },
|
|
4260
|
+
responseAdapter: (response) => ({
|
|
4261
|
+
accessToken: response.access_token,
|
|
4262
|
+
expiresIn: response.expires_in
|
|
4263
|
+
}),
|
|
4264
|
+
expiryBuffer: 5 * 60,
|
|
4265
|
+
// 5 minutes
|
|
4266
|
+
requestBody: "grant_type=client_credentials&scope=payment-all",
|
|
4267
|
+
requestHeaders: {
|
|
4268
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
4269
|
+
Accept: "application/json"
|
|
4270
|
+
},
|
|
4271
|
+
authHeaders: {
|
|
4272
|
+
"Content-Type": "application/json",
|
|
4273
|
+
Accept: "application/json"
|
|
4274
|
+
}
|
|
4275
|
+
});
|
|
4310
4276
|
}
|
|
4311
4277
|
providerName = providerName;
|
|
4312
4278
|
_client;
|
|
4313
4279
|
baseUrl;
|
|
4314
|
-
|
|
4280
|
+
tokenManager;
|
|
4315
4281
|
createCheckout = async (params) => {
|
|
4316
4282
|
const { error, data } = createCheckoutSchema.safeParse(params);
|
|
4317
4283
|
if (error) throw ValidationError.fromZodError(error, "gopay", "createCheckout");
|
|
4318
|
-
if (
|
|
4284
|
+
if (!isEmailCustomer(data.customer)) {
|
|
4319
4285
|
throw new InvalidTypeError("customer", "object (customer) with email", "string", {
|
|
4320
4286
|
provider: this.providerName,
|
|
4321
4287
|
method: "createCheckout"
|
|
@@ -4375,7 +4341,7 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4375
4341
|
"/payments/payment",
|
|
4376
4342
|
{
|
|
4377
4343
|
body: JSON.stringify(goPayRequest),
|
|
4378
|
-
headers: await this.
|
|
4344
|
+
headers: await this.tokenManager.getAuthHeaders()
|
|
4379
4345
|
}
|
|
4380
4346
|
);
|
|
4381
4347
|
if (!response.ok) {
|
|
@@ -4390,7 +4356,7 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4390
4356
|
`/payments/payment/${id}`,
|
|
4391
4357
|
{
|
|
4392
4358
|
headers: {
|
|
4393
|
-
...await this.
|
|
4359
|
+
...await this.tokenManager.getAuthHeaders(),
|
|
4394
4360
|
"Content-Type": "application/x-www-form-urlencoded"
|
|
4395
4361
|
}
|
|
4396
4362
|
}
|
|
@@ -4452,9 +4418,9 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4452
4418
|
"The following fields must be present in the provider_metadata of createCheckout: {keys}"
|
|
4453
4419
|
);
|
|
4454
4420
|
if (this.opts.debug) {
|
|
4455
|
-
if (data.billing_interval
|
|
4421
|
+
if (data.billing_interval === "year") {
|
|
4456
4422
|
console.info(
|
|
4457
|
-
"GoPay does not support yearly subscriptions,
|
|
4423
|
+
"GoPay does not support yearly subscriptions, the available options are `day`, `week`, `month` and `ON_DEMAND` \n raise an issue at https://github.com/usepaykit/paykit-sdk/issues if you need this feature"
|
|
4458
4424
|
);
|
|
4459
4425
|
}
|
|
4460
4426
|
if (!data.provider_metadata?.description) {
|
|
@@ -4467,21 +4433,29 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4467
4433
|
day: "DAY",
|
|
4468
4434
|
week: "WEEK",
|
|
4469
4435
|
month: "MONTH",
|
|
4470
|
-
year: "
|
|
4436
|
+
year: "ON_DEMAND"
|
|
4471
4437
|
};
|
|
4438
|
+
const recurrenceCycle = intervalMap?.[data.billing_interval] ?? "ON_DEMAND";
|
|
4472
4439
|
const currentPeriodEnd = (() => {
|
|
4473
|
-
if (
|
|
4440
|
+
if (recurrenceCycle === "DAY") {
|
|
4474
4441
|
return new Date(Date.now() + 1 * 24 * 60 * 60 * 1e3).toISOString();
|
|
4475
4442
|
}
|
|
4476
|
-
if (
|
|
4443
|
+
if (recurrenceCycle === "WEEK") {
|
|
4477
4444
|
return new Date(Date.now() + 7 * 24 * 60 * 60 * 1e3).toISOString();
|
|
4478
4445
|
}
|
|
4479
|
-
if (
|
|
4446
|
+
if (recurrenceCycle === "MONTH") {
|
|
4480
4447
|
return new Date(Date.now() + 30 * 24 * 60 * 60 * 1e3).toISOString();
|
|
4481
4448
|
}
|
|
4482
|
-
|
|
4449
|
+
if (recurrenceCycle === "ON_DEMAND") {
|
|
4450
|
+
throw new ConfigurationError(
|
|
4451
|
+
"ON_DEMAND subscriptions is not yet implemented by PayKit, please open an issue at https://github.com/usepaykit/paykit-sdk/issues",
|
|
4452
|
+
{
|
|
4453
|
+
provider: this.providerName
|
|
4454
|
+
}
|
|
4455
|
+
);
|
|
4456
|
+
}
|
|
4457
|
+
throw new Error("Invalid billing interval: " + data.billing_interval);
|
|
4483
4458
|
})();
|
|
4484
|
-
const recurrenceCycle = intervalMap[data.billing_interval] ?? "ON_DEMAND";
|
|
4485
4459
|
const goPaySubscriptionOptions = {
|
|
4486
4460
|
payer: {
|
|
4487
4461
|
allowed_payment_instruments: ["PAYMENT_CARD"],
|
|
@@ -4515,7 +4489,7 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4515
4489
|
"/payments/payment",
|
|
4516
4490
|
{
|
|
4517
4491
|
body: JSON.stringify(goPaySubscriptionOptions),
|
|
4518
|
-
headers: await this.
|
|
4492
|
+
headers: await this.tokenManager.getAuthHeaders()
|
|
4519
4493
|
}
|
|
4520
4494
|
);
|
|
4521
4495
|
if (!response.ok) {
|
|
@@ -4544,7 +4518,7 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4544
4518
|
}
|
|
4545
4519
|
const response = await this._client.post(`/payments/payment/${id}/void-recurrence`, {
|
|
4546
4520
|
headers: {
|
|
4547
|
-
...await this.
|
|
4521
|
+
...await this.tokenManager.getAuthHeaders(),
|
|
4548
4522
|
"Content-Type": "application/x-www-form-urlencoded"
|
|
4549
4523
|
}
|
|
4550
4524
|
});
|
|
@@ -4561,7 +4535,7 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4561
4535
|
const response = await this._client.get(
|
|
4562
4536
|
`/payments/payment/${id}`,
|
|
4563
4537
|
{
|
|
4564
|
-
headers: await this.
|
|
4538
|
+
headers: await this.tokenManager.getAuthHeaders()
|
|
4565
4539
|
}
|
|
4566
4540
|
);
|
|
4567
4541
|
if (!response.ok) {
|
|
@@ -4590,12 +4564,23 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4590
4564
|
}
|
|
4591
4565
|
);
|
|
4592
4566
|
}
|
|
4567
|
+
const successUrl = data.provider_metadata?.success_url;
|
|
4568
|
+
if (!successUrl) {
|
|
4569
|
+
throw new ConfigurationError(
|
|
4570
|
+
"success_url is required, this is the URL to redirect the user to the success page after the payment is successful",
|
|
4571
|
+
{
|
|
4572
|
+
provider: this.providerName,
|
|
4573
|
+
missingKeys: ["success_url"]
|
|
4574
|
+
}
|
|
4575
|
+
);
|
|
4576
|
+
}
|
|
4593
4577
|
const goPayRequest = {
|
|
4594
4578
|
payer: {
|
|
4595
4579
|
allowed_payment_instruments: ["PAYMENT_CARD", "BANK_ACCOUNT"],
|
|
4596
4580
|
default_payment_instrument: "PAYMENT_CARD",
|
|
4597
4581
|
contact: { email: data.customer.email }
|
|
4598
4582
|
},
|
|
4583
|
+
callback: { return_url: successUrl, notification_url: this.opts.webhookUrl },
|
|
4599
4584
|
target: { type: "ACCOUNT", goid: parseInt(this.opts.goId) },
|
|
4600
4585
|
amount: data.amount,
|
|
4601
4586
|
currency: data.currency ?? "CZK",
|
|
@@ -4616,7 +4601,7 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4616
4601
|
"/payments/payment",
|
|
4617
4602
|
{
|
|
4618
4603
|
body: JSON.stringify(goPayRequest),
|
|
4619
|
-
headers: await this.
|
|
4604
|
+
headers: await this.tokenManager.getAuthHeaders()
|
|
4620
4605
|
}
|
|
4621
4606
|
);
|
|
4622
4607
|
if (!response.ok) {
|
|
@@ -4631,7 +4616,7 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4631
4616
|
`/payments/payment/${id}`,
|
|
4632
4617
|
{
|
|
4633
4618
|
headers: {
|
|
4634
|
-
...await this.
|
|
4619
|
+
...await this.tokenManager.getAuthHeaders(),
|
|
4635
4620
|
"Content-Type": "application/x-www-form-urlencoded"
|
|
4636
4621
|
}
|
|
4637
4622
|
}
|
|
@@ -4652,9 +4637,7 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4652
4637
|
capturePayment = async (id, params) => {
|
|
4653
4638
|
const payment = await this._client.get(
|
|
4654
4639
|
`/payments/payment/${id}/capture`,
|
|
4655
|
-
{
|
|
4656
|
-
headers: await this.authController.getAuthHeaders()
|
|
4657
|
-
}
|
|
4640
|
+
{ headers: await this.tokenManager.getAuthHeaders() }
|
|
4658
4641
|
);
|
|
4659
4642
|
if (!payment.ok) {
|
|
4660
4643
|
throw new OperationFailedError("capturePayment", this.providerName, {
|
|
@@ -4679,19 +4662,16 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4679
4662
|
`/payments/payment/${id}/capture`,
|
|
4680
4663
|
{
|
|
4681
4664
|
body: JSON.stringify(captureBody),
|
|
4682
|
-
headers: await this.
|
|
4665
|
+
headers: await this.tokenManager.getAuthHeaders()
|
|
4683
4666
|
}
|
|
4684
4667
|
);
|
|
4685
4668
|
return paykitPayment$InboundSchema(payment.value);
|
|
4686
4669
|
};
|
|
4687
4670
|
cancelPayment = async (id) => {
|
|
4688
|
-
|
|
4671
|
+
await this._client.post(
|
|
4689
4672
|
`/payments/payment/${id}/void-authorization`,
|
|
4690
|
-
{
|
|
4691
|
-
headers: await this.authController.getAuthHeaders()
|
|
4692
|
-
}
|
|
4673
|
+
{ headers: await this.tokenManager.getAuthHeaders() }
|
|
4693
4674
|
);
|
|
4694
|
-
console.dir({ response }, { depth: 100 });
|
|
4695
4675
|
const payment = await this.retrievePayment(id);
|
|
4696
4676
|
if (!payment) {
|
|
4697
4677
|
throw new OperationFailedError("cancelPayment", this.providerName, {
|
|
@@ -4727,7 +4707,7 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4727
4707
|
const response = await this._client.post(`/payments/payment/${data.payment_id}/refund`, {
|
|
4728
4708
|
body: new URLSearchParams({ amount: String(data.amount) }).toString(),
|
|
4729
4709
|
headers: {
|
|
4730
|
-
...await this.
|
|
4710
|
+
...await this.tokenManager.getAuthHeaders(),
|
|
4731
4711
|
"Content-Type": "application/x-www-form-urlencoded"
|
|
4732
4712
|
}
|
|
4733
4713
|
});
|
|
@@ -4748,7 +4728,6 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4748
4728
|
const { fullUrl } = payload;
|
|
4749
4729
|
const paymentId = new URL(fullUrl).searchParams.get("id");
|
|
4750
4730
|
const parentId = new URL(fullUrl).searchParams.get("parent_id");
|
|
4751
|
-
console.log({ paymentId, parentId });
|
|
4752
4731
|
if (!paymentId) {
|
|
4753
4732
|
throw new WebhookError("Payment ID is required", { provider: this.providerName });
|
|
4754
4733
|
}
|
|
@@ -4758,12 +4737,11 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4758
4737
|
const [payment, error] = await tryCatchAsync(
|
|
4759
4738
|
this._client.get(`/payments/payment/${paymentId}`, {
|
|
4760
4739
|
headers: {
|
|
4761
|
-
...await this.
|
|
4740
|
+
...await this.tokenManager.getAuthHeaders(),
|
|
4762
4741
|
"Content-Type": "application/x-www-form-urlencoded"
|
|
4763
4742
|
}
|
|
4764
4743
|
})
|
|
4765
4744
|
);
|
|
4766
|
-
console.log({ payment });
|
|
4767
4745
|
if (error) {
|
|
4768
4746
|
throw new WebhookError("Failed to retrieve payment", {
|
|
4769
4747
|
provider: this.providerName
|