如何在Laravel 8中集成Shippo API并解决参数不足/变量未定义错误
你当前贴出的控制器代码中没有Shippo相关调用逻辑,报错大概率出现在你注入的Shipping_New服务类内部,可按以下步骤逐一排查修复:
优先检查Shippo基础配置是否正确
确认你在.env文件中已经配置了正确的SHIPPO_API_KEY,并且在config目录下新建了shippo.php配置文件,参考配置如下:return [ 'api_key' => env('SHIPPO_API_KEY'), 'shipper_address' => [ 'name' => '你的店铺名称', 'street1' => '发件人详细地址', 'city' => '发件人所在城市', 'state' => '发件人所在省份', 'zip' => '发件人邮编', 'country' => '发件人国家二字码,如CN、US', 'phone' => '发件人联系电话' ] ];如果你在服务类中硬写密钥或者地址参数漏填,就会出现变量未定义或者参数过少的错误。
检查
Shipping_New服务类的Shippo调用参数完整性
Shippo获取运费接口最少需要传入发件人地址、收件人地址、包裹信息三个必填参数,缺任意一个就会报参数过少错误。你需要确认调用Shippo_Shipment::create()方法时,三个参数都已正确赋值,尤其不要漏传包裹的重量、尺寸参数,参考调用示例:// 发件人地址从配置读取,收件人从CheckoutStore方法的$data取 $shipment = \Shippo_Shipment::create([ 'address_from' => config('shippo.shipper_address'), 'address_to' => [ 'name' => $data['name'] . ' ' . $data['shipping_last_name'], 'street1' => $data['street1'], 'city' => $data['city'], 'state' => ShipState::find($data['state_id'])->state_name, 'zip' => $data['zip'], 'country' => $data['country'], 'phone' => $data['phone'] ], 'parcels' => [[ 'length' => 10, // 替换为购物车商品合计包裹长度 'width' => 10, // 替换为购物车商品合计包裹宽度 'height' => 10, // 替换为购物车商品合计包裹高度 'distance_unit' => 'cm', 'weight' => 2, // 替换为购物车商品合计重量 'mass_unit' => 'kg' ]], 'async' => false ]);注意你代码中的
state_id、district_id存储的是关联表主键,直接传给Shippo会报错,需要先转换为对应的地址文本。检查命名空间和依赖注入配置
如果你是在Shipping_New类中调用Shippo,要确认类顶部已经引入use Shippo;,并且在服务容器注册Shipping_New时没有传错构造参数。另外你控制器构造方法的注释标注的注入类是UserRepository和Shipping,实际注入的是User和Shipping_New,注释和实际不一致的情况下,如果用到了IDE自动生成代码或者反射类扩展,也可能引发参数错误,建议统一注释和实际注入的类名。开启调试日志定位具体报错位置
在Laravel的config/app.php中将APP_DEBUG设为true,复现错误后查看storage/logs下的日志文件,可以直接定位到具体报错的文件和代码行,快速找到漏传的参数或者未定义的变量。
内容的提问来源于stack exchange,提问作者D.T

