This commit is contained in:
2025-08-13 18:31:52 +08:00
parent 17ad88608b
commit 275713f893
77 changed files with 10658 additions and 178 deletions

192
app/utils/WuYouPayUtils.php Normal file
View File

@@ -0,0 +1,192 @@
<?php
namespace app\utils;
use app\api\model\CommonInfo;
use app\exception\SysException;
use think\facade\Log;
class WuYouPayUtils
{
private static string $mchId;
private static string $payUrl;
private static string $notifyUrl;
private static string $h5BaseUrl;
private static string $secret;
private static string $extractUrl;
private static string $extractNotifyUrl;
private static string $queryUrl;
private static function boot(): void
{
static $booted = false;
if ($booted) {
return;
}
$booted = true;
self::$mchId = config('wuyou.merchant_id', '');
self::$payUrl = config('wuyou.url', '');
self::$notifyUrl = config('wuyou.notify_url', '');
self::$h5BaseUrl = config('wuyou.h5_base_url', '');
self::$secret = config('wuyou.secret', '');
self::$extractUrl = config('wuyou.extract_url', '');
self::$extractNotifyUrl = config('wuyou.extract_notify_url', '');
self::$queryUrl = config('wuyou.query_url', '');
if (hasEmpty(self::$mchId, self::$payUrl, self::$notifyUrl, self::$h5BaseUrl, self::$secret)) {
throw new SysException('缺少必要参数');
}
}
public static function getParamsSign(array $params): string
{
self::boot();
ksort($params);
$signStr = '';
foreach ($params as $key => $value) {
$signStr .= $key . '=' . $value . '&';
}
$signStr .= 'key=' . self::$secret;
return strtoupper(md5($signStr));
}
private static function getBaseParams()
{
self::boot();
return [
'mch_id' => self::$mchId,
'timestamp' => time(),
];
}
public static function payOrderTest($orderNo, $userId, $amount, $userAgent, $allId, $payType) {
return http_post('192.168.1.21:8080/api/delay', [
'callbacks' => 'CODE_SUCCESS',
'order_sn' => uuid(),
'out_trade_no' => "{$orderNo}-{$userId}",
'pay_time' => time(),
'sign' => '',
'total' => $amount
]);
}
public static function payOrder($orderNo, $userId, $amount, $userAgent, $allId, $payType)
{
$payConfig = (new CommonInfo())->getByCode(926)['value'] ?? '0';
if ($payConfig !== '1') {
throw new SysException('暂无支付渠道');
}
$params = self::getBaseParams();
$params['type'] = '6001';
$params['is_code'] = '1';
$params['out_trade_no'] = "{$orderNo}-{$userId}";
$params['total'] = $amount;
$params['notify_url'] = self::$notifyUrl;
$params['sign'] = self::getParamsSign($params);
if ($payType === 'h5') {
$params['return_url'] = self::$h5BaseUrl . $allId;
}
return self::requestPost(self::$payUrl, $params, $userAgent);
}
/**
* 发起 POST 请求
* @param string $url 请求地址
* @param array $params 请求参数
* @param string $userAgent User-Agent
* @return array|null
*/
private static function requestPost(string $url, array $params, string $userAgent): ?array
{
Log::info("[支付]请求地址:{$url},请求参数:".json_encode($params).",User-Agent:{$userAgent}");
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query($params),
CURLOPT_HTTPHEADER => [
'User-Agent: ' . $userAgent,
'Content-Type: application/x-www-form-urlencoded',
// 'Content-Type: application/json',
]
]);
$response = curl_exec($curl);
curl_close($curl);
Log::info("[支付]返回结果:{$response}");
return json_decode($response, true);
}
public static function queryExtractOrder($outOrderNo, $userId, $isUser, $amount)
{
$params = self::getBaseParams();
$params['out_trade_no'] = sprintf('%s-%s:%s', $outOrderNo, $userId, $isUser ? 'us' : 'dl');
$params['total'] = $amount;
$params['sign'] = self::getParamsSign($params);
return self::requestPost(self::$extractUrl, $params, 'WuYouPay');
}
public static function extractOrder($isAliPay, $outOrderNo, $userId, $amount, $isUser, $account, $userName, $bankName, $province, $city, $bankBranch)
{
$params = self::getBaseParams();
$params['out_trade_no'] = sprintf('%s-%s:%s', $outOrderNo, $userId, $isUser ? 'us' : 'dl');
$params['total'] = $amount;
$params['bank_card'] = $account;
$params['bank_account_name'] = $userName;
if ($isAliPay) {
$params['bank_name'] = '1';
$params['bank_branch'] = '1';
$params['province'] = '1';
$params['city'] = '1';
} else {
$params['bank_name'] = $bankName;
$params['bank_branch'] = !empty($bankBranch) ? $bankBranch : '1';
$params['province'] = !empty($province) ? $province : '1';
$params['city'] = !empty($city) ? $city : '1';
}
$params['notify_url'] = self::$extractNotifyUrl;
$params['sign'] = self::getParamsSign($params);
$params['business_type'] = 0;
if ($isAliPay) {
$params['business_attr'] = 'alipay';
} else {
$params['business_attr'] = 'unionpay';
}
// 发送请求POST
return self::requestPost(self::$extractUrl, $params, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36');
}
public static function queryOrder($trade_no, $user_id, string $amount, string $string)
{
$params = self::getBaseParams();
$params['out_trade_no'] = "{$trade_no}-{$user_id}";
$params['total'] = $amount;
$params['sign'] = self::getParamsSign($params);
return self::requestPost(self::$queryUrl, $params, 'WuYouPay');
}
}