medusa-payment-tamara
Version:
Tamara payment gateway plugin for Medusa
201 lines (200 loc) • 7.87 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const medusa_1 = require("@medusajs/medusa");
const axios_1 = __importDefault(require("axios"));
const medusa_core_utils_1 = require("medusa-core-utils");
class MyPaymentProcessor extends medusa_1.AbstractPaymentProcessor {
constructor({ itemsService, logger }, options) {
super(arguments[0]);
this.itemsService = itemsService;
this.logger = logger;
this.tamara_token = options.tamara_token;
this.tamara_api = options.tamara_api;
this.web_endpoint = options.web_endpoint;
}
updatePaymentData(sessionId, data) {
throw new Error("1");
}
async capturePayment(paymentSessionData) {
const cart = this.cart;
const amount = cart.total;
try {
var id;
if (paymentSessionData.hasOwnProperty("payment")) {
// @ts-ignore
id = paymentSessionData.payment.id;
}
else {
id = paymentSessionData.id;
}
const data = {
"order_id": id,
"total_amount": {
"amount": amount / 100,
"currency": cart.region.currency_code,
},
"shipping_info": {
"shipped_at": "2019-08-24T14:15:22Z",
"shipping_company": cart.shipping_methods[0],
}
};
const headers = {
authorization: `Bearer ${this.tamara_token}`,
};
await axios_1.default.post(`${this.tamara_api}/payments/capture`, data, { headers });
return await this.retrievePayment(paymentSessionData);
}
catch (error) {
this.logger.error(error.message);
return error;
}
}
async authorizePayment(paymentSessionData, context) {
try {
const status = await this.getPaymentStatus(paymentSessionData);
const temp = await this.retrievePayment(paymentSessionData);
const data = { ...temp };
const id = paymentSessionData.order_id;
const headers = {
authorization: `Bearer ${this.tamara_token}`,
};
const res = await axios_1.default.post(`${this.tamara_api}/orders/${id}/authorise`, {}, { headers });
return {
status,
data,
};
}
catch (error) {
const e = {
"error": error
};
return e;
}
}
async cancelPayment(paymentSessionData) {
return {
id: "cancel",
};
}
async initiatePayment(context) {
var _a, _b, _c, _d, _e, _f, _g, _h;
const cart = await this.itemsService.getCart(context.resource_id);
this.cart = cart;
const currency_code = cart.region.currency_code.toUpperCase();
const price = context.amount / 100;
const data = {
"order_reference_id": context.resource_id,
"total_amount": {
"amount": price,
"currency": currency_code
},
"description": `Customer Order n° ${context.resource_id} with total of ${(0, medusa_core_utils_1.humanizeAmount)(context.amount, context.currency_code)}`,
"country_code": currency_code.slice(0, 2),
"payment_type": "PAY_BY_INSTALMENTS",
"instalments": 3,
"items": await this.itemsService.getitems(context),
"consumer": {
"first_name": ((_a = cart.customer) === null || _a === void 0 ? void 0 : _a.first_name) || "Guest",
"last_name": ((_b = cart.customer) === null || _b === void 0 ? void 0 : _b.last_name) || "Customer",
"phone_number": ((_c = cart.customer) === null || _c === void 0 ? void 0 : _c.phone) || "+966500000001",
"email": ((_d = cart.customer) === null || _d === void 0 ? void 0 : _d.email) || "",
},
"shipping_address": {
"first_name": ((_e = cart.customer) === null || _e === void 0 ? void 0 : _e.first_name) || "Guest",
"last_name": ((_f = cart.customer) === null || _f === void 0 ? void 0 : _f.last_name) || "Customer",
"line1": (_g = cart.shipping_address) === null || _g === void 0 ? void 0 : _g.address_1,
"city": (_h = cart.shipping_address) === null || _h === void 0 ? void 0 : _h.city,
"country_code": currency_code.slice(0, 2),
},
"tax_amount": {
"amount": cart.tax_total / 100,
"currency": currency_code
},
"shipping_amount": {
"amount": cart.shipping_total / 100,
"currency": currency_code
},
"merchant_url": {
"success": `${this.web_endpoint}/checkout`,
"failure": `${this.web_endpoint}/failure`,
"cancel": `${this.web_endpoint}/cancel`,
"notification": "https://example.com/payments/tamarapay"
},
"platform": "medusa"
};
const config = {
headers: {
Authorization: `Bearer ${this.tamara_token}`,
},
};
this.logger.info(`data: ${JSON.stringify(data)}`);
const url = `${this.tamara_api}/checkout`;
const response = await axios_1.default.post(url, data, config);
const responseData = await response.data;
return responseData;
}
async deletePayment(paymentSessionData) {
return paymentSessionData;
}
async getPaymentStatus(paymentSessionData) {
return medusa_1.PaymentSessionStatus.AUTHORIZED;
}
async refundPayment(paymentSessionData, refundAmount) {
try {
var id;
if (paymentSessionData.hasOwnProperty("payment")) {
// @ts-ignore
id = paymentSessionData.payment.id;
}
else {
id = paymentSessionData.id;
}
const amount = refundAmount / 100;
const payment_id = id;
const data = {
"total_amount": {
amount: amount,
currency: this.cart.region.currency_code
},
"comment": `Refund for the order ${id}`
};
const headers = {
authorization: `Bearer ${this.tamara_token}`,
};
await axios_1.default.post(`${this.tamara_api}/payments/simplified-refund/${payment_id}`, data, { headers });
return await this.retrievePayment(paymentSessionData);
}
catch (error) {
return error;
}
}
async retrievePayment(paymentSessionData) {
try {
var id;
if (paymentSessionData.hasOwnProperty("payment")) {
// @ts-ignore
id = paymentSessionData.payment.id;
}
else {
id = paymentSessionData.id;
}
const headers = {
authorization: `Bearer ${this.tamara_token}`,
};
const response = await axios_1.default.get(`${this.tamara_api}/orders/${id}`, { headers });
const responseData = response.data;
return responseData;
}
catch (error) {
return error;
}
}
async updatePayment(context) {
this.initiatePayment(context);
}
}
MyPaymentProcessor.identifier = "Tamara";
exports.default = MyPaymentProcessor;