F2Fpay.php 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. <?php
  2. namespace App\Utils\Payments;
  3. use App\Services\PaymentService;
  4. use App\Utils\Library\AlipayF2F;
  5. use App\Utils\Library\Templates\Gateway;
  6. use Auth;
  7. use Exception;
  8. use Illuminate\Http\JsonResponse;
  9. use Illuminate\Http\Request;
  10. use Log;
  11. use Response;
  12. class F2Fpay extends PaymentService implements Gateway
  13. {
  14. private static array $aliConfig;
  15. public function __construct()
  16. {
  17. self::$aliConfig = [
  18. 'app_id' => sysConfig('f2fpay_app_id'),
  19. 'ali_public_key' => sysConfig('f2fpay_public_key'),
  20. 'rsa_private_key' => sysConfig('f2fpay_private_key'),
  21. 'notify_url' => route('payment.notify', ['method' => 'f2fpay']),
  22. ];
  23. }
  24. public function purchase(Request $request): JsonResponse
  25. {
  26. $payment = $this->createPayment(Auth::id(), $request->input('id'), $request->input('amount'));
  27. $data = [
  28. 'subject' => sysConfig('subject_name') ?: sysConfig('website_name'),
  29. 'out_trade_no' => $payment->trade_no,
  30. 'total_amount' => $payment->amount,
  31. ];
  32. try {
  33. $gateWay = new AlipayF2F(self::$aliConfig);
  34. $result = $gateWay->qrCharge($data);
  35. $payment->update(['qr_code' => 1, 'url' => $result['qr_code']]);
  36. } catch (Exception $e) {
  37. $payment->failed();
  38. Log::alert('【支付宝当面付】支付错误: '.$e->getMessage());
  39. exit;
  40. }
  41. return Response::json(['status' => 'success', 'data' => $payment->trade_no, 'message' => '创建订单成功!']);
  42. }
  43. public function notify(Request $request): void
  44. {
  45. try {
  46. $result = (new AlipayF2F(self::$aliConfig))->tradeQuery($request->only('out_trade_no', 'trade_no'));
  47. Log::notice('【支付宝当面付】回调验证查询:'.var_export($result, true));
  48. } catch (Exception $e) {
  49. Log::alert('【支付宝当面付】回调信息错误: '.$e->getMessage());
  50. exit;
  51. }
  52. if ($result['code'] === '10000' && $result['msg'] === 'Success') {
  53. if ($request->has('out_trade_no') && in_array($request->input('trade_status'), ['TRADE_FINISHED', 'TRADE_SUCCESS'])) {
  54. if ($this->paymentReceived($request->input('out_trade_no'))) {
  55. exit('success');
  56. }
  57. } else {
  58. Log::error('【支付宝当面付】交易失败:'.var_export($request->all(), true));
  59. }
  60. } else {
  61. Log::error('【支付宝当面付】验证失败:'.var_export($result, true));
  62. }
  63. // 返回验证结果
  64. exit('fail');
  65. }
  66. }