UNPKG

@des1re7/medusa-payment-tbank

Version:

T-Bank Payment Provider for Medusa Commerce

709 lines (604 loc) 25.8 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _medusa = require("@medusajs/medusa"); var _axios = _interopRequireDefault(require("axios")); var _token = _interopRequireDefault(require("../utils/token")); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } var TinkoffPaymentService = /*#__PURE__*/function (_AbstractPaymentProce) { (0, _inherits2["default"])(TinkoffPaymentService, _AbstractPaymentProce); var _super = _createSuper(TinkoffPaymentService); function TinkoffPaymentService(_, options) { var _this; (0, _classCallCheck2["default"])(this, TinkoffPaymentService); _this = _super.call(this, _, options); _this.api_url = options.api_url || "https://securepay.tinkoff.ru/v2"; _this.terminalKey = options.terminalKey; _this.password = options.password; _this.notificationURL = options.notificationURL; _this.isLogging = options.isLogging; return _this; } (0, _createClass2["default"])(TinkoffPaymentService, [{ key: "initiatePayment", value: function () { var _initiatePayment = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(context) { var amount, resource_id, email, orderId, responseData, success; return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: this.Log("initiatePayment"); _context.prev = 1; amount = context.amount, resource_id = context.resource_id, email = context.email; orderId = "".concat(resource_id, "_").concat(Date.now()); _context.next = 6; return this.initPayment(orderId, amount); case 6: responseData = _context.sent; success = responseData.Success; if (success) { _context.next = 10; break; } return _context.abrupt("return", { error: "Message: ".concat(responseData.Message, "\r\nDetails: ").concat(responseData.Details) }); case 10: return _context.abrupt("return", { session_data: { id: responseData.PaymentId, orderId: orderId, PaymentURL: responseData.PaymentURL, contextAmount: amount, paymentAmount: responseData.Amount } }); case 13: _context.prev = 13; _context.t0 = _context["catch"](1); return _context.abrupt("return", { error: _context.t0.message }); case 16: case "end": return _context.stop(); } } }, _callee, this, [[1, 13]]); })); function initiatePayment(_x) { return _initiatePayment.apply(this, arguments); } return initiatePayment; }() }, { key: "updatePayment", value: function () { var _updatePayment = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(context) { var amount, resource_id, paymentSessionData, orderId, responseData, cancelData, _orderId, _responseData; return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: this.Log("updatePayment"); _context2.prev = 1; amount = context.amount, resource_id = context.resource_id, paymentSessionData = context.paymentSessionData; if (!(paymentSessionData.status && paymentSessionData.status.toLowerCase() === 'canceled')) { _context2.next = 10; break; } this.Log("The payment was canceled or rejected. Recreating this payment."); orderId = "".concat(resource_id, "_").concat(Date.now()); _context2.next = 8; return this.initPayment(orderId, amount); case 8: responseData = _context2.sent; return _context2.abrupt("return", { session_data: { id: responseData.PaymentId, orderId: orderId, PaymentURL: responseData.PaymentURL, contextAmount: amount, paymentAmount: responseData.Amount } }); case 10: if (!(amount != paymentSessionData.paymentAmount)) { _context2.next = 22; break; } this.Log("The amounts did not match. Recreating the payment."); _context2.next = 14; return this.cancelPayment(paymentSessionData); case 14: cancelData = _context2.sent; if (!cancelData.error) { _context2.next = 17; break; } return _context2.abrupt("return", cancelData); case 17: _orderId = "".concat(resource_id, "_").concat(Date.now()); _context2.next = 20; return this.initPayment(_orderId, amount); case 20: _responseData = _context2.sent; return _context2.abrupt("return", { session_data: { id: _responseData.PaymentId, orderId: _orderId, PaymentURL: _responseData.PaymentURL, contextAmount: amount, paymentAmount: _responseData.Amount } }); case 22: return _context2.abrupt("return", { session_data: { id: paymentSessionData.id, orderId: paymentSessionData.orderId, PaymentURL: paymentSessionData.PaymentURL, contextAmount: amount, paymentAmount: paymentSessionData.paymentAmount } }); case 25: _context2.prev = 25; _context2.t0 = _context2["catch"](1); return _context2.abrupt("return", { error: _context2.t0.message }); case 28: case "end": return _context2.stop(); } } }, _callee2, this, [[1, 25]]); })); function updatePayment(_x2) { return _updatePayment.apply(this, arguments); } return updatePayment; }() }, { key: "authorizePayment", value: function () { var _authorizePayment = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(paymentSessionData, context) { var status; return _regenerator["default"].wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: this.Log("authorizePayment"); _context3.prev = 1; _context3.next = 4; return this.getStatus(paymentSessionData.id); case 4: status = _context3.sent; return _context3.abrupt("return", { status: status, data: { id: paymentSessionData.id, orderId: paymentSessionData.orderId, status: status, PaymentURL: paymentSessionData.PaymentURL, contextAmount: paymentSessionData.contextAmount, paymentAmount: paymentSessionData.paymentAmount } }); case 8: _context3.prev = 8; _context3.t0 = _context3["catch"](1); return _context3.abrupt("return", { error: _context3.t0.message }); case 11: case "end": return _context3.stop(); } } }, _callee3, this, [[1, 8]]); })); function authorizePayment(_x3, _x4) { return _authorizePayment.apply(this, arguments); } return authorizePayment; }() }, { key: "capturePayment", value: function () { var _capturePayment = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(paymentSessionData) { var paymentId, data, response, success, errorMessage; return _regenerator["default"].wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: this.Log("capturePayment"); _context4.prev = 1; paymentId = paymentSessionData.id; data = { TerminalKey: this.terminalKey, PaymentId: paymentId, Amount: paymentSessionData.contextAmount }; data.Token = (0, _token["default"])(data, this.password); this.Log("Request:"); this.Log(data); _context4.next = 9; return _axios["default"].post("".concat(this.api_url, "/Confirm"), data); case 9: response = _context4.sent; this.Log("Response:"); this.Log(response.data); success = response.data.Success; if (success) { _context4.next = 17; break; } errorMessage = "Message: ".concat(response.data.Message, "\r\nDetails: ").concat(response.data.Details); console.error("Error: ".concat(errorMessage)); return _context4.abrupt("return", { code: response.data.ErrorCode, error: response.data.Message, detail: response.data.Details }); case 17: return _context4.abrupt("return", _objectSpread({ id: paymentId }, response.data)); case 20: _context4.prev = 20; _context4.t0 = _context4["catch"](1); return _context4.abrupt("return", { error: _context4.t0.message }); case 23: case "end": return _context4.stop(); } } }, _callee4, this, [[1, 20]]); })); function capturePayment(_x5) { return _capturePayment.apply(this, arguments); } return capturePayment; }() }, { key: "refundPayment", value: function () { var _refundPayment = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(paymentSessionData, refundAmount) { var paymentId, data, response, success; return _regenerator["default"].wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: this.Log("refundPayment"); _context5.prev = 1; paymentId = paymentSessionData.id; data = { TerminalKey: this.terminalKey, PaymentId: paymentId, Amount: refundAmount }; data.Token = (0, _token["default"])(data, this.password); this.Log("Request"); this.Log(data); _context5.next = 9; return _axios["default"].post("".concat(this.api_url, "/Cancel"), data); case 9: response = _context5.sent; this.Log("Response:"); this.Log(response.data); success = response.data.Success; if (success) { _context5.next = 15; break; } return _context5.abrupt("return", { error: "Message: ".concat(response.data.Message, "\r\nDetails: ").concat(response.data.Details) }); case 15: return _context5.abrupt("return", _objectSpread({ id: paymentId }, response.data)); case 18: _context5.prev = 18; _context5.t0 = _context5["catch"](1); return _context5.abrupt("return", { error: _context5.t0.message }); case 21: case "end": return _context5.stop(); } } }, _callee5, this, [[1, 18]]); })); function refundPayment(_x6, _x7) { return _refundPayment.apply(this, arguments); } return refundPayment; }() }, { key: "cancelPayment", value: function () { var _cancelPayment = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6(paymentSessionData) { var paymentId, data, response, success; return _regenerator["default"].wrap(function _callee6$(_context6) { while (1) { switch (_context6.prev = _context6.next) { case 0: this.Log("cancelPayment"); _context6.prev = 1; paymentId = paymentSessionData.id; data = { TerminalKey: this.terminalKey, PaymentId: paymentId }; data.Token = (0, _token["default"])(data, this.password); this.Log("Request:"); this.Log(data); _context6.next = 9; return _axios["default"].post("".concat(this.api_url, "/Cancel"), data); case 9: response = _context6.sent; this.Log("Response:"); this.Log(response.data); success = response.data.Success; if (success) { _context6.next = 15; break; } return _context6.abrupt("return", { error: "Message: ".concat(response.data.Message, "\r\nDetails: ").concat(response.data.Details) }); case 15: return _context6.abrupt("return", _objectSpread({ id: paymentId }, response.data)); case 18: _context6.prev = 18; _context6.t0 = _context6["catch"](1); return _context6.abrupt("return", { error: _context6.t0.message }); case 21: case "end": return _context6.stop(); } } }, _callee6, this, [[1, 18]]); })); function cancelPayment(_x8) { return _cancelPayment.apply(this, arguments); } return cancelPayment; }() }, { key: "getPaymentStatus", value: function () { var _getPaymentStatus = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(paymentSessionData) { var status; return _regenerator["default"].wrap(function _callee7$(_context7) { while (1) { switch (_context7.prev = _context7.next) { case 0: this.Log("getPaymentStatus"); _context7.prev = 1; _context7.next = 4; return this.getStatus(paymentSessionData.id); case 4: status = _context7.sent; return _context7.abrupt("return", status); case 8: _context7.prev = 8; _context7.t0 = _context7["catch"](1); return _context7.abrupt("return", _medusa.PaymentSessionStatus.ERROR); case 11: case "end": return _context7.stop(); } } }, _callee7, this, [[1, 8]]); })); function getPaymentStatus(_x9) { return _getPaymentStatus.apply(this, arguments); } return getPaymentStatus; }() }, { key: "deletePayment", value: function () { var _deletePayment = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8(paymentSessionData) { return _regenerator["default"].wrap(function _callee8$(_context8) { while (1) { switch (_context8.prev = _context8.next) { case 0: console.warn("deletePayment: Method not implemented."); return _context8.abrupt("return", {}); case 2: case "end": return _context8.stop(); } } }, _callee8); })); function deletePayment(_x10) { return _deletePayment.apply(this, arguments); } return deletePayment; }() }, { key: "retrievePayment", value: function () { var _retrievePayment = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9(paymentSessionData) { return _regenerator["default"].wrap(function _callee9$(_context9) { while (1) { switch (_context9.prev = _context9.next) { case 0: console.warn("retrievePayment: Method not implemented."); return _context9.abrupt("return", paymentSessionData); case 2: case "end": return _context9.stop(); } } }, _callee9); })); function retrievePayment(_x11) { return _retrievePayment.apply(this, arguments); } return retrievePayment; }() }, { key: "updatePaymentData", value: function () { var _updatePaymentData = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10(sessionId, data) { return _regenerator["default"].wrap(function _callee10$(_context10) { while (1) { switch (_context10.prev = _context10.next) { case 0: console.warn("updatePaymentData: Method not implemented."); return _context10.abrupt("return", { id: data.id }); case 2: case "end": return _context10.stop(); } } }, _callee10); })); function updatePaymentData(_x12, _x13) { return _updatePaymentData.apply(this, arguments); } return updatePaymentData; }() }, { key: "generateInitOrderData", value: function generateInitOrderData(orderId, amount) { var data = { TerminalKey: this.terminalKey, Amount: amount, OrderId: orderId, Description: orderId, PayType: "T" }; if (this.notificationURL) { data.NotificationURL = this.notificationURL; } data.Token = (0, _token["default"])(data, this.password); return data; } }, { key: "initPayment", value: function () { var _initPayment = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11(orderId, amount) { var data, response; return _regenerator["default"].wrap(function _callee11$(_context11) { while (1) { switch (_context11.prev = _context11.next) { case 0: data = this.generateInitOrderData(orderId, amount); this.Log("Request:"); this.Log(data); _context11.next = 5; return _axios["default"].post("".concat(this.api_url, "/Init"), data); case 5: response = _context11.sent; this.Log("Response:"); this.Log(response.data); return _context11.abrupt("return", response.data); case 9: case "end": return _context11.stop(); } } }, _callee11, this); })); function initPayment(_x14, _x15) { return _initPayment.apply(this, arguments); } return initPayment; }() }, { key: "getStatus", value: function () { var _getStatus = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12(paymentId) { var data, response, success, statusResponse, status; return _regenerator["default"].wrap(function _callee12$(_context12) { while (1) { switch (_context12.prev = _context12.next) { case 0: data = { TerminalKey: this.terminalKey, PaymentId: paymentId, Token: '' }; data.Token = (0, _token["default"])(data, this.password); this.Log("Request:"); this.Log(data); _context12.next = 6; return _axios["default"].post("".concat(this.api_url, "/GetState"), data); case 6: response = _context12.sent; this.Log("Response:"); this.Log(response.data); success = response.data.Success; if (success) { _context12.next = 12; break; } throw new Error("Message: ".concat(response.data.Message, "\r\nDetails: ").concat(response.data.Details)); case 12: statusResponse = response.data.Status; status = _medusa.PaymentSessionStatus.PENDING; if (statusResponse === "CONFIRMED" || statusResponse === "AUTHORIZED") { status = _medusa.PaymentSessionStatus.AUTHORIZED; } else if (statusResponse === "REJECTED") { status = _medusa.PaymentSessionStatus.CANCELED; } else if (statusResponse === "FORM_SHOWED") { status = _medusa.PaymentSessionStatus.PENDING; } return _context12.abrupt("return", status); case 16: case "end": return _context12.stop(); } } }, _callee12, this); })); function getStatus(_x16) { return _getStatus.apply(this, arguments); } return getStatus; }() }, { key: "Log", value: function Log(message) { if (this.isLogging) { console.log(message); } } }]); return TinkoffPaymentService; }(_medusa.AbstractPaymentProcessor); (0, _defineProperty2["default"])(TinkoffPaymentService, "identifier", "tbank"); var _default = TinkoffPaymentService; exports["default"] = _default;