From 6acecb0596b68e3ad75327f35536612856f5ac33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8A=80=E6=9C=AF=E8=80=81=E8=83=A1?= <1094551889@qq.com> Date: Tue, 5 Nov 2024 15:46:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=92=E4=BB=B6=E5=BC=80=E5=8F=91=E6=A8=A1?= =?UTF-8?q?=E7=89=88=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controller/PayController.php | 2 +- config/extendconfig/payplugin.php | 2 +- extend/payclient/PayClass.php | 17 ++- extend/payclient/ShouQianBa.php | 236 ++++++++++++++++-------------- extend/payclient/payclient.zip | Bin 11079 -> 12258 bytes runtime/order.json | 2 +- 6 files changed, 142 insertions(+), 117 deletions(-) diff --git a/app/controller/PayController.php b/app/controller/PayController.php index c025b83..efdb3c0 100644 --- a/app/controller/PayController.php +++ b/app/controller/PayController.php @@ -282,7 +282,7 @@ class PayController $payclient_path = "\\payclient\\{$payclient_name}"; $Payclient = new $payclient_path($config); // 获取支付明细 - $records = $Payclient->payQuery($query); + $records = $Payclient->getOrderInfo($query); if ($records) { // 提交收款记录 $upres = $Mpay->upRecords($records, $aid); diff --git a/config/extendconfig/payplugin.php b/config/extendconfig/payplugin.php index e26a584..da5edba 100644 --- a/config/extendconfig/payplugin.php +++ b/config/extendconfig/payplugin.php @@ -49,7 +49,7 @@ return array( array( 'platform' => 'ysepay', 'name' => '小Y经营', - 'class_name' => 'Ysepay', + 'class_name' => 'YsePay', 'price' => '99.00', 'describe' => '为商户和消费者提供安全、便捷、高效的支付产品与服务助力商户提升运营效率,实现数字化运营', 'website' => 'https://xym.ysepay.com/', diff --git a/extend/payclient/PayClass.php b/extend/payclient/PayClass.php index 70feda1..74028af 100644 --- a/extend/payclient/PayClass.php +++ b/extend/payclient/PayClass.php @@ -27,7 +27,7 @@ class PayClass // 验证码接口 private $captcha_path = '/saas_merchant_management/public/captcha'; - function __construct($config) + function __construct(array $config) { $this->username = $config['username']; $this->password = $config['password']; @@ -35,18 +35,18 @@ class PayClass // 检查token/cookie目录 $dir_path = runtime_path() . "token/{$this->pay_type}/"; if (!is_dir($dir_path)) { - if (!mkdir($dir_path, 755, true)) echo '目录创建失败'; + if (!mkdir($dir_path, 755, true)) echo '创建token/cookie目录失败'; } // token/cookie文件路径 $this->token_path = $dir_path . md5($this->username . $this->password . __CLASS__) . '.json'; $this->cookie_path = $dir_path . md5($this->username . $this->password . __CLASS__) . '.txt'; // 检查token文件 if (!file_exists($this->token_path)) { - file_put_contents($this->token_path, \json_encode(['token' => 'ok', 'update_time' => date('Y-m-d H:i:s')])); + file_put_contents($this->token_path, json_encode(['token' => 'ok', 'update_time' => date('Y-m-d H:i:s')])); } } // 获取订单信息 - public function getOrderInfo(array $query) + public function getOrderInfo(array $query): array { $order_list = $this->queryOrder($query); $orders = []; @@ -82,7 +82,7 @@ class PayClass if ($result['code'] === 0) { $order_list = $result['data']['list']; } else { - // 重试2次 + // 重试3次 if ($times < 3) { $this->updateToken(); $order_list = $this->queryOrder($query, $times + 1); @@ -137,12 +137,13 @@ class PayClass $this->saveToken($data['data']); return true; } else { - // 重试2次 + // 重试3次 + $is_login = false; if ($times < 3) { - $is_login = false; $is_login = $this->login($times + 1); return $is_login; } + return $is_login; } } // 更新token @@ -162,7 +163,7 @@ class PayClass private function saveToken($data) { $token = $data['token']; - file_put_contents($this->token_path, ['token' => $token, 'update_time' => date('Y-m-d H:i:s')]); + file_put_contents($this->token_path, json_encode(['token' => $token, 'update_time' => date('Y-m-d H:i:s')])); } // 解析验证码 private function getCaptchaInfo(string $image = '', string $typeid = '3'): string diff --git a/extend/payclient/ShouQianBa.php b/extend/payclient/ShouQianBa.php index 029481c..f67dbe2 100644 --- a/extend/payclient/ShouQianBa.php +++ b/extend/payclient/ShouQianBa.php @@ -1,41 +1,113 @@ username = $config['username']; - $this->password = $config['password']; - // 检查token目录 - $dir_path = runtime_path() . 'token/sqbpay'; + $this->password = md5($config['password']); + $this->now = time(); + // 检查token/cookie目录 + $dir_path = runtime_path() . "token/{$this->pay_type}/"; if (!is_dir($dir_path)) { - if (!mkdir($dir_path, 755, true)) { - echo '目录创建失败'; - } + if (!mkdir($dir_path, 755, true)) echo '创建token/cookie目录失败'; } - $this->token_path = $dir_path . '/' . md5($this->username . $this->password . 'sqbpay') . '.json'; + // token/cookie文件路径 + $this->token_path = $dir_path . md5($this->username . $this->password . __CLASS__) . '.json'; + $this->cookie_path = $dir_path . md5($this->username . $this->password . __CLASS__) . '.txt'; + // 检查token文件 if (!file_exists($this->token_path)) { - // 失效Token刷新 - $token_info = ['token' => 'Y2FjZmRiMi04MjRjLTQ2NDgtYTU0Ny1lNzg2MDllMTQ1ZTI6MTcxOTQ1Mzg0MzU3OTozNjAwMDAw.txcnX60Za8', 'expire_time' => 1719453843579]; - file_put_contents($this->token_path, json_encode($token_info)); + file_put_contents($this->token_path, json_encode(['token' => 'ok', 'update_time' => date('Y-m-d H:i:s')])); } } - // 登陆账号 - private function login(): array + // 获取订单信息 + public function getOrderInfo(array $query): array { + $order_list = $this->queryOrder($query); + $orders = []; + if (!$order_list) return $orders; + $payways = [2 => 'alipay', 3 => 'wxpay']; + foreach ($order_list as $value) { + $order = []; + // 平台订单流水号 + $order['order_no'] = $value['order_sn']; + // 支付类型 + $order['payway'] = $payways[$value['payway']]; + // 收款金额 + $order['price'] = (float)($value['original_amount'] / 100); + // 收款渠道(二维码编号) + $order['channel'] = $value['terminal_device_fingerprint']; + // 添加到订单列表 + $orders[] = $order; + } + return $orders; + } + // 查询订单 + private function queryOrder(array $query, $times = 0): array + { + // 查询订单列表 + $token = $this->getToken(); + $url = $this->payhost . $this->order_query_path . '?client_version=7.0.0&token=' . $token; + $header = ['Content-Type: application/json;charset=UTF-8']; + $new_query = $this->getOrderQuery($query); + $res = $this->getHttpResponse($url, $header, json_encode($new_query)); + $result = json_decode($res, true); + // 检查订单信息 + $order_list = []; + if ($result['code'] === 50000) { + $order_list = $result['data']['records']; + } else { + // 重试1次 + if ($times < 1) { + $this->updateToken(); + $order_list = $this->queryOrder($query, $times + 1); + } + } + return $order_list; + } + // 构建订单查询数组信息 + private function getOrderQuery(array $query): array + { + $new_query = $query; + $now = $this->now; + $begin_time = (int)(($now - 175) . mt_rand(100, 999)); + $end_time = (int)($now . mt_rand(100, 999)); + $query['date_start'] = $begin_time; + $query['date_end'] = $end_time; + return $new_query; + } + // 登陆账号 + private function login($times = 0): bool + { + $url = $this->payhost . $this->login_path; $user_info = [ "username" => $this->username, - "password" => md5($this->password), + "password" => $this->password, "uc_device" => [ "device_type" => 2, "default_device" => 0, @@ -46,100 +118,50 @@ class ShouQianBa "device_brand" => "Chrome" ] ]; - $header = [ - 'Content-Type:application/json;charset=UTF-8', - 'Host:web-platforms-msp.shouqianba.com', - 'Origin:https://s.shouqianba.com', - 'Referer:https://s.shouqianba.com/login', - ]; - $url = $this->host . $this->login; + $header = ['Content-Type:application/json;charset=UTF-8', 'Host:web-platforms-msp.shouqianba.com', 'Origin:https://s.shouqianba.com', 'Referer:https://s.shouqianba.com/login']; $res = $this->getHttpResponse($url, $header, json_encode($user_info)); - $arr_res = json_decode($res, true); - $mchUserTokenInfo = $arr_res['data']['mchUserTokenInfo']; - $token_info = []; - $token_info['token'] = $mchUserTokenInfo['token']; - $token_info['expire_time'] = $mchUserTokenInfo['expire_time']; - // 保存登陆token - file_put_contents($this->token_path, json_encode($token_info)); - // 返回新token - return $token_info; + $data = json_decode($res, true); + if ($data['code'] === 50000 && $data['data']['code'] === 50000) { + // 保存token + $this->saveToken($data['data']['mchUserTokenInfo']); + return true; + } else { + // 重试2次 + $is_login = false; + if ($times < 2) { + $is_login = $this->login($times + 1); + return $is_login; + } + return $is_login; + } + } + // 更新token + private function updateToken(): bool + { + $token = $this->getToken(); + $url = $this->payhost . $this->refresh_token_path . '?token=' . $token; + $header = ["Authorization:Bearer {$token}"]; + $res = $this->getHttpResponse($url, $header, true); + $data = json_decode($res, true); + if ($data['data']['status'] === 0) { + // 登陆刷新Token + $this->login(); + } else { + $this->saveToken($data['data']); + } + return true; } // 获取token private function getToken(): string { - $token_info_find = json_decode(file_get_contents($this->token_path), true); - // 有效期判断 - $expire_time = intval($token_info_find['expire_time'] / 1000); - $token = ''; - if ($expire_time - time() < 600) { - // 刷新token - $url = $this->host . $this->refresh_token . '?token=' . $token_info_find['token']; - $header = ["Authorization:Bearer {$token_info_find['token']}"]; - $res = $this->getHttpResponse($url, $header, true); - $arr_res = json_decode($res, true); - if ($arr_res['data']['status'] === 0) { - // 登陆更新token - $token = ($this->login())['token']; - } else { - $token = $arr_res['data']['token']; - $token_info = []; - $token_info['token'] = $token; - $token_info['expire_time'] = $arr_res['data']['expire_time']; - // 保存Token - file_put_contents($this->token_path, json_encode($token_info)); - } - } else { - $token = $token_info_find['token']; - } - return $token; + $token_info = json_decode(file_get_contents($this->token_path), true); + return $token_info['token']; } - // 接口客户端 - public function payQuery(array $query): array + // 保存token + private function saveToken($data) { - $token = $this->getToken(); - if ($token) { - $url = $this->host . $this->find_transactions . '?client_version=7.0.0&token=' . $token; - $header = ['Content-Type: application/json;charset=UTF-8']; - // 构建订单查询 - $now = time(); - $begin_time = ($now - 175) * 1000; - $end_time = $now * 1000; - $query['date_start'] = $begin_time; - $query['date_end'] = $end_time; - // 查询订单列表 - $res_order = $this->getHttpResponse($url, $header, json_encode($query)); - $arr_res = json_decode($res_order, true); - $list = []; - if ($arr_res['code'] === 50000) { - $list = $arr_res['data']['records']; - } - // 重构订单流水,返回数组 - $moneyList = []; - if ($list) { - $order_no = []; - $payway = []; - $price = []; - $channel = []; - $payways = [2 => 'alipay', 3 => 'wxpay']; - foreach ($list as $value) { - // 平台订单流水号 - $order_no[] = $value['order_sn']; - // 支付类型 - $payway[] = $payways[$value['payway']]; - // 收款金额 - $price[] = $value['original_amount'] / 100; - // 收款渠道(二维码编号) - $channel[] = $value['terminal_device_fingerprint']; - } - $moneyList['order_no'] = $order_no; - $moneyList['payway'] = $payway; - $moneyList['price'] = $price; - $moneyList['channel'] = $channel; - } - return $moneyList; - } else { - return []; - } + $token = $data['token']; + file_put_contents($this->token_path, json_encode(['token' => $token, 'update_time' => date('Y-m-d H:i:s')])); } // 请求外部资源 private function getHttpResponse($url, $header = [], $post = null, $timeout = 10) @@ -148,11 +170,13 @@ class ShouQianBa curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($ch, CURLOPT_COOKIEJAR, $this->cookie_path); + curl_setopt($ch, CURLOPT_COOKIEFILE, $this->cookie_path); if ($header) { curl_setopt($ch, CURLOPT_HTTPHEADER, $header); } else { $httpheader[] = "Accept: */*"; - $httpheader[] = "Accept-Language: zh-CN,zh;q=0.8"; + $httpheader[] = "Accept-Language: zh-CN,zh;q=0.9"; $httpheader[] = "Connection: close"; curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader); } diff --git a/extend/payclient/payclient.zip b/extend/payclient/payclient.zip index e21aff257c8d39c79fe52774d0cd2492628092f6..01305ba9f4b072c35e6e771faa9a7f3cfc3dd539 100644 GIT binary patch literal 12258 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 literal 11079 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