阶段性提交代码
This commit is contained in:
94
app/Admin/Controllers/Unionpay/IndexController.php
Normal file
94
app/Admin/Controllers/Unionpay/IndexController.php
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Admin\Controllers\Unionpay;
|
||||||
|
|
||||||
|
use App\Admin\Actions\User\Callback;
|
||||||
|
use App\Admin\Actions\User\Profit;
|
||||||
|
use App\Admin\Actions\User\ReCode;
|
||||||
|
use App\Admin\Actions\User\RefD3Key;
|
||||||
|
use App\Admin\Exporters\UsersExport;
|
||||||
|
use App\Models\Area;
|
||||||
|
use App\Models\UnionpayLog;
|
||||||
|
use App\Models\User;
|
||||||
|
use Auth;
|
||||||
|
use Encore\Admin\Controllers\AdminController;
|
||||||
|
use Encore\Admin\Form;
|
||||||
|
use Encore\Admin\Grid;
|
||||||
|
use Encore\Admin\Widgets\Table;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use RuLong\Identity\Models\Identity;
|
||||||
|
|
||||||
|
class IndexController extends AdminController
|
||||||
|
{
|
||||||
|
|
||||||
|
protected $title = '银联操作日志';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notes:
|
||||||
|
* @Author: <C.Jason>
|
||||||
|
* @Date : 2019/9/18 14:50
|
||||||
|
* @return Grid
|
||||||
|
*/
|
||||||
|
protected function grid()
|
||||||
|
{
|
||||||
|
$grid = new Grid(new UnionpayLog);
|
||||||
|
|
||||||
|
$grid->disableActions();
|
||||||
|
|
||||||
|
$grid->model()->orderBy('id', 'desc');
|
||||||
|
|
||||||
|
$grid->filter(function ($filter) {
|
||||||
|
$filter->column(1 / 2, function ($filter) {
|
||||||
|
$filter->equal('msg_txn_code', '交易类型')->select(config('unionpay.type'));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$grid->column('id', '#ID#');
|
||||||
|
$grid->column('msg_txn_code', '交易类型')
|
||||||
|
->using(config('unionpay.type'))
|
||||||
|
->label();
|
||||||
|
|
||||||
|
$grid->column('msg_crrltn_id', '消息关联号');
|
||||||
|
$grid->column('msg_time', '报文日期');
|
||||||
|
$grid->column('mkt_code', '券码');
|
||||||
|
$grid->column('msg_sys_sn', '平台流水号');
|
||||||
|
$grid->column('req_serial_no', '查询流水号');
|
||||||
|
|
||||||
|
// $grid->column('请求参数')->display(function ($title, $column) {
|
||||||
|
// return '点击展开';
|
||||||
|
// })->modal(function ($model) {
|
||||||
|
// $in_source = $this->in_source;
|
||||||
|
// if (is_array($in_source) && count($in_source) > 1) {
|
||||||
|
// foreach ($in_source as $key => $item) {
|
||||||
|
// dump($this->id);
|
||||||
|
// $title[] = $key;
|
||||||
|
// $data[] = $item;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return new Table($title, $data);
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
|
||||||
|
$grid->column('请求参数')->display(function () {
|
||||||
|
$in_source = $this->in_source;
|
||||||
|
|
||||||
|
return $in_source;
|
||||||
|
})->hide();
|
||||||
|
|
||||||
|
$grid->column('返回信息')->display(function () {
|
||||||
|
$out_source = $this->out_source;
|
||||||
|
|
||||||
|
return $out_source;
|
||||||
|
})->hide();
|
||||||
|
|
||||||
|
$grid->column('created_at', '注册时间');
|
||||||
|
$grid->disableExport(false);
|
||||||
|
|
||||||
|
$grid->export(function ($export) {
|
||||||
|
$export->filename($this->title . date("YmdHis"));
|
||||||
|
});
|
||||||
|
|
||||||
|
return $grid;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -55,4 +55,7 @@ Route::group([
|
|||||||
$router->resource('activitycoupons', 'Activity\CouponController');
|
$router->resource('activitycoupons', 'Activity\CouponController');
|
||||||
$router->resource('activitycouponlogs', 'Activity\LogController');
|
$router->resource('activitycouponlogs', 'Activity\LogController');
|
||||||
|
|
||||||
|
//银联日志
|
||||||
|
$router->resource('unionpays', 'Unionpay\IndexController');
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,34 +2,76 @@
|
|||||||
|
|
||||||
namespace App\Api\Controllers;
|
namespace App\Api\Controllers;
|
||||||
|
|
||||||
|
use App\Exceptions\ApiException;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use XuanChen\UnionPay\UnionPay;
|
use XuanChen\UnionPay\UnionPay;
|
||||||
use Response;
|
|
||||||
|
|
||||||
class UnionPayController extends Controller
|
class UnionPayController extends Controller
|
||||||
{
|
{
|
||||||
|
|
||||||
public function index()
|
public function index(Request $request)
|
||||||
{
|
{
|
||||||
$user_ext_info = [
|
|
||||||
'mobile_no' => '15663876870',
|
|
||||||
'user_code' => '1',
|
|
||||||
'user_code_type' => '8521475DDDeeee',
|
|
||||||
'dev_id' => '1',
|
|
||||||
];
|
|
||||||
dd(json_encode($user_ext_info));
|
|
||||||
$str = 'msg_type=00&msg_txn_code=002100&msg_crrltn_id=12345678901234567890123456789000&msg_flg=0&msg_sender=01&msg_time=20130318162412&msg_sys_sn=12345678900987654321&msg_ver=0.1&mchnt_no=8981231234567890&term_no=12345678&shop_no=086123456123456789&req_serial_no=12345678900987654321&orig_req_serial_no=12345678900987654321&enc_card_no=123123123123123123123sdfadqerqr&acq_term_sn=123456&refer_no=123456789012&sett_date=20130318&txn_date=20130318&txn_time=162850&orig_amt=10000&discount_amt=2000&pay_amt=8000&pay_mode=1';
|
|
||||||
parse_str($str, $arr_str);
|
|
||||||
|
|
||||||
$action = new UnionPay($arr_str);
|
$action = new UnionPay($request->all());
|
||||||
$sign = $action->getSign();
|
// $sign = $action->getSign(false);
|
||||||
|
$sign = 'd8e5bf46d0d9f1da702170c2e141d85cf3ca785106886dbfedb3310ee9ce2ca3f18a2e6c179ec9908fc4f41d05df463634106918bdbefc63b8f199c7d2f3b0d45510b4dd6ccdf4549e11a8551a5098b14c01fdaa5840a4608f462fdafdc14b8f2a35471da315d8245a4ef6281b6e04bd22d5a266500a6caf6e5203202c37111d';
|
||||||
$action->sign = $sign;
|
$action->sign = $sign;
|
||||||
$res = $action->checkSign(true);
|
$res = $action->checkSign(false, false);
|
||||||
dump($sign);
|
dump('签名: ' . $sign);
|
||||||
dump($res);
|
$res_str = ($res === true) ? '成功' : '失败';
|
||||||
|
dump('验签结果:' . $res_str);
|
||||||
|
dd($action);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//签名
|
||||||
|
public function toSign($sign_data)
|
||||||
|
{
|
||||||
|
//签名字段
|
||||||
|
// $sign_data['msg_type'] = $array['msg_type'];
|
||||||
|
// $sign_data['msg_txn_code'] = $array['msg_txn_code'];
|
||||||
|
// $sign_data['msg_crrltn_id'] = $array['msg_crrltn_id'];
|
||||||
|
// $sign_data['msg_flg'] = $array['msg_flg'];
|
||||||
|
// $sign_data['msg_sender'] = $array['msg_sender'];
|
||||||
|
// $sign_data['msg_time'] = $array['msg_time'];
|
||||||
|
// $sign_data['msg_sys_sn'] = $array['msg_sys_sn'];
|
||||||
|
// $sign_data['msg_ver'] = $array['msg_ver'];
|
||||||
|
|
||||||
|
// if (isset($array['msg_rsp_code'])) {
|
||||||
|
// $sign_data['msg_rsp_code'] = $array['msg_rsp_code'];
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if (isset($array['msg_rsp_desc'])) {
|
||||||
|
// $sign_data['msg_rsp_desc'] = $array['msg_rsp_desc'];
|
||||||
|
// }
|
||||||
|
|
||||||
|
//将字段名按字母表顺序排序
|
||||||
|
ksort($sign_data);
|
||||||
|
|
||||||
|
//将post的数据utf-8编码
|
||||||
|
$str_data = utf8_encode(http_build_query($sign_data));
|
||||||
|
//获取私钥资源ID
|
||||||
|
$private = config('unionpay.check.self.private');
|
||||||
|
|
||||||
|
if (!file_exists($private)) {
|
||||||
|
throw new \Exception('缺少私钥文件');
|
||||||
|
}
|
||||||
|
|
||||||
|
$private_key = file_get_contents($private);
|
||||||
|
$pkeyid = openssl_get_privatekey($private_key);
|
||||||
|
|
||||||
|
//签名赋值sign
|
||||||
|
if (openssl_sign($str_data, $sign, $pkeyid)) {
|
||||||
|
$sign_data = bin2hex($sign);
|
||||||
|
} else {
|
||||||
|
$sign_data = '';
|
||||||
|
}
|
||||||
|
//释放ssl资源
|
||||||
|
openssl_free_key($pkeyid);
|
||||||
|
|
||||||
|
return $sign_data;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notes: 银联接口
|
* Notes: 银联接口
|
||||||
* @Author: 玄尘
|
* @Author: 玄尘
|
||||||
@@ -42,10 +84,12 @@ class UnionPayController extends Controller
|
|||||||
$inputs = $request->all();
|
$inputs = $request->all();
|
||||||
$sign = $inputs['sign'];
|
$sign = $inputs['sign'];
|
||||||
unset($inputs['sign']);
|
unset($inputs['sign']);
|
||||||
|
|
||||||
$action = new UnionPay($inputs, $sign);
|
$action = new UnionPay($inputs, $sign);
|
||||||
|
|
||||||
|
// $action->addLog();
|
||||||
$action->start();
|
$action->start();
|
||||||
$action->updateOutData();
|
|
||||||
|
// $action->updateLog();
|
||||||
|
|
||||||
return $action->respond();
|
return $action->respond();
|
||||||
|
|
||||||
|
|||||||
45
app/Exceptions/ApiUnionpayException.php
Normal file
45
app/Exceptions/ApiUnionpayException.php
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Author: sai
|
||||||
|
* Date: 2020/1/15
|
||||||
|
* Time: 14:31
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace App\Exceptions;
|
||||||
|
|
||||||
|
class ApiUnionpayException extends \Exception
|
||||||
|
{
|
||||||
|
|
||||||
|
const ERROR_CODE = 1001;
|
||||||
|
const ERROR_MSG = 'ApiUnionpayException';
|
||||||
|
|
||||||
|
private $data = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* BusinessException constructor.
|
||||||
|
* @param string $message
|
||||||
|
* @param string $code
|
||||||
|
* @param array $data
|
||||||
|
*/
|
||||||
|
public function __construct($data = [])
|
||||||
|
{
|
||||||
|
$this->data = $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getData()
|
||||||
|
{
|
||||||
|
return $this->data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 异常输出
|
||||||
|
*/
|
||||||
|
public function render($request)
|
||||||
|
{
|
||||||
|
return response()->json($this->getData(), 200);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -7,18 +7,17 @@ use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
|
|||||||
|
|
||||||
class Handler extends ExceptionHandler
|
class Handler extends ExceptionHandler
|
||||||
{
|
{
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A list of the exception types that are not reported.
|
* A list of the exception types that are not reported.
|
||||||
*
|
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $dontReport = [
|
protected $dontReport = [
|
||||||
//
|
ApiException::class,
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A list of the inputs that are never flashed for validation exceptions.
|
* A list of the inputs that are never flashed for validation exceptions.
|
||||||
*
|
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $dontFlash = [
|
protected $dontFlash = [
|
||||||
@@ -28,18 +27,17 @@ class Handler extends ExceptionHandler
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Report or log an exception.
|
* Report or log an exception.
|
||||||
*
|
|
||||||
* @param \Exception $exception
|
* @param \Exception $exception
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function report(Exception $exception)
|
public function report(Exception $exception)
|
||||||
{
|
{
|
||||||
|
info($exception->getMessage());
|
||||||
parent::report($exception);
|
parent::report($exception);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Render an exception into an HTTP response.
|
* Render an exception into an HTTP response.
|
||||||
*
|
|
||||||
* @param \Illuminate\Http\Request $request
|
* @param \Illuminate\Http\Request $request
|
||||||
* @param \Exception $exception
|
* @param \Exception $exception
|
||||||
* @return \Illuminate\Http\Response
|
* @return \Illuminate\Http\Response
|
||||||
@@ -48,4 +46,5 @@ class Handler extends ExceptionHandler
|
|||||||
{
|
{
|
||||||
return parent::render($request, $exception);
|
return parent::render($request, $exception);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -88,6 +88,24 @@ class Coupon extends Model
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notes: 撤销分润
|
||||||
|
* @Author: 玄尘
|
||||||
|
* @Date : 2020/10/9 14:07
|
||||||
|
*/
|
||||||
|
public function reprofit()
|
||||||
|
{
|
||||||
|
if ($this->profit > 1) {
|
||||||
|
return $this->user->account->rule('refreeze', -$this->profit, false, [
|
||||||
|
'coupon_id' => $this->id,
|
||||||
|
'redemptionCode' => $this->redemptionCode,
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
|
return '不需要操作';
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 打款
|
* 打款
|
||||||
* @author 玄尘 2020-03-13
|
* @author 玄尘 2020-03-13
|
||||||
|
|||||||
@@ -10,4 +10,9 @@ class UnionpayLog extends Model
|
|||||||
'out_source' => 'array',
|
'out_source' => 'array',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
public function coupon()
|
||||||
|
{
|
||||||
|
return $this->hasOne(Coupon::class, 'redemptionCode', 'mkt_code');
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,13 +2,13 @@
|
|||||||
|
|
||||||
return [
|
return [
|
||||||
//分配的渠道号
|
//分配的渠道号
|
||||||
'msg_sender' => 01,
|
'msg_sender' => '660134',
|
||||||
//打印在小票上,由活动标题、优惠金额、原始金额组合而成
|
//打印在小票上,由活动标题、优惠金额、原始金额组合而成
|
||||||
'pos_receipt' => '',
|
'pos_receipt' => '本时生活,优惠生活',
|
||||||
//广告,用于打印在小票上
|
//广告,用于打印在小票上
|
||||||
'pos_ad' => '',
|
'pos_ad' => '',
|
||||||
//营销联盟广告,用于打印在小票上
|
//营销联盟广告,用于打印在小票上
|
||||||
'pos_mkt_ad' => '',
|
'pos_mkt_ad' => '本时生活,优惠生活',
|
||||||
//银联渠道id
|
//银联渠道id
|
||||||
'agent_id' => '299',
|
'agent_id' => '299',
|
||||||
//银联网点id
|
//银联网点id
|
||||||
@@ -17,6 +17,7 @@ return [
|
|||||||
'serv_chg' => 0,
|
'serv_chg' => 0,
|
||||||
//佣金
|
//佣金
|
||||||
'commission' => 0,
|
'commission' => 0,
|
||||||
|
//证书
|
||||||
'check' => [
|
'check' => [
|
||||||
'self' => [
|
'self' => [
|
||||||
'private' => storage_path('cert/unionpay/self/private_rsa.pem'),
|
'private' => storage_path('cert/unionpay/self/private_rsa.pem'),
|
||||||
@@ -26,6 +27,18 @@ return [
|
|||||||
'public' => storage_path('cert/unionpay/public_rsa.pem'),
|
'public' => storage_path('cert/unionpay/public_rsa.pem'),
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
|
'type' => [
|
||||||
|
'002025' => '查询',
|
||||||
|
'002100' => '交易',
|
||||||
|
'002101' => '冲正',
|
||||||
|
'002102' => '撤销',
|
||||||
|
],
|
||||||
|
'log_type' => [
|
||||||
|
'002025' => 'query',
|
||||||
|
'002100' => 'freezecoupon',
|
||||||
|
'002101' => 'reversal',
|
||||||
|
'002102' => 'annul',
|
||||||
|
],
|
||||||
//基础数据
|
//基础数据
|
||||||
'regular' => [
|
'regular' => [
|
||||||
'002025' => [
|
'002025' => [
|
||||||
@@ -50,6 +63,8 @@ return [
|
|||||||
"msg_sys_sn",
|
"msg_sys_sn",
|
||||||
"msg_ver",
|
"msg_ver",
|
||||||
"req_serial_no",//自己添加的基础数据
|
"req_serial_no",//自己添加的基础数据
|
||||||
|
"orig_req_serial_no",//自己添加的基础数据
|
||||||
|
"sett_date",//自己添加的基础数据
|
||||||
],
|
],
|
||||||
'002101' => [
|
'002101' => [
|
||||||
"msg_type",
|
"msg_type",
|
||||||
@@ -61,6 +76,7 @@ return [
|
|||||||
"msg_sys_sn",
|
"msg_sys_sn",
|
||||||
"msg_ver",
|
"msg_ver",
|
||||||
"req_serial_no",//自己添加的基础数据
|
"req_serial_no",//自己添加的基础数据
|
||||||
|
"orig_req_serial_no",//自己添加的基础数据
|
||||||
],
|
],
|
||||||
'002102' => [
|
'002102' => [
|
||||||
"msg_type",
|
"msg_type",
|
||||||
@@ -72,7 +88,7 @@ return [
|
|||||||
"msg_sys_sn",
|
"msg_sys_sn",
|
||||||
"msg_ver",
|
"msg_ver",
|
||||||
"req_serial_no",//自己添加的基础数据
|
"req_serial_no",//自己添加的基础数据
|
||||||
|
"orig_req_serial_no",//自己添加的基础数据
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
'fields' => [
|
'fields' => [
|
||||||
|
|||||||
@@ -1,32 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace XuanChen\Coupon;
|
|
||||||
|
|
||||||
use Illuminate\Support\ServiceProvider;
|
|
||||||
|
|
||||||
class CouponServiceProvider extends ServiceProvider
|
|
||||||
{
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Register services.
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function register()
|
|
||||||
{
|
|
||||||
dd(1);
|
|
||||||
if ($this->app->runningInConsole()) {
|
|
||||||
$this->publishes([__DIR__ . '/../config/xuanchen_coupon.php' => config_path('xuanchen_coupon.php')]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Bootstrap services.
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function boot()
|
|
||||||
{
|
|
||||||
$this->mergeConfigFrom(__DIR__ . '/../config/xuanchen_coupon.php', 'xuanchen_coupon');
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -22,7 +22,7 @@ class ZhyCreate implements CheckCouponContracts
|
|||||||
"marketRuleNumber" => "001",
|
"marketRuleNumber" => "001",
|
||||||
"perVoucherNumber" => "1",
|
"perVoucherNumber" => "1",
|
||||||
"planVoucherNumber" => "10",
|
"planVoucherNumber" => "10",
|
||||||
"queryCreateTime" => "2019-11-11 18=> 39=> 49",
|
"queryCreateTime" => "2019-11-11 18:39:49",
|
||||||
"similarStack" => "Y",
|
"similarStack" => "Y",
|
||||||
"voucherEndTime" => "2019-12-15",
|
"voucherEndTime" => "2019-12-15",
|
||||||
"voucher_ruleCode" => "$01-VC-1573468710381900",
|
"voucher_ruleCode" => "$01-VC-1573468710381900",
|
||||||
@@ -35,8 +35,8 @@ class ZhyCreate implements CheckCouponContracts
|
|||||||
"limitFrequency" => "",
|
"limitFrequency" => "",
|
||||||
"mabIsRefund" => "",
|
"mabIsRefund" => "",
|
||||||
"marketCode" => "20191213154203514",
|
"marketCode" => "20191213154203514",
|
||||||
"marketExEndTime" => "2019-12-15 00=> 00=> 00",
|
"marketExEndTime" => "2019-12-15 00:00:00",
|
||||||
"marketExStartTime" => "2019-12-13 00=> 00=> 00",
|
"marketExStartTime" => "2019-12-13 00:00:00",
|
||||||
"marketHierarchy" => "3311",
|
"marketHierarchy" => "3311",
|
||||||
"marketName" => "行为推送活动-3",
|
"marketName" => "行为推送活动-3",
|
||||||
"marketProvince" => "51",
|
"marketProvince" => "51",
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ use App\Models\User;
|
|||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 自有卡券系统
|
* 中石化接口
|
||||||
*/
|
*/
|
||||||
class Sinopec
|
class Sinopec
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,13 +2,18 @@
|
|||||||
|
|
||||||
namespace XuanChen\UnionPay\Action;
|
namespace XuanChen\UnionPay\Action;
|
||||||
|
|
||||||
|
use App\Exceptions\ApiException;
|
||||||
|
use App\Exceptions\ApiUnionpayException;
|
||||||
|
use App\Models\Log as LogModel;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
class Init
|
class Init
|
||||||
{
|
{
|
||||||
|
|
||||||
|
//传入的参数
|
||||||
public $params;
|
public $params;
|
||||||
|
|
||||||
|
//传入的签名
|
||||||
public $sign;
|
public $sign;
|
||||||
|
|
||||||
public $msg_type = '00';
|
public $msg_type = '00';
|
||||||
@@ -30,6 +35,15 @@ class Init
|
|||||||
//网点id
|
//网点id
|
||||||
public $outlet_id;
|
public $outlet_id;
|
||||||
|
|
||||||
|
//渠道id
|
||||||
|
public $agent_id;
|
||||||
|
|
||||||
|
//日志
|
||||||
|
public $log;
|
||||||
|
|
||||||
|
//幂等数据
|
||||||
|
public $info;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notes: 验签
|
* Notes: 验签
|
||||||
* @Author: 玄尘
|
* @Author: 玄尘
|
||||||
@@ -37,22 +51,22 @@ class Init
|
|||||||
* @param false $self 是否是自己的证书
|
* @param false $self 是否是自己的证书
|
||||||
* @return bool|string
|
* @return bool|string
|
||||||
*/
|
*/
|
||||||
public function checkSign($self = false)
|
public function checkSign($out = true, $self = false)
|
||||||
{
|
{
|
||||||
$sign = $this->sign;
|
$sign = hex2bin($this->sign);
|
||||||
$sign = base64_decode($sign);
|
|
||||||
|
|
||||||
$public_key = $this->getPublic($self);
|
$public_key = $this->getPublic($self);
|
||||||
|
|
||||||
$pub_key_id = openssl_get_publickey($public_key);
|
$pub_key_id = openssl_get_publickey($public_key);
|
||||||
|
|
||||||
$signStr = $this->getSignString($this->params);
|
$signStr = $this->getSignString($out);
|
||||||
|
|
||||||
if ($pub_key_id) {
|
if ($pub_key_id) {
|
||||||
$result = (bool)openssl_verify($signStr, $sign, $pub_key_id);
|
$result = (bool)openssl_verify($signStr, $sign, $pub_key_id);
|
||||||
openssl_free_key($pub_key_id);
|
openssl_free_key($pub_key_id);
|
||||||
} else {
|
} else {
|
||||||
return '公钥格式有误!';
|
throw new \Exception('私钥格式有误');
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
@@ -61,8 +75,10 @@ class Init
|
|||||||
/**
|
/**
|
||||||
* Notes: 签名
|
* Notes: 签名
|
||||||
* @Author: 玄尘
|
* @Author: 玄尘
|
||||||
* @Date : 2020/9/29 9:56
|
* @Date : 2020/10/9 15:52
|
||||||
|
* @param bool $self
|
||||||
* @return string
|
* @return string
|
||||||
|
* @throws \Exception
|
||||||
*/
|
*/
|
||||||
public function getSign($out = true)
|
public function getSign($out = true)
|
||||||
{
|
{
|
||||||
@@ -71,13 +87,18 @@ class Init
|
|||||||
|
|
||||||
$privKeyId = openssl_pkey_get_private($private_key);
|
$privKeyId = openssl_pkey_get_private($private_key);
|
||||||
if (!$privKeyId) {
|
if (!$privKeyId) {
|
||||||
return '私钥格式有误';
|
throw new \Exception('私钥格式有误');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (openssl_sign($signStr, $signature, $privKeyId)) {
|
||||||
|
$signature = bin2hex($signature);
|
||||||
|
} else {
|
||||||
|
throw new \Exception('签名错误');
|
||||||
}
|
}
|
||||||
|
|
||||||
openssl_sign($signStr, $signature, $privKeyId);
|
|
||||||
openssl_free_key($privKeyId);
|
openssl_free_key($privKeyId);
|
||||||
|
|
||||||
return base64_encode($signature);
|
return $signature;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -87,7 +108,7 @@ class Init
|
|||||||
* @param $out 是否是获取返回值的数据
|
* @param $out 是否是获取返回值的数据
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function getSignString($out)
|
public function getSignString($out = false)
|
||||||
{
|
{
|
||||||
if ($out) {
|
if ($out) {
|
||||||
$params = array_filter($this->outdata);
|
$params = array_filter($this->outdata);
|
||||||
@@ -95,10 +116,15 @@ class Init
|
|||||||
$params = array_filter($this->params);
|
$params = array_filter($this->params);
|
||||||
}
|
}
|
||||||
|
|
||||||
ksort($params);
|
if (empty($params)) {
|
||||||
$signStr = http_build_query($params);
|
throw new \Exception('缺少数据');
|
||||||
|
}
|
||||||
|
|
||||||
|
ksort($params);
|
||||||
|
|
||||||
|
//http_build_query 会自动urlencode 需要转换
|
||||||
|
return $this->str2utf8(urldecode(http_build_query($params)));
|
||||||
|
|
||||||
return $signStr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//获取私钥
|
//获取私钥
|
||||||
@@ -125,13 +151,48 @@ class Init
|
|||||||
return file_get_contents($public);
|
return file_get_contents($public);
|
||||||
}
|
}
|
||||||
|
|
||||||
//更新返回值
|
/**
|
||||||
public function updateOutData()
|
* Notes: 插入日志
|
||||||
|
* @Author: 玄尘
|
||||||
|
* @Date : 2020/10/9 14:38
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function addLog()
|
||||||
{
|
{
|
||||||
$this->outdata['sign'] = $this->getSign();
|
$log_type = config('unionpay.log_type');
|
||||||
$this->model->out_source = $this->outdata;
|
$data = [
|
||||||
$this->model->save();
|
'path' => request()->url(),
|
||||||
|
'method' => request()->method(),
|
||||||
|
'type' => $log_type[$this->msg_txn_code],
|
||||||
|
'in_source' => $this->params,
|
||||||
|
];
|
||||||
|
|
||||||
|
return $this->log = LogModel::create($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notes: 更新日志
|
||||||
|
* @Author: 玄尘
|
||||||
|
* @Date : 2020/10/9 14:46
|
||||||
|
*/
|
||||||
|
public function updateLog()
|
||||||
|
{
|
||||||
|
$this->log->out_source = $this->outdata;
|
||||||
|
$this->log->save();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将字符串编码转为 utf8
|
||||||
|
* @param $str
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function str2utf8($str)
|
||||||
|
{
|
||||||
|
$encode = mb_detect_encoding($str, ['ASCII', 'UTF-8', 'GB2312', 'GBK', 'BIG5']);
|
||||||
|
$str = $str ? $str : mb_convert_encoding($str, 'UTF-8', $encode);
|
||||||
|
$str = is_string($str) ? $str : '';
|
||||||
|
|
||||||
|
return $str;
|
||||||
}
|
}
|
||||||
|
|
||||||
//输出数据
|
//输出数据
|
||||||
|
|||||||
@@ -22,8 +22,9 @@ class UnionPay extends Init
|
|||||||
{
|
{
|
||||||
$this->params = $params;
|
$this->params = $params;
|
||||||
$this->sign = $sign;
|
$this->sign = $sign;
|
||||||
$this->msg_txn_code = $params['msg_txn_code'];
|
$this->msg_txn_code = $params['msg_txn_code'] ?? '';
|
||||||
$this->msg_sender = config('unionpay.msg_sender');
|
$this->msg_sender = config('unionpay.msg_sender');
|
||||||
|
$this->agent_id = config('unionpay.agent_id');
|
||||||
$this->outlet_id = config('unionpay.outlet_id');
|
$this->outlet_id = config('unionpay.outlet_id');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -34,15 +35,38 @@ class UnionPay extends Init
|
|||||||
*/
|
*/
|
||||||
public function start()
|
public function start()
|
||||||
{
|
{
|
||||||
$this->updateInputData();
|
//设置基础数据
|
||||||
|
$this->getOutBaseData();
|
||||||
|
|
||||||
|
try {
|
||||||
|
//校验数据
|
||||||
|
$this->checkInData();
|
||||||
|
//查询是否是幂等 就是重复查询
|
||||||
|
$this->idempotent();
|
||||||
|
//入库请求参数
|
||||||
|
$this->InputData();
|
||||||
|
//返回值
|
||||||
$this->out_data();
|
$this->out_data();
|
||||||
|
//更新数据
|
||||||
|
$this->updateOutData();
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
|
||||||
|
$this->outdata['msg_rsp_code'] = '9999';
|
||||||
|
$this->outdata['msg_rsp_desc'] = $e->getMessage();
|
||||||
|
if (empty($this->model->out_source)) {
|
||||||
|
$this->updateOutData();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//处理流程
|
//处理流程
|
||||||
public function out_data()
|
public function out_data()
|
||||||
{
|
{
|
||||||
$this->getOutBaseData();
|
//是幂等
|
||||||
|
if ($this->info && !empty($this->info->out_source)) {
|
||||||
|
$this->outdata = $this->info->out_source;
|
||||||
|
} else {
|
||||||
if ($this->msg_rsp_code == '0000') {
|
if ($this->msg_rsp_code == '0000') {
|
||||||
switch ($this->msg_txn_code) {
|
switch ($this->msg_txn_code) {
|
||||||
//聚合营销优惠查询接口
|
//聚合营销优惠查询接口
|
||||||
@@ -50,8 +74,8 @@ class UnionPay extends Init
|
|||||||
$res = Coupon::Query($this->params['mkt_code'], $this->outlet_id);
|
$res = Coupon::Query($this->params['mkt_code'], $this->outlet_id);
|
||||||
if (is_array($res)) {
|
if (is_array($res)) {
|
||||||
$this->outdata['pos_display'] = $res['name'];
|
$this->outdata['pos_display'] = $res['name'];
|
||||||
$this->outdata['discount'] = $res['price'];
|
$this->outdata['discount'] = $res['price'] * 100;
|
||||||
$this->outdata['actual_amt'] = bcsub($this->params['amount'], $res['price'], 4);
|
$this->outdata['actual_amt'] = (int)bcsub($this->params['amount'], $res['price'] * 100);
|
||||||
} else {
|
} else {
|
||||||
$this->outdata['msg_rsp_code'] = '9999';
|
$this->outdata['msg_rsp_code'] = '9999';
|
||||||
$this->outdata['msg_rsp_desc'] = $res;
|
$this->outdata['msg_rsp_desc'] = $res;
|
||||||
@@ -60,18 +84,21 @@ class UnionPay extends Init
|
|||||||
//销账交易接口
|
//销账交易接口
|
||||||
case '002100':
|
case '002100':
|
||||||
//查询聚合信息
|
//查询聚合信息
|
||||||
$info = UnionpayLog::where('msg_crrltn_id', $this->params['msg_crrltn_id'])
|
$query = UnionpayLog::where('req_serial_no', $this->params['orig_req_serial_no'])
|
||||||
->where('msg_txn_code', '002025')
|
->where('msg_txn_code', '002025')
|
||||||
->latest()
|
->latest()
|
||||||
->first();
|
->first();
|
||||||
//获取配置数据
|
|
||||||
$conf_unionpay = config('unionpay');
|
$this->outdata['orig_amt'] = $query->in_source['amount']; //订单金额 原始金额
|
||||||
|
$this->outdata['discount_amt'] = $query->out_source['discount']; //折扣金额
|
||||||
|
$this->outdata['pay_amt'] = $query->out_source['actual_amt']; //折扣后金额
|
||||||
|
|
||||||
//获取银联渠道
|
//获取银联渠道
|
||||||
$user = User::find($conf_unionpay['agent_id']);
|
$user = User::find($this->agent_id);
|
||||||
|
|
||||||
if ($info) {
|
if ($query) {
|
||||||
$coupon = Coupon::Redemption($user, $info->mkt_code, $this->params['orig_amt'], $conf_unionpay['outlet_id'], '');
|
$coupon = [];
|
||||||
|
$coupon = Coupon::Redemption($user, $query->mkt_code, $this->params['orig_amt'] / 100, $this->outlet_id, '');
|
||||||
if (!is_array($coupon)) {
|
if (!is_array($coupon)) {
|
||||||
$this->outdata['msg_rsp_code'] = '9999';
|
$this->outdata['msg_rsp_code'] = '9999';
|
||||||
$this->outdata['msg_rsp_desc'] = $coupon;
|
$this->outdata['msg_rsp_desc'] = $coupon;
|
||||||
@@ -80,19 +107,81 @@ class UnionPay extends Init
|
|||||||
$this->outdata['msg_rsp_code'] = '9999';
|
$this->outdata['msg_rsp_code'] = '9999';
|
||||||
$this->outdata['msg_rsp_desc'] = '未查询到前置接口,获取券码失败。';
|
$this->outdata['msg_rsp_desc'] = '未查询到前置接口,获取券码失败。';
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case '002101':
|
case '002101':
|
||||||
break;
|
break;
|
||||||
case '002102':
|
case '002102':
|
||||||
|
//查询聚合信息
|
||||||
|
$info = UnionpayLog::where('req_serial_no', $this->params['orig_req_serial_no'])
|
||||||
|
->where('msg_txn_code', '002025')
|
||||||
|
->latest()
|
||||||
|
->first();
|
||||||
|
|
||||||
|
if ($info) {
|
||||||
|
if ($info->coupon) {
|
||||||
|
$ret = $info->coupon->reprofit();
|
||||||
|
if ($ret !== true) {
|
||||||
|
$this->outdata['msg_rsp_code'] = '9999';
|
||||||
|
$this->outdata['msg_rsp_desc'] = $ret;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$this->outdata['msg_rsp_code'] = '9999';
|
||||||
|
$this->outdata['msg_rsp_desc'] = '为查询到优惠券信息。';
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$this->outdata['msg_rsp_code'] = '9999';
|
||||||
|
$this->outdata['msg_rsp_desc'] = '未查询到前置接口,获取券码失败。';
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notes: 入库数据
|
||||||
|
* @Author: 玄尘
|
||||||
|
* @Date : 2020/9/30 8:46
|
||||||
|
*/
|
||||||
|
private function InputData()
|
||||||
|
{
|
||||||
|
//获取基础数据
|
||||||
|
$base = config('unionpay.regular')[$this->msg_txn_code];
|
||||||
|
$data = [];
|
||||||
|
//循环获取入库数据
|
||||||
|
foreach ($this->params as $key => $param) {
|
||||||
|
if (in_array($key, $base)) {
|
||||||
|
$data[$key] = $param;
|
||||||
|
} else {
|
||||||
|
$data['in_source'][$key] = $param;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->model = UnionpayLog::create($data);
|
||||||
|
|
||||||
|
if (empty($this->model)) {
|
||||||
|
throw new \Exception('数据入库失败');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notes: 校验输入的数据
|
||||||
|
* @Author: 玄尘
|
||||||
|
* @Date : 2020/9/30 14:46
|
||||||
|
*/
|
||||||
|
public function checkInData()
|
||||||
|
{
|
||||||
|
if ($this->params['msg_txn_code'] == '002025' && (!isset($this->params['mkt_code']) || empty($this->params['mkt_code']))) {
|
||||||
|
$this->msg_rsp_code = 9999;
|
||||||
|
$this->msg_rsp_desc = '聚合营销码不能为空';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notes: 返回的基础数据
|
* Notes: 返回的基础数据
|
||||||
* @Author: 玄尘
|
* @Author: 玄尘
|
||||||
@@ -107,7 +196,7 @@ class UnionPay extends Init
|
|||||||
"msg_flg" => 1,
|
"msg_flg" => 1,
|
||||||
"msg_sender" => $this->msg_sender,
|
"msg_sender" => $this->msg_sender,
|
||||||
"msg_time" => now()->format('YmdHis'),
|
"msg_time" => now()->format('YmdHis'),
|
||||||
"msg_sys_sn" => $this->params['msg_sys_sn'],
|
"msg_sys_sn" => $this->params['msg_sys_sn'] ?? '',
|
||||||
"msg_rsp_code" => $this->msg_rsp_code,
|
"msg_rsp_code" => $this->msg_rsp_code,
|
||||||
"msg_rsp_desc" => $this->msg_rsp_desc,
|
"msg_rsp_desc" => $this->msg_rsp_desc,
|
||||||
];
|
];
|
||||||
@@ -130,65 +219,52 @@ class UnionPay extends Init
|
|||||||
'discount_amt' => $this->params['discount_amt'],
|
'discount_amt' => $this->params['discount_amt'],
|
||||||
'pay_amt' => $this->params['pay_amt'],
|
'pay_amt' => $this->params['pay_amt'],
|
||||||
'serv_chg' => config('unionpay.serv_chg'),
|
'serv_chg' => config('unionpay.serv_chg'),
|
||||||
'commission' => $this->params['orig_amt'],
|
'commission' => config('unionpay.commission'),
|
||||||
'event_no' => '',//什么是活动号
|
'event_no' => '',//活动号 直接为空就可以
|
||||||
]);
|
]);
|
||||||
break;
|
break;
|
||||||
case '002101':
|
case '002101':
|
||||||
|
$basics = array_merge($basics, [
|
||||||
|
'msg_ver' => 0.1,
|
||||||
|
]);
|
||||||
break;
|
break;
|
||||||
case '002102':
|
case '002102':
|
||||||
|
$basics = array_merge($basics, [
|
||||||
|
'msg_ver' => 0.1,
|
||||||
|
]);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
$this->outdata = $basics;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
return $this->outdata = $basics;
|
||||||
* Notes: 入库数据
|
|
||||||
* @Author: 玄尘
|
|
||||||
* @Date : 2020/9/30 8:46
|
|
||||||
*/
|
|
||||||
private function updateInputData()
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
if (!isset($this->params['msg_sys_sn'])) {
|
|
||||||
$this->params['msg_sys_sn'] = date('ymdHis') . sprintf('%06d', rand(1, 99999999));
|
|
||||||
}
|
|
||||||
|
|
||||||
//获取基础数据
|
|
||||||
$base = config('unionpay.regular')[$this->msg_txn_code];
|
|
||||||
$data = [];
|
|
||||||
foreach ($this->params as $key => $param) {
|
|
||||||
if (in_array($key, $base)) {
|
|
||||||
$data[$key] = $param;
|
|
||||||
} else {
|
|
||||||
$data['in_source'][$key] = $param;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$this->model = UnionpayLog::create($data);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
} catch (\Exception $e) {
|
|
||||||
$this->msg_rsp_code = 9999;
|
|
||||||
$this->msg_rsp_desc = $e->getMessage();
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notes: 校验输入的数据
|
* Notes: 查询是否是幂等
|
||||||
* @Author: 玄尘
|
* @Author: 玄尘
|
||||||
* @Date : 2020/9/30 14:46
|
* @Date : 2020/10/10 13:25
|
||||||
*/
|
*/
|
||||||
public function checkInData()
|
public function idempotent()
|
||||||
{
|
{
|
||||||
if ($this->params['msg_txn_code'] == '002025' && (!isset($this->params['mkt_code']) || empty($this->params['mkt_code']))) {
|
$this->info = UnionpayLog::where('req_serial_no', $this->params['req_serial_no'])
|
||||||
$this->msg_rsp_code = 9999;
|
->where('msg_txn_code', $this->msg_txn_code)
|
||||||
$this->msg_rsp_desc = '聚合营销码不能为空';
|
->where('status', 1)
|
||||||
|
->latest()
|
||||||
|
->first();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//更新返回值
|
||||||
|
public function updateOutData()
|
||||||
|
{
|
||||||
|
$this->outdata['sign'] = $this->getSign();
|
||||||
|
$this->model->out_source = $this->outdata;
|
||||||
|
if ($this->outdata['msg_rsp_code'] == '9999') {
|
||||||
|
$this->model->status = 0;
|
||||||
|
}
|
||||||
|
$this->model->save();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user