* Version: 2020-12-06. */ namespace App\Http\Controllers\Gateway; use Auth; use Http; use Illuminate\Http\JsonResponse; use Log; use Response; class PayBeaver extends AbstractPayment { private $appId; private $appSecret; private $url = 'https://api.citipay.net/api/v1/developer'; public function __construct() { $this->appId = sysConfig('paybeaver_app_id'); $this->appSecret = sysConfig('paybeaver_app_secret'); } public function purchase($request): JsonResponse { $payment = $this->creatNewPayment(Auth::id(), $request->input('id'), $request->input('amount')); $result = $this->createOrder($payment); //Log::alert('$this->createOrder【海狸支付】创建订单错误:'.var_export($result, true)); if (isset($result['message'])) { // Log::alert('【海狸支付】创建订单错误:'.$result['message']); return Response::json(['status' => 'fail', 'message' => '创建订单失败:'.$result['message']]); } if (! isset($result['data']['pay_url'])) { // Log::alert('【海狸支付】创建订单错误:未获取到支付链接'.var_export($result, true)); return Response::json(['status' => 'fail', 'message' => '创建订单失败:未知错误']); } $payment->update(['url' => $result['data']['pay_url']]); return Response::json(['status' => 'success', 'url' => $result['data']['pay_url'], 'message' => '创建订单成功!']); } private function post($data) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $this->url . '/v1/gateway/fetch'); curl_setopt($curl, CURLOPT_HEADER, 0); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); $data = curl_exec($curl); curl_close($curl); return $data; } private function createOrder($payment) { $params = [ 'out_trade_no' => $payment->trade_no, 'total_amount' => $payment->amount * 100, 'notify_url' => route('payment.notify', ['method' => 'paybeaver']), 'return_url' => route('invoice'), ]; $params['app_id'] = $this->appId; ksort($params); $str = http_build_query($params) . $this->appSecret; $params['sign'] = md5($str); $response = $this->post(http_build_query($params)); Log::info('【海狸支付】订单放回结果:'.var_export($response, true)); $response = json_decode($response,true); if (!isset($response['data'])) { Log::info('【海狸支付】创建订单失败:'.var_export(['code' => -1, 'msg' => '支付网关处理失败'], true)); return ['status' => 'fail', 'message' => '获取失败!请检查配置信息']; } return $response; } private function sign($params) { // if (isset($params['sign'])) { // unset($params['sign']); // } ksort($params); return md5(http_build_query($params).$this->appSecret); } public function notify($request): void { Log::info('【海狸支付】回调接口:'.var_export($request->all(), true)); if (! $this->paybeaverVerify($request->post())) { exit(json_encode(['status' => 400])); } if ($request->has(['out_trade_no']) && $this->paymentReceived($request->input(['out_trade_no'])) ) { $this->addPamentCallback($request->input('out_trade_no'),$request->input('trade_no'),$request->input('money')); Log::info('【海狸支付】paymentReceived:'.var_export($request->all(), true)); exit(json_encode(['status' => 200])); } exit(json_encode(['status' => 500])); } private function paybeaverVerify($params) { $sign = $params['sign']; unset($params['sign']); ksort($params); reset($params); $str = http_build_query($params) . $this->appSecret; return $sign === md5($str); //return hash_equals($params['sign'], $this->sign($params)); } }