193 lines
6.0 KiB
PHP
193 lines
6.0 KiB
PHP
<?php
|
||
|
||
namespace app\utils;
|
||
|
||
use app\api\model\CommonInfo;
|
||
use app\exception\SysException;
|
||
use support\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');
|
||
|
||
|
||
}
|
||
}
|