mirror of
				https://gitee.com/technical-laohu/mpay.git
				synced 2025-11-04 16:53:44 +08:00 
			
		
		
		
	后台添加支付测试功能
This commit is contained in:
		@@ -6,6 +6,7 @@ namespace app\controller;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
use app\BaseController;
 | 
					use app\BaseController;
 | 
				
			||||||
use app\model\Order;
 | 
					use app\model\Order;
 | 
				
			||||||
 | 
					use app\model\User;
 | 
				
			||||||
use think\facade\View;
 | 
					use think\facade\View;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class OrderController extends BaseController
 | 
					class OrderController extends BaseController
 | 
				
			||||||
@@ -27,4 +28,18 @@ class OrderController extends BaseController
 | 
				
			|||||||
            return '订单不存在';
 | 
					            return '订单不存在';
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    public function testPay()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $pid = 1000;
 | 
				
			||||||
 | 
					        if (session('?pid')) {
 | 
				
			||||||
 | 
					            $pid = session('pid');
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        View::assign('pid', $pid);
 | 
				
			||||||
 | 
					        $key = User::where('pid', $pid)->where('state', 1)->value('secret_key');
 | 
				
			||||||
 | 
					        if (!$key) {
 | 
				
			||||||
 | 
					            return '用户禁用或不存在';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        View::assign('key', $key);
 | 
				
			||||||
 | 
					        return View::fetch();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								public/static/js/crypto-js.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								public/static/js/crypto-js.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										131
									
								
								view/order/test_pay.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								view/order/test_pay.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,131 @@
 | 
				
			|||||||
 | 
					<!DOCTYPE html>
 | 
				
			||||||
 | 
					<html>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<head>
 | 
				
			||||||
 | 
						<meta charset="utf-8">
 | 
				
			||||||
 | 
						<title>订单明细</title>
 | 
				
			||||||
 | 
						<link rel="stylesheet" href="/component/pear/css/pear.css" />
 | 
				
			||||||
 | 
						<style>
 | 
				
			||||||
 | 
							.paybtn {
 | 
				
			||||||
 | 
								margin-top: 32px;
 | 
				
			||||||
 | 
								display: flex;
 | 
				
			||||||
 | 
								justify-content: space-evenly;
 | 
				
			||||||
 | 
								align-items: center;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							.paybtn>button {
 | 
				
			||||||
 | 
								display: flex;
 | 
				
			||||||
 | 
								align-items: center;
 | 
				
			||||||
 | 
								width: 115px;
 | 
				
			||||||
 | 
								justify-content: center;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							.paybtn>button>img {
 | 
				
			||||||
 | 
								margin-right: 3px;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						</style>
 | 
				
			||||||
 | 
					</head>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<body>
 | 
				
			||||||
 | 
						<div class="layui-row container">
 | 
				
			||||||
 | 
							<div class="main-container">
 | 
				
			||||||
 | 
								<form id="paytest" class="layui-form layui-form-pane" action="" lay-filter="paytest">
 | 
				
			||||||
 | 
									<div class="layui-form-item">
 | 
				
			||||||
 | 
										<label class="layui-form-label">商品名称</label>
 | 
				
			||||||
 | 
										<div class="layui-input-block">
 | 
				
			||||||
 | 
											<input type="text" name="name" autocomplete="off" class="layui-input" disabled>
 | 
				
			||||||
 | 
										</div>
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
 | 
									<div class="layui-form-item">
 | 
				
			||||||
 | 
										<label class="layui-form-label">订单编号</label>
 | 
				
			||||||
 | 
										<div class="layui-input-block">
 | 
				
			||||||
 | 
											<input type="text" name="out_trade_no" autocomplete="off" class="layui-input" disabled>
 | 
				
			||||||
 | 
										</div>
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
 | 
									<div class="layui-form-item">
 | 
				
			||||||
 | 
										<label class="layui-form-label">收款金额</label>
 | 
				
			||||||
 | 
										<div class="layui-input-block">
 | 
				
			||||||
 | 
											<input type="text" name="money" lay-verify="required|number" autocomplete="off"
 | 
				
			||||||
 | 
												class="layui-input">
 | 
				
			||||||
 | 
										</div>
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
 | 
								</form>
 | 
				
			||||||
 | 
								<div class="layui-form-item">
 | 
				
			||||||
 | 
									<div class="paybtn">
 | 
				
			||||||
 | 
										<button class="pear-btn wxpay">
 | 
				
			||||||
 | 
											<img src="/static/img/wxpay.ico" width="16">
 | 
				
			||||||
 | 
											<span>微信支付</span>
 | 
				
			||||||
 | 
										</button>
 | 
				
			||||||
 | 
										<button class="pear-btn alipay">
 | 
				
			||||||
 | 
											<img src="/static/img/alipay.ico" width="16">
 | 
				
			||||||
 | 
											<span>支付宝</span>
 | 
				
			||||||
 | 
										</button>
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
						</div>
 | 
				
			||||||
 | 
						<script src="/component/layui/layui.js"></script>
 | 
				
			||||||
 | 
						<script src="/component/pear/pear.js"></script>
 | 
				
			||||||
 | 
						<script src="/static/js/crypto-js.min.js"></script>
 | 
				
			||||||
 | 
						<script>
 | 
				
			||||||
 | 
							layui.use(['layer', 'form'], function () {
 | 
				
			||||||
 | 
								let form = layui.form;
 | 
				
			||||||
 | 
								let layer = layui.layer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								const formdata = {
 | 
				
			||||||
 | 
									name: `支付测试<?php echo date('Ymd-His', time()) ?>`,
 | 
				
			||||||
 | 
									out_trade_no: `pay<?php echo date('YmdHis', time()).mt_rand(1000,9999) ?>`,
 | 
				
			||||||
 | 
									money: 1,
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								form.val('paytest', formdata);
 | 
				
			||||||
 | 
								const key = `<?php echo $key ?>`;
 | 
				
			||||||
 | 
								const testdata = {
 | 
				
			||||||
 | 
									pid: `<?php echo $pid ?>`,
 | 
				
			||||||
 | 
									notify_url: window.location.origin,
 | 
				
			||||||
 | 
									return_url: window.location.origin,
 | 
				
			||||||
 | 
									sign_type: 'MD5'
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
								document.querySelector('.wxpay').addEventListener('click', function () {
 | 
				
			||||||
 | 
									crateOrder('wxpay');
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
								document.querySelector('.alipay').addEventListener('click', function () {
 | 
				
			||||||
 | 
									crateOrder('alipay');
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
								// 创建订单
 | 
				
			||||||
 | 
								function crateOrder(paytype) {
 | 
				
			||||||
 | 
									form.submit('paytest', function (data) {
 | 
				
			||||||
 | 
										const field = data.field;
 | 
				
			||||||
 | 
										let newdata = { ...field, ...testdata };
 | 
				
			||||||
 | 
										newdata.type = paytype;
 | 
				
			||||||
 | 
										newdata.sign = getSign(newdata, key);
 | 
				
			||||||
 | 
										const query = new URLSearchParams(newdata);
 | 
				
			||||||
 | 
										window.open(`${window.location.origin}/submit?${query.toString()}`, '_blank');
 | 
				
			||||||
 | 
										return false;
 | 
				
			||||||
 | 
									});
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								// 签名
 | 
				
			||||||
 | 
								function getSign(param = {}, key = '') {
 | 
				
			||||||
 | 
									// 对参数进行排序
 | 
				
			||||||
 | 
									param = Object.keys(param).sort().reduce((obj, key) => {
 | 
				
			||||||
 | 
										obj[key] = param[key];
 | 
				
			||||||
 | 
										return obj;
 | 
				
			||||||
 | 
									}, {});
 | 
				
			||||||
 | 
									let signstr = '';
 | 
				
			||||||
 | 
									for (let k in param) {
 | 
				
			||||||
 | 
										if (k != "sign" && k != "sign_type" && param[k] != '') {
 | 
				
			||||||
 | 
											signstr += k + '=' + param[k] + '&';
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									// 去除最后一个字符 '&'
 | 
				
			||||||
 | 
									signstr = signstr.substring(0, signstr.length - 1);
 | 
				
			||||||
 | 
									// 添加密钥
 | 
				
			||||||
 | 
									signstr += key;
 | 
				
			||||||
 | 
									// 计算 MD5 值
 | 
				
			||||||
 | 
									let sign = CryptoJS.MD5(signstr).toString();
 | 
				
			||||||
 | 
									return sign;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						</script>
 | 
				
			||||||
 | 
					</body>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
@@ -59,7 +59,7 @@
 | 
				
			|||||||
						</select>
 | 
											</select>
 | 
				
			||||||
					</div>
 | 
										</div>
 | 
				
			||||||
				</div>
 | 
									</div>
 | 
				
			||||||
				<div class="layui-form-item">
 | 
									<div class="layui-form-item layui-form-text">
 | 
				
			||||||
					<label class="layui-form-label">查询参数</label>
 | 
										<label class="layui-form-label">查询参数</label>
 | 
				
			||||||
					<div class="layui-input-block">
 | 
										<div class="layui-input-block">
 | 
				
			||||||
						<textarea name="params" placeholder="账号订单查询自定义参数,JSON格式,没有请填 { } " class="layui-textarea"></textarea>
 | 
											<textarea name="params" placeholder="账号订单查询自定义参数,JSON格式,没有请填 { } " class="layui-textarea"></textarea>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -74,6 +74,10 @@
 | 
				
			|||||||
			<i class="layui-icon layui-icon-delete"></i>
 | 
								<i class="layui-icon layui-icon-delete"></i>
 | 
				
			||||||
			删除
 | 
								删除
 | 
				
			||||||
		</button>
 | 
							</button>
 | 
				
			||||||
 | 
							<button class="pear-btn pear-btn-warming pear-btn-md" lay-event="testPay">
 | 
				
			||||||
 | 
								<i class="layui-icon layui-icon-cart"></i>
 | 
				
			||||||
 | 
								支付测试
 | 
				
			||||||
 | 
							</button>
 | 
				
			||||||
	</script>
 | 
						</script>
 | 
				
			||||||
	<script type="text/html" id="account-state">
 | 
						<script type="text/html" id="account-state">
 | 
				
			||||||
		<input type="checkbox" name="state" value="{{d.id}}" lay-skin="switch" lay-text="启用|禁用" lay-filter="accountEnable" {{ d.state == 1 ? 'checked' : '' }} />
 | 
							<input type="checkbox" name="state" value="{{d.id}}" lay-skin="switch" lay-text="启用|禁用" lay-filter="accountEnable" {{ d.state == 1 ? 'checked' : '' }} />
 | 
				
			||||||
@@ -98,7 +102,7 @@
 | 
				
			|||||||
				select.innerHTML = option_str;
 | 
									select.innerHTML = option_str;
 | 
				
			||||||
				form.render('select');
 | 
									form.render('select');
 | 
				
			||||||
			})()
 | 
								})()
 | 
				
			||||||
			
 | 
					
 | 
				
			||||||
			let cols = [[
 | 
								let cols = [[
 | 
				
			||||||
				{ type: 'checkbox' },
 | 
									{ type: 'checkbox' },
 | 
				
			||||||
				{ title: '平 台', field: 'platform', align: 'center', templet: '' },
 | 
									{ title: '平 台', field: 'platform', align: 'center', templet: '' },
 | 
				
			||||||
@@ -154,6 +158,8 @@
 | 
				
			|||||||
							httpJSON('/api/PayManage/delAccount', { ids: select_id })
 | 
												httpJSON('/api/PayManage/delAccount', { ids: select_id })
 | 
				
			||||||
							layer.close(index);
 | 
												layer.close(index);
 | 
				
			||||||
						});
 | 
											});
 | 
				
			||||||
 | 
									} else if (obj.event === 'testPay') {
 | 
				
			||||||
 | 
										account.testPay();
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			});
 | 
								});
 | 
				
			||||||
			// 表单自定义事件监听
 | 
								// 表单自定义事件监听
 | 
				
			||||||
@@ -237,6 +243,17 @@
 | 
				
			|||||||
					layer.msg(rec_info.msg, { icon: 2, time: 1200 }, () => { obj.elem.checked = !obj.elem.checked });
 | 
										layer.msg(rec_info.msg, { icon: 2, time: 1200 }, () => { obj.elem.checked = !obj.elem.checked });
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								// 支付测试
 | 
				
			||||||
 | 
								account.testPay = function () {
 | 
				
			||||||
 | 
									layer.open({
 | 
				
			||||||
 | 
										id: 'iframe-test-pay',
 | 
				
			||||||
 | 
										type: 2,
 | 
				
			||||||
 | 
										title: '支付测试',
 | 
				
			||||||
 | 
										shade: 0.1,
 | 
				
			||||||
 | 
										area: [common.isModile() ? '100%' : '480px', common.isModile() ? '100%' : '320px'],
 | 
				
			||||||
 | 
										content: `/Order/testPay`,
 | 
				
			||||||
 | 
									});
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			// 请求封装
 | 
								// 请求封装
 | 
				
			||||||
			async function httpJSON(url, info) {
 | 
								async function httpJSON(url, info) {
 | 
				
			||||||
				const res = await fetch(url, { method: 'post', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(info) });
 | 
									const res = await fetch(url, { method: 'post', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(info) });
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user