이딴 식으로 만들어놓으면 어떻게 합니까? #110
Answered
by
Palbahngmiyine
Eric0841
asked this question in
SOLAPI Q&A
-
사용 중인 프로그래밍 언어 및 버전TypeScript SDK 버전No response 운영 환경개발 환경 (로컬) 질문/문제 설명계속 오류가 뜹니다 코드 예시kakaoOptions: {
pfId: trimmedPfId,
templateId: "********************",
variables: {
"인증번호": String(verificationCode)
},
disableSms: false
}
import { Hono } from "npm:hono";
import { cors } from "npm:hono/cors";
import { logger } from "npm:hono/logger";
import * as kv from "./kv_store.tsx";
const app = new Hono();
// Enable logger
app.use('*', logger(console.log));
// Enable CORS for all routes and methods
app.use(
"/*",
cors({
origin: "*",
allowHeaders: ["Content-Type", "Authorization"],
allowMethods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
exposeHeaders: ["Content-Length"],
maxAge: 600,
}),
);
// Health check endpoint
app.get("/make-server-4ebf8678/health", (c) => {
return c.json({ status: "ok" });
});
// CoolSMS 인증번호 발송 엔드포인트
app.post("/make-server-4ebf8678/send-sms", async (c) => {
try {
const { phoneNumber, verificationCode } = await c.req.json();
if (!phoneNumber || !verificationCode) {
return c.json({ success: false, error: "전화번호와 인증번호를 입력해주세요." }, 400);
}
// 환경 변수에서 CoolSMS API 키 가져오기
const apiKey = Deno.env.get("COOLSMS_API_KEY");
const apiSecret = Deno.env.get("COOLSMS_API_SECRET");
const kakaoPfId = Deno.env.get("KAKAO_PFID");
if (!apiKey || !apiSecret) {
console.error("CoolSMS API 키가 설정되지 않았습니다.");
return c.json({ success: false, error: "서버 설정 오류" }, 500);
}
if (!kakaoPfId) {
console.error("카카오 발신 프로필 ID가 설정되지 않았습니다.");
return c.json({ success: false, error: "카카오 프로필 설정 오류" }, 500);
}
// API 키 공백 제거
const trimmedApiKey = apiKey.trim();
const trimmedApiSecret = apiSecret.trim();
const trimmedPfId = kakaoPfId.trim();
console.log(`API Key 길이: ${trimmedApiKey.length}`);
console.log(`API Secret 길이: ${trimmedApiSecret.length}`);
console.log(`카카오 프로필 ID: ${trimmedPfId}`);
// HMAC-SHA256 서명 생성
const date = new Date().toISOString();
const salt = Date.now().toString();
const data = date + salt;
// HMAC 서명 생성
const encoder = new TextEncoder();
const keyData = encoder.encode(trimmedApiSecret);
const messageData = encoder.encode(data);
const cryptoKey = await crypto.subtle.importKey(
"raw",
keyData,
{ name: "HMAC", hash: "SHA-256" },
false,
["sign"]
);
const signatureBuffer = await crypto.subtle.sign("HMAC", cryptoKey, messageData);
const signatureArray = Array.from(new Uint8Array(signatureBuffer));
const signature = signatureArray.map(b => b.toString(16).padStart(2, '0')).join('');
console.log(`Authorization: HMAC-SHA256 apiKey=${trimmedApiKey}, date=${date}, salt=${salt}, signature=${signature}`);
// CoolSMS API를 통한 카카오 알림톡 발송
const response = await fetch("https://api.coolsms.co.kr/messages/v4/send", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": `HMAC-SHA256 apiKey=${trimmedApiKey}, date=${date}, salt=${salt}, signature=${signature}`,
},
body: JSON.stringify({
message: {
to: phoneNumber.replace(/-/g, ""),
from: "010********",
type: "ATA", // 알림톡
text: `[기프티콘 지갑] 인증번호 ${verificationCode}\n인증번호는 3분 동안 유효합니다.`, // 알림톡 실패 시 대체 SMS
kakaoOptions: {
pfId: trimmedPfId,
templateId: "*************************",
variables: {
"인증번호": String(verificationCode)
},
disableSms: false
}
},
}),
});
const result = await response.json();
if (!response.ok) {
console.error("CoolSMS API 오류:", JSON.stringify(result, null, 2));
console.error("전송한 요청 본문:", JSON.stringify({
message: {
to: phoneNumber.replace(/-/g, ""),
from: "010********",
type: "ATA",
kakaoOptions: {
pfId: trimmedPfId,
templateId: "****************************",
variables: { "인증번호": String(verificationCode) }
}
}
}, null, 2));
return c.json({ success: false, error: result.errorMessage || JSON.stringify(result) }, 500);
}
console.log(`📱 카카오 알림톡 발송 성공: ${phoneNumber}로 인증번호 ${verificationCode} 발송됨`);
return c.json({ success: true, message: "인증번호가 발송되었습니다." });
} catch (error) {
console.error("알림톡 발송 중 오류 발생:", error);
return c.json({ success: false, error: `알림톡 발송 중 오류가 발생했습니다: ${error.message}` }, 500);
}
});
Deno.serve(app.fetch);시도한 해결 방법No response 기대하는 결과정상적으로 발송이 됐으면 좋겠습니다 ㅠ 확인사항
|
Beta Was this translation helpful? Give feedback.
Answered by
Palbahngmiyine
Jan 12, 2026
Replies: 1 comment 1 reply
-
|
안녕하세요 회원님, 솔라피 기술지원팀입니다. 알림톡 발송의 경우 text와 kakaoOptions.variables 프로퍼티를 동시에 사용할 순 없습니다. 하기에 SOLAPI Node.js SDK 예제를 안내드리오니 참고하여 연동 해 주시길 바라겠습니다. |
Beta Was this translation helpful? Give feedback.
1 reply
Answer selected by
Palbahngmiyine
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
안녕하세요 회원님, 솔라피 기술지원팀입니다. 알림톡 발송의 경우 text와 kakaoOptions.variables 프로퍼티를 동시에 사용할 순 없습니다. 하기에 SOLAPI Node.js SDK 예제를 안내드리오니 참고하여 연동 해 주시길 바라겠습니다.
https://github.com/solapi/solapi-nodejs/blob/master/examples/javascript/common/src/kakao/send/send_alimtalk.js