支付回调优化
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user