fengketrade/addons/shopro/library/ccblife/CcbOrderService.php
2025-10-17 16:32:16 +08:00

254 lines
7.3 KiB
PHP

<?php
namespace addons\shopro\library\ccblife;
use think\Exception;
/**
* 建行订单服务类
*
* 功能:
* - 订单推送到建行 (A3341TP01)
* - 订单状态更新 (A3341TP02)
* - 订单查询 (A3341TP03)
* - 订单退款 (A3341TP04)
*
* @author Billy
* @date 2025-01-16
*/
class CcbOrderService
{
/**
* HTTP客户端
* @var CcbHttpClient
*/
private $httpClient;
/**
* 配置信息
* @var array
*/
private $config;
/**
* 构造函数
*
* @param array $config 配置数组
*/
public function __construct($config = [])
{
if (empty($config)) {
$config = config('ccblife');
}
$this->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';
}
}