mirror of
https://gitee.com/technical-laohu/mpay.git
synced 2025-11-08 11:43:43 +08:00
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3f5866ea16 | ||
|
|
fb2f8f2f2c | ||
|
|
62989e4100 | ||
|
|
eeb877bd87 | ||
|
|
e9f64988a9 | ||
|
|
f62d4cd103 | ||
|
|
331b0b2d56 | ||
|
|
e5871d91c5 |
@@ -369,7 +369,7 @@ V免签是一款开源免费适用于个人收款使用的收款程序,原理
|
||||
|
||||
##### **转发规则**
|
||||
|
||||
添加应用转发规则,**微信**和**支付宝**需要分别设置
|
||||
添加应用转发规则,**微信**和**支付宝**需要分别设置,请注意选择**应用**规则
|
||||
|
||||

|
||||
|
||||
|
||||
@@ -20,70 +20,41 @@ class PayController
|
||||
'POST' => $request->post(),
|
||||
default => []
|
||||
};
|
||||
if (!$req_data) {
|
||||
return '参数错误';
|
||||
}
|
||||
if (!$req_data) return '参数错误';
|
||||
// 验证签名
|
||||
$key = User::where('pid', $req_data['pid'])->where('state', 1)->value('secret_key');
|
||||
if (!$key) {
|
||||
return '用户禁用或不存在';
|
||||
}
|
||||
if (!$key) return '用户禁用或不存在';
|
||||
$sign_str = self::getSign($req_data, $key);
|
||||
if ($req_data['sign'] === $sign_str) {
|
||||
// 检查商户订单
|
||||
$out_trade_no = Order::where('out_trade_no', $req_data['out_trade_no'])->value('out_trade_no');
|
||||
if (!$out_trade_no) {
|
||||
// 创建新订单
|
||||
$order_id = Order::createOrder($req_data);
|
||||
if ($order_id) {
|
||||
return redirect("/Pay/console/{$order_id}");
|
||||
} else {
|
||||
return '创建订单失败';
|
||||
}
|
||||
} else {
|
||||
return '订单提交重复';
|
||||
}
|
||||
} else {
|
||||
return '签名错误';
|
||||
}
|
||||
if ($req_data['sign'] !== $sign_str) return '签名错误';
|
||||
// 检查商户订单
|
||||
$out_trade_no = Order::where('out_trade_no', $req_data['out_trade_no'])->value('out_trade_no');
|
||||
if ($out_trade_no) return '订单提交重复';
|
||||
// 创建新订单
|
||||
$order_id = Order::createOrder($req_data);
|
||||
if (!$order_id) return '创建订单失败';
|
||||
return redirect("/Pay/console/{$order_id}");
|
||||
}
|
||||
// api提交订单
|
||||
public function mapi(Request $request)
|
||||
{
|
||||
if ($request->isPost()) {
|
||||
$req_data = $request->post();
|
||||
if (!$req_data) {
|
||||
$req_data = $request->get();
|
||||
if (!$req_data) {
|
||||
return '参数错误';
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return '请使用POST方式提交';
|
||||
}
|
||||
if (!$request->isPost()) return '请使用POST方式提交';
|
||||
$req_data = $request->post();
|
||||
if (!$req_data) $req_data = $request->get();
|
||||
if (!$req_data) return '参数错误';
|
||||
// 验证签名
|
||||
$key = User::where('pid', $req_data['pid'])->where('state', 1)->value('secret_key');
|
||||
if (!$key) {
|
||||
return '用户禁用或不存在';
|
||||
}
|
||||
if (!$key) return '用户禁用或不存在';
|
||||
$sign_str = self::getSign($req_data, $key);
|
||||
if ($req_data['sign'] === $sign_str) {
|
||||
// 检查商户订单
|
||||
$out_trade_no = Order::where('out_trade_no', $req_data['out_trade_no'])->value('out_trade_no');
|
||||
if (!$out_trade_no) {
|
||||
// 创建新订单
|
||||
$order_id = Order::createOrder($req_data);
|
||||
if ($order_id) {
|
||||
$payurl = $request->domain() . "/Pay/console/{$order_id}";
|
||||
$info = ['code' => 1, 'msg' => '订单创建成功', 'trade_no' => $order_id, 'qrcode' => $payurl];
|
||||
return json($info);
|
||||
} else {
|
||||
return '创建订单失败';
|
||||
}
|
||||
} else {
|
||||
return '订单提交重复';
|
||||
}
|
||||
} else {
|
||||
return '签名错误';
|
||||
}
|
||||
if ($req_data['sign'] !== $sign_str) return '签名错误';
|
||||
// 检查商户订单
|
||||
$out_trade_no = Order::where('out_trade_no', $req_data['out_trade_no'])->value('out_trade_no');
|
||||
if ($out_trade_no) return '订单提交重复';
|
||||
// 创建新订单
|
||||
$order_id = Order::createOrder($req_data);
|
||||
if (!$order_id) return '创建订单失败';
|
||||
$payurl = $request->domain() . "/Pay/console/{$order_id}";
|
||||
$info = ['code' => 1, 'msg' => '订单创建成功', 'trade_no' => $order_id, 'qrcode' => $payurl];
|
||||
return json($info);
|
||||
}
|
||||
// 收银台
|
||||
public function console($order_id = '')
|
||||
@@ -312,6 +283,7 @@ class PayController
|
||||
$payclient_path = "\\payclient\\{$config['payclass']}";
|
||||
$Payclient = new $payclient_path($info, $config);
|
||||
$res = $Payclient->notify();
|
||||
if (is_int($res)) return $res;
|
||||
$this->payHeart($res, $config);
|
||||
return 200;
|
||||
} else {
|
||||
|
||||
@@ -13,11 +13,11 @@ class Order extends BaseModel
|
||||
// 订单有效期
|
||||
private static $activity_time = 180;
|
||||
// 新建订单
|
||||
public static function createOrder($data)
|
||||
public static function createOrder($data): string|false
|
||||
{
|
||||
$my_time = time();
|
||||
$channel = self::setChannel($data['pid'], $data['type']);
|
||||
if(!$channel) return false;
|
||||
if (!$channel) return false;
|
||||
$new_order = [
|
||||
// 订单号
|
||||
'order_id' => self::createOrderID('H'),
|
||||
@@ -122,10 +122,10 @@ class Order extends BaseModel
|
||||
$channel_infos = PayChannel::whereIn('account_id', $aids)->where('state', 1)->order('last_time', 'asc')->select();
|
||||
if (!$channel_infos || !$aids) return [];
|
||||
// 微信/支付宝收款处理
|
||||
$channel_info = null;
|
||||
foreach ($channel_infos as $key => $value) {
|
||||
$check_wx = preg_match('/^wxpay\d+#/i', $value->channel);
|
||||
$check_ali = preg_match('/^alipay\d+#/i', $value->channel);
|
||||
$channel_info = null;
|
||||
if ($check_wx && $type === 'wxpay') {
|
||||
$channel_info = $channel_infos[$key];
|
||||
break;
|
||||
@@ -140,7 +140,7 @@ class Order extends BaseModel
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!$channel_info) return [];
|
||||
if (!$channel_info) return [];
|
||||
// 选取收款通道
|
||||
$patt = PayAccount::find($channel_info->account_id);
|
||||
$channel = ['aid' => $channel_info->account_id, 'cid' => $channel_info->id, 'patt' => $patt->getData('pattern')];
|
||||
|
||||
2
extend/.gitignore
vendored
2
extend/.gitignore
vendored
@@ -1 +1 @@
|
||||
/payclient
|
||||
payclient
|
||||
@@ -1,9 +0,0 @@
|
||||
<?php
|
||||
|
||||
header('content-type: application/json; charset=utf-8');
|
||||
$path = '../runtime/order.json';
|
||||
if (!file_exists($path)) {
|
||||
exit('{"code":3,"msg":"文件不存在"}');
|
||||
} else {
|
||||
exit(file_get_contents($path));
|
||||
}
|
||||
BIN
public/static/img/unionpay.ico
Normal file
BIN
public/static/img/unionpay.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
BIN
public/static/img/unionpay.jpg
Normal file
BIN
public/static/img/unionpay.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 26 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
@@ -1,14 +0,0 @@
|
||||
<?php
|
||||
function encrypt($string, $key) {
|
||||
$method = "AES-256-CBC";
|
||||
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($method));
|
||||
$encrypted = openssl_encrypt($string, $method, $key, 0, $iv);
|
||||
// 将iv和加密字符串拼接起来
|
||||
return base64_encode($iv . $encrypted);
|
||||
}
|
||||
|
||||
$key = "your-encryption-key"; // 这里应该是一个安全的密钥
|
||||
$string = "Hello, World!";
|
||||
$encryptedString = encrypt($string, $key);
|
||||
|
||||
echo $encryptedString; // 输出加密字符串
|
||||
@@ -751,6 +751,10 @@
|
||||
<td>wxpay</td>
|
||||
<td>微信支付</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>unionpay</td>
|
||||
<td>云闪付</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3 id="pay5"><a name="设备类型列表" class="reference-link"></a><span
|
||||
|
||||
@@ -5,6 +5,19 @@
|
||||
<meta charset="utf-8">
|
||||
<title>订单明细</title>
|
||||
<link rel="stylesheet" href="/component/pear/css/pear.css" />
|
||||
<style>
|
||||
.paytype {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 34px;
|
||||
}
|
||||
|
||||
.paytype>span {
|
||||
margin-left: 3px;
|
||||
line-height: normal;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body class="pear-container">
|
||||
@@ -56,6 +69,7 @@
|
||||
<option value="">请选择</option>
|
||||
<option value="wxpay">微信支付</option>
|
||||
<option value="alipay">支付宝</option>
|
||||
<option value="unionpay">云闪付</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
@@ -207,7 +221,7 @@
|
||||
{ title: '成交金额', field: 'really_price', align: 'center', minWidth: 85 },
|
||||
{ title: '支付状态', field: 'state', align: 'center', minWidth: 85, templet: '<div>{{# if(d.state==1){return`<span class="layui-badge layui-bg-green">成功</span>`}else{if(new Date(d.close_time)>new Date("<?php echo $servertime ?>")){return`<span class="layui-badge layui-bg-orange">等待</span>`}else{return`<span class="layui-badge layui-bg-gray">过期</span>`} } }}</div>' },
|
||||
{ title: '支付时间', field: 'pay_time', align: 'center', minWidth: 160, templet: '<div>{{= d.pay_time == d.create_time ? "- -" : d.pay_time}}</div>' },
|
||||
{ title: '支付平台', field: 'type', align: 'center', width: 120, templet: '<div>{{# if(d.type=="wxpay"){return`<img src="/static/img/wxpay.ico"width="15"><span>微信支付</span>`}if(d.type=="alipay"){return`<img src="/static/img/alipay.ico"width="15"><span>支付宝</span>`} }}</div>' },
|
||||
{ title: '支付平台', field: 'type', align: 'center', width: 120, templet: '<div>{{# if(d.type=="wxpay"){return`<div class="paytype"><img src="/static/img/wxpay.ico"width="15"><span>微信支付</span></div>`}if(d.type=="alipay"){return`<div class="paytype"><img src="/static/img/alipay.ico"width="15"><span>支付宝</span></div>`}if(d.type=="unionpay"){return`<div class="paytype"><img src="/static/img/unionpay.ico"width="15"><span>云闪付</span></div>`} }}</div>' },
|
||||
{ title: '收款平台[账号:终端]', field: 'platform', align: 'center', minWidth: 160, templet: '<div>{{# return`${d.payAccount.platform} [${d.aid}:${d.cid}]` }}</div>' },
|
||||
{ title: '操作', align: 'center', width: 120, fixed: 'right', templet: '<div><strong><a href="javascript:;" data-id="{{= d.id }}" class="layui-font-green {{= d.state==1 ? "orderSet-paid" : "orderSet-paying" }}">设置</a></strong></div>' }
|
||||
]]
|
||||
|
||||
@@ -23,6 +23,15 @@
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
.paytype {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.paytype>strong {
|
||||
margin-left: 3px;
|
||||
}
|
||||
|
||||
.alipay {
|
||||
color: #1677ff;
|
||||
}
|
||||
@@ -30,6 +39,10 @@
|
||||
.wxpay {
|
||||
color: #1AAD19;
|
||||
}
|
||||
|
||||
.unionpay {
|
||||
color: #d81e06;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
@@ -54,8 +67,8 @@
|
||||
<div class="layui-row">
|
||||
<div class="layui-col-xs3"><label class="layui-form-label"><strong>收款方式</strong></label></div>
|
||||
<div class="layui-col-xs9">
|
||||
<div class="list">
|
||||
<?php $payway=['alipay'=>'支付宝','wxpay'=>'微信支付'];$payway_img=['alipay'=>'/static/img/alipay.ico','wxpay'=>'/static/img/wxpay.ico'];echo "<img src='{$payway_img[$type]}'width='16'><strong class='{$type}'>{$payway[$type]}</strong>" ?>
|
||||
<div class="list paytype">
|
||||
<?php $payway=['alipay'=>'支付宝','wxpay'=>'微信支付','unionpay'=>'云闪付'];$payway_img=['alipay'=>'/static/img/alipay.ico','wxpay'=>'/static/img/wxpay.ico','unionpay'=>'/static/img/unionpay.ico'];echo "<img src='{$payway_img[$type]}'width='16'><strong class='{$type}'>{$payway[$type]}</strong>" ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>订单明细</title>
|
||||
<title>支付测试</title>
|
||||
<link rel="stylesheet" href="/component/pear/css/pear.css" />
|
||||
<style>
|
||||
.paybtn {
|
||||
@@ -60,6 +60,10 @@
|
||||
<img src="/static/img/alipay.ico" width="16">
|
||||
<span>支付宝</span>
|
||||
</button>
|
||||
<button class="pear-btn unionpay">
|
||||
<img src="/static/img/unionpay.ico" width="16">
|
||||
<span>云闪付</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -91,6 +95,9 @@
|
||||
document.querySelector('.alipay').addEventListener('click', function () {
|
||||
crateOrder('alipay');
|
||||
});
|
||||
document.querySelector('.unionpay').addEventListener('click', function () {
|
||||
crateOrder('unionpay');
|
||||
});
|
||||
// 创建订单
|
||||
function crateOrder(paytype) {
|
||||
form.submit('paytest', function (data) {
|
||||
|
||||
@@ -166,6 +166,9 @@
|
||||
} else if (payType === 'alipay') {
|
||||
payTpeyImg.src = '/static/img/alipay.jpg';
|
||||
payTypeText.innerText = '请使用支付宝扫码支付'
|
||||
} else if (payType === 'unionpay') {
|
||||
payTpeyImg.src = '/static/img/unionpay.jpg';
|
||||
payTypeText.innerText = '请使用云闪付扫码支付'
|
||||
}
|
||||
// 生成二维码
|
||||
if (codeType == 0) {
|
||||
|
||||
@@ -30,8 +30,8 @@
|
||||
<!-- <?php if ($platform == 'wxpay') { ?> -->
|
||||
<option value="wxpay1">个人码</option>
|
||||
<option value="wxpay2">赞赏码</option>
|
||||
<!-- <option value="wxpay3">经营码</option>
|
||||
<option value="wxpay4">商家码</option> -->
|
||||
<!-- <option value="wxpay3">经营码</option> -->
|
||||
<option value="wxpay4">商家码</option>
|
||||
<!-- <?php } ?> -->
|
||||
<!-- <?php if ($platform == 'alipay') { ?> -->
|
||||
<option value="alipay1">收钱码</option>
|
||||
|
||||
@@ -181,9 +181,9 @@
|
||||
<div class="layui-input-block">
|
||||
<div class="layui-form-mid layui-elip"
|
||||
style="margin-left: 10px;color: #5f5f5f;float: none;">
|
||||
<?php echo '并且 是 APP包名 相等 com.tencent.mm<br />并且 是 通知标题 相等 微信支付<br />[空格]或者 是 通知标题 相等 微信收款助手' ?>
|
||||
<?php echo '并且 是 APP包名 相等 com.tencent.mm<br />并且 是 通知标题 相等 微信支付<br />[空格]或者 是 通知标题 相等 微信收款助手<br />[空格]或者 是 通知标题 相等 微信收款商业版' ?>
|
||||
<a href="javascript:;" lay-on="copyinfo"
|
||||
data-info='<?php echo "并且 是 APP包名 相等 com.tencent.mm\n并且 是 通知标题 相等 微信支付\n[空格]或者 是 通知标题 相等 微信收款助手" ?>'
|
||||
data-info='<?php echo "并且 是 APP包名 相等 com.tencent.mm\n并且 是 通知标题 相等 微信支付\n[空格]或者 是 通知标题 相等 微信收款助手\n[空格]或者 是 通知标题 相等 微信收款商业版" ?>'
|
||||
style="float: right;" title="复制"><span
|
||||
class="icon pear-icon pear-icon-survey"></span></a>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user