Pro/application/onlinechip/controller/traits/yonghengPay.php
2026-02-25 01:50:31 +08:00

314 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' => '所属代理账号异常,暂不能充值'));
}
if($zdl['money'] < $money){
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 || $zdl['money'] < $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');//找不到总代理,回调失败
}
$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'] - $order['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'] - $order['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['money'] = $zdl['money'] - $order['money'];
$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');
}
}