AbstractPayment.php 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. <?php
  2. namespace App\Http\Controllers\Gateway;
  3. use App\Models\Payment;
  4. use App\Models\PaymentCallback;
  5. use App\Notifications\PaymentReceived;
  6. use Illuminate\Http\JsonResponse;
  7. use Illuminate\Http\Request;
  8. use Str;
  9. abstract class AbstractPayment
  10. {
  11. abstract public function purchase(Request $request): JsonResponse;
  12. abstract public function notify(Request $request): void;
  13. protected function creatNewPayment($uid, $oid, $amount): Payment
  14. {
  15. $payment = new Payment();
  16. $payment->trade_no = Str::random(8);
  17. $payment->user_id = $uid;
  18. $payment->order_id = $oid;
  19. $payment->amount = $amount;
  20. $payment->save();
  21. return $payment;
  22. }
  23. /**
  24. * @param string $trade_no 本地订单号
  25. * @param string $out_trade_no 外部订单号
  26. * @param string $amount 交易金额
  27. *
  28. * @return int
  29. */
  30. protected function addPamentCallback(string $trade_no, string $out_trade_no,$amount = ""): int
  31. {
  32. $payment = Payment::whereTradeNo($trade_no)->with('order')->first();
  33. if ($payment) {
  34. $log = new PaymentCallback();
  35. $log->trade_no = $payment->order->sn;
  36. $log->out_trade_no = $out_trade_no;
  37. $log->amount = $amount == "" ? (string)$payment->order->amount : $amount;
  38. return $log->save();
  39. }
  40. return -1;
  41. }
  42. // MD5验签
  43. protected function verify($data, $key, $signature, $filter = true): bool
  44. {
  45. return hash_equals($this->aliStyleSign($data, $key, $filter), $signature);
  46. }
  47. /**
  48. * Alipay式数据MD5签名.
  49. *
  50. * @param array $data 需要加密的数组
  51. * @param string $key 尾部的密钥
  52. * @param bool $filter 是否清理空值
  53. *
  54. * @return string md5加密后的数据
  55. */
  56. protected function aliStyleSign(array $data, string $key, $filter = true): string
  57. {
  58. // 剃离sign,sign_type,空值
  59. unset($data['sign'], $data['sign_type']);
  60. if ($filter) {
  61. $data = array_filter($data);
  62. }
  63. // 排序
  64. ksort($data, SORT_STRING);
  65. reset($data);
  66. return md5(urldecode(http_build_query($data)).$key);
  67. }
  68. protected function paymentReceived(string $tradeNo)
  69. {
  70. $payment = Payment::whereTradeNo($tradeNo)->with('order')->first();
  71. if ($payment) {
  72. $ret = $payment->order->complete();
  73. if ($ret) {
  74. $payment->user->notify(new PaymentReceived($payment->order->sn, $payment->amount));
  75. }
  76. return $ret;
  77. }
  78. return false;
  79. }
  80. }