AbstractPayment.php 1.7 KB

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