Topics covering webhook creation & management, event handling, Pub/Sub, and Eventbridge, in Shopify apps.
Hi folks,
I'm new to the technology stack recommended by Shopify. However following several examples I registered a webhook with read_orders and write_orders scope available after authentication:
// register webhook
const registration = await registerWebhook({
address: `${HOST}/webhooks/orders/create`,
topic: "ORDERS_CREATE",
accessToken,
shop,
apiVersion: '2020-01'
});
The registration comes back with success.
I have then done the following to make sure I catch the firing webhook:
const webhook = receiveWebhook({ secret: SHOPIFY_API_SECRET_KEY });
router.post('/webhooks/orders/create', webhook, (ctx) => {
console.log('received webhook: ', ctx.state.webhook);
});
Koa router is then set up thusly:
router.get('*', verifyRequest(), async (ctx) => {
ctx.respond = false;
ctx.res.statusCode = 200;
});
server.use(router.allowedMethods());
server.use(router.routes());
I'm using paid ngrok so the host URL is stable. I have the app reinstalled in my test store. And I created a test webhook call in notifications. I also set up the koa router log to show incoming traffic.
When I test the webhook through notifications I do not see any traffic coming into the app and no webhook is caught.
Seems to me that either the webhook is not firing or the above code is wrong or I have missed a step. Aside from the fact I'm not using next.js I believe I'm doing everything the example app suggests (I may have missed something).
I hoped someone may have had the same problem or had some hints to help. Next I'll fire some data via postman to see if it's received.
Best regards, G.
How do you test the webhook? Are you creating an order through Shopify Admin?
Hi Sergiu,
Thank you for your interest.
I created an order through the store itself as a customer with the bogus payment gateway.
Also through admin->notification->test webhook.
Best regards, G.
Thanks for your advice. Appreciated.
Without the host I receive the message: "Invalid url '/webhooks/orders/create', missing host" as an error on the registerWebhook.
G.
Hmm this is my exact code for registering webhooks. As you can see, I don't prefix the host, otherwise the host is appended twice. What I do know, is that "registerWebhook" fails if you ever called it before. If you messed up your webhook, and want to reregister it, you have to delete it. Otherwise the "registerWebhook" call will fail with an exception.
async afterAuth(ctx) { const { shop, accessToken } = ctx.session; try { await registerWebhooks( shop, accessToken, "APP_SUBSCRIPTIONS_UPDATE", "/webhooks/app_subscriptions/update", "2020-01" ); } catch (e) { console.error(e); } ctx.redirect("/"); }
And this my route:
const webhook = receiveWebhook({ secret: SHOPIFY_API_SECRET }); router.post("/webhooks/app_subscriptions/update", webhook, async ctx => { const { payload: { app_subscription } } = ctx.state.webhook; console.log(app_subscription); ctx.respond = false; ctx.res.statusCode = 200; });
@tolgapaksoy thank you so much for your help and code. I tried this and a few other things and still no cigar.
I'm starting to wonder if it's a ngrok / ssl issue that I am completely misunderstanding.
Routing with GETs is working fine (tested with Curl) but a random POST might not be getting through.
I'll post an update if I find any useful information.
G.
Hi folks,
I wanted to give a quick update on my issue. I didn't find any help on other forums or internet searches.
- Webhook on order / create is still not being received through ngrok: I tried several ngrok settings and kept it simple with ngrok http -subdomain=xxxx.com.ngrok.io 3000.
- I created a whole new development store and installed the app. No luck.
- I registered the webhook in Settings->Notifications->Webhooks, just to see if I could fire it from there. Nothing received.
- Oddly, if I execute curl --insecure -d 'random data' https://xxxx.com.ngrok.io/webhooks/order/create then the ngrok shows receipt of the POST and my server routing also logs receipt of the post (302 to auth which I was expecting).
So I'm wondering what the difference is between executing the webhook from Shopify and curl. Could it be a SSL cert issue or something similar? I understand that ngrok should take care of this - so it seems unlikely.
Pretty stumped for something that should be so easy. Any thoughts appreciated. I'd love to help out others who might have had the same problem, even given up.
G.
Hi All,
I have also an issue with Order Create webhooks (Order Webhooks at ALL).
First of all, when testing Webhooks from Store Admin, at the endpoint the webhook request can not be validated normally as the shared secret is different than when that store is subscribed for notifications through Shopify Application through the API. But that webhooks ( Settings -> Notifications -> Create Webhook) all the time working perfectly.
What I am trying and what I get up to now...
1. I got a multi-channel lister and 2 stores connected inside (Authorized through the Shopify API and subscribed for Carts, Checkouts, and Orders Webhooks)
2. Endpoint to validate and process the Webhooks
Up to now, there was not any issue regarding Orders Webhooks. My APP catches them all and processes it normally.
But before an hour, only the Orders Webhooks stops, I tried a lot of things
- unsubscribe and subscribe Stores
- create a new development Store. Subscribed that new store for Carts, Checkouts, and Orders Webhooks
- double-checked that that new store is subscribed
one of the answers I think is most accurate in our case is that that happen after I try to complete the checkout choosing Bogus Gateway card number 2 and 3 - after that everything stuck
The same issue here, ORDERS_CREATE doesn't trigger webhook to ngrok domains. It's impossible to test locally without it.
I didn't read this whole thread, but when I create webhooks programmatically it's topic: 'orders/create' not 'ORDERS_CREATE'
I'm with the same problem, I can't receive the request in my application using ngrok.
I tried any things, if you know anything please help us.
Topic: cart/create and cart/update
After finding many hours and wrote here in the community, I solved my problem.
I'm building an application with .Net core. So on startup of .Net core applications have and configuration app.UseHttpsRedirection() by default.
When I was reading about some possibilities I was thinking of TCP problem because the ngrok was receiving the shopify signal webhook, but I got to see the ngrok logs and there was "307 Temporary Redirect".
So I removed the UseHttpsRedirection and the problem was solved. I Think on the production server I won't have these problems