'empty', 'key_name' => 'id', 'error_msg' => '订单id有误', ], [ 'checked_type' => 'empty', 'key_name' => 'user', 'error_msg' => '用户信息有误', ], ]; $ret = params_checked($params, $p); if($ret !== true) { return DataReturn($ret, -1); } // 获取订单信息 $where = ['id'=>intval($params['id']), 'user_id' => $params['user']['id']]; $data = M('Order')->where($where)->field('id,status,total_price,payment_id')->find(); if(empty($data)) { return DataReturn(L('common_data_no_exist_error'), -1); } if($data['total_price'] <= 0.00) { return DataReturn('金额不能为0', -1); } if($data['status'] != 1) { $status_text = L('common_order_user_status')[$data['status']]['name']; return DataReturn('状态不可操作['.$status_text.']', -1); } // 支付方式 $payment = ResourcesService::PaymentList(['where'=>['id'=>$data['payment_id']]]); if(empty($payment[0])) { return DataReturn('支付方式有误', -1); } // 发起支付 $url = __MY_URL__.'payment_order_'.strtolower($payment[0]['payment']); $pay_data = array( 'out_user' => md5($params['user']['id']), 'order_sn' => date('YmdHis').$data['id'], 'name' => '订单支付', 'total_price' => $data['total_price'], 'notify_url' => $url.'_notify.php', 'call_back_url' => $url.'_respond.php', ); $pay_name = '\Library\Payment\\'.$payment[0]['payment']; $ret = (new $pay_name($payment[0]['config']))->Pay($pay_data); if(isset($ret['code']) && $ret['code'] == 0) { // 存储session订单id $_SESSION['payment_order_id'] = $data['id']; return $ret; } return DataReturn('支付接口异常', -1); } /** * 支付同步处理 * @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 = params_checked($params, $p); if($ret !== true) { return DataReturn($ret, -1); } // 支付方式 $payment = ResourcesService::PaymentList(['where'=>['payment'=>PAYMENT_TYPE]]); if(empty($payment[0])) { return DataReturn('支付方式有误', -1); } // 支付数据校验 $pay_name = '\Library\Payment\\'.PAYMENT_TYPE; return (new $pay_name($payment[0]['config']))->Respond(); } /** * 支付异步处理 * @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 = ResourcesService::PaymentList(['where'=>['payment'=>PAYMENT_TYPE]]); if(empty($payment[0])) { return DataReturn('支付方式有误', -1); } // 支付数据校验 $pay_name = '\Library\Payment\\'.PAYMENT_TYPE; $ret = (new $pay_name($payment[0]['config']))->Respond(); if(!isset($ret['code']) || $ret['code'] != 0) { return $ret; } // 获取订单信息 $m = M('Order'); $where = ['id'=>self::OutTradeNoParsing($ret['data']['out_trade_no'])]; $data = $m->where($where)->field('id,status,total_price,payment_id,user_id,shop_id')->find(); file_put_contents('/data/www/project/shopxo/service/dddddd.txt', json_encode($data)); if(empty($data)) { return DataReturn(L('common_data_no_exist_error'), -1); } if($data['status'] > 1) { $status_text = L('common_order_user_status')[$data['status']]['name']; return DataReturn('状态不可操作['.$status_text.']', 0); } // 兼容web版本支付参数 $buyer_email = isset($ret['data']['buyer_logon_id']) ? $ret['data']['buyer_logon_id'] : (isset($ret['data']['buyer_email']) ? $ret['data']['buyer_email'] : ''); $total_amount = isset($ret['data']['total_amount']) ? $ret['data']['total_amount'] : (isset($ret['data']['total_fee']) ? $ret['data']['total_fee'] : ''); // 写入支付日志 $pay_log_data = [ 'user_id' => $data['user_id'], 'order_id' => $data['id'], 'trade_no' => $ret['data']['trade_no'], 'user' => $buyer_email, 'total_fee' => $total_amount, 'amount' => $data['total_price'], 'subject' => $ret['data']['subject'], 'pay_type' => 0, 'business_type' => 0, 'add_time' => time(), ]; M('PayLog')->add($pay_log_data); // 消息通知 $detail = '订单支付成功,金额'.PriceBeautify($data['total_price']).'元'; CommonMessageAdd('订单支付', $detail, $data['user_id']); // 开启事务 $m->startTrans(); // 更新订单状态 $upd_data = array( 'status' => 2, 'pay_status'=> 1, 'pay_price' => $total_amount, 'pay_time' => time(), 'upd_time' => time(), ); if($m->where(['id'=>$data['id']])->save($upd_data)) { // 提交事务 $m->commit(); // 成功 return DataReturn('处理成功', 0); } // 事务回滚 $m->rollback(); // 处理失败 return DataReturn('处理失败222', -100); } /** * 订单号解析 * @author Devil * @blog http://gong.gg/ * @version 1.0.0 * @date 2018-09-28 * @desc description * @param [string] $out_trade_no [支付回传订单号] */ public static function OutTradeNoParsing($out_trade_no) { return substr($out_trade_no, 14); } /** * 前端订单列表条件 * @author Devil * @blog http://gong.gg/ * @version 1.0.0 * @date 2018-09-29 * @desc description * @param [array] $params [输入参数] */ public static function HomeOrderListWhere($params = []) { $where = [ 'is_delete_time' => 0, ]; // 用户id if(!empty($params['user'])) { $where['user_id'] = $params['user']['id']; } return $where; } /** * 订单总数 * @author Devil * @blog http://gong.gg/ * @version 1.0.0 * @date 2018-09-29 * @desc description * @param [array] $where [条件] */ public static function OrderTotal($where = []) { return (int) M('Order')->where($where)->count(); } /** * 订单列表 * @author Devil * @blog http://gong.gg/ * @version 1.0.0 * @date 2018-09-29 * @desc description * @param [array] $params [输入参数] */ public static function OrderList($params = []) { // 请求参数 $p = [ [ 'checked_type' => 'empty', 'key_name' => 'where', 'error_msg' => '条件不能为空', ], [ 'checked_type' => 'is_array', 'key_name' => 'where', 'error_msg' => '条件格式有误', ], [ 'checked_type' => 'isset', 'key_name' => 'limit_start', 'error_msg' => '分页起始值有误', ], [ 'checked_type' => 'isset', 'key_name' => 'limit_number', 'error_msg' => '分页数量不能为空', ], ]; $ret = params_checked($params, $p); if($ret !== true) { return DataReturn($ret, -1); } $limit_start = max(0, intval($params['limit_start'])); $limit_number = max(1, intval($params['limit_number'])); $order_by = empty($params['$order_by']) ? 'id desc' : I('order_by', '', '', $params); // 获取订单 $data = M('Order')->where($params['where'])->limit($limit_start, $limit_number)->order($order_by)->select(); if(!empty($data)) { $detail_m = M('OrderDetail'); $detail_field = 'id,goods_id,title,images,original_price,price,attribute,buy_number'; $images_host = C('IMAGE_HOST'); $total_price = 0; foreach($data as &$v) { $items = $detail_m->where(['order_id'=>$v['id']])->field($detail_field)->select(); if(!empty($items)) { foreach($items as &$vs) { $vs['images'] = empty($vs['images']) ? null : $images_host.$vs['images']; $vs['attribute'] = empty($vs['attribute']) ? null : json_decode($vs['attribute'], true); $vs['goods_url'] = HomeUrl('Goods', 'Index', ['id'=>$vs['goods_id']]); $total_price += $vs['buy_number']*$vs['price']; } } $v['items'] = $items; $v['items_count'] = count($items); $v['total_price'] = $total_price; } } return DataReturn('处理成功', 0, $data); } } ?>