1460 lines
51 KiB
PHP
Executable File
1460 lines
51 KiB
PHP
Executable File
<?php
|
||
// +----------------------------------------------------------------------
|
||
// | ShopXO 国内领先企业级B2C免费开源电商系统
|
||
// +----------------------------------------------------------------------
|
||
// | Copyright (c) 2011~2019 http://shopxo.net All rights reserved.
|
||
// +----------------------------------------------------------------------
|
||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||
// +----------------------------------------------------------------------
|
||
// | Author: Devil
|
||
// +----------------------------------------------------------------------
|
||
namespace app\service;
|
||
|
||
use think\Db;
|
||
use think\facade\Hook;
|
||
use app\service\PaymentService;
|
||
use app\service\BuyService;
|
||
use app\service\IntegralService;
|
||
use app\service\RegionService;
|
||
use app\service\ExpressService;
|
||
use app\service\ResourcesService;
|
||
use app\service\PayLogService;
|
||
|
||
/**
|
||
* 订单服务层
|
||
* @author Devil
|
||
* @blog http://gong.gg/
|
||
* @version 0.0.1
|
||
* @datetime 2016-12-01T21:51:08+0800
|
||
*/
|
||
class OrderService
|
||
{
|
||
/**
|
||
* 订单支付
|
||
* @author Devil
|
||
* @blog http://gong.gg/
|
||
* @version 1.0.0
|
||
* @date 2018-09-26
|
||
* @desc description
|
||
* @param [array] $params [输入参数]
|
||
*/
|
||
public static function Pay($params = [])
|
||
{
|
||
// 请求参数
|
||
$p = [
|
||
[
|
||
'checked_type' => 'empty',
|
||
'key_name' => 'id',
|
||
'error_msg' => '订单id有误',
|
||
],
|
||
[
|
||
'checked_type' => 'empty',
|
||
'key_name' => 'user',
|
||
'error_msg' => '用户信息有误',
|
||
],
|
||
];
|
||
$ret = ParamsChecked($params, $p);
|
||
if($ret !== true)
|
||
{
|
||
return DataReturn($ret, -1);
|
||
}
|
||
|
||
// 获取订单信息
|
||
$where = ['id'=>intval($params['id']), 'user_id' => $params['user']['id']];
|
||
$order = Db::name('Order')->where($where)->find();
|
||
if(empty($order))
|
||
{
|
||
return DataReturn('资源不存在或已被删除', -1);
|
||
}
|
||
if($order['status'] != 1)
|
||
{
|
||
$status_text = lang('common_order_user_status')[$order['status']]['name'];
|
||
return DataReturn('状态不可操作['.$status_text.']', -1);
|
||
}
|
||
|
||
// 支付方式
|
||
$payment_id = empty($params['payment_id']) ? $order['payment_id'] : intval($params['payment_id']);
|
||
$payment = PaymentService::PaymentList(['where'=>['id'=>$payment_id]]);
|
||
if(empty($payment[0]))
|
||
{
|
||
return DataReturn('支付方式有误', -1);
|
||
}
|
||
|
||
// 更新订单支付方式
|
||
if(!empty($params['payment_id']) && $params['payment_id'] != $order['payment_id'])
|
||
{
|
||
Db::name('Order')->where(['id'=>$order['id']])->update(['payment_id'=>$payment_id, 'upd_time'=>time()]);
|
||
}
|
||
|
||
// 金额为0直接支付成功
|
||
if($order['total_price'] <= 0.00)
|
||
{
|
||
// 非线上支付处理
|
||
$params['user']['user_name_view'] = '用户-'.$params['user']['user_name_view'];
|
||
$pay_result = self::OrderPaymentUnderLine([
|
||
'order' => $order,
|
||
'payment' => $payment[0],
|
||
'user' => $params['user'],
|
||
'subject' => $params,
|
||
]);
|
||
if($pay_result['code'] == 0)
|
||
{
|
||
return DataReturn('支付成功', 0, ['data'=>MyUrl('index/order/respond', ['appoint_status'=>0])]);
|
||
}
|
||
return $pay_result;
|
||
}
|
||
|
||
// 支付入口文件检查
|
||
$pay_checked = PaymentService::EntranceFileChecked($payment[0]['payment'], 'order');
|
||
if($pay_checked['code'] != 0)
|
||
{
|
||
// 入口文件不存在则创建
|
||
$payment_params = [
|
||
'payment' => $payment[0]['payment'],
|
||
'respond' => '/index/order/respond',
|
||
'notify' => '/api/ordernotify/notify',
|
||
];
|
||
$ret = PaymentService::PaymentEntranceCreated($payment_params);
|
||
if($ret['code'] != 0)
|
||
{
|
||
return $ret;
|
||
}
|
||
}
|
||
|
||
// 回调地址
|
||
$url = __MY_URL__.'payment_order_'.strtolower($payment[0]['payment']);
|
||
|
||
// url模式, pathinfo模式下采用自带url生成url, 避免非index.php多余
|
||
if(MyC('home_seo_url_model', 0) == 0)
|
||
{
|
||
$call_back_url = $url.'_respond.php';
|
||
} else {
|
||
$call_back_url = MyUrl('index/order/respond', ['paymentname'=>$payment[0]['payment']]);
|
||
if(stripos($call_back_url, '?') !== false)
|
||
{
|
||
$call_back_url = $url.'_respond.php';
|
||
}
|
||
}
|
||
|
||
// 发起支付
|
||
$pay_data = array(
|
||
'user' => $params['user'],
|
||
'out_user' => md5($params['user']['id']),
|
||
'order_id' => $order['id'],
|
||
'order_no' => $order['order_no'],
|
||
'name' => '订单支付',
|
||
'total_price' => $order['total_price'],
|
||
'client_type' => $order['client_type'],
|
||
'notify_url' => $url.'_notify.php',
|
||
'call_back_url' => $call_back_url,
|
||
'site_name' => MyC('home_site_name', 'ShopXO', true),
|
||
'ajax_url' => MyUrl('index/order/paycheck'),
|
||
);
|
||
$pay_name = 'payment\\'.$payment[0]['payment'];
|
||
$ret = (new $pay_name($payment[0]['config']))->Pay($pay_data);
|
||
if(isset($ret['code']) && $ret['code'] == 0)
|
||
{
|
||
// 非线上支付处理
|
||
if(in_array($payment[0]['payment'], config('shopxo.under_line_list')))
|
||
{
|
||
$params['user']['user_name_view'] = '用户-'.$params['user']['user_name_view'];
|
||
$pay_result = self::OrderPaymentUnderLine([
|
||
'order' => $order,
|
||
'payment' => $payment[0],
|
||
'user' => $params['user'],
|
||
'subject' => $params,
|
||
]);
|
||
if($pay_result['code'] != 0)
|
||
{
|
||
return $pay_result;
|
||
}
|
||
}
|
||
|
||
// 支付信息返回
|
||
$ret['data'] = [
|
||
// 是否为线下支付类型
|
||
'is_under_line' => in_array($payment[0]['payment'], config('shopxo.under_line_list')) ? 1 : 0,
|
||
|
||
// 支付模块处理数据
|
||
'data' => $ret['data'],
|
||
];
|
||
|
||
return $ret;
|
||
}
|
||
return DataReturn(empty($ret['msg']) ? '支付接口异常' : $ret['msg'], -1);
|
||
}
|
||
|
||
/**
|
||
* 管理员订单支付
|
||
* @author Devil
|
||
* @blog http://gong.gg/
|
||
* @version 1.0.0
|
||
* @date 2018-09-26
|
||
* @desc description
|
||
* @param [array] $params [输入参数]
|
||
*/
|
||
public static function AdminPay($params = [])
|
||
{
|
||
// 请求参数
|
||
$p = [
|
||
[
|
||
'checked_type' => 'empty',
|
||
'key_name' => 'id',
|
||
'error_msg' => '订单id有误',
|
||
],
|
||
[
|
||
'checked_type' => 'empty',
|
||
'key_name' => 'user',
|
||
'error_msg' => '管理员信息有误',
|
||
],
|
||
];
|
||
$ret = ParamsChecked($params, $p);
|
||
if($ret !== true)
|
||
{
|
||
return DataReturn($ret, -1);
|
||
}
|
||
|
||
// 获取订单信息
|
||
$where = ['id'=>intval($params['id'])];
|
||
$order = Db::name('Order')->where($where)->find();
|
||
if(empty($order))
|
||
{
|
||
return DataReturn('资源不存在或已被删除', -1);
|
||
}
|
||
if($order['status'] != 1)
|
||
{
|
||
$status_text = lang('common_order_admin_status')[$order['status']]['name'];
|
||
return DataReturn('状态不可操作['.$status_text.']', -1);
|
||
}
|
||
|
||
// 支付方式
|
||
$payment_id = empty($params['payment_id']) ? $order['payment_id'] : intval($params['payment_id']);
|
||
$payment = PaymentService::PaymentList(['where'=>['id'=>$payment_id]]);
|
||
if(empty($payment[0]))
|
||
{
|
||
return DataReturn('支付方式有误', -1);
|
||
}
|
||
|
||
// 非线上支付处理
|
||
return self::OrderPaymentUnderLine([
|
||
'order' => $order,
|
||
'payment' => $payment[0],
|
||
'user' => $params['user'],
|
||
'subject' => $params,
|
||
]);
|
||
}
|
||
|
||
/**
|
||
* [OrderPaymentUnderLine 线下支付处理]
|
||
* @author Devil
|
||
* @blog http://gong.gg/
|
||
* @version 1.0.0
|
||
* @datetime 2018-10-05T22:40:57+0800
|
||
* @param [array] $params [输入参数]
|
||
*/
|
||
private static function OrderPaymentUnderLine($params = [])
|
||
{
|
||
if(!empty($params['order']) && !empty($params['payment']) && !empty($params['user']))
|
||
{
|
||
if(in_array($params['payment']['payment'], config('shopxo.under_line_list')) || $params['order']['total_price'] <= 0.00)
|
||
{
|
||
// 支付处理
|
||
$pay_params = [
|
||
'order' => $params['order'],
|
||
'payment' => $params['payment'],
|
||
'pay' => [
|
||
'trade_no' => '',
|
||
'subject' => isset($params['params']['subject']) ? $params['params']['subject'] : '订单支付',
|
||
'buyer_user' => $params['user']['user_name_view'],
|
||
'pay_price' => $params['order']['total_price'],
|
||
],
|
||
];
|
||
return self::OrderPayHandle($pay_params);
|
||
} else {
|
||
return DataReturn('仅线下支付方式处理', -1);
|
||
}
|
||
}
|
||
return DataReturn('无需处理', 0);
|
||
}
|
||
|
||
/**
|
||
* 支付同步处理
|
||
* @author Devil
|
||
* @blog http://gong.gg/
|
||
* @version 1.0.0
|
||
* @date 2018-09-28
|
||
* @desc description
|
||
* @param [array] $params [输入参数]
|
||
*/
|
||
public static function Respond($params = [])
|
||
{
|
||
// 请求参数
|
||
$p = [
|
||
[
|
||
'checked_type' => 'empty',
|
||
'key_name' => 'user',
|
||
'error_msg' => '用户信息有误',
|
||
],
|
||
];
|
||
$ret = ParamsChecked($params, $p);
|
||
if($ret !== true)
|
||
{
|
||
return DataReturn($ret, -1);
|
||
}
|
||
|
||
// 支付方式
|
||
$payment_name = defined('PAYMENT_TYPE') ? PAYMENT_TYPE : (isset($params['paymentname']) ? $params['paymentname'] : '');
|
||
if(empty($payment_name))
|
||
{
|
||
return DataReturn('支付方式标记异常', -1);
|
||
}
|
||
$payment = PaymentService::PaymentList(['where'=>['payment'=>$payment_name]]);
|
||
if(empty($payment[0]))
|
||
{
|
||
return DataReturn('支付方式有误', -1);
|
||
}
|
||
|
||
// 支付数据校验
|
||
$pay_name = 'payment\\'.$payment_name;
|
||
$ret = (new $pay_name($payment[0]['config']))->Respond(array_merge($_GET, $_POST));
|
||
if(isset($ret['code']) && $ret['code'] == 0)
|
||
{
|
||
if(empty($ret['data']['out_trade_no']))
|
||
{
|
||
return DataReturn('单号有误', -1);
|
||
}
|
||
// 获取订单信息
|
||
$where = ['order_no'=>$ret['data']['out_trade_no'], 'is_delete_time'=>0, 'user_is_delete_time'=>0];
|
||
$order = Db::name('Order')->where($where)->find();
|
||
|
||
// 非线上支付处理
|
||
self::OrderPaymentUnderLine([
|
||
'order' => $order,
|
||
'payment' => $payment[0],
|
||
'user' => $params['user'],
|
||
'params' => $params,
|
||
]);
|
||
}
|
||
return $ret;
|
||
}
|
||
|
||
/**
|
||
* 支付异步处理
|
||
* @author Devil
|
||
* @blog http://gong.gg/
|
||
* @version 1.0.0
|
||
* @date 2018-09-28
|
||
* @desc description
|
||
* @param [array] $params [输入参数]
|
||
*/
|
||
public static function Notify($params = [])
|
||
{
|
||
// 支付方式
|
||
$payment = PaymentService::PaymentList(['where'=>['payment'=>PAYMENT_TYPE]]);
|
||
if(empty($payment[0]))
|
||
{
|
||
return DataReturn('支付方式有误', -1);
|
||
}
|
||
|
||
// 支付数据校验
|
||
$pay_name = 'payment\\'.PAYMENT_TYPE;
|
||
$ret = (new $pay_name($payment[0]['config']))->Respond(array_merge($_GET, $_POST));
|
||
if(!isset($ret['code']) || $ret['code'] != 0)
|
||
{
|
||
return $ret;
|
||
}
|
||
|
||
// 获取订单信息
|
||
$where = ['order_no'=>$ret['data' |