Как показать / отправить HTML в админ Shopify? - PullRequest
0 голосов
/ 24 апреля 2019

У меня проблема с выяснением способа отображения html в админке приложения.

Я следовал учебнику 'Создание приложения Shopify с Node and Express' и могу отобразить json магазина в Администраторе приложения Shopify. Тем не менее, я не понимаю следующие шаги для получения любого HTML для отображения в приложении администратора. Я попытался заменить end(shopResponse) методом рендеринга, который выдает ошибку «происхождение запроса не может быть проверено». Я также попытался настроить дополнительный запрос, но это вызвало похожую ошибку.


app.get('/shopify', (req, res) => {
  const shop = req.query.shop;
  if (shop) {
    const state = nonce();
    const redirectUri = forwardingAddress + '/shopify/callback';
    const installUrl = 'https://' + shop +
      '/admin/oauth/authorize?client_id=' + apiKey +
      '&scope=' + scopes +
      '&state=' + state +
      '&redirect_uri=' + redirectUri;

    res.cookie('state', state);
    res.redirect(installUrl);
  } else {
    return res.status(400).send('Missing shop parameter. Please add ?shop=your-development-shop.myshopify.com to your request');
  }
});

app.get('/shopify/callback', (req, res) => {
  const { shop, hmac, code, state } = req.query;
  console.log(req.headers)
  var stateCookie = '';

  if (req.headers.cookie) {
    stateCookie = cookie.parse(req.headers.cookie).state; 
  }

  if (state !== stateCookie) {
    return res.status(403).send('Request origin cannot be verified');
  }

  if (shop && hmac && code) {
    const map = Object.assign({}, req.query);
    delete map['signature'];
    delete map['hmac'];
    const message = querystring.stringify(map);
    const providedHmac = Buffer.from(hmac, 'utf-8');
    const generatedHash = Buffer.from(
      crypto
        .createHmac('sha256', apiSecret)
        .update(message)
        .digest('hex'),
        'utf-8'
      );
    let hashEquals = false;
    // timingSafeEqual will prevent any timing attacks. Arguments must be buffers
    try {
      hashEquals = crypto.timingSafeEqual(generatedHash, providedHmac)
    // timingSafeEqual will return an error if the input buffers are not the same length.
    } catch (e) {
      hashEquals = false;
    };

    if (!hashEquals) {
      return res.status(400).send('HMAC validation failed');
    }

    const accessTokenRequestUrl = 'https://' + shop + '/admin/oauth/access_token';
    const accessTokenPayload = {
      client_id: apiKey,
      client_secret: apiSecret,
      code,
    };

    request.post(accessTokenRequestUrl, { json: accessTokenPayload })
    .then((accessTokenResponse) => {
      const accessToken = accessTokenResponse.access_token;
      // DONE: Use access token to make API call to 'shop' endpoint
      const shopRequestUrl = 'https://' + shop + '/admin/api/2019-04/themes.json';
      const shopRequestHeaders = {
        'X-Shopify-Access-Token': accessToken,
      };

      request.get(shopRequestUrl, { headers: shopRequestHeaders })
      .then((shopResponse) => {
        // This is what I have tried replacing with a render method
        res.status(200).end(shopResponse);
      })
      .catch((error) => {
        res.status(error.statusCode).send(error.error.error_description);
      });

    })
    .catch((error) => {
      res.status(error.statusCode).send(error.error.error_description);
    });

  } else {
    res.status(400).send('Required parameters missing');
  }
});

Я ожидаю, что смогу увидеть базовый html в администраторе приложения Shopify.

решаемые

После прочтения принятого ответа я понял, что мне не нужны все данные с самого начала, чтобы показать файл.

Мой маршрут из белого списка выглядел так:

app.get('/shopify/callback', (req, res) => {

  res.render('pages/index')
});

Ответы [ 3 ]

0 голосов
/ 24 апреля 2019

Вы не отображаете свой HTML в Shopify Admin.Вместо этого вы отображаете HTML в своем приложении, и Shopify отображает ваше приложение, встроенное в Shopify Admin.У вас есть два варианта.Во-первых, ваше приложение отображается за пределами администратора, как и любое другое обычное веб-приложение, или два, вы выбираете отображение внутри администратора Shopify как встроенное приложение, что означает, что ваш HTML-дисплей внутри iframe создает Shopify для вас.

Перед тем, как создавать приложение, вам следует прочитать документацию по Shopify Apps, а затем спросить, как приложения отображают HTML ... важно, чтобы вы поняли основную концепцию этого.

0 голосов
/ 25 апреля 2019

Как только вы успешно получаете shop json, это означает, что приложение успешно установлено в магазине shopify

Чтобы отобразить html в приложении для администратора магазина, вы должны создать в своем проекте один маршрут, который отобразит HTML-страницу, как показано ниже

app.get('/', function (req, res, next) {
    res.render('your html page path');
}); 

это может сделать вас html-страницей, где вы можете отобразить html для домашней страницы вашего приложения

Теперь вам нужно установить URL своего домена в настройках приложения учетной записи партнера shopify Shopifyпартнерская учетная запись щелкните этот URL-адрес и перейдите в приложение >> Настройка приложения и добавьте свой https-домен для своего приложения

https://yourdomain.com/

эта корневая папка загружается, когда ваше приложение открывается из shopify admin и на нем отображается индексhtml-страница для вашего приложения

0 голосов
/ 24 апреля 2019

Отредактировано: я также новичок в разработке для Shopify и провожу последние 3 недели, настраивая свои приложения Node / Express для работы с Shopify, и у меня тоже есть проблемы в дороге.

Я только что рассмотрел это сегодня вечером (25.04.19) и вот что я сделал, чтобы отобразить / показать свою страницу index.html.

Добавьте это к вершине с вашими другими требованиями:

var path = require('path');

Добавить этот путь в:

app.get('/shopify', function (req, res, next) {
res.sendFile(path.join(__dirname, '../public', 'index.html'));
}); 

Примечание: «../pubic» - это каталог прямо перед моим файлом «index.html». Возможно, это будет для вас иначе, но это должно быть легко понять.

Я также добавил в этот путь:

app.get('/', function (req, res, next) {
res.sendFile(path.join(__dirname, '../public', 'index.html'));
}); 
...