'http://www.shanyecaozf.com/gateway/Pay/pay.html', 'debug' => 1,//调试 'logDir' => to_linux_path(storage_path() . '/logs/'), 'mch_id' => $this->pay_gateway['app_id'], //客户交易者账号 'token' => $this->pay_gateway['app_key'], 'interface' => $this->pay_gateway['mch_id'], 'return_url' => action('Pay\PayController@returnNotify', ['type' => $type]), 'notify_url' => action('Pay\PayController@notify', ['type' => $type]), ]; $this->pay_config = $config; // $citpay = Sanyecaopay::make($config); // $this->pay_model = $citpay; } //统一下单支付 public function pay($pay_data) { $array = [ // 在citpay平台中获取 "orderNo" => $pay_data['out_trade_no'],//订单号 "orderCurrency" => "CNY",//订单币种,固定值:USDT或CNY "orderAmount" => $pay_data['total_amount'],//金额 ]; $res = $this->orderBuy($array); $res=is_array($res)?$res:json_decode($res,256); if (isset($res['status'])) { if ($res['status'] == 1) { $url = $res['data']['payurl']; return redirect()->away($url);//跳转支付 } else { return $res; // return self::addError(['msg' => $res['message']]); } } else { return ['status'=>0,'message'=>'未知错误','data']; // return self::addError(['msg' => '未知错误']); } } /** 统一下单 * @param $pay_data * @return mixed */ private function orderBuy($pay_data){ //商户号 $accountId = $this->pay_gateway['app_id']; //商户秘钥 $key = $this->pay_gateway['app_key']; $payData = [ 'accountId' => $accountId,//商户 'payType' => '1',//支付类型 'orderId' => $pay_data['orderNo'],//订单号 'commodity' => '商品' . mt_rand(100000, 999999), //商品名称 //接口参数---其他支付接口参数请查看接口文档 'interface' => $this->pay_gateway['mch_id'],//对应的三方通道 'amount' => $pay_data['orderAmount'], //订单金额(元) 'requestIp' => request()->getClientIp(), //用户请求ip 'notifyUrl' => $this->pay_config['notify_url'],// //异步回调地址 ]; $sign=$this->md5Verify('create',$payData,$key);//签名 $payData['sign'] = $sign; $this->debugLog('下单接口请求内容'.json_encode($payData,true), []); $req = Curl::to($this->pay_config['url'])->withData($payData)->post(); $this->debugLog('下单接口返回' . is_array($req) ? json_encode($req, true) : json_encode(json_decode($req, 256), true)); return $req; } /** * 检查订单 * @param $order * @return bool|string */ private function checkOrder($order){ $url = 'http://www.shanyecaozf.com/gateway/Pay/order_query.html'; $payData['accountId'] = $this->pay_gateway['app_id']; $payData['orderId'] = $order['orderNo']; $key = $this->pay_gateway['app_key']; $sign = $this->md5Verify('create',$payData, $key); $payData['sign'] = $sign; $res = Curl::to($url)->withData($payData)->post(); $res = is_array($res) ? $res : json_decode($res, 256); if ($res['status'] == 1) { if ($res['data']['trade_status'] == 200 && $res['data']['out_trade_no']==$order['orderNo']) { return true; } } return false; } //统一验证签名 public function verify() { $para = $this->result_data; // $para['total_amount'] = $this->order['order_money'];//订单金额必须跟支付金额一致 $sign = $para['sign']; unset($para['sign']); $token = $this->pay_gateway['app_key']; $md5sign = $this->md5Verify('check', $para, $token); if ($md5sign == $sign) { return true; } else { return false; } } //返回给支付商的成功 public function success() { echo 'success'; } //统一回调处理 /** * 回调第一部,如果是同步,直接回传 * @param $return * @param $pay_type * @param $request * @return bool|\Illuminate\Http\RedirectResponse */ public function notify($return, $pay_type, $request) { $this->setLogName($pay_type); $this->debugLog('回调原始数据', $request->all()); $this->pay_type = $pay_type; $this->request = $request; //取得订单,是否有此订单,如果没有直接返回空 $order_sn = $request->input('out_trade_no'); //取得订单 $this->getOrder($order_sn); $return = ($return) ? 1 : 0; if ($return) { //判断是否是商户id if ($this->order->merchant_id == 0) { return redirect()->route('web.user.index'); } // return $this->merchantReturnSend(); } /* $this->order = Order::where('order_sn', $order_sn)->first(); if(empty($this->order)) { return false; }*/ //取得通道id $this->gateway = $this->pay_gateway = config('gateway.config')[$this->gateway_id]; //dd($this->gateway); //取得支付配置 $this->payConfig($this->pay_type); $this->result_data = $request->all(); //dump($this->result_data); //进行验证签名 if (!$this->verify()) { $this->debugLog('签名验证失败'); return false; } return $this->payNotify(); } /** * 同步回调 * @return \Illuminate\Http\RedirectResponse */ public function returnPay() { //判断是否是商户id if ($this->order->merchant_id == 0) { return redirect()->route('web.user.index'); } // return $this->merchantReturnSend(); } //异步回调 /** * 获得通道信息,取得支付配置模型,验证签名, * @return bool|void */ private function payNotify() { //取得通道信息内容 //判断有没支付成功先,没有的话,直接就没有下一步了 $pay_status = $this->result_data['trade_status']; //dd($this->result_data); if ($pay_status != 200) { $this->debugLog('sanyecao订单支付失败', $this->request->all()); return false; } $data = $this->result_data; $this->pay_data = $this->result_data; //如果应答状态不是01/A6表示支付失败 $this->debugLog(json_encode($data,true)); $this->debugLog('-------------' . $this->order->order_sn . '--选择----' . $this->pay_type . '----' . $this->pay_method . '----开始回调处理-------------------------'); if (empty($data)) { return $this->debugLog('验证签名失败', $data); } try { $pay_cn_name = ''; //统一格式化 $this->unionHandle($data); $chorder = $this->checkOrder(['orderNo' => $data['out_trade_no']]); //检查下订单 if ($chorder) { //支付返回信息 $this->pay_data = $data; $this->debugLog('验证签名成功,数据', $data); //更新订单 $this->updateOrder(); $this->debugLog('updateOrder Ok'); } } catch (\Exception $exception) { $this->debugLog('失败异常内容:' . $exception->getMessage()); if (!in_array($data['respCode'], ['00', 'A6'])) { $this->debugLog('订单支付失败', $this->request->all()); return false;//支付失败 } $this->order->notify_status = 1;//支付回调成功 $this->order->pay_status = 1;//支付状态 $this->order->pay_ok_at = date('Y-m-d H:i:s'); $this->order->save();//保存 Log::channel('pay_success')->info($pay_cn_name . '支付成功,但处理订单失败', ['data' => json_encode($data)]); } } /** * 统一格式化 */ public function unionHandle($data) { $result = [ 'order_sn' => $data['out_trade_no'], 'pay_order_sn' => $data['out_trade_no'], 'pay_money' => $data['total_amount'], 'pay_type' => 'sanyecao_alipay', 'account' => '' ]; $this->setResult($result); Log::channel('pay_success')->info('citpay支付成功', [ 'pay_type' => $result['pay_type'], 'pay_money' => $result['pay_money'], 'account' => $result['account'], 'order_sn' => $result['order_sn'], 'pay_order_sn' => $result['pay_order_sn']]); } /** * 这个调试需要配置在config/logging.php * @param $pay_type */ public function setLogName($pay_type) { $name = ''; switch ($pay_type) { case 'usdtpay': $name = 'usdtpay_'; case 'sanyecaopay': $name='sanyecaopay_'; break; } $this->log_name = $name; } }