@paykit-sdk/gopay 1.0.0 → 1.0.1
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/README.md +41 -34
- package/dist/controllers/auth.js +21 -5
- package/dist/controllers/auth.mjs +21 -5
- package/dist/gopay-provider.js +116 -55
- package/dist/gopay-provider.mjs +116 -55
- package/dist/index.js +123 -56
- package/dist/index.mjs +123 -56
- package/dist/utils/mapper.js +13 -5
- package/dist/utils/mapper.mjs +13 -5
- package/package.json +8 -9
package/dist/gopay-provider.mjs
CHANGED
|
@@ -4050,7 +4050,11 @@ var AuthController = class {
|
|
|
4050
4050
|
constructor(opts) {
|
|
4051
4051
|
this.opts = opts;
|
|
4052
4052
|
const debug = opts.debug ?? true;
|
|
4053
|
-
this._client = new HTTPClient({
|
|
4053
|
+
this._client = new HTTPClient({
|
|
4054
|
+
baseUrl: this.opts.baseUrl,
|
|
4055
|
+
headers: {},
|
|
4056
|
+
retryOptions: { max: 3, baseDelay: 1e3, debug }
|
|
4057
|
+
});
|
|
4054
4058
|
}
|
|
4055
4059
|
_client;
|
|
4056
4060
|
_accessToken = null;
|
|
@@ -4060,10 +4064,18 @@ var AuthController = class {
|
|
|
4060
4064
|
const expiry = parseInt(expiryStr || "0", 10);
|
|
4061
4065
|
if (expiry > Date.now()) return token;
|
|
4062
4066
|
}
|
|
4063
|
-
const credentials = Buffer.from(
|
|
4067
|
+
const credentials = Buffer.from(
|
|
4068
|
+
`${this.opts.clientId}:${this.opts.clientSecret}`
|
|
4069
|
+
).toString("base64");
|
|
4064
4070
|
const response = await this._client.post("/oauth2/token", {
|
|
4065
|
-
headers: {
|
|
4066
|
-
|
|
4071
|
+
headers: {
|
|
4072
|
+
Authorization: `Basic ${credentials}`,
|
|
4073
|
+
"Content-Type": "application/x-www-form-urlencoded"
|
|
4074
|
+
},
|
|
4075
|
+
body: new URLSearchParams({
|
|
4076
|
+
grant_type: "client_credentials",
|
|
4077
|
+
scope: "payment-all"
|
|
4078
|
+
}).toString()
|
|
4067
4079
|
});
|
|
4068
4080
|
if (!response.ok || !response.value.access_token) {
|
|
4069
4081
|
throw new OperationFailedError("getAccessToken", "gopay", {
|
|
@@ -4077,11 +4089,17 @@ var AuthController = class {
|
|
|
4077
4089
|
};
|
|
4078
4090
|
getAuthHeaders = async () => {
|
|
4079
4091
|
const token = await this.getAccessToken();
|
|
4080
|
-
return {
|
|
4092
|
+
return {
|
|
4093
|
+
Authorization: `Bearer ${token}`,
|
|
4094
|
+
"Content-Type": "application/json",
|
|
4095
|
+
Accept: "application/json"
|
|
4096
|
+
};
|
|
4081
4097
|
};
|
|
4082
4098
|
};
|
|
4083
4099
|
var paykitPayment$InboundSchema = (data) => {
|
|
4084
|
-
const itemId = JSON.parse(
|
|
4100
|
+
const itemId = JSON.parse(
|
|
4101
|
+
data.additional_params?.find((param) => param.name === PAYKIT_METADATA_KEY)?.value ?? "{}"
|
|
4102
|
+
).itemId;
|
|
4085
4103
|
const metadata = omitInternalMetadata(
|
|
4086
4104
|
data.additional_params?.reduce(
|
|
4087
4105
|
(acc, param) => {
|
|
@@ -4097,13 +4115,17 @@ var paykitPayment$InboundSchema = (data) => {
|
|
|
4097
4115
|
currency: data.currency,
|
|
4098
4116
|
customer: data.payer ?? { email: data.payer?.email ?? "" },
|
|
4099
4117
|
status: data.state,
|
|
4100
|
-
|
|
4118
|
+
item_id: itemId,
|
|
4101
4119
|
metadata
|
|
4102
4120
|
};
|
|
4103
4121
|
};
|
|
4104
4122
|
var paykitInvoice$InboundSchema = (data, isSubscription) => {
|
|
4105
|
-
const quantity = JSON.parse(
|
|
4106
|
-
|
|
4123
|
+
const quantity = JSON.parse(
|
|
4124
|
+
data.additional_params?.find((param) => param.name === PAYKIT_METADATA_KEY)?.value ?? "{}"
|
|
4125
|
+
).qty;
|
|
4126
|
+
const itemId = JSON.parse(
|
|
4127
|
+
data.additional_params?.find((param) => param.name === PAYKIT_METADATA_KEY)?.value ?? "{}"
|
|
4128
|
+
).itemId;
|
|
4107
4129
|
const status = (() => {
|
|
4108
4130
|
if (data.state === "PAID") return "paid";
|
|
4109
4131
|
return "open";
|
|
@@ -4133,7 +4155,9 @@ var paykitInvoice$InboundSchema = (data, isSubscription) => {
|
|
|
4133
4155
|
};
|
|
4134
4156
|
};
|
|
4135
4157
|
var paykitSubscription$InboundSchema = (data) => {
|
|
4136
|
-
const itemId = JSON.parse(
|
|
4158
|
+
const itemId = JSON.parse(
|
|
4159
|
+
data.additional_params?.find((param) => param.name === PAYKIT_METADATA_KEY)?.value ?? "{}"
|
|
4160
|
+
).itemId;
|
|
4137
4161
|
const billingIntervalMap = {
|
|
4138
4162
|
DAY: "day",
|
|
4139
4163
|
WEEK: "week",
|
|
@@ -4214,12 +4238,8 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4214
4238
|
method: "createCheckout"
|
|
4215
4239
|
});
|
|
4216
4240
|
}
|
|
4217
|
-
const {
|
|
4218
|
-
amount,
|
|
4219
|
-
currency = "CZK",
|
|
4220
|
-
successUrl
|
|
4221
|
-
} = validateRequiredKeys(
|
|
4222
|
-
["amount", "currency", "successUrl"],
|
|
4241
|
+
const { amount, currency = "CZK" } = validateRequiredKeys(
|
|
4242
|
+
["amount", "currency"],
|
|
4223
4243
|
data.provider_metadata,
|
|
4224
4244
|
"The following fields must be present in the provider_metadata of createCheckout: {keys}"
|
|
4225
4245
|
);
|
|
@@ -4246,12 +4266,22 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4246
4266
|
currency,
|
|
4247
4267
|
order_number: crypto.randomBytes(8).toString("hex").slice(0, 15),
|
|
4248
4268
|
order_description: data.metadata?.description || "Checkout",
|
|
4249
|
-
items: [
|
|
4269
|
+
items: [
|
|
4270
|
+
{
|
|
4271
|
+
name: data.item_id,
|
|
4272
|
+
amount: Number(amount),
|
|
4273
|
+
count: data.quantity,
|
|
4274
|
+
type: "ITEM"
|
|
4275
|
+
}
|
|
4276
|
+
],
|
|
4250
4277
|
lang: data.provider_metadata?.lang ? data.provider_metadata.lang : "EN",
|
|
4251
|
-
callback: { return_url:
|
|
4278
|
+
callback: { return_url: data.success_url, notification_url: this.opts.webhookUrl },
|
|
4252
4279
|
additional_params: Object.entries({
|
|
4253
4280
|
...data.metadata,
|
|
4254
|
-
[PAYKIT_METADATA_KEY]: JSON.stringify({
|
|
4281
|
+
[PAYKIT_METADATA_KEY]: JSON.stringify({
|
|
4282
|
+
itemId: data.item_id,
|
|
4283
|
+
qty: data.quantity
|
|
4284
|
+
})
|
|
4255
4285
|
}).map(([name, value]) => ({
|
|
4256
4286
|
name,
|
|
4257
4287
|
value: String(value)
|
|
@@ -4265,9 +4295,12 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4265
4295
|
return response.value;
|
|
4266
4296
|
};
|
|
4267
4297
|
retrieveCheckout = async (id) => {
|
|
4268
|
-
const response = await this._client.get(
|
|
4269
|
-
|
|
4270
|
-
|
|
4298
|
+
const response = await this._client.get(
|
|
4299
|
+
`/payments/payment/${id}`,
|
|
4300
|
+
{
|
|
4301
|
+
headers: await this.authController.getAuthHeaders()
|
|
4302
|
+
}
|
|
4303
|
+
);
|
|
4271
4304
|
if (!response.ok) {
|
|
4272
4305
|
throw new OperationFailedError("retrieveCheckout", this.providerName, {
|
|
4273
4306
|
cause: new Error("Failed to retrieve checkout")
|
|
@@ -4318,8 +4351,8 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4318
4351
|
method: "createCheckout"
|
|
4319
4352
|
});
|
|
4320
4353
|
}
|
|
4321
|
-
const {
|
|
4322
|
-
["
|
|
4354
|
+
const { quantity, success_url } = validateRequiredKeys(
|
|
4355
|
+
["quantity", "success_url"],
|
|
4323
4356
|
data.provider_metadata,
|
|
4324
4357
|
"The following fields must be present in the provider_metadata of createCheckout: {keys}"
|
|
4325
4358
|
);
|
|
@@ -4329,6 +4362,18 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4329
4362
|
month: "MONTH",
|
|
4330
4363
|
year: "MONTH"
|
|
4331
4364
|
};
|
|
4365
|
+
const currentPeriodEnd = (() => {
|
|
4366
|
+
if (data.billing_interval === "day") {
|
|
4367
|
+
return new Date(Date.now() + 1 * 24 * 60 * 60 * 1e3).toISOString();
|
|
4368
|
+
}
|
|
4369
|
+
if (data.billing_interval === "week") {
|
|
4370
|
+
return new Date(Date.now() + 7 * 24 * 60 * 60 * 1e3).toISOString();
|
|
4371
|
+
}
|
|
4372
|
+
if (data.billing_interval === "month") {
|
|
4373
|
+
return new Date(Date.now() + 30 * 24 * 60 * 60 * 1e3).toISOString();
|
|
4374
|
+
}
|
|
4375
|
+
return new Date(Date.now() + 365 * 24 * 60 * 60 * 1e3).toISOString();
|
|
4376
|
+
})();
|
|
4332
4377
|
const recurrenceCycle = intervalMap[data.billing_interval] ?? "ON_DEMAND";
|
|
4333
4378
|
const goPaySubscriptionOptions = {
|
|
4334
4379
|
payer: {
|
|
@@ -4341,13 +4386,15 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4341
4386
|
currency: data.currency ?? "CZK",
|
|
4342
4387
|
order_number: crypto.randomBytes(8).toString("hex").slice(0, 15),
|
|
4343
4388
|
order_description: data.metadata?.description || "Subscription",
|
|
4344
|
-
items: [
|
|
4389
|
+
items: [
|
|
4390
|
+
{ name: data.item_id, amount: Number(data.amount), count: parseInt(quantity) }
|
|
4391
|
+
],
|
|
4345
4392
|
recurrence: {
|
|
4346
4393
|
recurrence_cycle: recurrenceCycle,
|
|
4347
4394
|
recurrence_period: parseInt(quantity),
|
|
4348
|
-
recurrence_date_to:
|
|
4395
|
+
recurrence_date_to: currentPeriodEnd
|
|
4349
4396
|
},
|
|
4350
|
-
callback: { return_url:
|
|
4397
|
+
callback: { return_url: success_url, notification_url: this.opts.webhookUrl }
|
|
4351
4398
|
};
|
|
4352
4399
|
const response = await this._client.post("/payments/payment", {
|
|
4353
4400
|
body: JSON.stringify(goPaySubscriptionOptions),
|
|
@@ -4392,9 +4439,12 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4392
4439
|
return null;
|
|
4393
4440
|
};
|
|
4394
4441
|
retrieveSubscription = async (id) => {
|
|
4395
|
-
const response = await this._client.get(
|
|
4396
|
-
|
|
4397
|
-
|
|
4442
|
+
const response = await this._client.get(
|
|
4443
|
+
`/payments/payment/${id}`,
|
|
4444
|
+
{
|
|
4445
|
+
headers: await this.authController.getAuthHeaders()
|
|
4446
|
+
}
|
|
4447
|
+
);
|
|
4398
4448
|
if (!response.ok) {
|
|
4399
4449
|
throw new OperationFailedError("retrieveSubscription", this.providerName, {
|
|
4400
4450
|
cause: new Error("Failed to retrieve subscription")
|
|
@@ -4405,24 +4455,23 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4405
4455
|
};
|
|
4406
4456
|
createPayment = async (params) => {
|
|
4407
4457
|
const { error, data } = createPaymentSchema.safeParse(params);
|
|
4408
|
-
if (error)
|
|
4458
|
+
if (error)
|
|
4459
|
+
throw ValidationError.fromZodError(error, this.providerName, "createPayment");
|
|
4409
4460
|
if (typeof data.customer == "string" || typeof data.customer === "object" && !data.customer.email) {
|
|
4410
4461
|
throw new InvalidTypeError("customer", "object (customer) with email", "string", {
|
|
4411
4462
|
provider: this.providerName,
|
|
4412
4463
|
method: "createPayment"
|
|
4413
4464
|
});
|
|
4414
4465
|
}
|
|
4415
|
-
if (!data.
|
|
4416
|
-
throw new ConfigurationError(
|
|
4417
|
-
|
|
4418
|
-
|
|
4419
|
-
|
|
4466
|
+
if (!data.item_id) {
|
|
4467
|
+
throw new ConfigurationError(
|
|
4468
|
+
"item_id is required, this is the name of the item in GoPay",
|
|
4469
|
+
{
|
|
4470
|
+
provider: this.providerName,
|
|
4471
|
+
missingKeys: ["item_id"]
|
|
4472
|
+
}
|
|
4473
|
+
);
|
|
4420
4474
|
}
|
|
4421
|
-
const { quantity } = validateRequiredKeys(
|
|
4422
|
-
["quantity"],
|
|
4423
|
-
data.provider_metadata,
|
|
4424
|
-
"The following fields must be present in the provider_metadata of createPayment: {keys}"
|
|
4425
|
-
);
|
|
4426
4475
|
const goPayRequest = {
|
|
4427
4476
|
payer: {
|
|
4428
4477
|
allowed_payment_instruments: ["PAYMENT_CARD", "BANK_ACCOUNT"],
|
|
@@ -4433,13 +4482,13 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4433
4482
|
amount: data.amount,
|
|
4434
4483
|
currency: data.currency ?? "CZK",
|
|
4435
4484
|
order_number: crypto.randomBytes(8).toString("hex").slice(0, 15),
|
|
4436
|
-
order_description: data.
|
|
4437
|
-
items: [{ name: data.
|
|
4485
|
+
order_description: `Payment for ${data.item_id} by ${data.customer.email}`,
|
|
4486
|
+
items: [{ name: data.item_id, amount: data.amount, count: 1 }],
|
|
4438
4487
|
preauthorization: false,
|
|
4439
4488
|
// automatically captures the payment
|
|
4440
4489
|
additional_params: Object.entries({
|
|
4441
4490
|
...data.metadata,
|
|
4442
|
-
[PAYKIT_METADATA_KEY]: JSON.stringify({ itemId: data.
|
|
4491
|
+
[PAYKIT_METADATA_KEY]: JSON.stringify({ itemId: data.item_id, qty: 1 })
|
|
4443
4492
|
}).map(([name, value]) => ({
|
|
4444
4493
|
name,
|
|
4445
4494
|
value: String(value)
|
|
@@ -4458,9 +4507,12 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4458
4507
|
return response.value;
|
|
4459
4508
|
};
|
|
4460
4509
|
retrievePayment = async (id) => {
|
|
4461
|
-
const response = await this._client.get(
|
|
4462
|
-
|
|
4463
|
-
|
|
4510
|
+
const response = await this._client.get(
|
|
4511
|
+
`/payments/payment/${id}`,
|
|
4512
|
+
{
|
|
4513
|
+
headers: await this.authController.getAuthHeaders()
|
|
4514
|
+
}
|
|
4515
|
+
);
|
|
4464
4516
|
if (!response.ok) {
|
|
4465
4517
|
throw new OperationFailedError("retrievePayment", this.providerName, {
|
|
4466
4518
|
cause: new Error("Failed to retrieve payment")
|
|
@@ -4476,9 +4528,12 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4476
4528
|
});
|
|
4477
4529
|
};
|
|
4478
4530
|
capturePayment = async (id, params) => {
|
|
4479
|
-
const payment = await this._client.get(
|
|
4480
|
-
|
|
4481
|
-
|
|
4531
|
+
const payment = await this._client.get(
|
|
4532
|
+
`/payments/payment/${id}`,
|
|
4533
|
+
{
|
|
4534
|
+
headers: await this.authController.getAuthHeaders()
|
|
4535
|
+
}
|
|
4536
|
+
);
|
|
4482
4537
|
if (!payment.ok) {
|
|
4483
4538
|
throw new OperationFailedError("capturePayment", this.providerName, {
|
|
4484
4539
|
cause: new Error("Failed to retrieve payment")
|
|
@@ -4506,9 +4561,12 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4506
4561
|
return paykitPayment$InboundSchema(payment.value);
|
|
4507
4562
|
};
|
|
4508
4563
|
cancelPayment = async (id) => {
|
|
4509
|
-
const response = await this._client.post(
|
|
4510
|
-
|
|
4511
|
-
|
|
4564
|
+
const response = await this._client.post(
|
|
4565
|
+
`/payments/payment/${id}/void-authorization`,
|
|
4566
|
+
{
|
|
4567
|
+
headers: await this.authController.getAuthHeaders()
|
|
4568
|
+
}
|
|
4569
|
+
);
|
|
4512
4570
|
console.dir({ response }, { depth: 100 });
|
|
4513
4571
|
const payment = await this.retrievePayment(id);
|
|
4514
4572
|
if (!payment) {
|
|
@@ -4533,7 +4591,8 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4533
4591
|
};
|
|
4534
4592
|
async createRefund(params) {
|
|
4535
4593
|
const { error, data } = createRefundSchema.safeParse(params);
|
|
4536
|
-
if (error)
|
|
4594
|
+
if (error)
|
|
4595
|
+
throw ValidationError.fromZodError(error, this.providerName, "createRefund");
|
|
4537
4596
|
const payment = await this.retrievePayment(data.payment_id);
|
|
4538
4597
|
if (!payment) {
|
|
4539
4598
|
throw new OperationFailedError("createRefund", this.providerName, {
|
|
@@ -4579,7 +4638,9 @@ var GoPayProvider = class extends AbstractPayKitProvider {
|
|
|
4579
4638
|
})
|
|
4580
4639
|
);
|
|
4581
4640
|
if (error) {
|
|
4582
|
-
throw new WebhookError("Failed to retrieve payment", {
|
|
4641
|
+
throw new WebhookError("Failed to retrieve payment", {
|
|
4642
|
+
provider: this.providerName
|
|
4643
|
+
});
|
|
4583
4644
|
}
|
|
4584
4645
|
if (!payment.value) {
|
|
4585
4646
|
throw new WebhookError("Payment not found", { provider: this.providerName });
|
package/dist/index.js
CHANGED
|
@@ -4072,7 +4072,11 @@ var AuthController = class {
|
|
|
4072
4072
|
constructor(opts) {
|
|
4073
4073
|
this.opts = opts;
|
|
4074
4074
|
const debug = opts.debug ?? true;
|
|
4075
|
-
this._client = new core.HTTPClient({
|
|
4075
|
+
this._client = new core.HTTPClient({
|
|
4076
|
+
baseUrl: this.opts.baseUrl,
|
|
4077
|
+
headers: {},
|
|
4078
|
+
retryOptions: { max: 3, baseDelay: 1e3, debug }
|
|
4079
|
+
});
|
|
4076
4080
|
}
|
|
4077
4081
|
_client;
|
|
4078
4082
|
_accessToken = null;
|
|
@@ -4082,10 +4086,18 @@ var AuthController = class {
|
|
|
4082
4086
|
const expiry = parseInt(expiryStr || "0", 10);
|
|
4083
4087
|
if (expiry > Date.now()) return token;
|
|
4084
4088
|
}
|
|
4085
|
-
const credentials = Buffer.from(
|
|
4089
|
+
const credentials = Buffer.from(
|
|
4090
|
+
`${this.opts.clientId}:${this.opts.clientSecret}`
|
|
4091
|
+
).toString("base64");
|
|
4086
4092
|
const response = await this._client.post("/oauth2/token", {
|
|
4087
|
-
headers: {
|
|
4088
|
-
|
|
4093
|
+
headers: {
|
|
4094
|
+
Authorization: `Basic ${credentials}`,
|
|
4095
|
+
"Content-Type": "application/x-www-form-urlencoded"
|
|
4096
|
+
},
|
|
4097
|
+
body: new URLSearchParams({
|
|
4098
|
+
grant_type: "client_credentials",
|
|
4099
|
+
scope: "payment-all"
|
|
4100
|
+
}).toString()
|
|
4089
4101
|
});
|
|
4090
4102
|
if (!response.ok || !response.value.access_token) {
|
|
4091
4103
|
throw new core.OperationFailedError("getAccessToken", "gopay", {
|
|
@@ -4099,11 +4111,17 @@ var AuthController = class {
|
|
|
4099
4111
|
};
|
|
4100
4112
|
getAuthHeaders = async () => {
|
|
4101
4113
|
const token = await this.getAccessToken();
|
|
4102
|
-
return {
|
|
4114
|
+
return {
|
|
4115
|
+
Authorization: `Bearer ${token}`,
|
|
4116
|
+
"Content-Type": "application/json",
|
|
4117
|
+
Accept: "application/json"
|
|
4118
|
+
};
|
|
4103
4119
|
};
|
|
4104
4120
|
};
|
|
4105
4121
|
var paykitPayment$InboundSchema = (data) => {
|
|
4106
|
-
const itemId = JSON.parse(
|
|
4122
|
+
const itemId = JSON.parse(
|
|
4123
|
+
data.additional_params?.find((param) => param.name === core.PAYKIT_METADATA_KEY)?.value ?? "{}"
|
|
4124
|
+
).itemId;
|
|
4107
4125
|
const metadata = core.omitInternalMetadata(
|
|
4108
4126
|
data.additional_params?.reduce(
|
|
4109
4127
|
(acc, param) => {
|
|
@@ -4119,13 +4137,17 @@ var paykitPayment$InboundSchema = (data) => {
|
|
|
4119
4137
|
currency: data.currency,
|
|
4120
4138
|
customer: data.payer ?? { email: data.payer?.email ?? "" },
|
|
4121
4139
|
status: data.state,
|
|
4122
|
-
|
|
4140
|
+
item_id: itemId,
|
|
4123
4141
|
metadata
|
|
4124
4142
|
};
|
|
4125
4143
|
};
|
|
4126
4144
|
var paykitInvoice$InboundSchema = (data, isSubscription) => {
|
|
4127
|
-
const quantity = JSON.parse(
|
|
4128
|
-
|
|
4145
|
+
const quantity = JSON.parse(
|
|
4146
|
+
data.additional_params?.find((param) => param.name === core.PAYKIT_METADATA_KEY)?.value ?? "{}"
|
|
4147
|
+
).qty;
|
|
4148
|
+
const itemId = JSON.parse(
|
|
4149
|
+
data.additional_params?.find((param) => param.name === core.PAYKIT_METADATA_KEY)?.value ?? "{}"
|
|
4150
|
+
).itemId;
|
|
4129
4151
|
const status = (() => {
|
|
4130
4152
|
if (data.state === "PAID") return "paid";
|
|
4131
4153
|
return "open";
|
|
@@ -4155,7 +4177,9 @@ var paykitInvoice$InboundSchema = (data, isSubscription) => {
|
|
|
4155
4177
|
};
|
|
4156
4178
|
};
|
|
4157
4179
|
var paykitSubscription$InboundSchema = (data) => {
|
|
4158
|
-
const itemId = JSON.parse(
|
|
4180
|
+
const itemId = JSON.parse(
|
|
4181
|
+
data.additional_params?.find((param) => param.name === core.PAYKIT_METADATA_KEY)?.value ?? "{}"
|
|
4182
|
+
).itemId;
|
|
4159
4183
|
const billingIntervalMap = {
|
|
4160
4184
|
DAY: "day",
|
|
4161
4185
|
WEEK: "week",
|
|
@@ -4236,12 +4260,8 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4236
4260
|
method: "createCheckout"
|
|
4237
4261
|
});
|
|
4238
4262
|
}
|
|
4239
|
-
const {
|
|
4240
|
-
amount,
|
|
4241
|
-
currency = "CZK",
|
|
4242
|
-
successUrl
|
|
4243
|
-
} = core.validateRequiredKeys(
|
|
4244
|
-
["amount", "currency", "successUrl"],
|
|
4263
|
+
const { amount, currency = "CZK" } = core.validateRequiredKeys(
|
|
4264
|
+
["amount", "currency"],
|
|
4245
4265
|
data.provider_metadata,
|
|
4246
4266
|
"The following fields must be present in the provider_metadata of createCheckout: {keys}"
|
|
4247
4267
|
);
|
|
@@ -4268,12 +4288,22 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4268
4288
|
currency,
|
|
4269
4289
|
order_number: crypto__namespace.randomBytes(8).toString("hex").slice(0, 15),
|
|
4270
4290
|
order_description: data.metadata?.description || "Checkout",
|
|
4271
|
-
items: [
|
|
4291
|
+
items: [
|
|
4292
|
+
{
|
|
4293
|
+
name: data.item_id,
|
|
4294
|
+
amount: Number(amount),
|
|
4295
|
+
count: data.quantity,
|
|
4296
|
+
type: "ITEM"
|
|
4297
|
+
}
|
|
4298
|
+
],
|
|
4272
4299
|
lang: data.provider_metadata?.lang ? data.provider_metadata.lang : "EN",
|
|
4273
|
-
callback: { return_url:
|
|
4300
|
+
callback: { return_url: data.success_url, notification_url: this.opts.webhookUrl },
|
|
4274
4301
|
additional_params: Object.entries({
|
|
4275
4302
|
...data.metadata,
|
|
4276
|
-
[core.PAYKIT_METADATA_KEY]: JSON.stringify({
|
|
4303
|
+
[core.PAYKIT_METADATA_KEY]: JSON.stringify({
|
|
4304
|
+
itemId: data.item_id,
|
|
4305
|
+
qty: data.quantity
|
|
4306
|
+
})
|
|
4277
4307
|
}).map(([name, value]) => ({
|
|
4278
4308
|
name,
|
|
4279
4309
|
value: String(value)
|
|
@@ -4287,9 +4317,12 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4287
4317
|
return response.value;
|
|
4288
4318
|
};
|
|
4289
4319
|
retrieveCheckout = async (id) => {
|
|
4290
|
-
const response = await this._client.get(
|
|
4291
|
-
|
|
4292
|
-
|
|
4320
|
+
const response = await this._client.get(
|
|
4321
|
+
`/payments/payment/${id}`,
|
|
4322
|
+
{
|
|
4323
|
+
headers: await this.authController.getAuthHeaders()
|
|
4324
|
+
}
|
|
4325
|
+
);
|
|
4293
4326
|
if (!response.ok) {
|
|
4294
4327
|
throw new core.OperationFailedError("retrieveCheckout", this.providerName, {
|
|
4295
4328
|
cause: new Error("Failed to retrieve checkout")
|
|
@@ -4340,8 +4373,8 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4340
4373
|
method: "createCheckout"
|
|
4341
4374
|
});
|
|
4342
4375
|
}
|
|
4343
|
-
const {
|
|
4344
|
-
["
|
|
4376
|
+
const { quantity, success_url } = core.validateRequiredKeys(
|
|
4377
|
+
["quantity", "success_url"],
|
|
4345
4378
|
data.provider_metadata,
|
|
4346
4379
|
"The following fields must be present in the provider_metadata of createCheckout: {keys}"
|
|
4347
4380
|
);
|
|
@@ -4351,6 +4384,18 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4351
4384
|
month: "MONTH",
|
|
4352
4385
|
year: "MONTH"
|
|
4353
4386
|
};
|
|
4387
|
+
const currentPeriodEnd = (() => {
|
|
4388
|
+
if (data.billing_interval === "day") {
|
|
4389
|
+
return new Date(Date.now() + 1 * 24 * 60 * 60 * 1e3).toISOString();
|
|
4390
|
+
}
|
|
4391
|
+
if (data.billing_interval === "week") {
|
|
4392
|
+
return new Date(Date.now() + 7 * 24 * 60 * 60 * 1e3).toISOString();
|
|
4393
|
+
}
|
|
4394
|
+
if (data.billing_interval === "month") {
|
|
4395
|
+
return new Date(Date.now() + 30 * 24 * 60 * 60 * 1e3).toISOString();
|
|
4396
|
+
}
|
|
4397
|
+
return new Date(Date.now() + 365 * 24 * 60 * 60 * 1e3).toISOString();
|
|
4398
|
+
})();
|
|
4354
4399
|
const recurrenceCycle = intervalMap[data.billing_interval] ?? "ON_DEMAND";
|
|
4355
4400
|
const goPaySubscriptionOptions = {
|
|
4356
4401
|
payer: {
|
|
@@ -4363,13 +4408,15 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4363
4408
|
currency: data.currency ?? "CZK",
|
|
4364
4409
|
order_number: crypto__namespace.randomBytes(8).toString("hex").slice(0, 15),
|
|
4365
4410
|
order_description: data.metadata?.description || "Subscription",
|
|
4366
|
-
items: [
|
|
4411
|
+
items: [
|
|
4412
|
+
{ name: data.item_id, amount: Number(data.amount), count: parseInt(quantity) }
|
|
4413
|
+
],
|
|
4367
4414
|
recurrence: {
|
|
4368
4415
|
recurrence_cycle: recurrenceCycle,
|
|
4369
4416
|
recurrence_period: parseInt(quantity),
|
|
4370
|
-
recurrence_date_to:
|
|
4417
|
+
recurrence_date_to: currentPeriodEnd
|
|
4371
4418
|
},
|
|
4372
|
-
callback: { return_url:
|
|
4419
|
+
callback: { return_url: success_url, notification_url: this.opts.webhookUrl }
|
|
4373
4420
|
};
|
|
4374
4421
|
const response = await this._client.post("/payments/payment", {
|
|
4375
4422
|
body: JSON.stringify(goPaySubscriptionOptions),
|
|
@@ -4414,9 +4461,12 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4414
4461
|
return null;
|
|
4415
4462
|
};
|
|
4416
4463
|
retrieveSubscription = async (id) => {
|
|
4417
|
-
const response = await this._client.get(
|
|
4418
|
-
|
|
4419
|
-
|
|
4464
|
+
const response = await this._client.get(
|
|
4465
|
+
`/payments/payment/${id}`,
|
|
4466
|
+
{
|
|
4467
|
+
headers: await this.authController.getAuthHeaders()
|
|
4468
|
+
}
|
|
4469
|
+
);
|
|
4420
4470
|
if (!response.ok) {
|
|
4421
4471
|
throw new core.OperationFailedError("retrieveSubscription", this.providerName, {
|
|
4422
4472
|
cause: new Error("Failed to retrieve subscription")
|
|
@@ -4427,24 +4477,23 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4427
4477
|
};
|
|
4428
4478
|
createPayment = async (params) => {
|
|
4429
4479
|
const { error, data } = core.createPaymentSchema.safeParse(params);
|
|
4430
|
-
if (error)
|
|
4480
|
+
if (error)
|
|
4481
|
+
throw core.ValidationError.fromZodError(error, this.providerName, "createPayment");
|
|
4431
4482
|
if (typeof data.customer == "string" || typeof data.customer === "object" && !data.customer.email) {
|
|
4432
4483
|
throw new core.InvalidTypeError("customer", "object (customer) with email", "string", {
|
|
4433
4484
|
provider: this.providerName,
|
|
4434
4485
|
method: "createPayment"
|
|
4435
4486
|
});
|
|
4436
4487
|
}
|
|
4437
|
-
if (!data.
|
|
4438
|
-
throw new core.ConfigurationError(
|
|
4439
|
-
|
|
4440
|
-
|
|
4441
|
-
|
|
4488
|
+
if (!data.item_id) {
|
|
4489
|
+
throw new core.ConfigurationError(
|
|
4490
|
+
"item_id is required, this is the name of the item in GoPay",
|
|
4491
|
+
{
|
|
4492
|
+
provider: this.providerName,
|
|
4493
|
+
missingKeys: ["item_id"]
|
|
4494
|
+
}
|
|
4495
|
+
);
|
|
4442
4496
|
}
|
|
4443
|
-
const { quantity } = core.validateRequiredKeys(
|
|
4444
|
-
["quantity"],
|
|
4445
|
-
data.provider_metadata,
|
|
4446
|
-
"The following fields must be present in the provider_metadata of createPayment: {keys}"
|
|
4447
|
-
);
|
|
4448
4497
|
const goPayRequest = {
|
|
4449
4498
|
payer: {
|
|
4450
4499
|
allowed_payment_instruments: ["PAYMENT_CARD", "BANK_ACCOUNT"],
|
|
@@ -4455,13 +4504,13 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4455
4504
|
amount: data.amount,
|
|
4456
4505
|
currency: data.currency ?? "CZK",
|
|
4457
4506
|
order_number: crypto__namespace.randomBytes(8).toString("hex").slice(0, 15),
|
|
4458
|
-
order_description: data.
|
|
4459
|
-
items: [{ name: data.
|
|
4507
|
+
order_description: `Payment for ${data.item_id} by ${data.customer.email}`,
|
|
4508
|
+
items: [{ name: data.item_id, amount: data.amount, count: 1 }],
|
|
4460
4509
|
preauthorization: false,
|
|
4461
4510
|
// automatically captures the payment
|
|
4462
4511
|
additional_params: Object.entries({
|
|
4463
4512
|
...data.metadata,
|
|
4464
|
-
[core.PAYKIT_METADATA_KEY]: JSON.stringify({ itemId: data.
|
|
4513
|
+
[core.PAYKIT_METADATA_KEY]: JSON.stringify({ itemId: data.item_id, qty: 1 })
|
|
4465
4514
|
}).map(([name, value]) => ({
|
|
4466
4515
|
name,
|
|
4467
4516
|
value: String(value)
|
|
@@ -4480,9 +4529,12 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4480
4529
|
return response.value;
|
|
4481
4530
|
};
|
|
4482
4531
|
retrievePayment = async (id) => {
|
|
4483
|
-
const response = await this._client.get(
|
|
4484
|
-
|
|
4485
|
-
|
|
4532
|
+
const response = await this._client.get(
|
|
4533
|
+
`/payments/payment/${id}`,
|
|
4534
|
+
{
|
|
4535
|
+
headers: await this.authController.getAuthHeaders()
|
|
4536
|
+
}
|
|
4537
|
+
);
|
|
4486
4538
|
if (!response.ok) {
|
|
4487
4539
|
throw new core.OperationFailedError("retrievePayment", this.providerName, {
|
|
4488
4540
|
cause: new Error("Failed to retrieve payment")
|
|
@@ -4498,9 +4550,12 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4498
4550
|
});
|
|
4499
4551
|
};
|
|
4500
4552
|
capturePayment = async (id, params) => {
|
|
4501
|
-
const payment = await this._client.get(
|
|
4502
|
-
|
|
4503
|
-
|
|
4553
|
+
const payment = await this._client.get(
|
|
4554
|
+
`/payments/payment/${id}`,
|
|
4555
|
+
{
|
|
4556
|
+
headers: await this.authController.getAuthHeaders()
|
|
4557
|
+
}
|
|
4558
|
+
);
|
|
4504
4559
|
if (!payment.ok) {
|
|
4505
4560
|
throw new core.OperationFailedError("capturePayment", this.providerName, {
|
|
4506
4561
|
cause: new Error("Failed to retrieve payment")
|
|
@@ -4528,9 +4583,12 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4528
4583
|
return paykitPayment$InboundSchema(payment.value);
|
|
4529
4584
|
};
|
|
4530
4585
|
cancelPayment = async (id) => {
|
|
4531
|
-
const response = await this._client.post(
|
|
4532
|
-
|
|
4533
|
-
|
|
4586
|
+
const response = await this._client.post(
|
|
4587
|
+
`/payments/payment/${id}/void-authorization`,
|
|
4588
|
+
{
|
|
4589
|
+
headers: await this.authController.getAuthHeaders()
|
|
4590
|
+
}
|
|
4591
|
+
);
|
|
4534
4592
|
console.dir({ response }, { depth: 100 });
|
|
4535
4593
|
const payment = await this.retrievePayment(id);
|
|
4536
4594
|
if (!payment) {
|
|
@@ -4555,7 +4613,8 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4555
4613
|
};
|
|
4556
4614
|
async createRefund(params) {
|
|
4557
4615
|
const { error, data } = core.createRefundSchema.safeParse(params);
|
|
4558
|
-
if (error)
|
|
4616
|
+
if (error)
|
|
4617
|
+
throw core.ValidationError.fromZodError(error, this.providerName, "createRefund");
|
|
4559
4618
|
const payment = await this.retrievePayment(data.payment_id);
|
|
4560
4619
|
if (!payment) {
|
|
4561
4620
|
throw new core.OperationFailedError("createRefund", this.providerName, {
|
|
@@ -4601,7 +4660,9 @@ var GoPayProvider = class extends core.AbstractPayKitProvider {
|
|
|
4601
4660
|
})
|
|
4602
4661
|
);
|
|
4603
4662
|
if (error) {
|
|
4604
|
-
throw new core.WebhookError("Failed to retrieve payment", {
|
|
4663
|
+
throw new core.WebhookError("Failed to retrieve payment", {
|
|
4664
|
+
provider: this.providerName
|
|
4665
|
+
});
|
|
4605
4666
|
}
|
|
4606
4667
|
if (!payment.value) {
|
|
4607
4668
|
throw new core.WebhookError("Payment not found", { provider: this.providerName });
|
|
@@ -4760,7 +4821,13 @@ var createGopay = (config) => {
|
|
|
4760
4821
|
};
|
|
4761
4822
|
var gopay = () => {
|
|
4762
4823
|
const envVars = core.validateRequiredKeys(
|
|
4763
|
-
[
|
|
4824
|
+
[
|
|
4825
|
+
"GOPAY_CLIENT_ID",
|
|
4826
|
+
"GOPAY_CLIENT_SECRET",
|
|
4827
|
+
"GOPAY_GO_ID",
|
|
4828
|
+
"GOPAY_SANDBOX",
|
|
4829
|
+
"GOPAY_WEBHOOK_URL"
|
|
4830
|
+
],
|
|
4764
4831
|
process.env,
|
|
4765
4832
|
"Missing required environment variables: {keys}"
|
|
4766
4833
|
);
|