728x90
반응형

1. 버튼과 버튼 클릭 이벤트 함수를 만들어준다.

    const unSubscribeClickHandler = (e: any) => {
        if (window.confirm('구독을 취소하시겠습니까?')) {
            axios.post('/api/subscribe/unsubscribe', {
                muser_id: loginData.userId
            }).then(({ data }) => {
                if (data.success) {
                    alert('구독취소가 완료되었습니다. 다시 로그인해주세요.')
                    router.push('/')
                }
                else {
                    alert('구독취소 오류입니다. 관리자에게 문의 바랍니다.')
                }
            })
        }
        else {

        }
    }

 

2. 백엔드에 구독을 취소하는 라우터를 만들어준다. 

router.post("/unsubscribe", async function (req, res, next) {
    try {
        Subscribe.findOne({
            where: {
                subscribe_muser_id: req.body.muser_id,
                subscribe_type: "기본정기결제예약"
            },
            order: [['subscribe_createdAt', 'DESC']],
        }).then(async (result) => {

            if (result) {
                // 인증 토큰 발급 받기
                const getToken = await axios({
                    url: "https://api.iamport.kr/users/getToken",
                    method: "post", // POST method
                    headers: { "Content-Type": "application/json" }, // "Content-Type": "application/json"
                    data: {
                        imp_key: process.env.IMP_API_KEY, // REST API 키
                        imp_secret: process.env.IMP_API_SECRET_KEY // REST API Secret
                    }
                });
                const { access_token } = getToken.data.response; // 인증 토큰

                // 정기결제 예약 취소
                const paymentResult = await axios({
                    url: 'https://api.iamport.kr/subscribe/payments/unschedule',
                    method: "post",
                    headers: { "Authorization": access_token }, // 인증 토큰을 Authorization header에 추가
                    data: {
                        customer_uid: result.subscribe_customer_uid,
                        merchant_uid: result.subscribe_merchant_uid, // 새로 생성한 결제(재결제)용 주문 번호
                    }
                });

                MUserInfo.update({
                    muser_subscribe_type: ""
                }, {
                    where: {
                        muser_id: result.subscribe_muser_id
                    }
                })

                res.clearCookie('')
                res.send({ success: true })
            }
            else {
                res.send({ success: false })
            }
        })
    }
    catch (Err) {
        console.log("Err : ", Err)
        res.send({ success: false })
    }
})

module.exports = router;
728x90
반응형

+ Recent posts