webman_duanju/app/utils/WuYouPayUtils.php

193 lines
6.0 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\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');
}
}