diff --git a/app/Http/Controllers/Admin/StatisController.php b/app/Http/Controllers/Admin/StatisController.php
index f2367ce..be99e76 100644
--- a/app/Http/Controllers/Admin/StatisController.php
+++ b/app/Http/Controllers/Admin/StatisController.php
@@ -71,6 +71,8 @@ class StatisController extends BaseController
//提现手续费收入
$data['day_draw_fee_money'] = $draw->getSum(['statut' => 1], 'fee_money');
+ $data['total_draw_money'] = $draw->getSum(['status_in' => [1]], 'draw_money');
+
$system_commiss = new SystemCommissionStatisServices();
diff --git a/app/ServicePay/BasePay.php b/app/ServicePay/BasePay.php
new file mode 100644
index 0000000..f816d78
--- /dev/null
+++ b/app/ServicePay/BasePay.php
@@ -0,0 +1,21 @@
+ 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;
+ }
+}
\ No newline at end of file
diff --git a/app/ServicePay/DaliPayServices.php b/app/ServicePay/DaliPayServices.php
index 1c7fb04..f121a7a 100644
--- a/app/ServicePay/DaliPayServices.php
+++ b/app/ServicePay/DaliPayServices.php
@@ -62,7 +62,11 @@ class DaliPayServices implements PayApiInterface
*/
public function pay($pay_data)
{
-// echo number_format( 500, 2,'.','');exit;
+ $return = request()->all();
+ $re_type = 'html';
+ if (isset($return['re_type'])) {
+ $re_type = $return['re_type'];
+ }
//商户号
$accountId = $this->pay_config['mch_id'];
//商户秘钥
@@ -78,20 +82,36 @@ class DaliPayServices implements PayApiInterface
$sign = $this->sign($payData, $key);//签名
$payData['sign'] = $sign;
$res = Curl::to($this->pay_config['url'])->withData($payData)->post();
- $this->debugLog('下单接口请求内容' . json_encode($payData, true), []);
-
- $res = is_array($res) ? $res : json_decode($res, 256);
+ $this->debugLog('下单接口请求内容' . json_encode($payData, 256), []);
+ $res = is_array($res) ? $res : json_decode($res, true);
+ $this->debugLog('返回内容' . json_encode($res, 256), []);
if (is_array($res) && isset($res['code']) && $res['code'] == 100) {
$data = $res['data'];
$url = $data['url'];
- return redirect()->away($url);
+ return $this->returnPayRes($re_type,'',1,$url);
} else {
$msg = $res['msg'] ?? '未知错误';
- return ['code' => 0, 'msg' => $msg];
+ return $this->returnPayRes($re_type,$msg,0);
}
-
}
+ private function returnPayRes($re_type,$msg,$code,$url=''){
+ if ($code == 1) {
+ if ($re_type == 'json') {
+ return json_encode(['code' => 1, 'qrurl' => $url], 256);
+ } else {
+ return redirect()->away($url);
+ }
+ } else {
+ if ($re_type == 'json') {
+ return json_encode(['code' => 0, 'msg' => $msg], 256);
+ } else {
+ return $msg;
+ }
+ }
+ }
+
+
private function sign($tempArr, $signKey): string
{
$keyVal='';
diff --git a/app/ServicePay/KoulinghbPayServices.php b/app/ServicePay/KoulinghbPayServices.php
index 72e5c15..603e2f1 100644
--- a/app/ServicePay/KoulinghbPayServices.php
+++ b/app/ServicePay/KoulinghbPayServices.php
@@ -59,7 +59,11 @@ class KoulinghbPayServices implements PayApiInterface
*/
public function pay($pay_data)
{
-// echo number_format( 500, 2,'.','');exit;
+ $return = request()->all();
+ $re_type = 'html';
+ if (isset($return['re_type'])) {
+ $re_type = $return['re_type'];
+ }
//商户号
$accountId = $this->pay_config['mch_id'];
//商户秘钥
@@ -85,14 +89,31 @@ class KoulinghbPayServices implements PayApiInterface
$res = is_array($res) ? $res : json_decode($res, 256);
if (is_array($res) && isset($res['status']) && $res['status'] == 0) {
$url = $res['payurl'];
- return redirect()->away($url);
+ return $this->returnPayRes($re_type,'',1,$url);
} else {
$msg = $res['msg'] ?? '未知错误';
- return ['code' => 0, 'msg' => $msg];
+ $this->debugLog('错误' . $msg, []);
+ return $this->returnPayRes($re_type,$msg,0);
}
}
+ private function returnPayRes($re_type,$msg,$code,$url=''){
+ if ($code == 1) {
+ if ($re_type == 'json') {
+ return json_encode(['code' => 1,'errmsg'=>$msg, 'qrurl' => $url], 256);
+ } else {
+ return redirect()->away($url);
+ }
+ } else {
+ if ($re_type == 'json') {
+ return json_encode(['code' => 0, 'errmsg' => $msg], 256);
+ } else {
+ return $msg;
+ }
+ }
+ }
+
private function sign($tempArr, $signKey,$filter=[]): string
{
$keyVal = '';
diff --git a/app/ServicePay/PayApiProvidesTrait.php b/app/ServicePay/PayApiProvidesTrait.php
index d332382..baf33e6 100644
--- a/app/ServicePay/PayApiProvidesTrait.php
+++ b/app/ServicePay/PayApiProvidesTrait.php
@@ -61,14 +61,16 @@ trait PayApiProvidesTrait
return $this->pay_service = new RongYiServices();
case 'zhanxinpay':
return $this->pay_service = new ZhanXinPayServices();
- case 'dalipay':
+ case '1003':
return $this->pay_service = new DaliPayServices();
case 'pingguopay':
return $this->pay_service = new PingguopayServices();
- case 'koulinghbpay':
+ case '1004':
return $this->pay_service = new KoulinghbPayServices();
- case 'yihuibaopay':
+ case '1002':
return $this->pay_service = new YiHuiBaoPayServices();
+ case '1001':
+ return $this->pay_service = new ShanYePayServices();
break;
}
}
diff --git a/app/ServicePay/PayTrait.php b/app/ServicePay/PayTrait.php
index 406ced3..168044c 100644
--- a/app/ServicePay/PayTrait.php
+++ b/app/ServicePay/PayTrait.php
@@ -249,7 +249,7 @@ trait PayTrait
$ipWhite = $ipArr[$this->pay_type];
$this->debugLog('回调IP', [$ip,$ipWhite]);
if (!in_array($ip, $ipWhite)) {
- $this->debugLog('IP不合法', [$ip,$ipWhite]);
+// $this->debugLog('IP不合法', [$ip,$ipWhite]);
return false;
}
}
@@ -275,12 +275,14 @@ trait PayTrait
$pay_channel = $request->input('pay_channel');
$this->debugLog('-------------订单开始-------------');
+ $this->debugLog('appid->' . $request->input('app_id'));
$this->debugLog('支付类型->' . $pay_type);
$this->debugLog('channel->' . $pay_channel);
//选择服务类型
$this->setPayService($pay_type);
if (is_null($this->pay_service)) {
+ $this->debugLog('通道不存在或支付类型错误',$request->all());
return $this->addError(['error' => 1, 'msg' => '通道不存在或支付类型错误']);
}
$custorm_gateways = [];
diff --git a/app/ServicePay/ShanYePayServices.php b/app/ServicePay/ShanYePayServices.php
new file mode 100644
index 0000000..8017383
--- /dev/null
+++ b/app/ServicePay/ShanYePayServices.php
@@ -0,0 +1,399 @@
+ $this->getGateUrl() . '/gateway/payApiJson.asp',
+// '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;
+// }
+
+ //统一下单支付
+
+ /**
+ * @param $pay_data
+ * @return array|\Illuminate\Http\RedirectResponse
+ */
+ public function pay($pay_data)
+ {
+ $createUrl=$this->getGateUrl().'/api/pay/create_order';
+ $return = request()->all();
+ $re_type = 'html';
+ if (isset($return['re_type'])) {
+ $re_type = $return['re_type'];
+ }
+ //商户号
+ $accountId = $this->pay_config['mch_id'];
+ //商户秘钥
+ $key = $this->pay_gateway['cert_pub'];
+ $payData = [
+ 'mchId' => $accountId,//商户
+ 'appId' => $this->pay_config['token'],
+ 'productId' => $this->pay_gateway['mch_id'],//对应的三方通道
+ 'mchOrderNo' => strval($pay_data['out_trade_no']),//订单号
+ 'currency'=>'cny',
+ 'amount' => intval($pay_data['total_amount'] * 100), //支付金额为分
+ 'subject' => $pay_data['subject'], //
+ 'extra' => 'shanye', //
+ 'body' => $pay_data['subject'], //
+ 'notifyUrl' => strval($this->pay_config['notify_url']),// //异步回调地址
+ 'returnUrl' => strval($this->pay_config['return_url']),// //页面跳转通知
+ ];
+ $sign = self::md5Verify('create',$payData,$key);//签名
+ $payData['sign'] = $sign;
+// $res=$this->ddcurl($this->pay_config['url'],$pay_data,false);
+ $res = Curl::to($createUrl)->withData($payData)->post();
+ $this->debugLog('下单接口请求内容' . json_encode($payData, true), []);
+ $this->debugLog('返回内容' . json_encode($res, true), []);
+
+ $res = is_array($res) ? $res : json_decode($res, 256);
+ if (is_array($res) && isset($res['retCode']) && $res['retCode'] == 'SUCCESS') {
+ $data=$res['payParams'];
+ $url = $data['payUrl'];
+ $msg = $res['retMsg'] ?? '未知错误';
+ return $this->returnPayRes($re_type,$msg,1,$url);
+ } else {
+ $msg = $res['retMsg'] ?? '未知错误';
+ $this->debugLog('错误' . $msg, []);
+ return $this->returnPayRes($re_type,$msg,0);
+ }
+ }
+
+ private function returnPayRes($re_type,$msg,$code,$url=''){
+ if ($code == 1) {
+ if ($re_type == 'json') {
+ return json_encode(['code' => 1, 'qrurl' => $url], 256);
+ } else {
+ return redirect()->away($url);
+ }
+ } else {
+ if ($re_type == 'json') {
+ return json_encode(['code' => 0, 'msg' => $msg], 256);
+ } else {
+ return $msg;
+ }
+ }
+ }
+
+ private function sign($tempArr, $signKey,$signSortArr=[]): string
+ {
+ $keyVal = '';
+
+ if (isset($tempArr['sign'])) {
+ unset($tempArr['sign']);
+ }
+
+ $data = [];
+ foreach ($signSortArr as $key){
+ if(isset($tempArr[$key])){
+ array_push($data, "{$key}={$tempArr[$key]}");
+ }
+ }
+
+ ksort($tempArr);
+
+
+ $keyVal = implode('&', $data);
+
+ if (!empty($signKey) && is_string($signKey)) {
+ $keyVal .= $signKey;
+ }
+
+ return strtoupper(md5($keyVal));
+ }
+
+ /**
+ * 检查订单
+ * @param $orderid
+ * @return bool|string
+ */
+ private function checkOrder($orderid)
+ {
+ try {
+ $url = $this->getGateUrl() . '/api/pay/query_order';
+ $payData = [
+ 'mchId' => $this->pay_gateway['app_id'],//商户号
+ 'appId' => $this->pay_config['token'],
+ 'mchOrderNo' => $orderid,
+ ];
+ $key = $this->pay_gateway['cert_pub'];
+ $sign = self::md5Verify('create',$payData,$key);//签名
+ $payData['sign'] = $sign;
+ Log::channel('pay_order')->info('查询接口请求', $payData);
+ $responseRaw = Curl::to($url)->withData($payData)->get();
+// $responseRaw = $this->ddcurl($url, $payData, false);
+ $response = is_array($responseRaw) ? $responseRaw : json_decode($responseRaw, 256);
+// $this->debugLog('查询接口返回' . is_array($res) ? json_encode($res, true) : json_encode(json_decode($res, 256), true));
+ Log::channel('pay_order')->info('查询接口返回', $response);
+ if (is_array($response)
+ && isset($response['retCode']) && $response['retCode'] == 'SUCCESS'
+ && isset($response['status']) && $response['status'] == 2
+ && isset($response['mchOrderNo']) && $response['mchOrderNo'] == $orderid
+ ) {
+ return true;
+ }
+ return false;
+ }catch (\Exception $e){
+ Log::channel('pay_order')->info('err', $e->getMessage());
+ }
+ return false;
+ }
+
+
+ //统一验证签名
+ public function verify()
+ {
+ $params = $this->result_data;
+ $key = $this->pay_gateway['cert_pub'];
+ $sindata=[];
+ foreach ($params as $k=>$v){
+ if($v!='' && $k!='sign'){
+ $sindata[$k]=$v;
+ }
+ }
+ $sign = self::md5Verify('create',$sindata,$key);//签名
+ if (isset($params['sign']) && $sign == $params['sign']) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+
+ //返回给支付商的成功
+ public function success()
+ {
+ echo 'success';
+ exit;
+ }
+
+ //统一回调处理
+
+ /**
+ * 回调第一部,如果是同步,直接回传
+ * @param $return
+ * @param $pay_type
+ * @param $request
+ * @return bool|\Illuminate\Http\RedirectResponse
+ */
+ public function notify($return, $pay_type, $request)
+ {
+// $request = json_decode(file_get_contents('php://input'), true);
+ $allData = $request->all();
+ $this->setLogName($pay_type);
+ $this->debugLog('回调原始数据', $allData);
+ $this->pay_type = $pay_type;
+ $this->request = $request;
+ //取得订单,是否有此订单,如果没有直接返回空
+ $order_sn = $allData['mchOrderNo'];
+
+ $status = $allData['status'];
+
+ if ($status != 2) {
+ return '未支付成功';
+ }
+
+ $checkresult = $this->checkIP();//检查回调IP
+ if (!$checkresult) {
+ return 'ip 不合法';
+ }
+ //取得订单
+ $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();
+ }
+ //取得通道id
+ $this->gateway = $this->pay_gateway = config('gateway.config')[$this->gateway_id];
+ //dd($this->gateway);
+ //取得支付配置
+ $this->payConfig($this->pay_type);
+
+ $this->result_data = $allData;
+ //检查三方的订单
+ $checkorder = $this->checkOrder($order_sn);
+ if (!$checkorder) {
+ $this->debugLog('查询三方订单未支付成功');
+ return '查询三方订单未支付成功';
+ }
+ //dump($this->result_data);
+ //进行验证签名
+ if (!$this->verify()) {
+ $this->debugLog('签名以及支付状态验证失败');
+ return '签名以及支付状态验证失败';
+ }
+
+ 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()
+ {
+ //取得通道信息内容
+ $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('失败异常内容:' . $exception->getMessage());
+ $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['mchOrderNo'],//我方订单号
+ 'pay_order_sn' => $data['payOrderId'],//三方的订单号
+ 'pay_money' => number_format($data['amount'] / 100, 2, '.', ''), //支付金额,
+// 'pay_money' => $data['ordermoney'], //支付金额,
+ 'money' => number_format($data['amount'] / 100, 2, '.', ''),
+ '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['money'], 'order_sn' => $result['order_sn'],
+ 'pay_order_sn' => $result['pay_order_sn']]);
+
+ }
+
+
+ /**
+ * 这个调试需要配置在config/logging.php
+ * @param $pay_type
+ */
+ public function setLogName($pay_type)
+ {
+ $this->log_name = $pay_type;
+ }
+
+ /**
+ * 模拟post提交 json数据 请求接口
+ * @param string $url
+ * @param bool|true $https
+ * @param string $method
+ * @param string $param
+ * @return mixed
+ */
+ private function ddcurl($url = '', $param = '', $https = true, $method = 'post')
+ {
+ $param = json_encode($param, 320);
+ $ch = curl_init($url);
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+
+ #判断是否为https请求
+ if ($https === true) {
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+ curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
+ }
+ #判断是否为post请求
+ if ($method == 'post') {
+ curl_setopt($ch, CURLOPT_POST, true);
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
+ }
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
+
+ $str = curl_exec($ch);
+
+ curl_close($ch);
+ return $str;
+ }
+}
+
diff --git a/app/ServicePay/YiHuiBaoPayServices.php b/app/ServicePay/YiHuiBaoPayServices.php
index d5d84d8..2c46007 100644
--- a/app/ServicePay/YiHuiBaoPayServices.php
+++ b/app/ServicePay/YiHuiBaoPayServices.php
@@ -60,6 +60,11 @@ class YiHuiBaoPayServices implements PayApiInterface
public function pay($pay_data)
{
// echo number_format( 500, 2,'.','');exit;
+ $return = request()->all();
+ $re_type = 'html';
+ if (isset($return['re_type'])) {
+ $re_type = $return['re_type'];
+ }
//商户号
$accountId = $this->pay_config['mch_id'];
//商户秘钥
@@ -69,15 +74,15 @@ class YiHuiBaoPayServices implements PayApiInterface
'sdcustomno' => strval($pay_data['out_trade_no']),//订单号
'cardno' => $this->pay_gateway['mch_id'],//对应的三方通道
'orderamount' => intval($pay_data['total_amount'] * 100), //支付金额为分
- 'zftype'=>'casher',
- 'device'=>'mobile',
- 'ordertime'=>time(),
+ 'zftype' => 'casher',
+ 'device' => 'mobile',
+ 'ordertime' => time(),
'mark' => mt_rand(100000, 999999), //
'clientip' => request()->getClientIp(),
'noticeurl' => strval($this->pay_config['notify_url']),// //异步回调地址
'backurl' => strval($this->pay_config['return_url']),// //页面跳转通知
];
- $sign= $this->sign($payData,$key,['customerid', 'sdcustomno','orderamount','cardno','noticeurl','backurl','ordertime']);
+ $sign = $this->sign($payData, $key, ['customerid', 'sdcustomno', 'orderamount', 'cardno', 'noticeurl', 'backurl', 'ordertime']);
$payData['sign'] = $sign;
// $res=$this->ddcurl($this->pay_config['url'],$pay_data,false);
$res = Curl::to($this->pay_config['url'])->withData($payData)->post();
@@ -85,15 +90,31 @@ class YiHuiBaoPayServices implements PayApiInterface
$this->debugLog('返回内容' . json_encode($res, true), []);
$res = is_array($res) ? $res : json_decode($res, 256);
- if (is_array($res) && isset($res['state']) && $res['state'] == 1 && $res['qrurl']!='') {
+ if (is_array($res) && isset($res['state']) && $res['state'] == 1 && $res['qrurl'] != '') {
$url = $res['qrurl'];
- return redirect()->away($url);
+ $msg = $res['errmsg'] ?? '未知错误';
+ return $this->returnPayRes($re_type,$msg,1,$url);
} else {
$msg = $res['errmsg'] ?? '未知错误';
$this->debugLog('错误' . $msg, []);
- return json_encode(['code' => 0, 'msg' => $msg],256);
+ return $this->returnPayRes($re_type,$msg,0);
}
+ }
+ private function returnPayRes($re_type,$msg,$code,$url=''){
+ if ($code == 1) {
+ if ($re_type == 'json') {
+ return json_encode(['code' => 1, 'qrurl' => $url], 256);
+ } else {
+ return redirect()->away($url);
+ }
+ } else {
+ if ($re_type == 'json') {
+ return json_encode(['code' => 0, 'msg' => $msg], 256);
+ } else {
+ return $msg;
+ }
+ }
}
private function sign($tempArr, $signKey,$signSortArr=[]): string
@@ -178,7 +199,7 @@ class YiHuiBaoPayServices implements PayApiInterface
//返回给支付商的成功
public function success()
{
- echo '
0
++ + +
+tr_bank: 固码银行收款支付
++ pay_channel +
++ 产品id +
++ 否 +
++ 字符串 +
++ +
+ ++ 可传,可不传 没有明确给产品id时,不用传 +
+