dlh_test_server/app/api/controller/Gtpay.php
2024-12-09 09:48:49 +08:00

419 lines
17 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\api\controller;
use app\common\basics\Api;
use app\common\logic\Billions;
use app\common\logic\Earnings;
use app\common\model\AccountLog;
use app\common\model\localstore\LocalGoodsOrder;
use app\common\model\localstore\LocalStoreCloudAudio;
use app\common\server\CloudAudioServer;
use app\common\server\JsonServer;
use think\facade\Db;
class Gtpay extends Api
{
public $like_not_need_login = ['accountResult','checkOrder','account','messageSend','custom','wxPay','checkMcc','checkSecondMcc','anxinsignPerson','anxinsigncompany'];
private $agetId = "FWH000025501";
private $custId = "60000008228471";
private $wxAppid = "wx586d77b9edb0636d";
private $areaId = "20241128184516";//商圈号
private $publicKey = "-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlu5coHWBbtrz8DyX0VbPWiJZlAsofwZ99pZq1CNZhx2bo66BtcHLWQ5LhpXxz7/dRpqUaek1HIK2z03sPBIBQHoTWz74fPsbiKH++d7fX8389XWuEyeL8BuBIUzXDYYmxdZKuOZ9pxjYpVqXkfFRq35TAxKZnm3Nj7ReNliTyY1/kp/vgvgJPaF+tWrCorWBiHvqDLd2teD8yRICRbFtZfd+DNdAYNPhJ8IHAB2Tazc8qG/IOhaP9bAZ74xmVXnXmHQRa+6JLJqIh7k2OrUO0JdcU0HiSiCidQUqdGZf+U088lz8pi95t+AvV6mUFtWyEQZHmv/xrVxj9oVdcbwjFQIDAQAB
-----END PUBLIC KEY-----";
public function wxPay($user_id,$money='1',$local_goods_id=0,$lid=0){
// $user_id = $this->user_id;var_dump($user_id);
// $user_id = 979;
$user = Db::name("user_auth")->where("user_id",$user_id)->find();
$out = "dlh".time().$user_id;
$data = [
'agetId'=>$this->agetId,
'custId'=>$this->custId,
'orderNo'=>$out,
'txamt'=>$money*100,
'openid'=>$user['openid'],
'payWay'=>"1",
'ip'=>$_SERVER['REMOTE_ADDR'],
'timeStamp'=>time(),
'version'=>"1.0.0",
'wxAppid'=>$this->wxAppid,
'traType'=>'8'
];
$da['orderNo'] = $out;
$da['txamt'] = $money*100;
$da['user_id'] = $user_id;
$da['local_goods_id'] = $local_goods_id;
$da['lstore_id'] = $lid;
$da['dtime'] = date("Y-m-d H:i:s");
$r['id'] = Db::name("gt_pay")->insertGetId($da);
$d =$this->ASCII($data);
$data['sign'] = $this->sign($d,$this->publicKey);
// print_r("<pre>");
// var_dump($data);
$b = json_encode($data,true);
// var_dump($b);
$url = "https://yyfsvxm.postar.cn/yyfsevr/order/pay";
$result = $this->curl_post($url,$b);
$r['nonceStr'] = $result['data']['jsapiNoncestr'];
$r['package'] = $result['data']['jsapiPackage'];
$r['signType'] = $result['data']['jsapiSignType'];
$r['timeStamp'] = $result['data']['jsapiTimestamp'];
$r['paySign'] = $result['data']['jsapiPaySign'];
return JsonServer::success('开始支付',$r);
}
public function checkOrder($post){
// $user_id = $this->user_id;
$user_id = $post['user_id'];
$gtpay_msg = Db::name("gt_pay")->where("id",$post['id'])->find();
$data = [
'agetId'=>$this->agetId,
'custId'=>$this->custId,
'orderNo'=>$gtpay_msg['orderNo'],
'orderTime'=>date("Ymd",strtotime($gtpay_msg['dtime'])),
'timeStamp'=>time(),
'version'=>"1.0.0"
];
// print_r("<pre>");
// var_dump($data);
$d =$this->ASCII($data);
$data['sign'] = $this->sign($d,$this->publicKey);
// print_r("<pre>");
// var_dump($data);
$b = json_encode($data,true);
// var_dump($b);
$url = "https://yyfsvxm.postar.cn/yyfsevr/order/orderQuery";
$result = $this->curl_post($url,$b);
// var_dump($result);
return $this->account($result,$post,$user_id,$gtpay_msg);
}
public function account($result,$post,$user_id,$gtpay_msg){
// var_dump($result);
$sidy = 0.7;
$sidy1 = 0.03;
$sidy2 = 0.05;
$sidy3 = 0.22;
if(isset($post['spec_item_id'])){
$sku_num_msg = Db::name("local_store_goods_item")
->where("id",$post['spec_item_id'])
->find();
if($sku_num_msg!=null){
$data['goods_id'] = $sku_num_msg['goods_id'];
$local_goods_msg = Db::name("local_store_goods")
->where("id",$sku_num_msg['goods_id'])
->find();
if($local_goods_msg['subsidy_id'] == 0){
$sidy = 0.7;
$sidy1 = 0.03;
$sidy2 = 0.05;
$sidy3 = 0.22;
}else{
$subsidy = Db::name("goods_subsidy")
->where("id",$local_goods_msg['subsidy_id'])
->find();
$sidy = round($subsidy['profit']/100,2);
$sidy3 = round((100-$subsidy['profit']-8)/100,2);
}
}
$data['sku_id'] = $post['spec_item_id'];
}
if(isset($post['lsg_order_id'])){
$data['lsg_order_id'] = $post['lsg_order_id'];
if(isset($post['post_station_time'])){
$year = date("Y");
$post_station_time = $year.'-'.$post['post_station_time'];
$post_station_time = strtotime($post_station_time);
LocalGoodsOrder::where('lsg_order_id',$post['lsg_order_id'])->update(
[
'post_station_id'=>$post['post_station_id'],
'post_station_time'=>$post_station_time
]
);
}
}
if(isset($post['goods_num'])){
$data['goods_num'] = $post['goods_num'];
}
$data['order_sn'] = $gtpay_msg['orderNo'];
$data['order_source'] = 1;
$data['pay_way'] = 1;
$data['pay_status'] = 0;
$data['local_id'] = $post['lid'];
$data['user_id'] = $user_id;
$data['order_amount'] = round($gtpay_msg['txamt']/100,2);
$data['pay_type'] = 1;
$data['gt_orderno'] = $result['data']['orderNo'];
$data['create_time'] = date("Y-m-d H:i:s");
$r = Db::name("local_pay")->save($data);
$company = Db::name("local_store")->where("lstore_id",$post['lid'])->where("is_delete",0)->find();
$dt['lstore_id'] = $post['lid'];
$dt['payment_type'] = $company['bankType'];
$dt['total_amount'] = round($gtpay_msg['txamt']/100,2);
$dt['account_name'] = $company['shopName'];
$dt['bank_name'] = $company['bankName'];
$dt['bank_card'] = $company['bankCard'];
$dt['large_number'] = $company['largeNumber'];
$dt['separate_account'] = round($gtpay_msg['txamt']/100*$sidy,2);
$dt2['separate_account'] = round($gtpay_msg['txamt']/100*$sidy3,2);
$dt3['separate_account'] = round($gtpay_msg['txamt']/100*$sidy1,2);
if($post['lid'] == 138){
$dt['separate_account'] = round($gtpay_msg['txamt']/100*0.72,2);
$dt2['separate_account'] = round($gtpay_msg['txamt']/100*0.20,2);
}
if($post['lid'] == 140){
$dt['separate_account'] = round($gtpay_msg['txamt']/100*0.76,2);
$dt2['separate_account'] = round($gtpay_msg['txamt']/100*0.22,2);
$dt3['separate_account'] = 0;
}
$dt['create_time'] = date("Y-m-d H:i:s");
$dt['user_id'] = $user_id;
$dt['order_no'] = $gtpay_msg['orderNo'];
$dt['pay_shop_type'] = 1;
if( isset($post['remark'])){
$dt['remark'] = $post['remark'];
}
$r = Db::name("local_store_order")->save($dt);
// 基本户 5%
$dt1['lstore_id'] = $post['lid'];
$dt1['payment_type'] = 1;
$dt1['account_name'] = "东龙汇";
$dt1['bank_name'] = "中国工商银行";
$dt1['bank_card'] = "1204068809100138961";
$dt1['large_number'] = "102335006882";
$dt1['separate_account'] = round($gtpay_msg['txamt']/100*$sidy2,2);
$dt1['create_time'] = date("Y-m-d H:i:s");
$dt1['user_id'] = $user_id;
$dt1['local_our_company'] = 1;
$dt1['order_no'] = $gtpay_msg['orderNo'];
$r1 = Db::name("local_store_order")->save($dt1);
// 22% 一般户
$dt2['lstore_id'] = $post['lid'];
$dt2['payment_type'] = 1;
$dt2['account_name'] = "东龙汇";
$dt2['bank_name'] = "中国工商银行";
$dt2['bank_card'] = "1204064019200152507";
$dt2['large_number'] = "102335006405";
$dt2['create_time'] = date("Y-m-d H:i:s");
$dt2['user_id'] = $user_id;
$dt2['local_our_company'] = 2;
$dt2['order_no'] = $gtpay_msg['orderNo'];
$r2 = Db::name("local_store_order")->save($dt2);
// 10% 一般户
$dt3['lstore_id'] = $post['lid'];
$dt3['payment_type'] = 1;
$dt3['account_name'] = "东龙汇";
$dt3['bank_name'] = "中国工商银行";
$dt3['bank_card'] = "1204064419000115357";
// $dt3['bank_card'] = "1204068809100138961";
// $dt3['large_number'] = "102335006882";
$dt3['large_number'] = "102335006448";
// $dt3['separate_account'] = round($post['money']*0.06,2);
$dt3['create_time'] = date("Y-m-d H:i:s");
$dt3['user_id'] = $user_id;
$dt3['local_our_company'] = 3;
$dt3['order_no'] = $gtpay_msg['orderNo'];
$r3 = Db::name("local_store_order")->save($dt3);
$arr=array("ACC_DETAIL"=>array(
array(
"ACC_CUST_ID"=>$company['acc_cust_id'],
"ACC_DATE"=>round($gtpay_msg['txamt']/100*$sidy,2)
),
// 基本户
array(
"ACC_CUST_ID"=>"60000008228471",
"ACC_DATE"=>round($gtpay_msg['txamt']/100*$sidy2,2)
),
// 一般户2507
array(
"ACC_CUST_ID"=>"60000008435142",
"ACC_DATE"=>round($gtpay_msg['txamt']/100*$sidy3,2)
),
//一般户5357
array(
"ACC_CUST_ID"=>"60000008435087",
"ACC_DATE"=>round($gtpay_msg['txamt']/100*$sidy2,2)
)));
$arr = json_encode($arr,true);
$data = [
'agetId'=>$this->agetId,
'custId'=>$this->custId,
'orderNo'=>$result['data']['orderNo'],
'areaId'=>$this->areaId,
'accModel'=>"1",
'accWay'=>"1",
'orderAccDetail'=>$arr,
'timeStamp'=>time(),
'version'=>"1.0.0",
'remark'=>'订单分账',
'accTxamt'=>$gtpay_msg['txamt']
];
$d =$this->ASCII($data);
$data['sign'] = $this->sign($d,$this->publicKey);
// print_r("<pre>");
// var_dump($data);
$b = json_encode($data,true);
// var_dump($b);
$url = "https://yyfsvxm.postar.cn/yyfsevr/order/account";
$res = $this->curl_post($url,$b);
if($res['code'] == "000000"){
$dat['state'] = 1;
$dat['taskCreateDate'] = $res['data']['taskCreateDate'];
$dat['taskId'] = $res['data']['taskId'];
Db::name("gt_pay")->where("id",$gtpay_msg['id'])->update(['state'=>1]);
Db::name("local_store_order")->where("order_no",$gtpay_msg['orderNo'])->update(['state'=>1]);
Db::name("local_pay")->where("order_sn",$gtpay_msg['orderNo'])->update(['pay_status'=>1]);
if(isset($post['lsg_order_id'])){
LocalGoodsOrder::where('lsg_order_id',$post['lsg_order_id'])->update(
[
'state'=>1
]
);
}
$user = Db::name("user")->where("id",$user_id)->find();
$distribution = Db::name("distribution")->where("user_id",$user_id)->find();
// 参与消费返补
$billions = new Billions();
$order['order_amount'] = round($gtpay_msg['txamt']/100,2);
$this->playAudio($post['lid'], $order['order_amount']);
$order['id'] = $gtpay_msg['id'];
$order['order_sn'] = $gtpay_msg['orderNo'];
$order['type'] = 4;
$type = "local_pay";
$billions_result = $billions->billions($order,$user['id'],$type);
return JsonServer::success('分账成功');
}
}
public function accountResult(){
$data = [
'agetId'=>"FWH000025501",
'custId'=>"60000008228471",
'orderNo'=>"20241129TT2lg6ln",
'areaId'=>"20241128184516",
'taskCreateDate'=>"20241129",
'taskId'=>"1099295",
'timeStamp'=>time(),
'version'=>"1.0.0"
];
$d =$this->ASCII($data);
$data['sign'] = $this->sign($d,$this->publicKey);
print_r("<pre>");
var_dump($data);
$b = json_encode($data,true);
var_dump($b);
$url = "https://yyfsvxm.postar.cn/yyfsevr/order/accountResult";
$result = $this->curl_post($url,$b);
var_dump($result);
}
// 异步支付回调
public function payNotify(){
}
//异步提现回调
public function payWithdrawal(){
}
//异步进件
public function inComing(){
}
function ASCII($params=array()){
ksort($params);
reset($params);
$str = "";
$t = array();
foreach($params as $key=>$value){
$t[] = $key."=".$value;
}
$str = implode("&",$t);
// $str = http_build_query($params,'','&amp');
return $str;
}
public function sign($param,$key_pem)
{
$sha256 = hash("sha256", $param);
$privateKey = openssl_pkey_get_public($key_pem); //检测是否公钥
openssl_public_encrypt($sha256, $sign, $privateKey); //公钥加密
$sign = base64_encode($sign);
return $sign;
}
private function curl_post($url,$postdata){
$curl = curl_init(); // 启动一个CURL会话
curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检测
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Expect:'
)); // 解决数据包大不能提交
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata); // Post提交的数据包
curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循
curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
// curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
$tmpInfo = curl_exec($curl); // 执行操作
if (curl_errno($curl)) {
echo 'Errno' . curl_error($curl);
}
curl_close($curl); // 关键CURL会话
$tmpInfo=json_decode($tmpInfo,true);
return $tmpInfo;
}
private function curl_get($url) {
//初使化curl
$curl = curl_init();
//请求的url,由形参传入
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检测
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Expect:'
)); // 解决数据包大不能提交
//将得到的数据返回
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
//不处理头信息
curl_setopt($curl, CURLOPT_HEADER, 0);
//连接超过10秒超时
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
// curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
//执行curl
$output = curl_exec($curl);
if (curl_errno($curl)) {
echo 'Errno' . curl_error($curl);
}
//关闭资源
curl_close($curl);
//返回内容
$tmpInfo=json_decode($output,true);
return $tmpInfo;
}
private function playAudio($lstore_id, $money) {
if (!$lstore_id && !$money) {
return;
}
$sound = LocalStoreCloudAudio::where('lstore_id', $lstore_id)->field('sn, version, message')->find();
if (!$sound) {
return;
}
$message = $sound['message'] ?? CloudAudioServer::MESSAGE;
CloudAudioServer::send([
'id' => $sound['sn'],
'version' => $sound['version'],
'message' => "{$message},{$money}",
]);
}
}