mirror of
https://gitee.com/liuxioabin/fengketrade.git
synced 2026-04-17 12:57:32 +08:00
254 lines
7.3 KiB
PHP
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';
|
|
}
|
|
}
|