executeParam2( self::NAMESPACE, 'alibaba.createOrder.preview', 1, $businessParams ); if ($result === false) { Log::channel('alibaba')->error('[预下单] API请求失败', $businessParams); return false; } return $this->formatPreviewResult($result); } /** * 格式化预下单返回结果 * * 实际返回结构: * { * "orderPreviewResuslt": [{ * "tradeModeNameList": ["assureTrade"], * "status": true, * "sumPayment": 370, // 总支付金额(单位:分) * "sumCarriage": 300, // 总运费(单位:分) * "sumPaymentNoCarriage": 70, // 商品总金额(不含运费,单位:分) * "flowFlag": "fenxiaonew", * "cargoList": [{ // 商品列表 * "amount": 0.7, * "finalUnitPrice": 0.7, * "specId": "...", * "skuId": 6148579878582, * "offerId": 678279922176, * "openOfferId": "...", * "cargoPromotionList": [] * }], * "tradeModelList": [{"name":"担保交易","tradeType":"assureTrade","opSupport":true}], * "payChannelInfos": [{"name":"alipay"}], * "orderGroup": "79d4f82d...", * "canUseOfficialSolution": false * }], * "success": true, * "unsupportedCrossBorderPayOfferList": [] * } * * @param array $result API原始返回数据 * @return array */ protected function formatPreviewResult(array $result): array { $success = $result['success'] ?? false; $previewList = $result['orderPreviewResuslt'] ?? []; if (empty($previewList) || !is_array($previewList)) { return [ 'success' => $success, 'preview' => null, 'list' => [], ]; } $formattedList = []; foreach ($previewList as $item) { $formattedList[] = [ 'sumPayment' => $item['sumPayment'] ?? 0, 'sumCarriage' => $item['sumCarriage'] ?? 0, 'sumPaymentNoCarriage' => $item['sumPaymentNoCarriage'] ?? 0, 'flowFlag' => $item['flowFlag'] ?? '', // 'orderGroup' => $item['orderGroup'] ?? '', // 'status' => $item['status'] ?? false, // 'cargoList' => $item['cargoList'] ?? [], // 'tradeModeNameList' => $item['tradeModeNameList'] ?? [], // 'tradeModelList' => $item['tradeModelList'] ?? [], // 'payChannelInfos' => $item['payChannelInfos'] ?? [], // 'shopPromotionList' => $item['shopPromotionList'] ?? [], // 'tradeServiceList' => $item['tradeServiceList'] ?? [], // 'taoSampleSinglePromotion' => $item['taoSampleSinglePromotion'] ?? false, // 'canUseOfficialSolution' => $item['canUseOfficialSolution'] ?? false, ]; } return [ // 'success' => $success, 'preview' => $formattedList[0] ?? null, // 'list' => $formattedList, // 'unsupportedCrossBorderPayOfferList' => $result['unsupportedCrossBorderPayOfferList'] ?? [], ]; } /** * 构建商品列表参数(便捷方法) * * @param array $items 商品列表 [['offerId' => 123, 'quantity' => 2, 'skuId' => 456], ...] * @return array */ public function buildProductList(array $items): array { $productList = []; foreach ($items as $item) { $product = [ 'offerId' => (int)($item['offerId'] ?? $item['productId'] ?? 0), 'quantity' => (int)($item['quantity'] ?? 1), ]; if (!empty($item['skuId'])) { $product['skuId'] = (int)$item['skuId']; } if (!empty($item['price'])) { $product['price'] = (int)$item['price']; // 单位:分 } if (!empty($item['productUnit'])) { $product['productUnit'] = $item['productUnit']; } $productList[] = $product; } return $productList; } /** * 构建地址参数(便捷方法) * * @param int $addressId 地址ID * @return array */ public function buildAddressParam(int $addressId): array { return [ 'addressId' => $addressId, ]; } /** * 构建完整地址参数(使用系统地址数据格式) * * 适配系统 user_address 表字段: * address_id, real_name, phone, province, city, district, detail, post_code, code_list * * @param array $address 地址信息(系统user_address表数据) * @return array */ public function buildFullAddressParam(array $address): array { // 解析地区编码列表: "1,67449,35,493" $codeList = $address['code_list'] ?? ''; $codes = explode(',', $codeList); $districtCode = $codes[1] ?? $codes[0] ?? ''; return [ 'fullName' => $address['real_name'] ?? $address['fullName'] ?? '', 'mobile' => $address['phone'] ?? $address['mobile'] ?? '', 'phone' => $address['phone'] ?? $address['phone'] ?? '', 'postCode' => $address['post_code'] ?? $address['postCode'] ?? '', 'cityText' => $address['city'] ?? $address['cityText'] ?? '', 'provinceText' => $address['province'] ?? $address['provinceText'] ?? '', 'areaText' => $address['district'] ?? $address['areaText'] ?? '', 'townText' => $address['village'] ?? $address['townText'] ?? '', 'address' => $address['detail'] ?? $address['address'] ?? '', 'districtCode' => $districtCode, ]; } }