Shopify アプリに関する話題はこちら
CLIのnodeテンプレートアプリに定期請求を実装しました。
アプリをインストール→請求のキャンセル→アプリにアクセス時、無限にリダイレクトします。
デバッグ中は請求画面にリダイレクトされますが、Herokuにデプロイすると上記の現象が起こります。
解決方法のご教授お願い致します。
index.js
import { join } from "path"; import { readFileSync } from "fs"; import express from "express"; import serveStatic from "serve-static"; import shopify from "./shopify.js"; import GDPRWebhookHandlers from "./gdpr.js"; import { requestBilling } from "./billing.js"; const PORT = parseInt( process.env.BACKEND_PORT || process.env.PORT || "3000", 10 ); const STATIC_PATH = process.env.NODE_ENV === "production" ? `${process.cwd()}/frontend/dist` : `${process.cwd()}/frontend/`; const app = express(); // Set up Shopify authentication and webhook handling app.get(shopify.config.auth.path, shopify.auth.begin()); app.get( shopify.config.auth.callbackPath, shopify.auth.callback(), requestBilling, shopify.redirectToShopifyOrAppRoot() ); app.post( shopify.config.webhooks.path, shopify.processWebhooks({ webhookHandlers: GDPRWebhookHandlers, }), ); app.use("/api/*", shopify.validateAuthenticatedSession()); app.use(express.json()); app.use(shopify.cspHeaders()); app.use(serveStatic(STATIC_PATH, { index: false })); app.use("/*", shopify.ensureInstalledOnShop(), requestBilling, async (_req, res, _next) => { return res .status(200) .set("Content-Type", "text/html") .send(readFileSync(join(STATIC_PATH, "index.html"))); }); app.listen(PORT);
billing.js
import shopify, { billingConfig } from "./shopify.js"; export const requestBilling = async (req, res, next) => { console.debug('Start checking billing'); const plans = Object.keys(billingConfig); let session = res.locals.shopify?.session; const isAuth = !session ? false : true; if(!isAuth) { session = await getRequestShopSession( shopify.api, shopify.config, req, res ); } const isTest = process.env.NODE_ENV !== 'production'; const hasPayment = await shopify.api.billing.check({session, plans, isTest}); if (hasPayment) { next(); } else { const redirectUri = await shopify.api.billing.request({session, plan: plans[0], isTest}); if(isAuth) { res.redirect(redirectUri); } else { shopify.redirectOutOfApp({ req, res, redirectUri: redirectUri, shop: shopify.api.utils.sanitizeShop(req.query.shop), }); } } }; const getRequestShopSession = async(api, config, req, res) => { const shop = shopify.api.utils.sanitizeShop(req.query.shop); if (!shop) { return undefined; } config.logger.debug('Checking if shop has installed the app', { shop }); const sessionId = api.session.getOfflineId(shop); const session = await config.sessionStorage.loadSession(sessionId); return session; }
環境
解決済! ベストソリューションを見る。
成功
フロントエンド経由で請求画面にリダイレクトすることで解決しました。
オンラインストアを運営する中で、商品の返品や交換は重要なプロセスとなります。Shopify管理画面を通して簡単に返品や交換が行えることをご存知でしょうか?希望する場合は、お客...
By Mirai Sep 15, 2024Shopifyの請求書の支払いが失敗したという通知を受け取って驚いたことはありますか。初めての支払いでエラーが発生したり、これまで何の問題もなく支払いできていたのに突然失敗し...
By Minami_ Sep 8, 20242023年2月、Shopifyはcheckout.liquidを廃止し、Checkout Extensibilityに移行することを発表いたしました。この新しいチェックアウト...
By JasonH Aug 15, 2024