You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

122 lines
3.8 KiB

<?php
/**
* 本回调用不到 20200826
*/
namespace App\Controller;
use App\Constants\LogLabel;
use App\Model\OrderMain;
use App\Service\OrderServiceInterface;
use App\Service\FinancialRecordServiceInterface;
use EasyWeChat\Factory;
use Hyperf\Guzzle\CoroutineHandler;
use Hyperf\Di\Annotation\Inject;
use Hyperf\HttpMessage\Stream\SwooleStream;
use Symfony\Component\HttpFoundation\Request;
use App\Service\PurchaseLimitServiceInterface;
use Hyperf\DbConnection\Db;
class NotifyPayRefundController extends BaseController
{
const AWARD_LIMIT_AMOUNT = 3;
/**
* @Inject
* @var FinancialRecordServiceInterface
*/
protected $financialService;
/**
* @Inject
* @var OrderServiceInterface
*/
protected $orderService;
/**
* @Inject
* @var PurchaseLimitServiceInterface
*/
protected $purchaseLimitService;
/**
* 微信退款回调
*/
public function wxPayRefund()
{
$this->log->event(
LogLabel::WX_NOTIFY_REFUND,
'进入回调'
);
$config = config('wxpay');
$app = Factory::payment($config);
$app['guzzle_handler'] = CoroutineHandler::class;
$get = $this->request->getQueryParams();
$post = $this->request->getParsedBody();
$cookie = $this->request->getCookieParams();
$files = $this->request->getUploadedFiles();
$server = $this->request->getServerParams();
$xml = $this->request->getBody()->getContents();
$app['request'] = new Request($get,$post,[],$cookie,$files,$server,$xml);
/* 通知回调,进行业务处理 */
$response = $app->handleRefundedNotify(function ($message, $fail) use ($app) {
$this->log->event(
LogLabel::WX_NOTIFY_REFUND,
$message
);
try {
/* --- 退款失败 --- */
if (
empty($message)
|| !isset($message['result_code'])
|| $message['result_code'] != 'SUCCESS'
) {
// 错误日志
$this->log->event(
LogLabel::WX_NOTIFY_REFUND,
$message
);
$fail('Unknown error but FAIL');
return false;
}
/* --- 退款成功 --- */
$orderMain = OrderMain::select('id','global_order_id','money','user_id')
->where('global_order_id',$message['out_trade_no'])
->where('state',OrderMain::ORDER_STATE_REFUNDED)
->where(Db::raw('refund_time is null'))
->first();
if(!empty($orderMain)){
// 添加退款时间
$orderMain->refund_time = time();
$orderMain->save();
// 退款返还优惠券
$this->couponService->orderRefundCoupons($orderMain->global_order_id);
// 删除特价商品缓存
$this->purchaseLimitService->delSsdbPurchaseRecord($orderMain->id);
// 添加用户的流水
$this->financialService->userByOLOrderRefund($orderMain->user_id, $orderMain->global_order_id, $orderMain->money);
}
} catch (\Exception $e) {
$this->log->event(
LogLabel::WX_NOTIFY_REFUND,
['exception_fail' => $e->getMessage()]
);
$fail('Exception');
}
});
return $this->response
->withHeader('Content-Type', 'text/xml')
->withStatus(200)
->withBody(new SwooleStream($response->getContent()));
}
}