AbstractPayment.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Services\Gateway;
  4. use App\Models\Code;
  5. use App\Models\Payback;
  6. use App\Models\Paylist;
  7. use App\Models\Setting;
  8. use App\Models\User;
  9. use Psr\Http\Message\ResponseInterface;
  10. use Ramsey\Uuid\Uuid;
  11. use Slim\Http\Response;
  12. use Slim\Http\ServerRequest;
  13. abstract class AbstractPayment
  14. {
  15. /**
  16. * @param array $args
  17. */
  18. abstract public function purchase(Request $request, Response $response, array $args): ResponseInterface;
  19. /**
  20. * @param array $args
  21. */
  22. abstract public function notify(Request $request, Response $response, array $args): ResponseInterface;
  23. /**
  24. * 支付网关的 codeName, 规则为 [0-9a-zA-Z_]*
  25. */
  26. abstract public static function _name(): string;
  27. /**
  28. * 是否启用支付网关
  29. *
  30. * TODO: 传入目前用户信, etc..
  31. */
  32. abstract public static function _enable(): bool;
  33. /**
  34. * 显示给用户的名称
  35. */
  36. abstract public static function _readableName(): string;
  37. /**
  38. * @param array $args
  39. */
  40. public function getReturnHTML(Request $request, Response $response, array $args): ResponseInterface
  41. {
  42. return $response->write('ok');
  43. }
  44. /**
  45. * @param array $args
  46. */
  47. public function getStatus(Request $request, Response $response, array $args): ResponseInterface
  48. {
  49. $p = Paylist::where('tradeno', $_POST['pid'])->first();
  50. return $response->withJson([
  51. 'ret' => 1,
  52. 'result' => $p->satatus,
  53. ]);
  54. }
  55. abstract public static function getPurchaseHTML(): string;
  56. public function postPayment($pid, $method)
  57. {
  58. $p = Paylist::where('tradeno', $pid)->first();
  59. if ($p->status === 1) {
  60. return \json_encode(['errcode' => 0]);
  61. }
  62. $p->status = 1;
  63. $p->save();
  64. $user = User::find($p->userid);
  65. $user->money += $p->total;
  66. $user->save();
  67. $codeq = new Code();
  68. $codeq->code = $method;
  69. $codeq->isused = 1;
  70. $codeq->type = -1;
  71. $codeq->number = $p->total;
  72. $codeq->usedatetime = date('Y-m-d H:i:s');
  73. $codeq->userid = $user->id;
  74. $codeq->save();
  75. // 返利
  76. if ($user->ref_by > 0 && Setting::obtain('invitation_mode') === 'after_recharge') {
  77. Payback::rebate($user->id, $p->total);
  78. }
  79. return 0;
  80. }
  81. public static function generateGuid()
  82. {
  83. return substr(Uuid::uuid4()->toString(), 0, 8);
  84. }
  85. protected static function getCallbackUrl()
  86. {
  87. return $_ENV['baseUrl'] . '/payment/notify/' . get_called_class()::_name();
  88. }
  89. protected static function getUserReturnUrl()
  90. {
  91. return $_ENV['baseUrl'] . '/user/payment/return/' . get_called_class()::_name();
  92. }
  93. protected static function getActiveGateway($key)
  94. {
  95. $payment_gateways = Setting::where('item', '=', 'payment_gateway')->first();
  96. $active_gateways = \json_decode($payment_gateways->value);
  97. if (\in_array($key, $active_gateways)) {
  98. return true;
  99. }
  100. return false;
  101. }
  102. }