최신글
hyeonga_code
reProject_50_상품 주문 완료 시, 주문 내역 이메일 보내기 구현 본문
반응형
2024.02.21
결제 완료 시, 이메일로 간단한 주문 내역을 전송하도록 구현
orderRegister.js 에서 paymentInsert.do 를 실행하여 결제 정보가 성공적으로 저장된 경우 메일을 보내기로 했다.
담아야 하는 데이터가 여러 곳에 퍼져 있으므로 js에서 담았던 데이터를 들고가고 DB를 건드리지 않는 방식으로 진행했다.
/** 결제하기 버튼(정보 확인) */
function checkSubmit(){
if(pg == "" || payMethod == ""){
playToast("결제 방식을 선택해주세요", "warning");
return;
}
console.log("1. checkSubmit() 시작");
let clientemail = checkCondition("clientEmail", "이메일은 필수 입력값입니다");
let clientName = checkCondition("addressName", "받는 사람을 입력해주세요");
let clientNumber = checkCondition("addressNum", "연락처를 입력해주세요");
let postNum = checkCondition("addressPostNum", "우편번호를 입력해주세요");
let address1 = checkCondition("address1", "기본 주소는 필수 입력값입니다.");
let address2 = checkCondition("address2", "상세 주소를 입력해주세요");
let addressMemo = $("#deliveryMessage").val();
if(addressMemo == "inputMessage"){
addressMemo = $("#deliMsg").val();
}
//회원
let addressTitle = $("#addressTitle").val();
let addressId = $("#addressId").val();
let addressBase = $("#baseAddress").val();
let clientId = $("#clientId").val();
let couponId = $("#couponId").val()
if(couponId!= null && couponId !=""){
couponId = couponId.split("_")[2];
}
let usedPoint = parseInt($("#usedPoint").val());
//비회원
let cookiePwd = $("#cookiePwd").val();
let orderPrice = parseInt($("#orderPrice").val()); //주문금액
let priceList = document.querySelectorAll(".productPriceInput"); //상품별 금액
let cntList = document.querySelectorAll(".cartCnt"); //상품별 수량
let cartId = document.querySelectorAll(".cartId"); //장바구니 번호
let optionList = document.querySelectorAll(".optionId"); //상품별 옵션
let productName = document.querySelectorAll(".productName");//상품이름
let optionIdList = '';
let cartIdList = [];
let orderInfoList = [];
//orders_info
for(let i=0; i<priceList.length; i++){
let order = {
"optionId": optionList[i].value,
"orderProCnt": parseInt(cntList[i].value),
"orderTotal": parseInt(priceList[i].value),
"productName": productName[i].value
};
orderInfoList.push(order);
cartIdList.push(parseInt(cartId[i].value));
optionIdList += optionList[i].value;
if(i<priceList.length-1 ) {
optionIdList += ",";
}
}
let dataInfo = {};
dataInfo["cartIdList"] = cartIdList;
dataInfo["orderInfoList"] = orderInfoList;
//배송지
let addressInfo = {
"addressId": addressId,
"clientId": clientId,
"addressTitle": addressTitle,
"addressName": clientName,
"addressNum": clientNumber,
"addressPostNum": postNum,
"address1": address1,
"address2": address2,
"addressMemo": addressMemo,
"addressBase": addressBase
};
dataInfo["addressInfo"] = addressInfo;
dataInfo["addressBase"] = addressBase;
//주문정보
let orderInfo = {
"clientId": clientId,
"optionIdList": optionIdList,
"addressId": addressId,
"orderEmail": clientemail,
"orderPrice": orderPrice,
"usedPoint": usedPoint,
"couponId": couponId,
"cookiePwd": cookiePwd,
};
dataInfo["orderInfo"] = orderInfo;
dataInfo["orderPrice"] = orderPrice;
// 회원
if(couponId != null){
let usedCouponInfo = {
"couponId": couponId.split("_")[2],
"clientId": clientId
};
dataInfo["usedCouponInfo"] = usedCouponInfo;
}
$.ajax({
url: "orderRegisterProc.do",
type: "POST",
async: true,
dataType: "json",
data: JSON.stringify(dataInfo),
contentType: "application/json",
success: function(res){
if(res.code == 1){
let orderId = res.data;
let IMP = window.IMP;
IMP.init('imp21162314');
IMP.request_pay({
pg: pg, // pg사 코드
pay_method: payMethod, // 결제 수단
merchant_uid: 'merchant_'+new Date().getTime(),// 주문번호(고유)
name: optionIdList, // 주문명
amount: orderPrice, // 결제 금액(숫자)
buyer_email: clientemail, // 이메일
buyer_name: clientName, // 구매자 이름
buyer_tel: clientNumber, // 구매자 연락처
buyer_addr: address1 + address2,// 구매자 주소
buyer_postcode: postNum, // 구매자 우편번호
card: {
detail: [
{card_cod: "*", enabled:true}
]
},
display: {
card_quota: [1,2,3,4,6], // 할부개월 6개월만 활성화
only_installment: true // 일시불 항목은 제외
}
}, function (rsp) { // callback
if(rsp.success){
let paymentStatus;
//결제검증
$.ajax({
type: "POST",
url: "verifyIamport.do?imp_uid=" + rsp.imp_uid
}).done(function(data){
let result = $(data).find("amount").text();
if(rsp.paid_amount == result){
if(rsp.status == "ready"){
paymentStatus = "결제대기";
} else if (rsp.status == "paid"){
paymentStatus = "결제완료";
} else if (rsp.status == "fail"){
paymentStatus = "결제실패";
}
let paymentInfo = {
"orderId": orderId,
"paymentId": rsp.imp_uid,
"paymentMethod": sqlPayMethod,
"paymentDate": rsp.paid_at,
"paymentStatus": paymentStatus,
"amount": rsp.amount
}
$.ajax({
url: "paymentInsert.do",
type: "POST",
async: true,
dataType: "json",
data: JSON.stringify(paymentInfo),
contentType: "application/json",
success: function(res){
if(res.code > 0){
dataInfo["paymentInfo"] = paymentInfo;
$.ajax({
url: "sendMail.do",
type: "POST",
async: true,
dataType: "json",
data: JSON.stringify(dataInfo),
contentType: "application/json",
});
let successAction = "location.href='orderInfo.do?orderId=" + res.data + "'";
playConfirm(res.message, "주문 상세페이지로 이동하시겠습니까?", "success", "이동하기", "메인페이지로", successAction, "location.href='main.do'");
}
if(res.code == -1){
playToast(res.message, "error");
}
},
error : function(error){
playToast("오류가 발생했습니다.", 'error');
}
});
}
});
}
if(res.code == -1){
playToast(res.message, "error");
$.ajax({
url: "deleteCancleOrderInfo.do",
type: "POST",
async: true,
dataType: "json",
data: { orderId : res.data },
success: function(res){
if(res.code == 1){
console.log("주문정보 삭제 성공");
}
if(res.code == -1){
console.log("주문정보 삭제 실패");
}
},
error: function(){
console.log("오류발생");
}
});
}
});
}
},
error : function(error){
playToast("오류가 발생했습니다.", 'error');
}
});
}
-- ClientOrderController.java
@PostMapping("sendMail.do")
public void sendMail(@RequestBody Map<String, Object> data) {
System.err.println(">>>>>>>>>>>>>> 메일보낸다 : " + data);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy년 M월 d일");
List<HashMap<String, String>> orderInfoList = (List<HashMap<String, String>>)data.get("orderInfoList");
String orderListString = "";
for(int i=0; i<orderInfoList.size(); i++) {
orderListString += (String)orderInfoList.get(i).get("productName");
if(i<orderInfoList.size()-1) {
orderListString += ", <br>";
}
}
data.put("orderString", orderListString);
MimeMessagePreparator preparator = new MimeMessagePreparator() {
StringBuffer content = new StringBuffer()
.append("<p><img src='https://hyeongabucket.s3.ap-northeast-2.amazonaws.com/main/logo.png' width='237px' onclick=\"location.href='http://localhost:8080/w2/main.do'\"></p><p> </p>")
.append("<h1><span style=\"font-family: 'Nanum Gothic';\"><b>웨더웨어 주문 완료</b></span></h1>")
.append("<div style='witdh:80%;'><hr><p><span style=\"font-family: 'Nanum Gothic';\">안녕하세요.</span></p>")
.append("<p><span style=\"font-family: 'Nanum Gothic';\">주문하신 내역입니다.</span><span style=\"font-family: 'Nanum Gothic';\"></span></p>")
.append("<hr>")
.append("<p><span style=\"font-family: 'Nanum Gothic';\">주문번호 : <b>" + ((HashMap<String,String>)data.get("paymentInfo")).get("orderId") + "</b></span></p>")
.append("<p><span style=\"font-family: 'Nanum Gothic';\">결제금액 : <b>" + ((HashMap<String,String>)data.get("orderInfo")).get("orderPrice") + "</b></span></p>")
.append("<p><span style=\"font-family: 'Nanum Gothic';\">결제방식 : <b>" + ((HashMap<String,String>)data.get("paymentInfo")).get("paymentMethod") + "</b></span></p>")
.append("<p><span style=\"font-family: 'Nanum Gothic';\">결제상태 : <b>" + ((HashMap<String,String>)data.get("paymentInfo")).get("paymentStatus") + "</b></span></p>")
.append("<p><span style=\"font-family: 'Nanum Gothic';\">상품정보 <br><b>" + (String)data.get("orderString") + "</b></span></p>")
.append("<hr></div>");
@Override
public void prepare(MimeMessage mimeMessage) throws Exception {
mimeMessage.setFrom(new InternetAddress("weatherwear493@gmail.com", "WeatherWear", "UTF-8"));
mimeMessage.setSubject("[웨더웨어] 주문하신 내역입니다.");
mimeMessage.setRecipients(Message.RecipientType.TO, InternetAddress.parse(((HashMap<String,String>)data.get("orderInfo")).get("orderEmail")));
mimeMessage.setContent(content.toString(), "text/html;charset=UTF-8");
mimeMessage.setReplyTo(InternetAddress.parse(((HashMap<String,String>)data.get("orderInfo")).get("orderEmail")));
}
};
try {
mailSender.send(preparator);
} catch(Exception e) {
e.printStackTrace();
}
}
주문 후 결제가 완료되면 메일이 자동으로 발송된다.
반응형
'Project_WEATHERWEAR' 카테고리의 다른 글
reProject_52_Chart.js 활용하여 통계 구현하기_2 (0) | 2024.02.26 |
---|---|
reProject_51_Chart.js 활용하여 통계 구현하기_1 (0) | 2024.02.26 |
reProject_49_JAVA/SPRING SMS 문자 보내기 기능 구현 (0) | 2024.02.22 |
reProject_48_관리자 주문 페이지, 교환/환불 요청 확인, 교환/환불 처리, 아임포트 환불 처리(부분 취소/전액 취소) (0) | 2024.02.21 |
reProject_47_리뷰 작성, 리뷰 삭제, 별점, 리뷰 상세 보기 기능 구현 (0) | 2024.02.20 |