0ab2df21e9d707817cbec6bd1fd20d3019269901cc809a53e6edbdd020891c06f0c1ff


파이어베이스로 인앱결제 및 영수증 검증(펑션,앱체크 활용) 1부에서 이어지는 글입니다! 



[ 2. functions ]


영수증은 서버에서 검증해야한다길래 서버에서 코드를 사용할 수 있는 파이어베이스의 Functions를 활용했어.


프로젝트에 Functions 설치하는 방법은 찾아보면 많으니깐 나중에 추가할게.


아래는 functions 설치하고 폴더 내에 있는 index.js 에 추가한 영수증 검증 코드야. 


따로 체크해볼 사항은 googleapis 세팅과 serviceAccountContent, PACKAGE_NAME 환경 변수 세팅이야.


const functions = require("firebase-functions");
const {google} = require("googleapis");

// 환경 변수에서 값 가져오기
// eslint-disable-next-line max-len
const serviceAccountContent = functions.config().service_account.content;
const PACKAGE_NAME = functions.config().app.package_name;

exports.validateReceipt = functions.runWith({
enforceAppCheck: true, // ✅ App Check 적용
}).https.onCall(async (data, context) => {
const {productId, purchaseToken} = data;

// App Check 토큰 확인 (선택적 로그)
if (!context.app) {
console.error("❌ App Check 토큰 없음 - 요청 거부됨");
// eslint-disable-next-line max-len
throw new functions.https.HttpsError("failed-precondition", "App Check 토큰이 필요합니다.");
} else {
console.log("✅ App Check 토큰 확인됨 - App ID:", context.app.appId);
}

console.log("Received data:", {productId, purchaseToken}); // 디버깅 로그 추가

if (!purchaseToken || purchaseToken.trim() === "") {
console.error("purchaseToken이 비어있습니다.");
return {isValid: false};
}

// 서비스 계정 인증 (파일 대신 환경 변수 사용)
const auth = new google.auth.GoogleAuth({
credentials: serviceAccountContent, // JSON 객체 직접 사용
});

const androidPublisher = google.androidpublisher({
version: "v3",
auth,
});

try {
const response = await androidPublisher.purchases.products.get({
packageName: PACKAGE_NAME, // 환경 변수 사용
productId, // 상품 ID
token: purchaseToken, // 구매 토큰
});

console.log("API 응답:", response.data); // 응답 확인용 로그
if (response.data.purchaseState === 0) {
return {isValid: true};
} else {
return {isValid: false};
}
} catch (error) {
console.error("Error validating receipt:", error);
return {isValid: false};
}
});



2-1 구글 api 세팅


googleapis 패키지를 설치해서 functions 폴더 내 (클라우드 펑션 설치 장소)에 package.json과 package-lock.json에 모두 적용되어야 해.


폴더 내 디렉토리에서 아래 코드 입력 후 googleapis 패키지 설치 진행


cd functions

npm install googleapis


>> 설치 완료 후 


2-1-1. "package.json" 파일 내 종속성 확인 "googleapis": "^137.1.0"

{
"dependencies": {
"firebase-admin": "^12.1.0",
"firebase-functions": "^5.0.0",
"googleapis": "^137.1.0"
},
}


2-1-1. "package-lock.json" 파일 내 종속성 확인

*참고 : package.json에 적용되어도 lock 파일엔 적용이 안될때가 있으면 lock 파일 삭제 후 재설치 필요.


cd functions

rm package-lock.json

npm install


>> 다시 확인


2-2 환경변수 세팅

클라우드 펑션에 들어갈 serviceAccountContent, PACKAGE_NAME 환경변수를 설정해야해.

터미널에서 아래 코드를 입력하여 클라우드 펑션에 환경변수를 반영해주자.

firebase functions:config:set service_account.content=‘{서비스 계정 JSON }' app.package_name="com.example.app"


*참고 : {서비스 계정 JSON 키}에는 0-5 에서 저장했던 서비스계정 공개 키 JSON 파일의 내용을 입력하면 돼!(>> 터미널에 JSON 입력할땐 단일 줄로 만들어야해서 아래 사이트에 들어가서 변환해서 입력하자!)
JSON Minify Online to Minify, Compact JSON Data and Best

Best and Secure JSON Minify is online JSON Minifier tool to minify / Compact JSON data

jsonformatter.org


*com.example.app 에는 본인 앱 이름을 넣어주면 되고.
*터미널을 통해 환경변수가 잘 적용되었는지 확인해볼수도 있어.

firebase functions:config:get



2-3 클라우드 펑션 배포


package.json과 package-lock.json 파일 내에 googleapis 검색해보고 있다면 터미널을 통해 배포를 진행하자!

firebase deploy --only functions


>> 3부에서 이어짐..