안녕하세요, 현재 나에게 메시지 보내기 api 기능을 이용할려고 하는데 문서대로 맞게 요청을 한거같은데
계속해서 data: { msg: ‘access token should not be null or empty’, code: -401 } 해당 에러가 발생합니다.
headers에 Bearer ${accessToken}
으로 넣어주었고 req.body에 accessToken값을 넣어서 요청을 보냈습니다.
kakao developers 사이트에서 REST API 도구를 이용하면 나에게 메시지 api기능이 정상적으로 작동하는데
제가 직접 코드를 작성하여 요청하는 경우는 계속해서 access token이 없다고 뜹니다…
아래는 제가 작성한 코드 입니다.
import type { NextApiRequest, NextApiResponse } from "next";
import axios from "axios";
export default async function handler(
req: NextApiRequest,
res: NextApiResponse,
) {
if (req.method === "POST") {
const { accessToken } = req.body;
console.log(accessToken);
const result = await axios({
method: "POST",
url: "https://kapi.kakao.com/v2/api/talk/memo/default/send",
data: {
template_object: {
object_type: "text",
text: "테스트 메시지",
link: {},
},
headers: {
"content-type": "application/x-www-form-urlencoded",
Authorization: `Bearer + ${accessToken}`,
},
},
});
return res.status(200).json({
message: "메시지 요청 수행",
});
}
}
안녕하세요.
1. 헤더 부분 확인 부탁드립니다.
AS-IS : Authorization: `Bearer + ${accessToken}`, (X)
TO-BE : Authorization: `Bearer ${accessToken}`, (O)
2. data는 from-urlencoded 형식으로 요청 부탁드립니다.
import qs from 'qs'
...
data: qs.stringify({
template_object: ...
})
제가 중간에 코드를 수정하느라 잘못된 코드를 올렸네요. 말씀해주신 부분은 수정했습니다!
이번에는 다른 오류가 뜨는데 한 번만 더 답변해주실수 있으실까요?
아래는 제가 변경한 코드입니다.
발생하는 에러는 {“msg”:“template_object can’t be null.”,“code”:-2} 입니다.
아마도 제가 data부분을 제대로 못 넣고 있는거 같은데 혹시 따로 타입을 바꿔주는 작업을 해야하나요?
추가로 talk_message 권한 부분은 추가 항목 동의로 받았습니다!
import type { NextApiRequest, NextApiResponse } from “next”;
import request from “request”;
export default async function handler(
req: NextApiRequest,
res: NextApiResponse,
) {
if (req.method === “POST”) {
const { accessToken } = req.body;
const options = {
method: "POST",
url: "https://kapi.kakao.com/v2/api/talk/memo/default/send",
headers: {
Authorization: `Bearer ${accessToken}`,
"Content-type": "application/x-www-form-urlencoded",
},
data: {
template_object: {
object_type: "text",
text: "텍스트 영역입니다. 최대 200자 표시 가능합니다.",
link: {
web_url: "https://developers.kakao.com",
mobile_web_url: "https://developers.kakao.com",
},
button_title: "바로 확인",
},
},
};
await request(options, async (err, res, body) => {
console.log(body);
});
return res.status(200).json({
message: "메시지 요청 수행",
});
}
}
data는 json이 아닌 url encoded 방식으로 전달되어야 합니다.
위에 예시로 드린 qs 모듈을 사용하여 변환하시면 좋을것 같습니다.
늦게 답변드려 죄송합니다.
일단, 말씀해주신대로 qs모듈을 사용하여 data부분을 작성하였으나 동일한 에러가 발생합니다.
{“msg”:“template_object can’t be null.”,“code”:-2}
오타는 없는거같은데 왜 계속 template_object가 null로 요청된다는것일까요…
import type { NextApiRequest, NextApiResponse } from "next";
import request from "request";
import qs from "qs";
export default async function handler(
req: NextApiRequest,
res: NextApiResponse,
) {
if (req.method === "POST") {
const { accessToken } = req.body;
const options = {
method: "POST",
url: "https://kapi.kakao.com/v2/api/talk/memo/default/send",
headers: {
Authorization: `Bearer ${accessToken}`,
"Content-type": "application/x-www-form-urlencoded",
},
data: qs.stringify({
template_object: {
object_type: "text",
text: "텍스트 영역입니다. 최대 200자 표시 가능합니다.",
link: {
web_url: "https://developers.kakao.com",
mobile_web_url: "https://developers.kakao.com",
},
button_title: "바로 확인",
},
}),
};
request(options, async (err, res, body) => {
console.log(body);
});
return res.status(200).json({
message: "메시지 요청 수행",
});
}
}
아래 샘플 참고 부탁드립니다.
const options = {
method: 'POST',
url: 'https://kapi.kakao.com/v2/api/talk/memo/default/send',
headers: {
'Authorization': 'Bearer ACCESS_TOKEN',
'Content-Type': 'application/x-www-form-urlencoded',
},
form: qs.stringfy({
'template_object': JSON.stringify({
"object_type": "text",
"text": "텍스트 영역입니다. 최대 200자 표시 가능합니다.",
"link": {
"web_url": "https://developers.kakao.com/?test=link",
"mobile_web_url": "https://developers.kakao.com/?test=link"
},
"button_title": "바로 확인"
})
})
}