Nodejs를 사용하는 결제 게이트웨이 Stripe/Paypal의 종속성 역전

14684 단어 solidnodeoopjavascript
오늘 다룰 내용
  • 종속성 반전 아이디어
  • 결제 게이트웨이 Stripe/Paypal의 문제/해결책
  • 전자 상거래 프로젝트에서 사용할 수 있는 실제 시나리오

  • 종속성 역전


  • 높은 수준의 모듈은 낮은 수준의 모듈에 의존해서는 안 되며 둘 다 추상화에 의존해야 합니다
  • 아니면 상위 클래스는 항상 세부 사항보다는 클래스의 추상화에 의존해야 한다고 말할 수 있습니다.

  • 이 정의에서 우리는 말할 수 있습니다


    우리는 코드가 우리가 사용하고 있는 종속성의 실제 구현이 아니라 우리가 만든 래퍼에 의존하기를 원할 뿐입니다.

    우리가 가진 문제


  • Stripe에서 결제 게이트웨이 변경 >> Paypal은 매우 어려울 것이며 수많은 코드를 변경해야 함
  • 우리의 코드는 결제 서비스의 실제 구현에 따라 달라지며 유지 관리가 어려울 것입니다
  • 모든 것을 처음부터 다시 테스트
  • 나중에 추적하기가 정말 어려워지는 트랜잭션 만들기

  • 해결책




  • 중간 레이어 생성 이 레이어는 결제 게이트웨이 서비스 주변의 래퍼가 됩니다
  • 예: StripeServiceWrapper, PaypalServiceWrapper
  • 그래서 우리는 이 래퍼를 사용하여 지불 게이트웨이 아이디어를 추상화합니다.
  • 우리의 코드는 이제 우리가 사용하고 있는 종속성의 실제 구현이 아닌 이러한 래퍼에 의존합니다
  • .

    몇 가지 코드 스니펫으로 시작하겠습니다.



    결제 스토어
    여기서 우리는 래퍼를 주입하고 우리가 원하는 누구와도 쉽게 거래할 것입니다.

    import PaymentService from "./PaymentService";
    class PaymentStore {
      constructor(paymentWrapper) {
        this.paymentWrapper = paymentWrapper;
        this.paymentService = new PaymentService();
      }
    
      async makeTransaction(chargeData) {
        const charge = await this.paymentWrapper.createCharge(chargeData);
        await this.paymentService.addNewCharge(charge);
        return charge;
      }
    }
    
    export default PaymentStore;
    


    스트라이프 래퍼

    import Stripe from "stripe";
    import mockPayment from "./Stripe/mockPayment";
    class StripeServiceWrapper {
      constructor() {
        this.stripe = new Stripe(process.env.STRIPE_SECRET_KEY);
      }
      async createCharge() {
        const { amount, currency, description, source } = mockPayment;
        const charge = await this.stripe.charges.create({
          amount,
          currency,
          description,
          source,
        });
        return charge;
      }
    
      async createCustomer(customerData) {
        const { name, email, source, address, phone } = customerData;
        const customer = await stripe.customers.create({
          address,
          name,
          email,
          phone,
          source,
        });
        return customer;
      }
    }
    
    export default StripeServiceWrapper;
    


    페이팔 래퍼

    import paypal from "paypal-rest-sdk";
    import "./PayPal/PayPalConfig";
    
    class PayPalServiceWrapper {
      createCharge({ payment_object, paymentId }) {
        return new Promise(function (resolve, reject) {
          paypal.payment.execute(paymentId, payment_object, function (error, payment) {
            if (error) reject(error);
            else {
              const { id, transactions } = payment;
              resolve({ id, amount: parseInt(transactions[0].amount.total) });
            }
          });
        });
      }
    
      paymentExecutionLink(paymentObject) {
        return new Promise(function (resolve, reject) {
          paypal.payment.create(paymentObject, function (error, payment) {
            if (error) reject(error);
            else resolve(payment);
          });
        });
      }
    
      getRedirectLink(links) {
        for (let i = 0; i < links.length; i++) {
          if (links[i].rel === "approval_url") return links[i].href;
        }
      }
    }
    
    export default PayPalServiceWrapper;
    




    이제 컨트롤러에서 Stripe에서 Paypal로 전환하는 것이 매우 쉬울 것입니다.



    const post = async (req, res) => {
      const store = new PaymentStore(new StripeServiceWrapper());
      await store.makeTransaction();
      return res.status(200).send({SUCCESS_MESSAGE});
    };
    


    코드와 쉽게 시작하는 방법을 찾을 수 있습니다.



    https://github.com/eslamelkholy/Payment-Gateway-Stripe-Paypal-Using-Dependency-Inversion

    참조



    https://en.wikipedia.org/wiki/Dependency_inversion_principle

    https://www.geeksforgeeks.org/dependecy-inversion-principle-solid/

    좋은 웹페이지 즐겨찾기