Files
Pro/application/onlinechip/controller/traits/yonghengPay.php
T
fengshao1227 0bf387f7d5 feat: 线上自助充值不再扣代理余额(系统直充)
会员通过第三方支付通道线上充值时,不再检查/扣减总代理余额。
真金白银从支付通道进来,直接加分给会员。

改动覆盖全部9个支付通道trait:
- 删除下单时的代理余额检查(不再拦截"余额不足")
- 回调时只检查代理是否存在,不检查余额
- 不扣减代理money字段
- 充值记录标记为"系统直充"而非"扣取总代理余分"

代理手动给会员上分(信用盘模式)不受影响,仍然扣代理自己的分。
2026-05-24 19:25:05 +08:00

310 lines
15 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace app\onlinechip\controller\traits;
use think\Db;
use think\Log;
use think\Request;
trait yonghengPay{
public function online_order(){
$user_id = intval(Request::instance()->post('user_id'));
$money = intval(Request::instance()->post('price'));
$client = intval(Request::instance()->post('client'));
$username = trim(Request::instance()->post('username'));
$pay_type = intval(Request::instance()->post('pay_type'));
$user = Db::name('user')->where(array('id' => $user_id, 'status' => 1, 'is_delete' => 0, 'agent' => 0))->find();
$zdlIdArr = explode(',',$user['agent_parent_id_path']);
$area_list = config('area_list');
//判断是否金流支线,如果不是的话,不允许充值
$isAllow = false;
foreach($area_list[$user['area_id']]['limit_agent'] as $allowAgentId){
if(in_array($allowAgentId,$zdlIdArr)){
$isAllow = true;
}
}
if(!$isAllow){
return json(array('status' => 0, 'message' => '该账号暂不支持在线充值'));
}
$zdlId = $zdlIdArr[0];
$zdl = Db::name('user')->where(array('id' => $zdlId, 'status' => 1, 'is_delete' => 0, 'agent' => 1))->find();
if(!$zdl){
return json(array('status' => 0, 'message' => '所属代理账号异常,暂不能充值'));
}
$pay_list = config('pay_list');
if($user && $user_id > 0 && $money > 0 && $client > 0){
$pay_memberid = "11319"; //商户ID
$pay_orderid = 'E'.date("YmdHis").rand(100000,999999); //订单号
$pay_amount = $money; //交易金额
$pay_applydate = date("Y-m-d H:i:s"); //订单时间
$pay_notifyurl = $pay_list['yongheng']['notify_url']; //服务端返回地址
$pay_callbackurl = $pay_list['yongheng']['callback_url']; //页面跳转返回地址
$Md5key = "yfhjiq5rkdmx4xh3egt0f4hkay574wal"; //密钥
$tjurl = "https://www.aa168zf.com/Pay_Index.html"; //提交地址
$pay_bankcode = $pay_type; //银行编码
$native = array(
"pay_memberid" => $pay_memberid,
"pay_orderid" => $pay_orderid,
"pay_amount" => $pay_amount,
"pay_applydate" => $pay_applydate,
"pay_bankcode" => $pay_bankcode,
"pay_notifyurl" => $pay_notifyurl,
"pay_callbackurl" => $pay_callbackurl,
);
ksort($native);
$md5str = "";
foreach ($native as $key => $val) {
$md5str = $md5str . $key . "=" . $val . "&";
}
//echo($md5str . "key=" . $Md5key);
$sign = strtoupper(md5($md5str . "key=" . $Md5key));
$native["pay_md5sign"] = $sign;
$native['pay_attach'] = "1234|456";
$native['pay_productname'] = 'VIP基础服务';
$native['format'] = 'json';
$postdata = http_build_query($native);
$options = array(
'http' => array(
'method' => 'POST',
'header' => 'Content-type:application/x-www-form-urlencoded',
'content' => $postdata,
'timeout' => 15 * 60 // 超时时间(单位:s
)
);
$context = stream_context_create($options);
$result = file_get_contents($tjurl, false, $context);
$returnArray = json_decode($result,true);
//echo "<pre>";
//print_r($returnArray);
//echo "</pre>";
//exit();
$data = $returnArray['data'];
if($returnArray['status'] == 'ok'){
$order_record = array();
$order_record['pay_channel_id'] = 1;
$order_record['pay_channel_name'] = '永恒168';
$order_record['user_id'] = $user_id;
$order_record['order_sn'] = $data['orderid'];
$order_record['appid'] = $pay_memberid;
$order_record['api_key'] = $Md5key;
$order_record['money'] = $pay_amount;
$order_record['sign'] = $sign;
$order_record['create_time'] = time();
$order_record['back_order_sn'] = $data['transaction_id'];
$order_record['client'] = $client;
$order_id = Db::name('order_record')->insertGetId($order_record);
$order_log = array();
$order_log['pay_channel_id'] = 1;
$order_log['pay_channel_name'] = '永恒168';
$order_log['money'] = $pay_amount;
$order_log['create_time'] = time();
$order_log['remake'] = 'user_id:'.$user_id.',用户名:'.$username.',发起充值:'.$pay_amount.',充值时间:'.date('Y-m-d H:i:s',time());
$order_log['order_id'] = $order_id;
$order_log['client'] = $client;
Db::name('order_log')->insert($order_log);
return json(array('status' => 1, 'message' => '发起支付成功,即将跳转...', 'url' => $returnArray['data']['pay_url']));
}else{
return json(array('status' => 0, 'message' => $returnArray['msg']));
}
}else{
return json(array('status' => 0, 'message' => '支付发起失败,请稍后再试'));
}
}
public function call_back_url(){
Log::record(Request::instance()->post(),'callback');
exit();
}
public function call_back(){
$post = Request::instance()->post();
$serializePost = json_encode($post);
Log::record(Request::instance()->post(),'callback');
$update = array();
$memberid = Request::instance()->post("memberid"); // 商户ID
$orderid = Request::instance()->post("orderid"); // 订单号
$amount = Request::instance()->post("amount"); // 交易金额
$datetime = Request::instance()->post("datetime"); // 交易时间
$transaction_id = Request::instance()->post("transaction_id"); // 支付流水号
$returncode = Request::instance()->post("returncode"); // 支付成功代码
$callBackSign = Request::instance()->post("sign"); // 返回签名
$returnArray = array(
"memberid" => $memberid,
"orderid" => $orderid,
"amount" => $amount,
"datetime" => $datetime,
"transaction_id" => $transaction_id,
"returncode" => $returncode,
);
$md5key = "yfhjiq5rkdmx4xh3egt0f4hkay574wal";
ksort($returnArray);
reset($returnArray);
$md5str = "";
foreach ($returnArray as $key => $val) {
$md5str = $md5str . $key . "=" . $val . "&";
}
$sign = strtoupper(md5($md5str . "key=" . $md5key));
$order = Db::name('order_record')->where('order_sn',$returnArray['orderid'])->find();
if(!$order){
$order_log = array();
$order_log['pay_channel_id'] = 1;
$order_log['pay_channel_name'] = '永恒168';
$order_log['create_time'] = time();
$order_log['remake'] = "收到回调,但是查询不到订单号,回调内容:".$serializePost;
Db::name('order_log')->insert($order_log);
exit('OK');//订单不存在,回调失败
}
$user = Db::name('user')->where(array('id' => $order['user_id'], 'status' => 1, 'is_delete' => 0, 'agent' => 0))->find();
if(!$user){
$update['status'] = 1;
$update['remake'] = '收到回调,无法查询到会员';
Db::name('order_record')->where('id',$order['id'])->update($update);
$order_log = array();
$order_log['pay_channel_id'] = 1;
$order_log['pay_channel_name'] = '永恒168';
$order_log['create_time'] = time();
$order_log['remake'] = "收到回调,但是查询不到会员信息,会员可能已经删除或者停用,回调内容:".$serializePost;
Db::name('order_log')->insert($order_log);
exit('OK');//用户不存在,回调失败
}
if($order['status'] == 3){
$order_log = array();
$order_log['pay_channel_id'] = 1;
$order_log['pay_channel_name'] = '永恒168';
$order_log['money'] = $order['money'];
$order_log['create_time'] = time();
$order_log['remake'] = "收到回调,但订单已经支付完成".$serializePost;
$order_log['order_id'] = $order['id'];
Db::name('order_log')->insert($order_log);
exit('OK');//用户订单已经支付完成
}
//签名
if ($sign != $callBackSign) {
$update['status'] = 1;
$update['remake'] = '签名不对,交易暂停';
Db::name('order_record')->where('id',$order['id'])->update($update);
$order_log = array();
$order_log['pay_channel_id'] = 1;
$order_log['pay_channel_name'] = '永恒168';
$order_log['money'] = $order['money'];
$order_log['create_time'] = time();
$order_log['remake'] = "收到回调,但是签名不对,回调内容:".$serializePost;
$order_log['order_id'] = $order['id'];
Db::name('order_log')->insert($order_log);
exit('OK');//签名不对,回调失败
}
//状态
if ($returncode != "00") {
$update['status'] = 1;
$update['remake'] = '支付不成功'.$returncode;
Db::name('order_record')->where('id',$order['id'])->update($update);
$order_log = array();
$order_log['pay_channel_id'] = 1;
$order_log['pay_channel_name'] = '永恒168';
$order_log['money'] = $order['money'];
$order_log['create_time'] = time();
$order_log['remake'] = "收到回调,支付不成功,回调内容:".$serializePost;
$order_log['order_id'] = $order['id'];
Db::name('order_log')->insert($order_log);
exit('OK');//支付状态不对,回调失败
}
//返回金额
if($amount != $order['money']){
$update['status'] = 1;
$update['remake'] = '支付金额小于订单金额,交易停止';
Db::name('order_record')->where('id',$order['id'])->update($update);
$order_log = array();
$order_log['pay_channel_id'] = 1;
$order_log['pay_channel_name'] = '永恒168';
$order_log['money'] = $order['money'];
$order_log['create_time'] = time();
$order_log['remake'] = "收到回调,但是金额不对,回调内容:".$serializePost;
$order_log['order_id'] = $order['id'];
Db::name('order_log')->insert($order_log);
exit('OK');//金额不对,回调失败
}
//总代理金额
$zdlIdArr = explode(',',$user['agent_parent_id_path']);
$zdlId = $zdlIdArr[0];
$zdl = Db::name('user')->where(array('id' => $zdlId, 'status' => 1, 'is_delete' => 0, 'agent' => 1))->find();
if(!$zdl){
$update['status'] = 1;
$update['remake'] = '无法找到总代理,交易暂停';
Db::name('order_record')->where('id',$order['id'])->update($update);
$order_log = array();
$order_log['pay_channel_id'] = 1;
$order_log['pay_channel_name'] = '永恒168';
$order_log['money'] = $order['money'];
$order_log['create_time'] = time();
$order_log['remake'] = "无法找到总代理,回调内容:".$serializePost;
$order_log['order_id'] = $order['id'];
Db::name('order_log')->insert($order_log);
exit('OK');//找不到总代理,回调失败
}
$call_back_data = array();
//更新订单表
$call_back_data['back_money'] = $amount;
$call_back_data['back_sign'] = $callBackSign;
$call_back_data['back_time'] = time();
$call_back_data['status'] = 3;
$call_back_data['agent_parent_id'] = $user['agent_parent_id'];
$call_back_data['agent_parent_username'] = $user['agent_parent_username'];
$call_back_data['zdl_id'] = $zdl['id'];
$call_back_data['zdl_username'] = $zdl['username'];
$call_back_data['zdl_money_before'] = $zdl['money'];
$call_back_data['zdl_money_after'] = $zdl['money'];
$call_back_data['money_before'] = $user['money'];
$call_back_data['money_after'] = $user['money'] + $order['money'];
Db::name('order_record')->where(array('id' => $order['id']))->update($call_back_data);
//记录支付日志
$order_log = array();
$order_log['pay_channel_id'] = 1;
$order_log['pay_channel_name'] = '永恒168';
$order_log['money'] = $order['money'];
$order_log['create_time'] = time();
$order_log['remake'] = "回调支付成功";
$order_log['order_id'] = $order['id'];
Db::name('order_log')->insert($order_log);
//插入上分表并增加余分
$recharge = array();
$recharge['type'] = 4;
$recharge['amount'] = $order['money'];
$recharge['mode'] = 1;
$recharge['agent_or_admin'] = 3;
$recharge['controller_id'] = $zdl['id'];
$recharge['controller_username'] = $zdl['username'];
$recharge['controller_nickname'] = $zdl['nickname'];
$recharge['controller_type'] = '第三方充值平台充值,系统直充';
$recharge['controller_old_money'] = $zdl['money'];
$recharge['controller_new_money'] = $zdl['money'];
$recharge['user_id'] = $order['user_id'];
$recharge['user_type'] = $user['agent'];
$recharge['user_agent_level'] = 0;
$recharge['username_for'] = $user['username'];
$recharge['nickname_for'] = $user['nickname'];
$recharge['user_parent_id'] = $user['agent_parent_id'];
$recharge['create_time'] = time();
$recharge['old_money'] = $user['money'];
$recharge['new_money'] = $user['money'] + $order['money'];
$recharge['controller_system'] = 3;
$recharge['remake'] = '第三方充值成功';
Db::name('recharge')->insert($recharge);
$updateZdl = array();
$updateZdl['last_recharge_out'] = $order['money'];
$updateZdl['last_recharge_out_time'] = time();
$updateZdl['recharge_out_count'] = $zdl['recharge_out_count'] + 1;
$updateZdl['recharge_out_total_amount'] = $zdl['recharge_out_total_amount'] + $order['money'];
$updateUser = array();
$updateUser['money'] = $user['money'] + $order['money'];
$updateUser['last_recharge'] = $order['money'];
$updateUser['last_recharge_time'] = time();
$updateUser['recharge_count'] = $user['recharge_count'] + 1;
$updateUser['recharge_total_amount'] = $user['recharge_total_amount'] + $order['money'];
Db::name('user')->where(array('id' => $zdl['id']))->limit(1)->update($updateZdl);
Db::name('user')->where(array('id' => $order['user_id']))->limit(1)->update($updateUser);
exit('OK');
}
}