支付回调优化

This commit is contained in:
wong
2025-09-30 14:47:26 +08:00
parent d8f5771dcb
commit ddc3e855d4
3 changed files with 143 additions and 85 deletions

View File

@@ -3,11 +3,10 @@
namespace app\common\controller;
use app\chukebao\model\TokensCompany;
use app\chukebao\model\TokensRecord;
use think\Db;
use app\common\util\PaymentUtil;
use think\facade\Config;
use think\facade\Env;
use think\facade\Log;
use think\facade\Request;
use app\common\model\Order;
@@ -63,12 +62,12 @@ class PaymentService
'mchId' => $params['mch_id'],
'companyId' => isset($order['companyId']) ? $order['companyId'] : 0,
'userId' => isset($order['userId']) ? $order['userId'] : 0,
'orderType' => isset($order['orderType']) ? $order['orderType'] : 1,
'orderType' => isset($order['orderType']) ? $order['orderType'] : 1,
'status' => 0,
'goodsId' => isset($order['goodsId']) ? $order['goodsId'] : 0,
'goodsName' => isset($order['goodsName']) ? $order['goodsName'] : '',
'money' => isset($order['money']) ? $order['money'] : 0,
'goodsSpecs' => isset($order['goodsSpecs']) ? json_encode($order['goodsSpecs'],256) : json_encode([]),
'goodsSpecs' => isset($order['goodsSpecs']) ? json_encode($order['goodsSpecs'], 256) : json_encode([]),
'orderNo' => isset($order['orderNo']) ? $order['orderNo'] : '',
'ip' => Request::ip(),
'nonceStr' => isset($order['nonceStr']) ? $order['nonceStr'] : '',
@@ -237,26 +236,7 @@ class PaymentService
$order->payTime = $this->parsePayTime($time_end);
$order->save();
//订单处理
switch ($order['orderType']){
case 1:
// 处理购买算力
$token = TokensCompany::where(['companyId' => $order->companyId])->find();
$goodsSpecs = json_decode($order->goodsSpecs,true);
if (!empty($token)){
$token->tokens = $token->tokens + $goodsSpecs['tokens'];
$token->updateTime = time();
$token->save();
}else{
$tokensCompany = new TokensCompany();
$tokensCompany->companyId = $order->companyId;
$tokensCompany->tokens = $goodsSpecs['tokens'];
$tokensCompany->createTime = time();
$tokensCompany->updateTime = time();
$tokensCompany-> save();
}
break;
}
$this->processOrder($order);
Db::commit();
return json_encode(['code' => 200, 'msg' => '付款成功']);
} catch (\Exception $e) {
@@ -290,19 +270,16 @@ class PaymentService
* - transaction_id: string 平台交易号(与 out_trade_no 二选一)
* @return \think\response\Json
*/
public function queryOrder(array $query)
public function queryOrder($orderNo = '')
{
$outTradeNo = $query['out_trade_no'] ?? ($query['orderNo'] ?? '');
$transactionId = $query['transaction_id'] ?? '';
if ($outTradeNo === '' && $transactionId === '') {
return json(['code' => 422, 'msg' => '缺少查询参数out_trade_no 或 transaction_id']);
if (empty($orderNo)) {
return json(['code' => 422, 'msg' => '订单号缺失']);
}
$params = [
'service' => 'unified.trade.query',
'mch_id' => Env::get('payment.mchId'),
'out_trade_no' => $outTradeNo ?: null,
'out_trade_no' => $orderNo ?: null,
'nonce_str' => PaymentUtil::generateNonceStr(),
'sign_type' => 'MD5',
];
@@ -310,7 +287,7 @@ class PaymentService
// 过滤空值后签名
$secret = Env::get('payment.key');
if (empty($secret)) {
return json(['code' => 500, 'msg' => '支付密钥未配置']);
return json_encode(['code' => 500, 'msg' => '支付密钥未配置']);
}
$filtered = [];
@@ -322,7 +299,7 @@ class PaymentService
$url = Env::get('payment.url');
if (empty($url)) {
return json(['code' => 500, 'msg' => '支付网关地址未配置']);
return json_encode(['code' => 500, 'msg' => '支付网关地址未配置']);
}
// 请求网关
@@ -331,57 +308,119 @@ class PaymentService
$parsed = $this->parseXmlOrRaw($response);
if (!is_array($parsed)) {
return json(['code' => 500, 'msg' => '响应解析失败', 'data' => $response]);
return json_encode(['code' => 500, 'msg' => '响应解析失败', 'data' => $response]);
}
if (($parsed['status'] ?? '') !== '0') {
return json(['code' => 500, 'msg' => '通信失败' . ($parsed['message'] ?? 'unknown')]);
if ($parsed['status'] != 0) {
return json_encode(['code' => 500, 'msg' => '通信失败']);
}
if (($parsed['result_code'] ?? '') !== '0') {
return json(['code' => 200, 'msg' => '业务失败', 'data' => [
'err_code' => $parsed['err_code'] ?? '',
'err_msg' => $parsed['err_msg'] ?? '',
]]);
}
$tradeState = $parsed['trade_state'] ?? '';
$resp = [
'trade_state' => $tradeState,
'trade_state_desc' => $parsed['trade_state_desc'] ?? '',
'transaction_id' => $parsed['transaction_id'] ?? '',
'out_trade_no' => $parsed['out_trade_no'] ?? $outTradeNo,
'total_fee' => isset($parsed['total_fee']) ? (int)$parsed['total_fee'] : null,
'time_end' => $parsed['time_end'] ?? '',
'buyer_logon_id' => $parsed['buyer_logon_id'] ?? '',
'bank_type' => $parsed['bank_type'] ?? '',
];
if ($parsed['result_code'] == 0) {
$order = Order::where('orderNo', $orderNo)->lock(true)->find();
if (empty($order)) {
return json_encode(['code' => 500, 'msg' => '订单不存在']);
}
// 若已支付,同步本地订单
if ($tradeState === 'SUCCESS' && ($resp['out_trade_no'] ?? '') !== '') {
Db::startTrans();
try {
/** @var Order|null $order */
if ($order['status'] == 1) {
return json_encode(['code' => 200, 'msg' => '支付成功']);
}
$tradeState = $parsed['trade_state'] ?? '';
$resp = [
'trade_state' => $tradeState,
'trade_state_desc' => $parsed['trade_state_desc'] ?? '',
'transaction_id' => $parsed['transaction_id'] ?? '',
'out_trade_no' => $parsed['out_trade_no'] ?? $orderNo,
'total_fee' => isset($parsed['total_fee']) ? (int)$parsed['total_fee'] : null,
'time_end' => $parsed['time_end'] ?? '',
'buyer_logon_id' => $parsed['buyer_logon_id'] ?? '',
'bank_type' => $parsed['bank_type'] ?? '',
];
// 若已支付,同步本地订单
if ($tradeState == 'SUCCESS') {
Db::startTrans();
try {
/** @var Order|null $order */
$order = Order::where('orderNo', $resp['out_trade_no'])->lock(true)->find();
if ($order) {
$paidAt = $this->parsePayTime($resp['time_end'] ?? '') ?: time();
if ($order['status'] != 1) {
$order->save([
'status' => 1,
'transactionId' => $resp['transaction_id'] ?? '',
'payTime' => $paidAt,
'updateTime' => time(),
]);
}
}
//订单处理
$this->processOrder($order);
Db::commit();
return json_encode(['code' => 200, 'msg' => '支付成功'] );
} catch (\Exception $e) {
Db::rollback();
return json_encode(['code' => 500, 'msg' => '付款失败' . $e->getMessage()]);
}
}else{
$order = Order::where('orderNo', $resp['out_trade_no'])->lock(true)->find();
if ($order) {
$paidAt = $this->parsePayTime($resp['time_end'] ?? '') ?: time();
if ((int)$order['status'] !== 1) {
$order->save([
'status' => 1,
'transactionId' => $resp['transaction_id'] ?? '',
'payTime' => $paidAt,
'updateTime' => time(),
]);
}
$order->status = 3;
$order->payInfo = $resp['trade_state_desc'] ?? '';
$order->save();
}
Db::commit();
} catch (\Throwable $e) {
Db::rollback();
Log::error('[SwiftPass][query] update order exception: ' . $e->getMessage());
return json_encode(['code' => 500, 'msg' => '支付失败', 'data' => $resp]);
}
}else{
return json_encode(['code' => 500, 'msg' => '通信失败']);
}
}
public function processOrder($order = [])
{
if (empty($order)) {
return false;
}
return json(['code' => 200, 'msg' => '查询成功', 'data' => $resp]);
}
}
switch ($order['orderType']) {
case 1:
// 处理购买算力
$token = TokensCompany::where(['companyId' => $order->companyId])->find();
$goodsSpecs = json_decode($order->goodsSpecs, true);
if (!empty($token)) {
$token->tokens = $token->tokens + $goodsSpecs['tokens'];
$token->updateTime = time();
$token->save();
$newTokens = $token->tokens;
} else {
$tokensCompany = new TokensCompany();
$tokensCompany->companyId = $order->companyId;
$tokensCompany->tokens = $goodsSpecs['tokens'];
$tokensCompany->createTime = time();
$tokensCompany->updateTime = time();
$tokensCompany->save();
$newTokens = $tokensCompany->tokens;
}
//添加记录
$record = new TokensRecord();
$record->companyId = $order->companyId;
$record->userId = $order->userId;
$record->type = 1;
$record->form = 5;
$record->wechatAccountId = 0;
$record->friendIdOrGroupId = 0;
$record->remarks = '购买算力【'.$goodsSpecs['name'].'】';
$record->tokens = $goodsSpecs['tokens'];
$record->balanceTokens = $newTokens;
$record->createTime = time();
$record->save();
break;
}
return true;
}
}