291 lines
8.4 KiB
PHP
291 lines
8.4 KiB
PHP
<?php
|
||
|
||
namespace App\ServicePay;
|
||
|
||
use App\Models\Merchant;
|
||
use App\Models\Message;
|
||
use App\Models\Order;
|
||
use App\ServicePay\TransCard\ExampleCard;
|
||
use App\ServicePay\TransCard\GetTransInfo;
|
||
use Illuminate\Support\Facades\Log;
|
||
|
||
class GuMaPayServices implements PayApiInterface
|
||
{
|
||
|
||
use PayTrait;
|
||
public $gateway_list;//当前类型的支付通道列表
|
||
public $pay_type;//支付类型
|
||
public $pay_method;//支付方法
|
||
public $pay_gateway;//当前的支付通道实例
|
||
public $pay_config;//这个通道的支付配置信息
|
||
public $pay_model;//支付接口实例模型
|
||
public $order;
|
||
public $request;
|
||
public $gateway_id;
|
||
public $pay_data;
|
||
public $log_name;
|
||
public static $result;
|
||
public $timeOut=15;
|
||
|
||
//支付第一步:getGateway
|
||
//第二payConfig
|
||
//3:pay
|
||
|
||
/**
|
||
* 检查通道是否存在错误
|
||
*/
|
||
public function checkGatewayConfig()
|
||
{
|
||
$pay_method = $this->pay_method;
|
||
if (count($this->gateway_list) <= 0) {
|
||
self::addError(['msg' => '通道支付不存在']);
|
||
}
|
||
if (!isset($this->gateway_list[$pay_method])) {
|
||
self::addError(['msg' => '通道支付类型不存在']);
|
||
}
|
||
|
||
}
|
||
|
||
/**
|
||
* 支付包配置实列化
|
||
* @param $type
|
||
* @param array $setConfig
|
||
* @return $this
|
||
*/
|
||
public function payConfig($type, $setConfig = [])
|
||
{
|
||
|
||
$this->pay_config = [
|
||
'username'=>$this->gateway['username'],
|
||
'source'=>$this->gateway['source'],
|
||
'url'=>$this->gateway['url'],
|
||
'app_id'=>$this->pay_gateway['app_id'],
|
||
'mch_id'=>$this->gateway['mch_id'],//收款 银行卡号
|
||
'token' => $this->pay_gateway['app_key'],//密钥
|
||
];
|
||
$this->pay_model=$this->pay_config;
|
||
return $this;
|
||
}
|
||
|
||
//回调指定通道配置信息gateway
|
||
public function getConfig($gateway_id, $pay_method)
|
||
{
|
||
$this->pay_method = $pay_method;
|
||
return $this->pay_model = config('gateway.config')[$gateway_id];
|
||
}
|
||
|
||
public function getPayConfig()
|
||
{
|
||
return $this->pay_config;
|
||
}
|
||
|
||
|
||
public function pay($pay_data)
|
||
{
|
||
|
||
//订单开始时间,倒计时
|
||
$time_only = ((strtotime($this->order->created_at) + $this->timeOut * 60) - time());
|
||
|
||
|
||
$config=config('adconfig.pay_type');
|
||
|
||
$data = [
|
||
'gateway'=>$this->pay_gateway,
|
||
'title' => $config[$this->order->pay_type],
|
||
'pay_name' => $config[$this->order->pay_type],
|
||
'bank' => $this->pay_gateway,
|
||
'order' => $this->order,
|
||
'pay_type' => $this->order->pay_type,
|
||
'is_mobile' => is_mobile_client(),
|
||
'pay_status' => $this->order->pay_status == 1 ? '已支付' : '等待支付',
|
||
'only_time' =>$time_only
|
||
];
|
||
|
||
|
||
|
||
return view('web.order.code', $data);
|
||
|
||
|
||
}
|
||
|
||
/*
|
||
* 验证签名
|
||
*/
|
||
public function verify()
|
||
{
|
||
$params = $this->result_data;
|
||
|
||
$allData = $this->request->all();
|
||
if (isset($allData['token'])) {
|
||
if ($this->pay_config['app_id'] == $allData['token']) {
|
||
return true;
|
||
} else {
|
||
return false;
|
||
}
|
||
} else {
|
||
return false;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
public function setLogName($pay_type)
|
||
{
|
||
$name = '';
|
||
switch ($pay_type) {
|
||
case 'alipay':
|
||
$name = 'alipay_';
|
||
break;
|
||
case 'weixin':
|
||
$name = 'weixin_';
|
||
break;
|
||
|
||
}
|
||
$this->log_name = $name;
|
||
}
|
||
|
||
/**
|
||
* 取得订单,需要分开处理
|
||
* @param $ewm_account
|
||
* @return false|void
|
||
*/
|
||
private function getOrder($ewm_account,$order_money)
|
||
{
|
||
$order_money = number_format($order_money, 2, ',', '');
|
||
//查找未支付的订单
|
||
$this->order = Order::where('ewm_account', $ewm_account)->where('order_money', $order_money)
|
||
->whereIn('status', [0,2])->first();
|
||
//订单不存在返回空
|
||
if (empty($this->order)) {
|
||
$this->debugLog('订单不存在:' . $ewm_account);
|
||
return false;
|
||
}
|
||
$this->pay_method = $this->order->gateway_method;//支付方法
|
||
$this->gateway_id = $this->order->gateway_id;//通道ID
|
||
$this->merchant = Merchant::find($this->order->merchant_id);
|
||
}
|
||
|
||
public function notify($return, $pay_type, $request)
|
||
{
|
||
$allData = $request->all();
|
||
$this->setLogName($pay_type);
|
||
$this->debugLog('回调原始数据', $allData);
|
||
(new Message())->addMsg($allData);
|
||
$card = new ExampleCard();
|
||
$card->message($allData['content']);
|
||
$getTrans = new GetTransInfo($card);
|
||
$requestArr = $getTrans->getInfo();
|
||
if (!is_array($requestArr)) {
|
||
$this->debugLog('参数异常');
|
||
return '参数异常';
|
||
}
|
||
|
||
$this->pay_type = $pay_type;
|
||
$this->request = $request;
|
||
//取得订单,是否有此订单,如果没有直接返回空
|
||
$ewm_account = $requestArr['from_card'];
|
||
//order_money
|
||
//取得订单
|
||
$this->getOrder($ewm_account, $requestArr['pay_money']);
|
||
if (empty($this->order)) {
|
||
return '订单不存在';
|
||
}
|
||
|
||
$return = ($return) ? 1 : 0;
|
||
if ($return) {
|
||
|
||
//判断是否是商户id
|
||
if ($this->order->merchant_id == 0) {
|
||
return redirect()->route('web.user.index');
|
||
}
|
||
//
|
||
return $this->merchantReturnSend();
|
||
}
|
||
//取得通道id
|
||
$this->gateway = $this->pay_gateway = config('gateway.config')[$this->gateway_id];
|
||
|
||
//取得支付配置
|
||
$this->payConfig($this->pay_type);
|
||
|
||
$this->result_data = $requestArr;
|
||
$this->result_data['order_sn'] = $this->order->order_sn;
|
||
//进行验证签名
|
||
if (!$this->verify()) {
|
||
$this->debugLog('签名以及支付状态验证失败');
|
||
return '签名以及支付状态验证失败';
|
||
}
|
||
|
||
return $this->payNotify();
|
||
|
||
}
|
||
|
||
/**
|
||
* 获得通道信息,取得支付配置模型,验证签名,
|
||
* @return bool|void
|
||
*/
|
||
private function payNotify()
|
||
{
|
||
//取得通道信息内容
|
||
$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);
|
||
//支付返回信息
|
||
$this->pay_data = $data;
|
||
$this->debugLog('验证签名成功,数据', $data);
|
||
//更新订单
|
||
$this->updateOrder();
|
||
$this->debugLog('updateOrder Ok');
|
||
|
||
} catch (\Exception $exception) {
|
||
$this->debugLog('失败异常内容:' . json_encode($exception->getTrace()));
|
||
$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)]);
|
||
|
||
}
|
||
|
||
}
|
||
|
||
/**
|
||
* 统一格式化
|
||
*/
|
||
private function unionHandle($data)
|
||
{
|
||
$result = [
|
||
'order_sn' => $data['order_sn'],//我方订单号
|
||
'pay_order_sn' => $data['order_number'],//三方的订单号
|
||
'pay_money' => $data['pay_money'], //支付金额,
|
||
'money' => $data['pay_money'],
|
||
'pay_type' => $this->pay_type,
|
||
'account' => ''
|
||
];
|
||
|
||
$this->setResult($result);
|
||
Log::channel('pay_success')->info('支付成功', [
|
||
'pay_type' => $result['pay_type'], 'pay_money' => $result['pay_money'],
|
||
'account' => $result['account'],
|
||
'pay_order_sn' => $result['pay_order_sn']]);
|
||
|
||
}
|
||
|
||
public function success()
|
||
{
|
||
echo 'success';
|
||
exit;
|
||
}
|
||
|
||
|
||
} |