myfield = [ 'recharge' => [ 'fieldtype' => 'Pay', 'fieldname' => 'pay', 'setting' => [ 'option' => [ 'payfile' => 'pay.html', // 模板文件 'is_finecms' => 0, // 是否启用余额付款 ], ] ], 'score' => [ 'fieldtype' => 'Pay', 'fieldname' => 'pay', 'setting' => [ 'option' => [ 'payfile' => 'score.html', // 模板文件 'is_finecms' => 1, // 是否启用余额付款 ], ] ], 'donation' => [ 'fieldtype' => 'Pay', 'fieldname' => 'pay', 'setting' => [ 'option' => [ 'payfile' => 'donation.html', // 模板文件 'is_finecms' => 1, // 是否启用余额付款 ], ] ], 'gathering' => [ 'fieldtype' => 'Pay', 'fieldname' => 'price', 'setting' => [ 'option' => [ 'payfile' => 'gathering.html', // 模板文件 'is_finecms' => 1, // 是否启用余额付款 ], ] ], ]; } // 获取支付方式 public function get_pay_type($is_finecms = 0) { $pay_type = []; $is_finecms && $pay_type['finecms'] = \Phpcmf\Service::R(ROOTPATH.'api/pay/finecms/config.php'); if (\Phpcmf\Service::C()->member_cache['payapi']) { foreach (\Phpcmf\Service::C()->member_cache['payapi'] as $name => $t) { if (!is_file(ROOTPATH.'api/pay/'.$name.'/config.php')) { continue; // 排除是否存在配置文件 } $pay_type[$name] = \Phpcmf\Service::R(ROOTPATH.'api/pay/'.$name.'/config.php'); } } if ($is_finecms) { if (!$this->uid) { unset($pay_type['finecms']); } elseif ($this->member['money'] < 0.01) { unset($pay_type['finecms']); } } if (IS_DEV && !$pay_type) { log_message('debug', '系统没有开启支付接口,无法获取到支付方式'); } return $pay_type; } // 获取打赏模块内容 public function get_module_row($dir, $id, $siteid) { $data = $this->table($siteid.'_'.$dir)->get($id); if (!$data) { return dr_return_data(0, dr_lang('打赏内容不存在')); } return dr_return_data(1, 'ok', $data); } // 获取价格值 public function get_price_value($data, $field, $sku = '') { if ($sku && $sku != 'null' && isset($data[$field.'_sku']) && is_array($data[$field.'_sku'])) { return (float)$data[$field.'_sku']['value'][$sku]['price']; } return (float)$data[$field]; } // 获取支付价格和内容 public function get_pay_info($id, $field, $num = 1, $sku = '') { list($table, $name, $username, $thumb, $url) = $this->_get_table_name( $field['relatedid'], $field['relatedname'] ); if (!$table) { return dr_return_data(0, dr_lang('支付关联表不存在')); } $rt = $this->table($table)->get($id); if (!$rt) { return dr_return_data(0, dr_lang('支付关联表[%s]内容(#%s)不存在', $table, $id)); } elseif (!isset($rt[$field['fieldname']])) { return dr_return_data(0, dr_lang('支付关联表的支付字段[%s]不存在于主表', $field['fieldname'])); } elseif (isset($rt[$thumb]) && $rt[$thumb] && !is_numeric($rt[$thumb])) { // 如果是多文件字段取第一个作为缩略图 $image = dr_string2array($rt[$thumb]); isset($image['file'][0]) && $image['file'][0] && $rt[$thumb] = $image['file'][0]; } if (isset($rt[$field['fieldname'].'_sku']) && $rt[$field['fieldname'].'_sku']) { $rt[$field['fieldname'].'_sku'] = dr_string2array($rt[$field['fieldname'].'_sku']); } $obj = \Phpcmf\Service::L('field')->get($field['fieldtype']); if (isset($rt[$field['fieldname'].'_sku']) && $rt[$field['fieldname'].'_sku'] && $obj && method_exists($obj, 'get_pay_info')) { $rs = $obj->get_pay_info($rt, $field, $sku); if (!$rs['code']) { return $rs; } list($sn, $quantity, $sku_name, $sku_string) = $rs['data']; } elseif ($field['fieldtype'] == 'Pays' && isset($rt[$field['fieldname'].'_sku']) && $rt[$field['fieldname'].'_sku']) { // 兼容老版本写法 $rt[$field['fieldname'].'_sku'] = dr_string2array($rt[$field['fieldname'].'_sku']); if (!$sku && $rt[$field['fieldname'].'_sku']) { return dr_return_data(0, dr_lang('没有选择商品属性')); } elseif (!isset($rt[$field['fieldname'].'_sku']['value'][$sku]) || !$rt[$field['fieldname'].'_sku']['value'][$sku]) { #print_r($rt[$field['fieldname'].'_sku']['value']); return dr_return_data(0, dr_lang('商品(#'.$rt['id'].')属性(#'.$sku.')无效')); } $sn = (string)$rt[$field['fieldname'].'_sku']['value'][$sku]['sn']; $quantity = (int)$rt[$field['fieldname'].'_sku']['value'][$sku]['quantity']; list($sku_name, $sku_string) = dr_sku_name($sku, $rt[$field['fieldname'].'_sku'], 1); } else { $sn = (string)$rt[$field['fieldname'].'_sn']; $quantity = (int)$rt[$field['fieldname'].'_quantity']; $sku_name = $sku_string = ''; } // 获取价格 $price = $this->get_price_value($rt, $field['fieldname'], $sku); // buy-表名-主键id-字段id-数量-sku $mid = 'buy-'.$table .'-'. $id .'-'. $field['id'] .'-'. max(1, (int)$num) .'-'. ($sku ? $sku : 'null'); return [ 'sn' => $sn, 'mid' => $mid, 'num' => $num, 'price' => $price, 'price_sku' => isset($rt[$field['fieldname'].'_sku']) ? $rt[$field['fieldname'].'_sku'] : '', 'total' => $price * $num, 'table' => $table, 'quantity' => $quantity, 'sku_name' => $sku_name, 'sku_string' => $sku_string, 'sku_value' => $sku, 'touid' => intval($rt['uid']), 'tousername' => (string)$rt['username'], 'title' => (string)$rt[$name], 'thumb' => (string)$rt[$thumb], 'url' => $url ? $url.$id : '', 'data' => $rt, ]; } // 获取支付信息的表名 public function _get_table_name($relatedid, $relatedname) { $data = \Phpcmf\Service::C()->get_cache('table-pay-'.SITE_ID, $relatedname.'-'.$relatedid); if (!$data) { return []; } // 表名 - 标题字段 - 卖家账号 - 缩略图 - 地址 return [$data['table'], $data['name'], $data['username'], $data['thumb'], $data['url']]; } // 支付状态 public function paystatus($data) { switch ($data['status']) { case 0: return ' '.dr_lang('未付款').' '; break; case 1: return ' '.dr_lang('已付款').' '; break; case 2: return ' '.dr_lang('汇款中').' '; break; case 5: return ' '.dr_lang('上门付').' '; break; case 3: return ' '.dr_lang('被拒绝').' '; break; } } // 用途类型 public function paytype($mark) { switch ($mark) { // 在线充值 case 'recharge': return ' '.dr_lang('充值').' '; break; // 在线充值 case 'score': return ' '.dr_lang(SITE_SCORE).' '; break; // 系统 case 'system': return ' '.dr_lang('系统').' '; break; // 订单 case 'order': case 'orders': return ' '.dr_lang('订单').' '; break; // 提现 case 'cash': return ' '.dr_lang('提现').' '; break; // 其他来自自定义字段 default: list($rname, $rid, $fid) = explode('-', $mark); switch ($rname) { // 系统 case 'system': return ' '.dr_lang('系统').' '; break; // 用户组 case 'group': return ' '.dr_lang('会员').' '; break; // 用户组 case 'level': return ' '.dr_lang('等级').' '; break; // 订单 case 'order': case 'orders': return ' '.dr_lang('订单').' '; break; case 'gathering': // 收款插件 return ' '.dr_lang('收款').' '; break; case 'buy': // 快速下单 return ' '.dr_lang('下单').' '; break; case 'my': // 二次开发 $obj = $this->my_pay_obj($rid); if (!$obj) { return ' '.dr_lang('未知').' '; } elseif (method_exists($obj, 'paytype')) { return $obj->paytype(); } else { return ' '.dr_lang('应用').' '; } break; case 'donation': // 打赏作者 return ' '.dr_lang('打赏').' '; break; default: // 来自自定义字段 /* $field = \Phpcmf\Service::C()->get_cache('table-field', $fid); if ($field['relatedname'] == 'module') { // 模块 return ' '.dr_lang('模块').' '; } elseif (function_exists('dr_paytype_'.$mark)) { return call_user_func('dr_paytype_'.$mark); }*/ return ' '.dr_lang('其他').' '; break; } break; } } // 付款名称 public function payname($name) { switch ($name) { case 'meet'; return '上门'; break; case 'remit'; return '汇款'; break; case 'system'; return '系统'; break; case 'admin'; return '后台'; break; case 'finecms'; return '余额'; break; case 'weixin'; return '微信'; break; case 'alipay'; return '支付宝'; break; default; if (!$this->payname[$name]) { if (is_file(WEBPATH.'api/pay/'.$name.'/config.php')) { $this->payname[$name] = require WEBPATH.'api/pay/'.$name.'/config.php'; } else { return $name; } } if (isset($this->payname[$name]['name']) && $this->payname[$name]['name']) { return $this->payname[$name]['name']; } return $name; break; } } /** * 支付表单调用 * mark 表名-主键id-字段id * value 支付金额 * title 支付说明 * */ public function payform($mark, $value = 0, $title = '', $url = '', $remove_div = 0, $tpl = '') { switch ($mark) { // 在线充值 case 'recharge': $field = $this->myfield[$mark]; break; // 金币充值 case 'score': $field = $this->myfield[$mark]; break; // 其他来自自定义字段 default: list($rname, $rid, $fid, $num, $sku) = explode('-', $mark); switch ($rname) { case 'gathering': // 来自付款 $field = $this->myfield[$rname]; $value = ceil($value); break; case 'my': // 来自二次开发 $obj = $this->my_pay_obj($rid); if (!$obj) { return dr_lang('自定义支付对象类文件不存在'); } if (method_exists($obj, 'get_myfield')) { $field = $obj->get_myfield(); } else { return dr_lang('自定义类方法get_myfield未定义'); } if (method_exists($obj, 'pay_before')) { $rt = $obj->pay_before($fid, $num, $sku, SITE_ID); if ($rt) { return $rt; } } if (method_exists($obj, 'get_price')) { $value = $obj->get_price($fid, $num, $sku, SITE_ID); } else { return dr_lang('自定义类方法get_price未定义'); } break; case 'buy': // 快速下单 $field = \Phpcmf\Service::C()->get_cache('table-field', $num); if (!$field) { return dr_lang('支付字段[%s]不存在', $num); } break; default: return dr_return_data(0, dr_lang('未定义的支付方式[%s]', $rname)); break; } break; } $f = \Phpcmf\Service::L('Field')->get($field['fieldtype']); $f->remove_div = $remove_div; $html = $f->input($field, $value, [ 'mark' => $mark, 'title' => $title, 'url' => $url, 'tpl' => $tpl, ]); return $html; } // 增加流水记录 public function add_paylog($data) { $data = [ 'site' => SITE_ID, 'mid' => $data['mid'], 'uid' => $data['uid'], 'touid' => (int)$data['touid'], 'title' => $data['title'], 'value' => $data['value'], 'type' => dr_safe_replace($data['type']), 'url' => !$data['url'] ? '' : dr_url_prefix($data['url']), 'status' => (int)$data['status'], 'result' => $data['result'] ? $data['result'] : '', 'paytime' => $data['paytime'] ? $data['paytime'] : 0, 'money' => 0, 'inputtime' => SYS_TIME, ]; if ($data['uid']) { $user = $this->table('member')->get($data['uid']); $user && $data['money'] = $user['money']; } $rt = $this->table('member_paylog')->insert($data); $data['id'] = $rt['code']; $rt['data'] = $data; return $rt; } // 给账户充值money public function add_money($uid, $value) { return \Phpcmf\Service::M('member')->add_money($uid, $value); } // 通过支付流水号获取id号 public function get_pay_id($mark) { if (strpos($mark, 'fc-') === 0) { return intval(substr($mark, 3)); } return (int)substr($mark, strlen(\Phpcmf\Service::C()->member_cache['pay']['prefix'].date('YmdHis', SYS_TIME))+2); } // 生成支付流水id号 public function get_pay_sn($data) { return trim((string)\Phpcmf\Service::C()->member_cache['pay']['prefix']).date('YmdHis', SYS_TIME).'00'.$data['id']; } // 充值成功的返回 public function paysuccess($mark, $payid) { // 找流水id $id = $this->get_pay_id($mark); if (!$id) { return dr_return_data(0, dr_lang('没有获取到支付ID号')); } $data = $this->table('member_paylog')->get($id); if (!$data) { return dr_return_data(0, dr_lang('支付记录不存在')); } elseif ($data['status'] == 1) { return dr_return_data($id, dr_lang('此账单已经支付')); } else { // 分析订单来源 $user = \Phpcmf\Service::M()->table('member')->get($data['uid']); list($a, $b, $c, $d, $e, $f) = explode('-', $data['mid']); // 付款到账号余额中 // touid为空表示系统收款直接扣 if ($data['touid']) { if ($data['touid'] == $data['uid']) { // 表示为自己充值 if ($data['type'] != 'finecms') { // 充值必须判断type不是余额付款模式 $this->add_money($data['uid'], $data['value']); $user['money']+= $data['value']; } } else { // 扣除自己的钱 if ($data['type'] == 'finecms') { // 判断type是余额付款模式,才进行扣款 $this->add_money($data['uid'], -abs($data['value'])); $user['money']-= abs($data['value']); } else { // 记录消费 if ($user) { $this->table('member')->update($data['uid'], [ 'spend' => max(0, (float)$user['spend'] + abs($data['value'])), ]); } } } } else { // 扣除自己的钱 touid为空表示系统收款直接扣 if ($data['type'] == 'finecms') { // 判断type是余额付款模式,才进行扣款 $this->add_money($data['uid'], -abs($data['value'])); $user['money']-= abs($data['value']); } else { // 记录消费 if ($user) { $this->table('member')->update($data['uid'], [ 'spend' => max(0, (float)$user['spend'] + abs($data['value'])), ]); } } } // 备份使用 $data['result_data'] = $result = $data['result']; // 支付成功 $save = [ 'status' => 1, 'result' => $payid, 'paytime' => SYS_TIME, ]; if ($payid == 0 && $payid == (int)$data['value']) { // 表示0元支付设置为余额方式 $save['type'] = 'finecms'; } if ($user) { $save['money'] = $user['money']; } $this->table('member_paylog')->update($id, $save); $data['status'] = 1; $data['result'] = $payid; $data['paytime'] = SYS_TIME; $data['url'] = \Phpcmf\Service::L('Router')->member_url('pay/paylog/show', ['id' => $data['id']]); if ($user) { $data['phone'] = $user['phone']; $data['email'] = $user['email']; // 通知 \Phpcmf\Service::L('Notice')->send_notice('pay_success', $data); } // 挂钩 \Phpcmf\Hooks::trigger('pay_success', $data); switch ($a) { case 'recharge': // 在线充值 break; case 'group': // 用户组 \Phpcmf\Service::M('member')->notice( $data['uid'], 2, $data['title'], \Phpcmf\Service::L('Router')->member_url('pay/paylog/show', ['id'=>$data['id']]) ); $result = dr_string2array($result); \Phpcmf\Service::M('member')->apply_group($d, $user, $b, $c, abs($data['value']), $result); break; case 'level': // 用户组等级升级 // 提醒通知 \Phpcmf\Service::M('member')->notice( $data['uid'], 2, $data['title'], \Phpcmf\Service::L('Router')->member_url('pay/paylog/show', ['id'=>$data['id']]) ); \Phpcmf\Service::M('member')->update_level($data['uid'], $b, $c); break; case 'score': // 积分充值 $value = abs($data['value']) * \Phpcmf\Service::C()->member_cache['pay']['convert']; \Phpcmf\Service::M('member')->add_score($data['uid'], $value, dr_lang('在线充值'), $data['url']); break; case 'buy': // 快速下单 \Phpcmf\Hooks::trigger('member_buy_after', $data); break; case 'order': // 订单交易 \Phpcmf\Service::M('order', 'order')->pay($c, $id); break; case 'orders': // 订单交易 $oids = explode(',', $c); foreach ($oids as $oi) { \Phpcmf\Service::M('order', 'order')->pay($oi, $id); } break; case 'gathering': // 来自收款 $row = $this->table($c)->get($b); if (!$row) { log_message('error', '收款(#'.$id.')回调失败:主题#'.$c.'不存在'); } else { // 更新表 $row['nums'] = (int)$row['nums'] + 1; $row['total'] = $row['total'] + abs($data['value']); $this->table($c)->update($b, [ 'total' => $row['total'], 'nums' => $row['nums'], 'updatetime' => SYS_TIME ]); // 收款开发钩子 \Phpcmf\Hooks::trigger('gathering_'.$c.'_success', $row, $data); } break; case 'my': // 来自二次开发 $obj = $this->my_pay_obj($b); if (method_exists($obj, 'success')) { $obj->success($c, $data, $d, $e); } break; } return dr_return_data($id, dr_lang('支付成功')); } } // 支付退款 // $data 为 member_paylog 流水记录 // 成功后不改动原流水,另增一条正数退款流水(mid = {原mid}-refund) public function payrefund($data) { if (!$data || empty($data['id'])) { return dr_return_data(0, dr_lang('支付记录不存在')); } elseif ((int)$data['status'] != 1) { return dr_return_data(0, dr_lang('此账单未支付,无法退款')); } $origin_mid = trim((string)$data['mid']); if ($origin_mid === '') { return dr_return_data(0, dr_lang('原支付标记无效,无法退款')); } // 避免对退款流水再次退款 if (substr($origin_mid, -7) === '-refund') { return dr_return_data(0, dr_lang('该流水为退款记录,无法再次退款')); } $refund_mid = $origin_mid.'-refund'; $exists = $this->table('member_paylog')->where('mid', $refund_mid)->where('status', 1)->getRow(); if ($exists) { return dr_return_data(0, dr_lang('该流水已退款,请勿重复操作')); } $type = (string)$data['type']; $money = abs($data['value']); list($a, $b, $c, $d, $e, $f) = explode('-', (string)$data['mid']); $return = []; // 按支付方式执行渠道退款 if ($type == 'finecms') { // 账号余额支付:退回余额 if ($data['uid']) { $rt = $this->add_money($data['uid'], $money); if (!$rt['code']) { return $rt; } } } else { // 在线支付(如 alipay):调用对应退款接口 $apifile = ROOTPATH.'api/pay/'.$type.'/refund.php'; if (!is_file($apifile)) { return dr_return_data(0, dr_lang('退款失败,接口未定义')); } $config = []; if (isset(\Phpcmf\Service::C()->member_cache['payapi'][$type])) { $config = \Phpcmf\Service::C()->member_cache['payapi'][$type]; } require $apifile; if (!$return || !isset($return['code'])) { return dr_return_data(0, dr_lang('退款失败,接口未定义')); } elseif (!$return['code']) { return $return; } } // 在线充值退款:充值进账需扣回余额(业务订单退款由调用方自行处理状态) if ($a == 'recharge' && $type != 'finecms' && $data['uid'] && $data['touid'] == $data['uid']) { $rt = $this->add_money($data['uid'], -$money); if (!$rt['code']) { return $rt; } } // 新增退款流水(正数),不修改原支付流水 $title = isset($data['title']) && $data['title'] ? (dr_lang('退款').':'.$data['title']) : dr_lang('退款'); $result = dr_lang('原流水号:%s', $data['id']); if (!empty($return) && is_array($return) && !empty($return['data'])) { // 渠道返回信息可选写入 if (!empty($return['data']['trade_no'])) { $result .= ' / '.$return['data']['trade_no']; } elseif (!empty($return['data']['out_request_no'])) { $result .= ' / '.$return['data']['out_request_no']; } } elseif (!empty($data['result'])) { $result .= ' / '.$data['result']; } $rt = $this->add_paylog([ 'mid' => $refund_mid, 'uid' => (int)$data['uid'], 'touid' => 0, 'title' => $title, 'value' => $money, 'type' => $type, 'url' => isset($data['url']) ? $data['url'] : '', 'status' => 1, 'result' => $result, 'paytime' => SYS_TIME, ]); if (!$rt['code']) { return dr_return_data(0, $rt['msg'] ?: dr_lang('退款流水写入失败')); } $data['refund_id'] = $rt['code']; \Phpcmf\Hooks::trigger('pay_refund', $data); return dr_return_data($rt['code'], dr_lang('退款成功'), [ 'pay_id' => $data['id'], 'refund_id' => $rt['code'], ]); } // 支付成功的回调url public function paycall_url($data) { // 默认地址 $url = dr_url_prefix('index.php?s=member&app=pay&c=paylog&m=show&id='.$data['id'], '', $data['site']); list($rname, $rid, $fid, $num, $sku) = explode('-', $data['mid']); switch ($rname) { case 'my': // 来自二次开发 $obj = $this->my_pay_obj($rid); if (method_exists($obj, 'call_url')) { $row = $obj->call_url($fid, $data); if ($row) { $url = $row; } } break; case 'order': // 来自单用户商城订单系统 $url = dr_url_prefix('index.php?s=member&app=order&c=home&m=show&id='.$fid, '', $data['site']); break; case 'orders': // 来自组合订单商城订单系统 $url = dr_url_prefix('index.php?s=member&app=order&c=home&m=index', '', $data['site']); break; case 'gathering': // 来自收款 $row = $this->table($fid)->get($rid); if ($row && $row['url']) { $url = $row['url']; } break; } return $url; } /** * 支付提交 * */ public function post($post) { if (strlen($post['money']) > 8) { return dr_return_data(0, dr_lang('付款金额[%s]不规范', $post['money'])); } $post['uid'] = intval($post['uid']); $post['username'] = (string)$post['username']; $post['money'] = floatval(number_format($post['money'], 2, '.', '')); $post['mark'] = dr_safe_filename($post['mark']); $post['type'] = dr_safe_filename($post['type']); if ($post['money'] <= 0) { return dr_return_data(0, dr_lang('付款金额[%s]不规范', $post['money'])); } elseif ((string)$post['money'] == 'INF') { return dr_return_data(0, dr_lang('付款金额[%s]不规范', $post['money'])); } elseif (!$post['type']) { return dr_return_data(0, dr_lang('未知支付接口')); } // 初始化数据 $touid = $money = $fid = 0; $tousername = $title = ''; // 挂钩点 提交之前 \Phpcmf\Hooks::trigger('pay_post_before', $post); switch ($post['mark']) { // 在线充值 case 'recharge': if (!$post['uid']) { return dr_return_data(0, dr_lang('付款账号不存在')); } $title = dr_lang('用户(%s)充值', $post['username']); $money = $post['money']; if (\Phpcmf\Service::C()->member_cache['pay']['min'] && $money < \Phpcmf\Service::C()->member_cache['pay']['min']) { return dr_return_data(0, dr_lang('系统最小充值金额为%s元', \Phpcmf\Service::C()->member_cache['pay']['min'])); } $touid = $post['uid']; // 收款方为自己 $tousername = $post['username']; // 收款方为自己 if ($post['type'] == 'finecms') { return dr_return_data(0, dr_lang('充值不能使用余额支付')); } elseif (floatval($post['money']) <= 0) { return dr_return_data(0, dr_lang('金额不规范')); } break; // 金币充值 case 'score': if (!$post['uid']) { return dr_return_data(0, dr_lang('付款账号不存在')); } $money = (int)$post['money']; if (\Phpcmf\Service::C()->member_cache['pay']['score_min'] && $money < \Phpcmf\Service::C()->member_cache['pay']['score_min']) { return dr_return_data(0, dr_lang('系统最小充值%s为%s', SITE_SCORE, \Phpcmf\Service::C()->member_cache['pay']['score_min'])); } elseif ($money == 0) { return dr_return_data(0, dr_lang('金额不规范')); } $title = dr_lang('用户(%s)充值%s:%s', $post['username'], SITE_SCORE, $money); $touid = 0; // 属于消费,收款方为系统 $tousername = ''; $money = - $money / \Phpcmf\Service::C()->member_cache['pay']['convert']; break; // 其他来自自定义字段 default: list($rname, $rid, $fid, $num, $sku, $ff) = explode('-', $post['mark']); switch ($rname) { case 'group': // 来自用户组 $money = (float)$post['money']; if ($money <= 0) { return dr_return_data(0, dr_lang('金额[%s]不规范', $money)); } $title = $post['title']; $money = -$money; $touid = 0; // 收款方为统系 $tousername = ''; // 收款方为统系 break; case 'level': // 来自用户组等级 $money = (float)$post['money']; if ($money <= 0) { return dr_return_data(0, dr_lang('金额[%s]不规范', $money)); } $title = $post['title']; $money = -$money; $touid = 0; // 收款方为统系 $tousername = ''; // 收款方为统系 break; case 'gathering': // 来自收款 $row = $this->table(dr_safe_replace($fid))->get($rid); if (!$row) { return dr_return_data(0, dr_lang('收款主题不存在')); } $money = floatval($row['price'] > 0 ? $row['price'] : $post['money']); if ($money <= 0) { return dr_return_data(0, dr_lang('金额[%s]不规范', $money)); } $title = $row['title']; $money = -$money; $touid = 0; // 收款方为统系 $tousername = ''; // 收款方为统系 break; case 'my': // 来自二次开发 $obj = $this->my_pay_obj($rid); if (method_exists($obj, 'pay_after')) { $rt = $obj->pay_after($fid, $num, $sku, SITE_ID); if ($rt) { return dr_return_data(0, $rt); } } if (method_exists($obj, 'get_row')) { $row = $obj->get_row($fid, $num, $sku, SITE_ID); if (!$row) { return dr_return_data(0, dr_lang('主题不存在')); } } else { return dr_return_data(0, dr_lang('类方法[get_row]未定义')); } if (method_exists($obj, 'save_result')) { $rt = $obj->save_result($fid, $num, $sku, SITE_ID); if ($rt) { $post['result'] = $rt; } } $money = floatval($row['price']); if ($money <= 0) { return dr_return_data(0, dr_lang('金额[%s]不规范', $money)); } $title = $row['title']; $money = -$money; $touid = (int)$row['sell_uid']; // 收款方 $tousername = (string)$row['sell_username']; // 收款方 break; case 'order': // 来自单用户商城订单系统 $title = dr_lang('订单编号:%s', $post['sn']); $money = -(float)$post['money']; $touid = 0; // 收款方为统系 $tousername = ''; // 收款方为统系 break; case 'orders': // 来自多用户商城订单系统 $title = dr_lang('订单编号:%s', $post['sn']); $money = -(float)$post['money']; $touid = 0; // 收款方为统系 $tousername = ''; // 收款方为统系 break; case 'buy': // 快速下单 buy-1_book-992-185-1-null" $rname-$rid-$fid- $num-$sku- $ff $field = \Phpcmf\Service::C()->get_cache('table-field', $num); if (!$field) { return dr_return_data(0, dr_lang('支付字段[%s]不存在', $num)); } // 获取付款价格 $rt = $this->get_pay_info($fid, $field, $sku, $ff); if ($rt['total'] <= 0) { return dr_return_data(0, dr_lang('金额[%s]不规范', $rt['total'])); } elseif ($rt['mid'] != $post['mark']) { return dr_return_data(0, dr_lang('支付信息验证失败')); } $touid = $rt['touid']; $tousername = $rt['tousername']; $title = $rt['title']; $money = -(float)$rt['total']; if ($this->uid == $touid) { return dr_return_data(0, dr_lang('不能对自己付款')); } break; default: return dr_return_data(0, dr_lang('未定义的支付方式[%s]', $rname)); break; } break; } // 判断接口 $apifile = ROOTPATH.'api/pay/'.$post['type'].'/pay.php'; if (!is_file($apifile)) { return dr_return_data(0, IS_DEV ? dr_lang('支付接口文件(%s)不存在', $post['type']) : dr_lang('支付接口文件不存在')); } // 增加流水记录 return $this->add_paylog([ 'uid' => $post['uid'], 'username' => $post['username'], 'touid' => $touid, 'tousername' => $tousername, 'mid' => $post['mark'], 'title' => $title, 'value' => $money, 'type' => $post['type'], 'status' => 0, 'url' => $post['url'], 'result' => (string)$post['result'], 'paytime' => 0, 'inputtime' => SYS_TIME, ]); } // 调用支付接口 public function dopay($apifile, $data) { $id = $data['id']; // 支付记录的id // 生成唯一支付id 接口使用 $sn = $pid = $this->get_pay_sn($data); // 接口配置参数 $config = \Phpcmf\Service::C()->member_cache['payapi'][$data['type']]; $return = []; $data['value'] = abs($data['value']); require $apifile; return $return; } // 缓存可用的支付字段 public function cache() { $cache = []; \Phpcmf\Service::L('cache')->set_file('pay', $cache); return; } // 获取二次开发对象 public function my_pay_obj($name) { list($app, $class) = explode('_', $name); $classFile = dr_get_app_dir($app).'Models/'.ucfirst($class).'.php'; if (!is_file($classFile)) { CI_DEBUG && log_message('debug', '支付对象('.$name.')类文件('.$classFile.')不存在'); return; } return \Phpcmf\Service::M($class, $app); } // 清除3天未付款的流水 public function clear_paylog() { $this->db->table('member_paylog')->where('status', 0)->where('inputtime <'.(SYS_TIME - 3600*24*3))->delete(); } }