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

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

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

311 lines
14 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 happyPay{
public function happy_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 = "API1362913582567500"; //商户CID
$pay_orderid = 'E'.date("YmdHis").rand(100000,999999); //订单号
$pay_amount = $money; //交易金额
$pay_notifyurl = $pay_list['happyPay']['notify_url']; //服务端返回地址
$pay_callbackurl = $pay_list['happyPay']['callback_url']; //页面跳转返回地址
$Md5key = "77f4a079992f4e16b0d2cb4dbd1d7f0f"; //密钥
$tjurl = "http://khgri4829.com:6084/api/pay/V2"; //提交地址
$native = [
'version'=>'V2',//版本号
'signType'=>'MD5',//签名类型
'merchantNo'=>$pay_memberid,//商户号
'date'=>date('Ymdhis',time()),//时间戳格式:YYYYMMDDhhmmss
'channleType'=>$pay_type,//通道类型
'noticeUrl'=>$pay_notifyurl,
'orderNo'=>$pay_orderid,
'bizAmt'=>$pay_amount,
];
ksort($native);
$md5str = "";
foreach ($native as $key => $val) {
$md5str = $md5str . $key . "=" . $val . "&";
}
$md5str = trim($md5str,'&');
$sign = md5($md5str . $Md5key);
$native["sign"] = $sign;
$postData = http_build_query($native);
$options = array(
'http' => array(
'method' => 'POST',
'header' =>[
'Content-type:application/json',
'Accept:application/json'
],
'content' => json_encode($native),
'timeout' => 15 * 60 // 超时时间(单位:s
)
);
$context = stream_context_create($options);
$result = file_get_contents($tjurl, false, $context);
$returnArray = json_decode($result,true);
// print_r($returnArray);die;
if(is_array($returnArray) && isset($returnArray['code'])){
if($returnArray['code'] == 0){
if(isset($returnArray['detail']['PayURL'])){
$returnUrl = $returnArray['detail']['PayURL'];
}else{
$parms = base64_encode(encrypt_data(['user_id'=>$user_id,'orderNo'=>$pay_orderid]));
$returnUrl = $pay_callbackurl.'?value='.$parms;
}
$order_record = array();
$order_record['pay_channel_id'] = 5;
$order_record['pay_channel_name'] = 'happyPay';
$order_record['user_id'] = $user_id;
$order_record['order_sn'] = $pay_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'] = '';
$order_record['client'] = $client;
if(isset($returnArray['detail']['PayHtml'])){
$order_record['remake'] = $returnArray['detail']['PayHtml'];
}
$order_id = Db::name('order_record')->insertGetId($order_record);
$order_log = array();
$order_log['pay_channel_id'] = 5;
$order_log['pay_channel_name'] = 'happyPay';
$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' => $returnUrl));
}else{
return json(array('status' => 0, 'message' => $returnArray['msg']));
}
}else{
return json(array('status' => 0, 'message' => '支付发起失败,请稍后再试'));
}
}else{
return json(array('status' => 0, 'message' => '支付发起失败,请稍后再试'));
}
}
public function happy_call_back_url(){
$getData = Request::instance()->get('value');
$content = '页面或订单已失效或订单';
if(base64_decode($getData)){
$data = decrypt_data(['encryptData'=>base64_decode($getData)]);
if(isset($data['orderNo']) && isset($data['user_id'])){
$orderInfo = Db::name('order_record')->where(['order_sn'=>$data['orderNo'],'user_id'=>$data['user_id']])->find();
if($orderInfo){
if($orderInfo['status'] == 3){
$content = '订单已完成';
}else{
$content = $orderInfo['remake'];
}
}
}
}
$this->assign('content',$content);
return $this->fetch();
}
public function happy_call_back(){
$post = Request::instance()->post();
$serializeData = json_encode($post);
if(!is_array($post) || !isset($post['orderNo']) || !isset($post['bizAmt']) || !isset($post['status']) || !isset($post['sign']) || !isset($post['status'])){
Log::record($post,'error_pay_callback');
exit();
}
Log::record($post,'callback');
if($post['status'] != 1){
Log::record($post,'fail_pay_callback');
exit('SUCCESS');
}
$order = Db::name('order_record')->where(['order_sn'=>$post['orderNo']])->find();
if(!$order){
$order_log['pay_channel_id'] = 5;
$order_log['pay_channel_name'] = 'happyPay';
$order_log['create_time'] = time();
$order_log['remake'] = "收到回调,但是查询不到订单号,回调内容:".$serializeData;
Db::name('order_log')->insert($order_log);
exit('SUCCESS');//订单不存在,回调失败
}
$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['pay_channel_id'] = 5;
$order_log['pay_channel_name'] = 'happyPay';
$order_log['create_time'] = time();
$order_log['remake'] = "收到回调,但是查询不到会员信息,会员可能已经删除或者停用,回调内容:".$serializeData;
Db::name('order_log')->insert($order_log);
exit('SUCCESS');//用户不存在,回调失败
}
//验证签名
$Md5key = "77f4a079992f4e16b0d2cb4dbd1d7f0f"; //密钥
$postData = $post;
unset($postData['sign']);
ksort($postData);
$md5str = "";
foreach ($postData as $key => $val) {
$md5str = $md5str . $key . "=" . $val . "&";
}
$md5str = trim($md5str,'&');
$sign = md5($md5str . $Md5key);
if ($sign != $post['sign']) {
$update['status'] = 1;
$update['remake'] = '签名不对,交易暂停';
Db::name('order_record')->where('id',$order['id'])->update($update);
$order_log = array();
$order_log['pay_channel_id'] = 5;
$order_log['pay_channel_name'] = 'happyPay';
$order_log['money'] = $order['money'];
$order_log['create_time'] = time();
$order_log['remake'] = "收到回调,但是签名不对,回调内容:".$serializeData;
$order_log['order_id'] = $order['id'];
Db::name('order_log')->insert($order_log);
exit('SUCCESS');//签名不对,回调失败
}
//返回金额
if(round($post['bizAmt'],2) != $order['money']){
$order_log = array();
$order_log['pay_channel_id'] = 5;
$order_log['pay_channel_name'] = 'happyPay';
$order_log['money'] = $order['money'];
$order_log['create_time'] = time();
$order_log['remake'] = "收到回调,但是金额不对,回调内容:".$serializeData;
$order_log['order_id'] = $order['id'];
Db::name('order_log')->insert($order_log);
exit('SUCCESS');//金额不对,回调失败
}
//总代理金额
$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'] = 5;
$order_log['pay_channel_name'] = 'happyPay';
$order_log['money'] = $order['money'];
$order_log['create_time'] = time();
$order_log['remake'] = "无法找到总代理,回调内容:".$serializeData;
$order_log['order_id'] = $order['id'];
Db::name('order_log')->insert($order_log);
exit('SUCCESS');//找不到总代理,回调失败
}
//更新订单表
$call_back_data['back_money'] = $post['bizAmt'];
$call_back_data['back_sign'] = '';
$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'] = 5;
$order_log['pay_channel_name'] = 'happyPay';
$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('SUCCESS');
}
}