PHP Shopify应用部署Fly.io后遇redirect_uri未白名单OAuth错误
解决Shopify应用部署到Fly.io后的OAuth重定向错误
问题根源分析
你遇到的redirect_uri被替换为https://not_defined/api/auth/callback是核心线索,这说明应用代码或依赖的Shopify工具包在读取应用域名时,未获取到正确的Fly.io部署地址,转而使用了默认占位值。结合代码和现象,问题集中在环境变量配置缺失、硬编码域名的兼容性问题,以及access_token请求的语法错误上。
具体修复步骤
1. 修正Fly.io环境变量配置
Fly.io部署时必须设置正确的应用域名环境变量,否则Laravel和Shopify相关工具包无法生成正确URL:
- 通过Fly.io控制台或
flyctl命令设置:
若使用Laravel Shopify包,额外设置:flyctl secrets set APP_URL=https://clipjoy.fly.dev flyctl secrets set SHOPIFY_CLIENT_ID=你的客户端ID flyctl secrets set SHOPIFY_CLIENT_SECRET=你的客户端密钥flyctl secrets set SHOPIFY_APP_URL=https://clipjoy.fly.dev
2. 重构install路由的redirect_uri生成逻辑
不要硬编码域名,改用Laravel辅助函数生成动态URL,适配不同环境:
// 先给redirect路由命名,示例:Route::get('/api/shopify/redirect', ...)->name('shopify.redirect'); Route::get('/api/install/clipjoy', function (Request $request) { $shop = Utils::sanitizeShopDomain($request->query('shop')); // 用route函数生成完整HTTPS地址,自动适配当前环境 $redirectUrl = route('shopify.redirect', [], true); $encodedRedirect = urlencode($redirectUrl); $clientId = env('SHOPIFY_CLIENT_ID'); $scope = 'write_products,read_orders,write_publications,read_publications,read_themes'; header("Location: https://{$shop}/admin/oauth/authorize?client_id={$clientId}&scope={$scope}&redirect_uri={$encodedRedirect}"); exit(); });
3. 修复installApp方法的access_token请求语法错误
原代码单引号包裹变量导致无法解析,且参数格式错误,改为POST表单参数传递:
public function installApp(Request $request) { $shop = $request->get('shop'); $code = $request->get('code'); $response = Http::post( "https://{$shop}/admin/oauth/access_token", [ 'client_id' => env('SHOPIFY_CLIENT_ID'), 'client_secret' => env('SHOPIFY_CLIENT_SECRET'), 'code' => $code, ] ); // 可选:添加错误处理逻辑 if (!$response->successful()) { abort(500, '获取Shopify访问令牌失败'); } return redirect(Utils::getEmbeddedAppUrl($request->query("host", null))); }
4. 验证Shopify后台的重定向URL配置
确保Shopify合作伙伴后台的**Allowed redirection URL(s)**中添加完整的Fly.io地址:
https://clipjoy.fly.dev/api/shopify/redirect
不要仅填写路径,Shopify要求必须是完整的HTTPS URL。
5. 排查SDK自动OAuth冲突
若项目使用Laravel Shopify或Shopify官方PHP SDK,这些工具包可能自带默认OAuth路由(如/api/auth/callback),覆盖自定义流程:
- 禁用SDK自动路由注册(参考对应包文档,比如laravel-shopify可在配置文件设置
authenticate = false) - 确保SDK配置中的
redirect_uri指向自定义端点/api/shopify/redirect
验证步骤
- 部署修复后的代码到Fly.io
- 访问安装路由,查看跳转的
/admin/oauth/authorize请求参数,确认redirect_uri为正确的Fly.io地址 - 完成授权流程,检查是否仍出现
invalid_request错误
内容的提问来源于stack exchange,提问作者Saqib Rashid
相关产品推荐
相关产品推荐

