419 lines
17 KiB
PHP
419 lines
17 KiB
PHP
<?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,'','&');
|
||
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}",
|
||
]);
|
||
}
|
||
} |