config = $config; $this->httpClient = new CcbHttpClient($config); } /** * 推送订单到建行 (A3341TP01) * * @param array $orderData 订单数据 * @return array 返回结果 ['success' => bool, 'data' => array, 'error' => string] */ public function pushOrder($orderData) { try { // 构造订单推送数据 $bodyData = $this->buildOrderPushData($orderData); // 发送请求 $result = $this->httpClient->request('A3341TP01', $bodyData); return [ 'success' => true, 'data' => $result, 'ccb_discount_amt' => $result['CLD_BODY']['CCB_DISCOUNT_AMT'] ?? '0.00', ]; } catch (Exception $e) { return [ 'success' => false, 'error' => $e->getMessage(), ]; } } /** * 更新订单状态 (A3341TP02) * * @param string $orderId 订单ID * @param array $updateData 更新数据 * @return array 返回结果 */ public function updateOrder($orderId, $updateData) { try { // 构造订单更新数据 $bodyData = array_merge([ 'ORDER_ID' => $orderId, ], $updateData); // 发送请求 $result = $this->httpClient->request('A3341TP02', $bodyData); return [ 'success' => true, 'data' => $result, ]; } catch (Exception $e) { return [ 'success' => false, 'error' => $e->getMessage(), ]; } } /** * 查询订单 (A3341TP03) * * @param string $orderId 订单ID * @return array 返回结果 */ public function queryOrder($orderId) { try { $bodyData = [ 'ORDER_ID' => $orderId, ]; $result = $this->httpClient->request('A3341TP03', $bodyData); return [ 'success' => true, 'data' => $result, ]; } catch (Exception $e) { return [ 'success' => false, 'error' => $e->getMessage(), ]; } } /** * 订单退款 (A3341TP04) * * @param string $orderId 订单ID * @param float $refundAmount 退款金额 * @param string $refundReason 退款原因 * @return array 返回结果 */ public function refundOrder($orderId, $refundAmount, $refundReason = '') { try { $bodyData = [ 'ORDER_ID' => $orderId, 'REFUND_AMT' => number_format($refundAmount, 2, '.', ''), 'REFUND_REASON' => $refundReason ?: '用户申请退款', ]; $result = $this->httpClient->request('A3341TP04', $bodyData); return [ 'success' => true, 'data' => $result, ]; } catch (Exception $e) { return [ 'success' => false, 'error' => $e->getMessage(), ]; } } /** * 构造订单推送数据 (根据建行接口规范) * * @param array $orderData 商城订单数据 * @return array 建行接口要求的数据格式 */ private function buildOrderPushData($orderData) { // SKU商品列表 $skuList = []; if (!empty($orderData['goods_list'])) { foreach ($orderData['goods_list'] as $goods) { $skuList[] = [ 'SKU_NAME' => $goods['goods_name'] ?? '', 'SKU_REF_PRICE' => number_format($goods['price'] ?? 0, 2, '.', ''), 'SKU_NUM' => $goods['num'] ?? 1, 'SKU_SELL_PRICE' => number_format($goods['price'] ?? 0, 2, '.', ''), ]; } } // 商户信息 $merchantConfig = $this->config['merchant'] ?? []; return [ 'USER_ID' => $orderData['ccb_user_id'] ?? '', 'ORDER_ID' => $orderData['order_sn'] ?? '', 'ORDER_DT' => date('YmdHis', $orderData['create_time'] ?? time()), 'TOTAL_AMT' => number_format($orderData['total_amount'] ?? 0, 2, '.', ''), 'PAY_AMT' => number_format($orderData['pay_amount'] ?? 0, 2, '.', ''), 'DISCOUNT_AMT' => number_format($orderData['discount_amount'] ?? 0, 2, '.', ''), 'ORDER_STATUS' => $this->mapOrderStatus($orderData['pay_status'] ?? 0), 'REFUND_STATUS' => $this->mapRefundStatus($orderData['refund_status'] ?? 0), 'MCT_NM' => $merchantConfig['name'] ?? '商户名称', 'CUS_ORDER_URL' => $merchantConfig['order_detail_url'] . $orderData['id'], 'OCC_MCT_LOGO_URL' => $merchantConfig['logo_url'] ?? '', 'PAY_FLOW_ID' => $orderData['ccb_pay_flow_id'] ?? '', 'PAY_MRCH_ID' => $this->config['merchant_id'] ?? '', 'SKU_LIST' => json_encode($skuList, JSON_UNESCAPED_UNICODE), ]; } /** * 映射订单状态 * * Shopro订单状态 => 建行订单状态 * Shopro: closed=交易关闭, cancel=已取消, unpaid=未支付, paid=已支付, completed=已完成, pending=待定 * 建行: 0-待支付 1-已支付 2-已过期 3-失败 4-取消 * * @param string $status Shopro订单状态 * @return string 建行订单状态 */ private function mapOrderStatus($status) { $map = [ 'unpaid' => '0', // 未支付 => 待支付 'paid' => '1', // 已支付 => 已支付 'completed' => '1', // 已完成 => 已支付 'closed' => '2', // 交易关闭 => 已过期 'cancel' => '4', // 已取消 => 取消 'pending' => '0', // 待定 => 待支付 ]; return $map[$status] ?? '0'; } /** * 映射退款状态 * * 0-无退款 1-申请 2-已退款 3-部分退款 * * @param int $status 退款状态 * @return string 建行退款状态 */ private function mapRefundStatus($status) { $map = [ 0 => '0', // 无退款 1 => '1', // 申请 2 => '2', // 已退款 3 => '3', // 部分退款 ]; return $map[$status] ?? '0'; } }