테이프, 노드, 택배를 통해 지불 처리
게이트웨이를 지불해야 하는 이유는 무엇입니까?
Github 리셋 링크 및 집배원 모음: 여기를 클릭하십시오.
우리는 이곳에서 무엇을 건설합니까?
1) 고객의 세부 정보를 스트라이프에 저장
2) 스트라이프에 고객 카드를 추가합니다.
3) 고객 카드를 확인합니다.
4) 고객 카드를 업데이트합니다.
5) 스트라이프에서 고객의 카드 삭제
6) 저장된 카드로 결제합니다.
7) 일시불로 결제하고 카드 정보를 저장하지 않습니다.
고객의 민감한 카드에 대한 상세한 정보를 어떻게 저장합니까?
우리는 우선 비용을 만들고 비용 상세 정보를 고객에게 저장할 것이며, 이를 API에 전달함으로써 카드의 상세 정보를 직접 저장하지 않을 것이다.우리는 카드 정보를 직접 처리하지 않을 것이며, 우리의 생산 통합은 PCI Compliant 방식으로 개발되었다.이것도 Stripe가 추천한 것이다.
뭐 공부 해요?
스트라이프 API 키 가져오기:
주:
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.
시작:
$ 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를 적어야 한다.
답변:
기존 고객에게 카드 추가
테스트 목적으로 우리는 실제 카드 데이터를 사용할 필요가 없다.Stripe는 테스트 목적으로 사용할 카드 목록을 제공합니다. 본고에서 사용할 것입니다.너는 이곳에서 그것을 찾을 수 있다Stripe Test Cards
카드 번호, 만료 월, 연도, CVC 등은 새 카드를 추가하는 데 필요한 매개 변수입니다.따라서 만약 이 매개 변수가 주체에서 전달되지 않는다면, 우리는 잘못된 요청 오류를 응답으로 던질 것입니다.
답변:
고객의 모든 카드 보기
답변:
카드 상세 정보 업데이트
답변:
저장된 카드 삭제
저장된 카드를 삭제하려면 저장된 카드의 ID를 전달해야 합니다.
답변:
결제 비용 생성
- 기존 카드로 결제할 수 있습니다.
- 고객은 새 카드나 기존 카드를 저장할 필요가 없습니다.
새 카드로 일시불
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 키로 교체하면 완벽하게 작동합니다.만약 그것이 작용하지 않거나 어떤 문제가 있다면, 저에게 알려주십시오. 저는 당신의 피드백에 매우 감사할 것입니다.
Reference
이 문제에 관하여(테이프, 노드, 택배를 통해 지불 처리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/hudaniabhee/payment-handling-with-stripe-node-and-express-4gh0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)