AbstractPayment.php 2.1 KB

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