#### 1.買家申請退款退貨
文件路徑:
shop/controllers/Buyer/Service/ReturnCtl.php
方法:
addReturn()
參數:
order_id:“退款/退貨”的訂單號
goods_id:“退款/退貨”的訂單商品id
return_message:“退款/退貨”說明
return_reason_id:“退款/退貨”原因id
nums:“退款/退貨”商品數量
1.根據goods_id查找訂單信息,將查找出的訂單id與傳遞參數訂單id進行比較。兩者不一致,報錯。
~~~
if($goods['order_id'] !== $order_id)
{
$flag2 = false;
}
~~~
2.判斷訂單狀態,只有已付款訂單才可進去“退款/退貨”
~~~
if ($order['order_status'] < Order_StateModel::ORDER_PAYED)
{
$flag2 = false;
}
~~~
3.確定return_type的值,判斷此次的“退款/退貨”究竟是退款,還是退貨。
~~~
if ($order['order_is_virtual'])
{
$field['return_type'] = Order_ReturnModel::RETURN_TYPE_VIRTUAL;
}
else
{
switch ($order['order_status'])
{
case Order_StateModel::ORDER_PAYED:$field['return_type'] = Order_ReturnModel::RETURN_TYPE_ORDER ; //退款
break;
case Order_StateModel::ORDER_FINISH:$field['return_type'] = Order_ReturnModel::RETURN_TYPE_GOODS ; //退貨
break;
}
}
~~~
4.如果是貨到付款,確認收貨(付款)后才能退款
~~~
if($order['payment_id'] == PaymentChannlModel::PAY_CONFIRM)
{
if($order['order_status'] < Order_StateModel::ORDER_RECEIVED)
{
$flag2 = false;
}
}
~~~
5.根據訂單狀態,確定return_goods_return值。
退款(貨到付款只支持退貨,不支持退款)
~~~
if($goods['order_goods_status'] == Order_StateModel::ORDER_PAYED && $order['payment_id'] !== PaymentChannlModel::PAY_CONFIRM)
{
//白條支付不支持退款和退貨
if(strstr($order['payment_name'],'白條支付')){
$flag2 = false;
}
$field['return_goods_return'] = 0; //是否需要退貨 0-不需要 1-需要
$return = $this->orderReturnModel->getByWhere(array(
'order_goods_id' => $goods_id,
'return_type' => Order_ReturnModel::RETURN_TYPE_ORDER,
'return_state:!=' => Order_ReturnModel::RETURN_SELLER_UNPASS
));
}
~~~
退貨
~~~
if ($goods['order_goods_status'] == Order_StateModel::ORDER_FINISH)
{
if(strstr($order['payment_name'],'白條支付')){
$flag2 = false;
}
$field['return_goods_return'] = 1; //需要退貨
//查詢是否存在該訂單商品的退貨申請信息,且該申請未被賣家拒絕,以此判斷是否重新提交退貨申請
//只有以前沒有提交過該商品的退貨申請,且未被賣家拒絕的情況下,才可以提交退貨申請
$return = $this->orderReturnModel->getByWhere(array(
'order_goods_id' => $goods_id,
'return_type' => Order_ReturnModel::RETURN_TYPE_GOODS,
'return_state:!=' => Order_ReturnModel::RETURN_SELLER_UNPASS
));
}
~~~
6.計算生成“退款/退貨”訂單所需要的各種金額
//判斷這件“退款/退貨”商品是否還有可退數量(退款,退貨都會退還商品數量)
~~~
$this_goods_return = $this->orderReturnModel->getByWhere(array(
'order_goods_id' => $goods_id,
'return_state:!=' => Order_ReturnModel::RETURN_SELLER_UNPASS
));
~~~
* $this_goods_return_num :“退款/退貨”商品總的已退還件數
* $this_goods_return_cash :“退款/退貨”商品總的已退金額(包含正在審核中的金額)
//查找該筆訂單已經進行過或正進行中的的退款,退貨
~~~
$order_return = $this->orderReturnModel->getByWhere(array(
'order_number' => $order['order_id'],
'return_state:!=' => Order_ReturnModel::RETURN_SELLER_UNPASS
));
~~~
//訂單已經退款退貨的金額(包括與同意的退款和正在審核中的退款)
~~~
$order_return_cash = array_sum(array_column($order_return, 'return_cash'));
~~~
//訂單已經退還的商品數量
~~~
$order_return_num = array_sum(array_column($order_return, 'order_goods_num'));
~~~
//訂單還可退還的金額 = 訂單實付金額 - 訂單已退金額
//如果沒有發貨,可以退運費
~~~
if (Order_StateModel::ORDER_PAYED == $order['order_status'])
{
$order_can_return_cash = $order['order_payment_amount'] - $order_return_cash;
}
else
{
$order_can_return_cash = $order['order_payment_amount'] - $order_return_cash - $order['order_shipping_fee'];
}
/*
* $data['order']['order_refund_amount'] 與 $order_return_cash 的區別
* $data['order']['order_refund_amount']:表示商家已經同意的退款金額
* $order_return_cash:表示買家已經申請的退款,除被商家拒絕的退款外,正在審核的退款也包含在內
*/
//訂單已退還的金額
$return_limit = $order['order_refund_amount'];
//訂單可退金額
$cash_limit = $order_can_return_cash;
//訂單可退商品數量
$goods_can_return_nums = $order_all_goods_num - $order_return_num;
//該件商品可退的總金額
$return_goods_cash = $goods['order_goods_amount'] - $this_goods_return_cash;
//該件商品還可退還商品數量
$return_goods_nums = $goods['order_goods_num'] - $this_goods_return_num;
~~~
//實際該件商品可退還的金額(有時可能包含運費)
//該件商品全部“退款/退貨” //return_goods_nums
~~~
if($goods_can_return_nums == $nums && Order_StateModel::ORDER_PAYED == $order['order_status'])
{
//加上運費(未發貨)
$return_cash = $return_goods_cash + $order['order_shipping_fee'];
}
else
{
$return_cash = floor($nums * $goods['order_goods_payment_amount'] * 100) / 100;
}
//如果訂單為已付款狀態,并且所有商品都退款,則將運費退還
if(Order_StateModel::ORDER_PAYED == $order['order_status'] && $nums == $goods_can_return_nums)
{
$return_cash = $cash_limit;
}
~~~
/*退款退貨走同樣的流程。區別是:退款時可能會退還運費,退貨不可能退還運費。*/
7.訂單商品表中插入訂單商品的“退款/退貨”狀態
~~~
if($field['return_goods_return'] == 0)
{
//退款
$goods_field['goods_return_status'] = Order_GoodsModel::REFUND_IN;
$edit_flag = $this->orderGoodsModel->editGoods($goods_id, $goods_field);
check_rs($edit_flag, $rs_row);
}
else
{
//退貨
$goods_field['goods_refund_status'] = Order_GoodsModel::REFUND_IN;
$edit_flag = $this->orderGoodsModel->editGoods($goods_id, $goods_field);
check_rs($edit_flag, $rs_row);
}
~~~
#### 2.商家審核退款退貨
文件路徑:
shop\controllers\Seller\Service\ReturnCtl.php
方法:
agreeReturn()
參數:
order_return_id:退單id
return_shop_message:商家處理備注
1.判斷此退單是否已經被處理。
~~~
if($return['return_state'] == Order_ReturnModel::RETURN_SELLER_PASS)
{
$msg = __('已經退款,請刷新頁面。');
$status = 200;
$this->data->addBody(-140, array(), $msg, $status);
return false;
}
~~~
2.判斷商家處理備注是都存在違禁詞
~~~
if (Text_Filter::checkBanned($return_shop_message, $matche_row))
{
$msg = __('含有違禁詞');
$status = 250;
$this->data->addBody(-140, array(), $msg, $status);
return false;
}
~~~
3.判讀訂單是否已經收獲,如果沒有收貨,不扣除賣家資金。已確認收貨則扣除賣家資金。
$order_finish:訂單是否已經完成確認收貨
false :已收貨
true:未收貨
4.獲取用戶的賬戶資金信息
~~~
$key = Yf_Registry::get('shop_api_key');
$formvars = array();
$user_id = Perm::$userId;
$formvars['user_id'] = $user_id;
$formvars['app_id'] = Yf_Registry::get('shop_app_id');
$money_row = get_url_with_encrypt($key, sprintf('%s?ctl=Api_User_Info&met=getUserResourceInfo&typ=json', Yf_Registry::get('paycenter_api_url')), $formvars);
$user_money = $money['user_money']; //賬戶余額
$user_money_frozen = $money['user_money_frozen']; //賬戶凍結資金
//判斷訂單是否已經結算
if($settlement_unixtime >= $order_finish_unixtime )
{
//結算時間大于訂單完成時間。需要扣除賣家的現金賬戶
$money = $user_money;
$pay_type = 'cash';
}
else
{
//結算時間小于訂單完成時間。需要扣除賣家的凍結資金,如果凍結資金不足就扣除賬戶余額
$money = $user_money_frozen + $user_money;
$pay_type = 'frozen_cash';
}
~~~
5.判斷該退單是否是當前商家的訂單
6.當退款金額小于用戶資金時,或者訂單為未收貨訂單時流程繼續,否則報錯。
~~~
$shop_return_amount = $return['return_cash'] - $return['return_commision_fee'];
~~~
$shop_return_amount:退款金額
$money:用戶資金
修改退貨單狀態
~~~
$data['return_shop_message'] = $return_shop_message;
if ($return['return_goods_return'] == Order_ReturnModel::RETURN_GOODS_RETURN)
{
$data['return_state'] = Order_ReturnModel::RETURN_SELLER_PASS;
}
else
{
$data['return_state'] = Order_ReturnModel::RETURN_SELLER_GOODS;
}
$data['return_shop_time'] = get_date_time();
$flag = $this->orderReturnModel->editReturn($order_return_id, $data);
~~~
修改退貨單成功后,如果訂單為已收貨訂單,則修改商家金額。
~~~
if($flag && !$order_finish)
{
//扣除賣家的金額
$key = Yf_Registry::get('shop_api_key');
$formvars = array();
$user_id = Perm::$userId;
$formvars['user_id'] = $user_id;
$formvars['user_name'] = Perm::$row['user_name'];
$formvars['app_id'] = Yf_Registry::get('shop_app_id');
$formvars['money'] = $shop_return_amount * (-1);
$formvars['pay_type'] = $pay_type;
$formvars['reason'] = '退款';
$formvars['order_id'] = $order_base['order_id'];
$formvars['goods_id'] = $return['order_goods_id'];
$rs = get_url_with_encrypt($key, sprintf('%s?ctl=Api_User_Info&met=editReturnUserResourceInfo&typ=json', Yf_Registry::get('paycenter_api_url')), $formvars);
$dist_rs['status'] = 200;
//分銷
if(isset($dist_return_order) && !empty($dist_return_order)){
$key = Yf_Registry::get('shop_api_key');
$formvars = array();
$user_id = Perm::$userId;
$formvars['user_id'] = $dist_order['seller_user_id'];
$formvars['user_name'] = $dist_order['seller_user_name'];
$formvars['money'] = ($dist_return_order['return_cash']-$dist_return_order['return_commision_fee'])*(-1);
$formvars['order_id'] = $dist_order['order_id'];
$formvars['goods_id'] =0;
$formvars['app_id'] = Yf_Registry::get('shop_app_id');
$formvars['pay_type'] = $pay_type;
$formvars['reason'] = '退款';
$dist_rs = get_url_with_encrypt($key, sprintf('%s?ctl=Api_User_Info&met=editReturnUserResourceInfo&typ=json', Yf_Registry::get('paycenter_api_url')), $formvars);
}
if($rs['status'] == 200 && $dist_rs['status']==200)
{
$flag = true;
}
else
{
$flag = false;
}
}
~~~
#### 3.平臺審核退款退貨
文件路徑:
shop\controllers\Api\Trade\ReturnCtl.php
方法:
agree()
參數:
order_return_id:退單id
return_platform_message:處理備注
1.判斷商家是否同意此退單,如果不同意則只修改訂單狀態,不修改商家金額。如果商家同意,則修改訂單狀態并修改商家金額。
~~~
if($return['return_state'] == Order_ReturnModel::RETURN_SELLER_UNPASS)
{
//不同意
$data['return_platform_message'] = $return_platform_message;
$data['return_state'] = Order_ReturnModel::RETURN_PLAT_PASS;
$data['return_finish_time'] = get_date_time();
$rs_row = array();
$this->Order_ReturnModel->sql->startTransactionDb();
$edit_flag = $this->Order_ReturnModel->editReturn($order_return_id, $data);
check_rs($edit_flag, $rs_row);
if ($return['return_goods_return'])
{
//商品退換情況為完成2
$goods_data['goods_refund_status'] = Order_GoodsModel::REFUND_COM;
$edit_flag = $this->Order_GoodsModel->editGoods($return['order_goods_id'], $goods_data);
check_rs($edit_flag, $rs_row);
}
else
{
$goods_data['goods_return_status'] = Order_GoodsModel::REFUND_COM;
$edit_flag = $this->Order_GoodsModel->editGoods($return['order_goods_id'], $goods_data);
check_rs($edit_flag, $rs_row);
}
}
~~~
2.商家同意退款的情況
(1)修改退單的狀態
~~~
$data['return_platform_message'] = $return_platform_message;
$data['return_state'] = Order_ReturnModel::RETURN_PLAT_PASS;
$data['return_finish_time'] = get_date_time();
$rs_row = array();
$this->Order_ReturnModel->sql->startTransactionDb();
$edit_flag = $this->Order_ReturnModel->editReturn($order_return_id, $data);
~~~
(2)根據退款/退貨情況,修改訂單商品的狀態
~~~
if ($return['return_goods_return'])
{
//商品退換情況為完成2
$goods_data['goods_refund_status'] = Order_GoodsModel::REFUND_COM;
$edit_flag = $this->Order_GoodsModel->editGoods($return['order_goods_id'], $goods_data);
check_rs($edit_flag, $rs_row);
}
else
{
$goods_data['goods_return_status'] = Order_GoodsModel::REFUND_COM;
$edit_flag = $this->Order_GoodsModel->editGoods($return['order_goods_id'], $goods_data);
check_rs($edit_flag, $rs_row);
}
~~~
(3)將退款金額,退還傭金,退還紅包,退貨數量等寫入訂單表
~~~
$order_edit['order_refund_amount'] = $return['return_cash'];
$order_edit['order_return_num'] = $return['order_goods_num'];
$order_edit['order_commission_return_fee'] = $return['return_commision_fee'];
$order_edit['order_rpt_return'] = $return['return_rpt_cash'];
$edit_flag = $this->Order_BaseModel->editBase($return['order_number'], $order_edit,true);
~~~
(4)如果此訂單為退款訂單,并且將所有商品退還,則就訂單狀態修改為完成狀態
~~~
if($order_all_goods_num == $order_return_num && $order_base['order_status'] !== $Order_StateModel::ORDER_FINISH)
{
$order_edit_row = array();
$order_edit_row['order_status'] = $Order_StateModel::ORDER_FINISH;
$edit_flag2 = $this->Order_BaseModel->editBase($return['order_number'], $order_edit_row);
check_rs($edit_flag2, $rs_row);
}
~~~
(5)在paycenter中增加退款流水
判斷該筆訂單是否是主賬號支付,如果是主賬號支付,則將退款金額退還主賬號
~~~
if($order_base['order_sub_pay'] == Order_StateModel::SUB_SELF_PAY)
{
$return_user_id = $return['buyer_user_id'];
$return_user_name = $return['buyer_user_account'];
}
if($order_base['order_sub_pay'] == Order_StateModel::SUB_USER_PAY)
{
//查找主管賬戶用戶名
$User_BaseModel = new User_BaseModel();
$sub_user_base = $User_BaseModel->getOne($order_base['order_sub_user']);
$return_user_id = $order_base['order_sub_user'];
$return_user_name = $sub_user_base['user_account'];
}
$key = Yf_Registry::get('shop_api_key');
$url = Yf_Registry::get('paycenter_api_url');
$shop_app_id = Yf_Registry::get('shop_app_id');
$formvars = array();
$formvars['app_id'] = $shop_app_id;
$formvars['user_id'] = $return_user_id;
$formvars['user_account'] = $return_user_name;
$formvars['seller_id'] = $return['seller_user_id'];
$formvars['seller_account'] = $return['seller_user_account'];
$formvars['amount'] = $return['return_cash'];
$formvars['return_commision_fee'] = $return['return_commision_fee'];
$formvars['order_id'] = $return['order_number'];
$formvars['goods_id'] = $return['order_goods_id'];
$formvars['uorder_id'] = $order_base['payment_other_number'];
$formvars['payment_id'] = $order_base['payment_id'];
//平臺同意退款(只增加買家的流水)
$rs = get_url_with_encrypt($key, sprintf('%s?ctl=Api_Pay_Pay&met=refundBuyerTransfer&typ=json', $url), $formvars);
~~~
(6)如果訂單金額全數退還需要將訂單商品,支付中心的訂單狀態修改為訂單完成(未發貨)
~~~
if($order_all_goods_num == $order_return_num && $order_base['order_status'] == Order_StateModel::ORDER_PAYED)
{
$goods_data['order_goods_status'] = $Order_StateModel::ORDER_FINISH;
$order_goods_ids = $this->Order_GoodsModel->getByWhere(array('order_id'=>$return['order_number']));
$ed_flag = $this->Order_GoodsModel->editGoods($order_goods_ids, $goods_data);
check_rs($ed_flag, $rs_row);
//將需要確認的訂單號遠程發送給Paycenter修改訂單狀態
//遠程修改paycenter中的訂單狀態
$key = Yf_Registry::get('shop_api_key');
$url = Yf_Registry::get('paycenter_api_url');
$shop_app_id = Yf_Registry::get('shop_app_id');
$formvars = array();
$formvars['order_id'] = $return['order_number'];
$formvars['app_id'] = $shop_app_id;
$formvars['from_app_id'] = Yf_Registry::get('shop_app_id');
$rs = get_url_with_encrypt($key, sprintf('%s?ctl=Api_Pay_Pay&met=confirmOrder&typ=json', $url), $formvars);
if($rs['status'] == 250)
{
$rs_flag = false;
check_rs($rs_flag,$rs_row);
}
}
~~~
- 序言
- 系統要求
- 版本更新日志
- 遠豐商城技術對接說明
- 開發指導
- 系統架構
- 負載集群
- 云存儲
- 框架內容
- 基礎
- 開發規范
- 目錄結構
- 架構
- 架構總覽
- 數據庫
- 數據庫連接
- 基本使用
- 緩存
- 配置
- 路由
- 數據字典
- ucenter
- shop
- paycenter
- ucenter_admin
- shop_admin
- paycenter_admin
- shop1
- shop2
- shop3
- 通訊內容
- 商家中心
- 頂部導航欄
- 店鋪信息欄
- 店鋪及商品提示欄
- 交易提示欄
- 銷售情況統計欄
- 集群架構圖
- 單品銷量排行欄
- 店鋪運營推廣欄
- 平臺聯系方式欄
- 訂單物流
- 商品
- 商品列表
- 商品詳情
- 商品發布與編輯
- 分銷商品
- 關聯版式
- 商品規格
- 圖片空間
- 淘寶導入
- 訂單流程
- 交易訂單
- 訂單退款/退貨
- 促銷
- 團購管理
- 加價購
- 限時折扣
- 滿即送
- 代金券管理
- 分銷
- 店鋪
- 店鋪設置
- 自銷產品供應商
- 實體店鋪
- 品牌申請
- 店鋪信息
- 消費者保障服務
- 門店賬號
- 分銷商--產品供應商
- 分銷明細
- 批發市場
- 商家微信公眾號
- 售后服務
- 咨詢管理
- 投訴管理
- 退款管理
- 退貨管理
- 雜項
- 遠程上傳圖片
- 接口(廢棄,參考最外層接口項)
- 接口說明
- 品牌
- 商品規格
- 商品類型
- 商品分類
- 商品
- 訂單
- 商品/店鋪收藏
- 足跡
- 退款及退貨
- 商家店鋪
- 會員
- 入駐協議
- 訂單接口
- 商品接口
- 訂單物流接口
- 商家中心接口
- 促銷接口
- 快遞鳥物流接口
- 代金券接口
- 首頁版塊
- 團購
- 平臺紅包
- 限時折扣接口
- 拼團接口
- wap首頁模板
- JS
- 銀聯支付
- 多語言
- 商品評分
- 圖片加載
- 買家申請退款退貨
- 商家退款退貨
- 平臺退款退貨
- 添加發票
- 提交訂單
- 確認訂單
- 運費銷售區域
- 獲取會員地址
- 充值
- 導出XLS
- 商城系統集成
- 多語言實現
- 三級分銷推廣鏈接發展推廣員
- app.ini.php
- 去分銷
- 版本更新
- 物流支持
- 運營人員建議
- 業務邏輯
- 統計結算
- 客服消息
- 賬號
- 三級分銷
- IM
- 配置
- 平臺帳號
- 活動數據表說明
- 接口
- 數據庫中間鍵
- MyCat的優勢
- 概念說明
- Mycat的下載及安裝
- 參數配置案列
- Mycat讀寫分離
- 基本命令
- 常見錯誤