mirror of
https://gitee.com/ShopeX/OMS
synced 2026-03-30 21:15:34 +08:00
228 lines
9.1 KiB
PHP
228 lines
9.1 KiB
PHP
<?php
|
||
/**
|
||
* Copyright © ShopeX (http://www.shopex.cn). All rights reserved.
|
||
* See LICENSE file for license details.
|
||
*/
|
||
|
||
|
||
class ome_rpc_request_payment extends ome_rpc_request {
|
||
|
||
//支付状态
|
||
var $pay_status = array(
|
||
'succ'=>'SUCC',
|
||
'failed'=>'FAILED',
|
||
'cancel'=>'CANCEL',
|
||
'error'=>'ERROR',
|
||
'invalid'=>'INVALID',
|
||
'progress'=>'PROGRESS',
|
||
'timeout'=>'TIMEOUT',
|
||
'ready'=>'READY',
|
||
);
|
||
|
||
/**
|
||
* 添加交易收款单
|
||
* @access public
|
||
* @param int $payment_id 支付单主键ID
|
||
* @return boolean
|
||
*/
|
||
public function add($payment_id){
|
||
|
||
if(!empty($payment_id)){
|
||
|
||
$params = $this->payment_request_params($payment_id,'');
|
||
$shop_id = $params['shop_id'];
|
||
if($shop_id){
|
||
$shop_info = app::get('ome')->model('shop')->dump($shop_id,'name');
|
||
$title = '店铺('.$shop_info['name'].')添加[交易付款单(金额:'.$params['pay_fee'].')]订单号:'.$params['tid'].'付款单号:'.$params['payment_id'].')';
|
||
}else{
|
||
return false;
|
||
}
|
||
|
||
$callback = array(
|
||
'class' => 'ome_rpc_request_payment',
|
||
'method' => 'payment_add_callback',
|
||
);
|
||
|
||
$this->request('store.trade.payment.add',$params,$callback,$title,$shop_id);
|
||
}else{
|
||
return false;
|
||
}
|
||
}
|
||
|
||
function payment_add_callback($result){
|
||
return $this->callback($result);
|
||
}
|
||
|
||
/**
|
||
* 交易支付单请求
|
||
* @access public
|
||
* @param mixed $sdf 支付请求数据
|
||
* @return boolean
|
||
*/
|
||
public function payment_request($sdf=NULL){
|
||
|
||
if(!empty($sdf)){
|
||
|
||
$params = $this->payment_request_params('',$sdf);
|
||
$shop_id = $params['shop_id'];
|
||
if($shop_id){
|
||
$shop_info = app::get('ome')->model('shop')->dump($shop_id,'name');
|
||
$title = '店铺('.$shop_info['name'].')发起交易支付请求(金额:'.$params['pay_fee'].',支付方式:'.$params['payment_type'].')]订单号:'.$params['tid'];
|
||
}else{
|
||
return false;
|
||
}
|
||
|
||
$callback = array(
|
||
'class' => 'ome_rpc_request_payment',
|
||
'method' => 'payment_request_callback',
|
||
);
|
||
$this->request('store.trade.payment.add',$params,$callback,$title,$shop_id, 60);
|
||
}else{
|
||
return false;
|
||
}
|
||
}
|
||
|
||
function payment_request_callback($result){
|
||
|
||
//请求失败,还原订单支付状态,记录操作日志
|
||
$status = $result->get_status();
|
||
$oOrder = app::get('ome')->model('orders');
|
||
//$oApi_log = app::get('ome')->model('api_log');
|
||
$api_failObj = app::get('ome')->model('api_fail');
|
||
$oOperation_log = app::get('ome')->model('operation_log');
|
||
$callback_params = $result->get_callback_params();
|
||
$request_params = $result->get_request_params();
|
||
//$log_id = $callback_params['log_id'];
|
||
//$apilog_detail = $oApi_log->dump(array('log_id'=>$log_id), 'params');
|
||
//$apilog_detail = unserialize($apilog_detail['params']);
|
||
//$apilog_detail = $request_params;
|
||
|
||
$order_bn = $request_params['tid'];
|
||
$shop_id = $callback_params['shop_id'];
|
||
|
||
|
||
$order_detail = $oOrder->dump(array('order_bn'=>$order_bn,'shop_id'=>$shop_id), 'order_id,pay_status');
|
||
$order_id = $order_detail['order_id'];
|
||
$data = array(
|
||
'order_id' => $order_id,
|
||
'type' => 'payment'
|
||
);
|
||
if ($status != 'succ'){
|
||
if ($order_detail['pay_status'] == '8'){
|
||
//状态回滚,变成未付款/部分付款
|
||
kernel::single('ome_order_func')->update_order_pay_status($order_id, true, __CLASS__.'::'.__FUNCTION__);
|
||
//此订单出现在付款确认的“付款失败”标签页里,并在操作日志中记录“前端拒绝支付,付款失败”
|
||
$api_failObj->insert($data);
|
||
}elseif(in_array($order_detail['pay_status'],array('1','3'))){
|
||
$api_failObj->delete($data);
|
||
}
|
||
//操作日志
|
||
$oOperation_log->write_log('order_payment@ome',$order_id,'订单号:'.$order_bn.'发起支付请求,前端拒绝支付,付款失败');
|
||
}else{
|
||
$api_failObj->delete($data);
|
||
}
|
||
return $this->callback($result);
|
||
}
|
||
|
||
/**
|
||
* 更新支付单状态
|
||
* @access public
|
||
* @param int $payment_id 支付单主键ID
|
||
* @return boolean
|
||
*/
|
||
public function status_update($payment_id){
|
||
|
||
if(!empty($payment_id)){
|
||
$paymentObj = app::get('ome')->model('payments');
|
||
$orderObj = app::get('ome')->model('orders');
|
||
//支付单详情
|
||
$payment_detail = $paymentObj->dump(array('payment_id'=>$payment_id), 'order_id,shop_id,payment_bn,status');
|
||
$order = $orderObj->dump($payment_detail['order_id'], 'order_bn');
|
||
$params['tid'] = $order['order_bn'];
|
||
$params['payment_id '] = $payment_detail['payment_bn'];
|
||
$params['oid '] = '';#子订单id
|
||
$params['status'] = $this->pay_status($payment_detail['status']);
|
||
|
||
$callback = array(
|
||
'class' => 'ome_rpc_request_payment',
|
||
'method' => 'payment_status_update_callback',
|
||
);
|
||
|
||
$shop_id = $payment_detail['shop_id'];
|
||
if($shop_id){
|
||
$shop_info = app::get('ome')->model('shop')->dump($shop_id,'name');
|
||
$title = '店铺('.$shop_info['name'].')更新[交易支付单状态'.$params['status'].'](订单号:'.$order['order_bn'].'付款单号:'.$payment_detail['payment_bn'].')';
|
||
}else{
|
||
return false;
|
||
}
|
||
|
||
$this->request('store.trade.payment.status.update',$params,$callback,$title,$shop_id);
|
||
}else{
|
||
return false;
|
||
}
|
||
}
|
||
|
||
function payment_status_update_callback($result){
|
||
return $this->callback($result);
|
||
}
|
||
|
||
/**
|
||
* 组织支付单发起参数
|
||
* @access private
|
||
* @param number $payment_id 支付单ID
|
||
* @param mixed $sdf 原始请求数据
|
||
* @return ArrayObject 标准请求参数数据
|
||
*/
|
||
private function payment_request_params($payment_id='', $sdf=''){
|
||
|
||
$paymentObj = app::get('ome')->model('payments');
|
||
$paymentCfgObj = app::get('ome')->model('payment_cfg');
|
||
$orderObj = app::get('ome')->model('orders');
|
||
$memberObj = app::get('ome')->model('members');
|
||
if (!empty($payment_id)){
|
||
$payment_detail = $paymentObj->dump(array('payment_id'=>$payment_id), '*');
|
||
$order_id = $payment_detail['order_id'];
|
||
}elseif($sdf){
|
||
$payment_detail = $sdf;
|
||
$order_id = $payment_detail['order_id'];
|
||
$curr_time = time();
|
||
$payment_detail['t_begin'] = $curr_time;
|
||
$payment_detail['t_end'] = $curr_time;
|
||
$payment_detail['cur_money'] = $payment_detail['money'];
|
||
}
|
||
|
||
//支付信息
|
||
$cfg = $paymentCfgObj->dump(array('id'=>$payment_detail['payment']), 'pay_bn,custom_name');
|
||
$payment_detail['pay_bn'] = $cfg['pay_bn'];
|
||
$payment_detail['paymethod'] = $cfg['custom_name'];
|
||
//订单/会员信息
|
||
$order = $orderObj->dump($order_id, 'order_bn,member_id,shop_id');
|
||
$memberinfo = $memberObj->dump($order['member_id'],'uname,name');
|
||
|
||
$params = array();
|
||
$params['shop_id'] = $order['shop_id'];
|
||
$params['tid'] = $order['order_bn'];
|
||
$params['payment_id'] = $payment_detail['payment_bn'];
|
||
$params['buyer_id'] = $memberinfo['account']['uname'];
|
||
$params['seller_account'] = $payment_detail['account']?$payment_detail['account']:'';
|
||
$params['seller_bank'] = $payment_detail['bank']?$payment_detail['bank']:'';
|
||
$params['buyer_account'] = $payment_detail['pay_account']?$payment_detail['pay_account']:'';
|
||
$params['currency'] = $payment_detail['currency']?$payment_detail['currency']:'CNY';
|
||
$params['pay_fee'] = $payment_detail['money'];
|
||
$params['paycost'] = $payment_detail['paycost']?$payment_detail['paycost']:'';
|
||
$params['currency_fee'] = $payment_detail['cur_money']?$payment_detail['cur_money']:'';
|
||
$params['pay_type'] = $payment_detail['pay_type'];
|
||
$params['payment_tid'] = $payment_detail['pay_bn'];
|
||
$params['payment_type'] = $payment_detail['paymethod']?$payment_detail['paymethod']:'';
|
||
$params['t_begin'] = date("Y-m-d H:i:s",$payment_detail['t_begin']);
|
||
$params['t_end'] = $payment_detail['t_end'] ? date("Y-m-d H:i:s",$payment_detail['t_end']) : '';
|
||
$params['memo'] = $payment_detail['memo']?$payment_detail['memo']:'';
|
||
$params['status'] = $this->pay_status[$payment_detail['status']];
|
||
$params['payment_operator'] = kernel::single('desktop_user')->get_login_name();
|
||
$params['outer_no'] = $payment_detail['trade_no']?$payment_detail['trade_no']:'';#支付网关的内部交易单号
|
||
$params['modify'] = date("Y-m-d H:i:s", time());
|
||
return $params;
|
||
}
|
||
|
||
}
|