hyeonga_code

reProject_50_상품 주문 완료 시, 주문 내역 이메일 보내기 구현 본문

Project_WEATHERWEAR

reProject_50_상품 주문 완료 시, 주문 내역 이메일 보내기 구현

hyeonga 2024. 2. 22. 06:59
반응형

 

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>&nbsp;</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();
		}
	}

 

 

주문 후 결제가 완료되면 메일이 자동으로 발송된다.

 

 

반응형