Skip to content

Instantly share code, notes, and snippets.

@d-sea
Last active October 11, 2023 23:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save d-sea/d80dafb616318215df396ec47875a06f to your computer and use it in GitHub Desktop.
Save d-sea/d80dafb616318215df396ec47875a06f to your computer and use it in GitHub Desktop.
firebase functions iOS レシートデータを検証してlatest_receiptを返す
// 定期 最終支払 検証用
const PACKAGE_NAME_IOS = "(PUT YOUR APP PACKAGE NAME. ex. com.example.your.app)";
const RECEIPT_VERIFICATION_ENDPOINT_FOR_IOS_SANDBOX = "https://sandbox.itunes.apple.com/verifyReceipt";
const RECEIPT_VERIFICATION_ENDPOINT_FOR_IOS_PROD = "https://buy.itunes.apple.com/verifyReceipt";
const RECEIPT_VERIFICATION_PASSWORD_FOR_IOS = "(PUT YOUR VERIFICATION PASSWORD)";
async function verifyReceiptIos(verificationData, auth) {
let response;
try {
// 本番用APIにデータを送信する
response = await axios.post(RECEIPT_VERIFICATION_ENDPOINT_FOR_IOS_PROD, {
"receipt-data": verificationData,
password: RECEIPT_VERIFICATION_PASSWORD_FOR_IOS,
"exclude-old-transactions": true,
});
// 本番用APIから返却された`status`が`21007`の場合、送信されたレシートがサンドボックス環境用と判断する
if (response.data && response.data["status"] === 21007) {
response = await axios.post(
RECEIPT_VERIFICATION_ENDPOINT_FOR_IOS_SANDBOX,
{
"receipt-data": verificationData,
password: RECEIPT_VERIFICATION_PASSWORD_FOR_IOS,
"exclude-old-transactions": true,
}
);
}
// レシート検証用APIから返却されたレスポンス内の`status`が`0`であれば検証は成功 https://developer.apple.com/documentation/appstorereceipts/status#possible-values
const result = response.data;
if (result["status"] !== 0) {
return null;
}
// レスポンスデータ内の`bundle_id`が自身のパッケージ名と一致しているか確認する
if (
!result["receipt"] ||
result["receipt"]["bundle_id"] !== PACKAGE_NAME_IOS
) {
return null;
}
// `latest_receipt_info`は定期購読タイプのアイテムを購入したことがある場合のみ存在する
return result["latest_receipt_info"][0];
} catch (err) {
return null;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment