테이프, 노드, 택배를 통해 지불 처리

게이트웨이를 지불해야 하는 이유는 무엇입니까?

  • 우리가 전자상거래 쇼핑몰을 만들고 있다고 가정하자.지불 처리는 전자상거래 사이트의 관건적인 부분 중의 하나다.
  • PayPal, Amazon Pay, World Pay, Stripe 등 많은 다른 결제 게이트웨이를 사용할 수 있습니다. 그러나 본 강좌에서 우리는 Stripe를 계속 사용할 것입니다.
  • 지급망을 사용하는 것은 자금을 옮기기 위한 것이 아니라 다른 장점도 있다.
  • 지불망의 중점은 고객과 상인 간에 안전 통로를 만들어 안전 지불을 추진하는 것이다.
  • 이 강좌에서는 STRIPE를 사용하여 Node JS에 대한 결제 게이트웨이 서비스를 만듭니다.

    Github 리셋 링크 및 집배원 모음: 여기를 클릭하십시오.


    우리는 이곳에서 무엇을 건설합니까?


    1) 고객의 세부 정보를 스트라이프에 저장
    2) 스트라이프에 고객 카드를 추가합니다.
    3) 고객 카드를 확인합니다.
    4) 고객 카드를 업데이트합니다.
    5) 스트라이프에서 고객의 카드 삭제
    6) 저장된 카드로 결제합니다.
    7) 일시불로 결제하고 카드 정보를 저장하지 않습니다.

    고객의 민감한 카드에 대한 상세한 정보를 어떻게 저장합니까?


    우리는 우선 비용을 만들고 비용 상세 정보를 고객에게 저장할 것이며, 이를 API에 전달함으로써 카드의 상세 정보를 직접 저장하지 않을 것이다.우리는 카드 정보를 직접 처리하지 않을 것이며, 우리의 생산 통합은 PCI Compliant 방식으로 개발되었다.이것도 Stripe가 추천한 것이다.

    뭐 공부 해요?

  • 스트라이프 API 키
  • 시스템에 설치된 노드 버전 >=12
  • 집배원/불면증(API 호출 테스트용 기타 소프트웨어)
  • 스트라이프 API 키 가져오기:

  • 로그인Stripe Dashboard을 통해 자신의 스트라이프 API 키를 획득하고 테스트 키를 획득할 수 있습니다.그것은 보기에 이와 같은 "sk\u live\u..."3Vls’.
  • 이 강좌에서, 우리는stripe가 제공하는 here 의 기본 샌드박스 키를 사용할 것입니다.
  • 주:


    If you are using your own API key, then make sure to turn on "TEST MODE" from your Stripe Dashboard otherwise you might face some unexpected charges during the test and you will be able to see the test transactions in your dashboard.


    시작:

  • Stripe는 센트 단위로 비용을 받기 때문에 200달러를 받으려면 20000달러(200x100=20000달러)가 됩니다.
  • 저희는 데이터베이스를 사용하지 않기 때문에 이 강좌에서 저는 고객 ID를 상량으로만 저장합니다.따라서 이 옵션을 사용하면 고객의 테이프 데이터를 저장하려면 데이터베이스에 연결되어 있는지 확인하십시오.
  • 설치 의존 항목.
    $ npm init
    
    Express, Stripe Node 패키지 설치
    $ npm install express 
    $ npm install --save stripe
    

    지수회사 명


    자, 이제 index라는 첫 번째 파일을 만듭니다.js.생성된 후에는 파일 상단에 프로젝트에 필요한 모든 종속 항목이 포함되기를 원합니다.
    const express = require("express");
    const app = express();
    const port = 3000;
    
    app.use(express.json());
    
    서버가 정상적으로 작동하는지 테스트하고 확인하려면 포트 3000에서 이 함수를 실행하고 성공하면 문자열을 기록합니다.
    app.get("/", (req, res) => {
      res.send("Hello World!");
    });
    
    app.listen(port, () => {
      console.log(`App listening at http://localhost:${port}`);
    });
    
    지금 브라우저를 열고 http://localhost:3000/ 를 입력하면 "안녕하세요, 세상!"을 볼 수 있습니다.브라우저에서.
    이 점에서 우리의 지수.js 파일은 다음과 같습니다.
    const express = require("express");
    const app = express();
    const port = 3000;
    
    app.use(express.json());
    
    app.get("/", (req, res) => {
        res.send("Hello World!");
    });
    
    app.listen(port, () => {
        console.log(`App listening at http://localhost:${port}`);
    });
    
    

    줄무늬회사 명


    strie라는 새 파일을 만듭니다.js, 모든 테이프 호출을 처리하는 데 사용됩니다.만들면 간단한 GET 요청을 만들고 색인을 위한 라우팅 파일을 내보냅니다.js에서 액세스할 수 있는 기능:
    const express = require("express");
    const router = express.Router();
    
    router.get("/", (req, res) => {
      res.status(200).json({
        message: "Stripe Hello World!",
      });
    });
    
    module.exports = router;
    

    스트라이프 추가.js 루트에서 인덱스로 이동합니다.회사 명


    const stripe = require("./stripe");
    app.use("/api/", stripe);
    
    인덱스입니다.js는 다음과 유사합니다.
    const express = require("express");
    const app = express();
    const stripe = require("./stripe");
    const port = 3000;
    
    app.use(express.json());
    
    app.use("/api/", stripe);
    
    app.get("/", (req, res) => {
      res.send("Hello World!");
    });
    
    app.listen(port, () => {
      console.log(`App listening at http://localhost:${port}`);
    });
    
    이제 브라우저를 열고 입력: http://localhost:3000/api/ "Stripe Hello World!"브라우저에서.

    새 스트라이프 고객 만들기


    줄무늬js 파일에서 스트라이프 키를 상수로 추가하고 스트라이프 모듈을 추가합니다.
    const Stripe_Key = 'sk_test_....jQb';
    const stripe = require("stripe")(Stripe_Key);
    
    사용자의 전자 우편 주소에서 새로운 고객 id를 만드는api를 만듭니다

    Note
    If you are using your own API key then you can add your organization account Secret Key. So it will link the customer with your organization.


    스트라이프 API를 사용하여 새 고객을 만드는 동안 추가 파일을 추가할 수 있습니다.Stripe Documents에서 스트라이프 API를 찾을 수 있습니다
    현재 우리는 어떠한 데이터베이스도 사용하지 않았기 때문에, 우리는 메시지에 답장하는 어딘가에 고객 id를 적어야 한다.

    답변:
  • "cus_IDxxDETTAorXTO"
  • 기존 고객에게 카드 추가


    테스트 목적으로 우리는 실제 카드 데이터를 사용할 필요가 없다.Stripe는 테스트 목적으로 사용할 카드 목록을 제공합니다. 본고에서 사용할 것입니다.너는 이곳에서 그것을 찾을 수 있다Stripe Test Cards
    카드 번호, 만료 월, 연도, CVC 등은 새 카드를 추가하는 데 필요한 매개 변수입니다.따라서 만약 이 매개 변수가 주체에서 전달되지 않는다면, 우리는 잘못된 요청 오류를 응답으로 던질 것입니다.


    답변:


    고객의 모든 카드 보기

  • 고객이 저장한 카드의 목록을 얻으려면 테이프에서 이전에 생성된customerID를 전달해야 합니다.
  • 이런 상황에서 우리는 카드Id, 카드 유형, 만기 상세 정보와 저장된 카드의 마지막 4자리 숫자만 필요로 한다.단, 저장된 카드의 더 많은 데이터가 필요하다면 Stripe Docs for View saved Cards 에서 찾을 수 있습니다


  • 답변:


    카드 상세 정보 업데이트

  • 고객이 저장한 카드 상세 정보에서 카드ID를 얻을 수 있습니다. 카드ID에서 카드 소유자 이름, 만기월, 만기년, 주소 상세 정보 등 저장된 카드 상세 정보를 업데이트할 수 있습니다. 카드ID를 제외한 모든 상세 정보는 선택할 수 있는 업데이트 작업입니다.
  • 더 많은 필드를 업데이트하려면 Stripe Docs for Updating Card Details 에서 찾을 수 있습니다.


  • 답변:

    저장된 카드 삭제


    저장된 카드를 삭제하려면 저장된 카드의 ID를 전달해야 합니다.


    답변:

    결제 비용 생성

  • 우리는 두 가지 선택이 있다.
    - 기존 카드로 결제할 수 있습니다.
    - 고객은 새 카드나 기존 카드를 저장할 필요가 없습니다.
  • 따라서 요청의 "oneTime"파라미터를 사용할 것입니다.차체는 그들 사이의 전환 스위치로 한다.

  • 새 카드로 일시불
    const { amount, email } = req.body;
        const {
          cardNumber,
          cardExpMonth,
          cardExpYear,
          cardCVC,
          country,
          postalCode,
        } = req.body;
    
        if (!cardNumber || !cardExpMonth || !cardExpYear || !cardCVC) {
          return res.status(400).send({
            Error: "Necessary Card Details are required for One Time Payment",
          });
        }
        try {
          const cardToken = await stripe.tokens.create({
            card: {
              number: cardNumber,
              exp_month: cardExpMonth,
              exp_year: cardExpYear,
              cvc: cardCVC,
              address_state: country,
              address_zip: postalCode,
            },
          });
    
          const charge = await stripe.charges.create({
            amount: amount,
            currency: "usd",
            source: cardToken.id,
            receipt_email: email,
            description: `Stripe Charge Of Amount ${amount} for One Time Payment`,
          });
    
          if (charge.status === "succeeded") {
            return res.status(200).send({ Success: charge });
          } else {
            return res
              .status(400)
              .send({ Error: "Please try again later for One Time Payment" });
          }
        } catch (error) {
          return res.status(400).send({
            Error: error.raw.message,
          });
        }
    
    

    기존 카드로 결제
    const { amount, cardId,  email } = req.body;
    
    try {
          const createCharge = await stripe.charges.create({
            amount: amount,
            currency: "usd",
            receipt_email: email,
            customer: customerId,
            card: cardId,
            description: `Stripe Charge Of Amount ${amount} for Payment`,
          });
          if (createCharge.status === "succeeded") {
            return res.status(200).send({ Success: createCharge });
          } else {
            return res
              .status(400)
              .send({ Error: "Please try again later for payment" });
          }
        } catch (error) {
          return res.status(400).send({
            Error: error.raw.message,
          });
        }
    

    최종 비용 지불 코드




    일시불 회신:


    저장된 카드 결제 응답:

    최종 스트라이프.JS 회사


    지금은 스트라이프예요.js는 다음과 유사합니다.
    const express = require("express");
    const router = express.Router();
    const Stripe_Key =
      "sk_test_....Qb";
    const stripe = require("stripe")(Stripe_Key);
    const customerId = "cus_IDxx....orXTO";
    
    router.get("/", (req, res) => {
      res.status(200).json({
        message: "Stripe Hello World!",
      });
    });
    
    // Create a new customer for stripe
    router.post("/newCustomer", async (req, res) => {
      console.log("\n\n Body Passed:", req.body);
      try {
        const customer = await stripe.customers.create(
          {
            email: req.body.email,
          }
          // {
          //   // If you are using your own api then you can add your organization account here. So it will link the customer with your organization
          //   stripeAccount: process.env.StripeAccountId,
          //}
        );
        return res.status(200).send({
          //   customerDetails: customer,
          customerId: customer.id,
          customerEmail: customer.email,
        });
      } catch (error) {
        return res.status(400).send({ Error: error.raw.message });
      }
    });
    
    // Add a new card of the customer
    router.post("/addNewCard", async (req, res) => {
      console.log("\n\n Body Passed:", req.body);
      const {
        cardNumber,
        cardExpMonth,
        cardExpYear,
        cardCVC,
        cardName,
        country,
        postal_code,
      } = req.body;
    
      if (!cardNumber || !cardExpMonth || !cardExpYear || !cardCVC) {
        return res.status(400).send({
          Error: "Please Provide All Necessary Details to save the card",
        });
      }
      try {
        const cardToken = await stripe.tokens.create({
          card: {
            name: cardName,
            number: cardNumber,
            exp_month: cardExpMonth,
            exp_year: cardExpYear,
            cvc: cardCVC,
            address_country: country,
            address_zip: postal_code,
          },
          // customer: customer.stripe_id,
          // stripe_account: StripeAccountId,
        });
    
        const card = await stripe.customers.createSource(customerId, {
          source: `${cardToken.id}`,
        });
    
        return res.status(200).send({
          card: card.id,
        });
      } catch (error) {
        return res.status(400).send({
          Error: error.raw.message,
        });
      }
    });
    
    // Get List of all saved card of the customers
    router.get("/viewAllCards", async (req, res) => {
      let cards = [];
      try {
        const savedCards = await stripe.customers.listSources(customerId, {
          object: "card",
        });
        const cardDetails = Object.values(savedCards.data);
    
        cardDetails.forEach((cardData) => {
          let obj = {
            cardId: cardData.id,
            cardType: cardData.brand,
            cardExpDetails: `${cardData.exp_month}/${cardData.exp_year}`,
            cardLast4: cardData.last4,
          };
          cards.push(obj);
        });
        return res.status(200).send({
          cardDetails: cards,
        });
      } catch (error) {
        return res.status(400).send({
          Error: error.raw.message,
        });
      }
    });
    
    // Update saved card details of the customer
    router.post("/updateCardDetails", async (req, res) => {
      const { cardName, cardExpMonth, cardExpYear, cardId } = req.body;
    
      if (!cardId) {
        return res.status(400).send({
          Error: "CardID is Required to update",
        });
      }
      try {
        const card = await stripe.customers.updateSource(customerId, cardId, {
          name: cardName,
          exp_month: cardExpMonth,
          exp_year: cardExpYear,
        });
        return res.status(200).send({
          updatedCard: card,
        });
      } catch (error) {
        return res.status(400).send({
          Error: error.raw.message,
        });
      }
    });
    
    // Delete a saved card of the customer
    router.post("/deleteCard", async (req, res) => {
      console.log("\n\n Body Passed:", req.body);
      const { cardId } = req.body;
      if (!cardId) {
        return res.status(400).send({
          Error: "CardId is required to delete Card",
        });
      }
      try {
        const deleteCard = await stripe.customers.deleteSource(customerId, cardId);
        return res.status(200).send(deleteCard);
      } catch (error) {
        return res.status(400).send({
          Error: error.raw.message,
        });
      }
    });
    
    // Create a payment charge
    router.post("/createCharge", async (req, res) => {
      const { amount, cardId, oneTime, email } = req.body;
      if (oneTime) {
        const {
          cardNumber,
          cardExpMonth,
          cardExpYear,
          cardCVC,
          country,
          postalCode,
        } = req.body;
    
        if (!cardNumber || !cardExpMonth || !cardExpYear || !cardCVC) {
          return res.status(400).send({
            Error: "Necessary Card Details are required for One Time Payment",
          });
        }
        try {
          const cardToken = await stripe.tokens.create({
            card: {
              number: cardNumber,
              exp_month: cardExpMonth,
              exp_year: cardExpYear,
              cvc: cardCVC,
              address_state: country,
              address_zip: postalCode,
            },
          });
    
          const charge = await stripe.charges.create({
            amount: amount,
            currency: "usd",
            source: cardToken.id,
            receipt_email: email,
            description: `Stripe Charge Of Amount ${amount} for One Time Payment`,
          });
    
          if (charge.status === "succeeded") {
            return res.status(200).send({ Success: charge });
          } else {
            return res
              .status(400)
              .send({ Error: "Please try again later for One Time Payment" });
          }
        } catch (error) {
          return res.status(400).send({
            Error: error.raw.message,
          });
        }
      } else {
        try {
          const createCharge = await stripe.charges.create({
            amount: amount,
            currency: "usd",
            receipt_email: email,
            customer: customerId,
            card: cardId,
            description: `Stripe Charge Of Amount ${amount} for Payment`,
          });
          if (createCharge.status === "succeeded") {
            return res.status(200).send({ Success: charge });
          } else {
            return res
              .status(400)
              .send({ Error: "Please try again later for payment" });
          }
        } catch (error) {
          return res.status(400).send({
            Error: error.raw.message,
          });
        }
      }
    });
    
    module.exports = router;
    

    결론


    이것은 지불과 관련 데이터를 처리하는 완전한 작업 코드이다.샌드박스 키를 Strip-API 키로 교체하면 완벽하게 작동합니다.만약 그것이 작용하지 않거나 어떤 문제가 있다면, 저에게 알려주십시오. 저는 당신의 피드백에 매우 감사할 것입니다.

    좋은 웹페이지 즐겨찾기