AbstractPayment.php 1.8 KB

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