You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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命令设置:
    flyctl secrets set APP_URL=https://clipjoy.fly.dev
    flyctl secrets set SHOPIFY_CLIENT_ID=你的客户端ID
    flyctl secrets set SHOPIFY_CLIENT_SECRET=你的客户端密钥
    
    若使用Laravel Shopify包,额外设置:
    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

验证步骤

  1. 部署修复后的代码到Fly.io
  2. 访问安装路由,查看跳转的/admin/oauth/authorize请求参数,确认redirect_uri为正确的Fly.io地址
  3. 完成授权流程,检查是否仍出现invalid_request错误

内容的提问来源于stack exchange,提问作者Saqib Rashid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 07:25:34