PayBeaver.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. <?php
  2. /**
  3. * Created by PayBeaver <merchant.paybeaver.com>
  4. * Version: 2020-12-06.
  5. */
  6. namespace App\Http\Controllers\Gateway;
  7. use Auth;
  8. use Http;
  9. use Illuminate\Http\JsonResponse;
  10. use Log;
  11. use Response;
  12. class PayBeaver extends AbstractPayment
  13. {
  14. private $appId;
  15. private $appSecret;
  16. private $url = 'https://api.citipay.net/api/v1/developer';
  17. public function __construct()
  18. {
  19. $this->appId = sysConfig('paybeaver_app_id');
  20. $this->appSecret = sysConfig('paybeaver_app_secret');
  21. }
  22. public function purchase($request): JsonResponse
  23. {
  24. $payment = $this->creatNewPayment(Auth::id(), $request->input('id'), $request->input('amount'));
  25. $result = $this->createOrder($payment);
  26. //Log::alert('$this->createOrder【海狸支付】创建订单错误:'.var_export($result, true));
  27. if (isset($result['message'])) {
  28. // Log::alert('【海狸支付】创建订单错误:'.$result['message']);
  29. return Response::json(['status' => 'fail', 'message' => '创建订单失败:'.$result['message']]);
  30. }
  31. if (! isset($result['data']['pay_url'])) {
  32. // Log::alert('【海狸支付】创建订单错误:未获取到支付链接'.var_export($result, true));
  33. return Response::json(['status' => 'fail', 'message' => '创建订单失败:未知错误']);
  34. }
  35. $payment->update(['url' => $result['data']['pay_url']]);
  36. return Response::json(['status' => 'success', 'url' => $result['data']['pay_url'], 'message' => '创建订单成功!']);
  37. }
  38. private function post($data)
  39. {
  40. $curl = curl_init();
  41. curl_setopt($curl, CURLOPT_URL, $this->url . '/v1/gateway/fetch');
  42. curl_setopt($curl, CURLOPT_HEADER, 0);
  43. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  44. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  45. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
  46. curl_setopt($curl, CURLOPT_POST, 1);
  47. curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  48. $data = curl_exec($curl);
  49. curl_close($curl);
  50. return $data;
  51. }
  52. private function createOrder($payment)
  53. {
  54. $params = [
  55. 'out_trade_no' => $payment->trade_no,
  56. 'total_amount' => $payment->amount * 100,
  57. 'notify_url' => route('payment.notify', ['method' => 'paybeaver']),
  58. 'return_url' => route('invoice'),
  59. ];
  60. $params['app_id'] = $this->appId;
  61. ksort($params);
  62. $str = http_build_query($params) . $this->appSecret;
  63. $params['sign'] = md5($str);
  64. $response = $this->post(http_build_query($params));
  65. Log::info('【海狸支付】订单放回结果:'.var_export($response, true));
  66. $response = json_decode($response,true);
  67. if (!isset($response['data'])) {
  68. Log::info('【海狸支付】创建订单失败:'.var_export(['code' => -1, 'msg' => '支付网关处理失败'], true));
  69. return ['status' => 'fail', 'message' => '获取失败!请检查配置信息'];
  70. }
  71. return $response;
  72. }
  73. private function sign($params)
  74. {
  75. // if (isset($params['sign'])) {
  76. // unset($params['sign']);
  77. // }
  78. ksort($params);
  79. return md5(http_build_query($params).$this->appSecret);
  80. }
  81. public function notify($request): void
  82. {
  83. Log::info('【海狸支付】回调接口:'.var_export($request->all(), true));
  84. if (! $this->paybeaverVerify($request->post())) {
  85. exit(json_encode(['status' => 400]));
  86. }
  87. if ($request->has(['out_trade_no']) && $this->paymentReceived($request->input(['out_trade_no'])) ) {
  88. $this->addPamentCallback($request->input('out_trade_no'),$request->input('trade_no'),$request->input('money'));
  89. Log::info('【海狸支付】paymentReceived:'.var_export($request->all(), true));
  90. exit(json_encode(['status' => 200]));
  91. }
  92. exit(json_encode(['status' => 500]));
  93. }
  94. private function paybeaverVerify($params)
  95. {
  96. $sign = $params['sign'];
  97. unset($params['sign']);
  98. ksort($params);
  99. reset($params);
  100. $str = http_build_query($params) . $this->appSecret;
  101. return $sign === md5($str);
  102. //return hash_equals($params['sign'], $this->sign($params));
  103. }
  104. }