2020.02新版

This commit is contained in:
Blokura
2020-02-21 16:20:55 +08:00
parent 45e2415d71
commit a2f29a310b
755 changed files with 95144 additions and 0 deletions

View File

@@ -0,0 +1,21 @@
[config]
;支付插件英文名称,需和目录名称一致,不能有重复
name = "codepay"
;支付插件显示名称
showname = "码支付"
;支付插件作者
author = "码支付"
;支付插件作者链接
link = "https://codepay.fateqq.com/"
;支付插件支持的支付方式,多种方式用英文,隔开可选的有alipay,qqpay,wxpay,bank
types = "alipay,qqpay,wxpay"
;支付插件要求传入的参数以及参数显示名称可选的有appid,appkey,appsecret,appurl,appmchid
inputs = "appid:商户ID,appkey:商户密钥"
;支付插件要求传入的支付方式参数
select = ""

View File

@@ -0,0 +1,33 @@
<?php
#码支付接口配置
$codepay_config['id'] = $channel['appid'];
$codepay_config['key'] = $channel['appkey'];
//字符编码格式 目前支持 gbk GB2312 或 utf-8 保证跟文档编码一致 建议使用utf-8
$codepay_config['chart'] = strtolower('utf-8');
//是否启用免挂机模式 1为启用. 未开通请勿更改否则资金无法及时到账
$codepay_config['act'] = "0"; //认证版则开启 一般情况都为0
/**订单支付页面显示方式
* 1: GET框架云端支付 (简单 兼容性强 自动升级 1分钟可集成)
* 2: POST表单到云端支付 (简单 兼容性强 自动升级)
* 3自定义开发模式 (默认 复杂 需要一定开发能力 手动升级 html/codepay_diy_order.php修改收银台代码)
* 4高级模式(复杂 需要较强的开发能力 手动升级 html/codepay_supper_order.php修改收银台代码)
*/
$codepay_config['page'] = 4; //支付页面展示方式
//支付页面风格样式 仅针对$codepay_config['page'] 参数为 1或2 才会有用。
$codepay_config['style'] = 1; //暂时保留的功能 后期会生效 留意官网发布的风格编号
//二维码超时设置 单位:秒
$codepay_config['outTime'] = 300;//360秒=6分钟 最小值60 不建议太长 否则会影响其他人支付
//最低金额限制
$codepay_config['min'] = 0.01;
//$codepay_config["qrcode_url"] = "./codepay/qrcode.php"; //使用本地二维码
$codepay_config['pay_type'] = 1;

View File

@@ -0,0 +1,54 @@
<?php
/**
* 从本地获取二维码软件版专用。(默认为显示云端上传的二维码)
* 注意:
* 如果你提交的订单为100元 但展示的是1元的二维码 那么订单会不存在 不下发通知
* 如使用的是自定义金额的收款码用户未按金额约定支付 都会是订单不存在。
* Date: 2017/2/14
* Time: 21:51
*/
$money = number_format((float)$_GET['money'], 2, '.', ''); //金额统一保留2位小时
$tag = (int)$_GET['tag'];
$type = (int)$_GET['type'];
if ($type <= 0) $type = 1;
if ($money <= 0) {//这是什么状况 金额都没有。展示no.png
header('Location: img/no.png');
exit(0);
}
/**
* 根据参数转为二维码文件名 (我们只给一个参考 具体根据个人实际开发)
* @param $money 金额
* @param int $type 支付类型
* @param int $tag 支付宝备注
* @param int $act 二维码规则方式
* @return string 返回二维码路径
*
*默认路径格式为qr/支付方式/金额_备注.png 支付宝则为qr/支付方式/金额_备注.png
* 比如100元 微信为/qr/3/100.png 支付宝则为qr/1/100.00_0.png 其中100.00_0.png _0表示备注0 默认为0
*act参数为1则格式为qr/支付方式/金额整数部分/金额小数部分.png 支付宝则为qr/支付方式/金额整数部分/金额小数部分_备注.png
*比如100元 小数部分则是00 100元微信QQ路径为qr/3/100/00.png 100元支付为qr/3/100/00_0.png
*/
function moneyToFileName($money, $type = 1, $tag = 0, $act = 0)
{
if ($act == 1) { //act参数为1则使用的是将金额分成多个文件夹形式
$money_arr = explode(".", $money); //将金额小数点后面部分分开
$name1 = $money_arr[0];
$name2 = count($money_arr) <= 1 ? '00' : $money_arr[1];
$fileName = $type == 1 ? "qr/{$type}/{$name1}/{$name2}_{$tag}.png" : "qr/{$type}/{$name1}/{$name2}.png";
} else { //默认方式 qr/3/100.00.png 支付宝则为qr/1/100.00_0.png
$fileName = $type == 1 ? "qr/{$type}/{$money}_{$tag}.png" : "qr/{$type}/{$money}.png";
}
return $fileName;
}
$qrcode_filename = moneyToFileName($money, $type, $tag, 0); //根据参数生成默认金额二维码地址
if (!file_exists($qrcode_filename)) { //该金额二维码不存在 亲。
//检查你是否有默认收款码 有则使用,没有那别人根本无法付款
$index_fileName = "qr/{$type}/index.png";
$qrcode_filename = file_exists($index_fileName) ? $index_fileName : 'img/no.png';
}
header('Location: ' . $qrcode_filename); //跳转到二维码真实地址

View File

@@ -0,0 +1,44 @@
<?php
/* *
* 码支付异步通知页面
*/
if(!defined('IN_PLUGIN'))exit();
require_once(PAY_ROOT."inc/codepay_config.php");
ksort($_POST); //排序post参数
reset($_POST); //内部指针指向数组中的第一个元素
$sign = '';
foreach ($_POST AS $key => $val) {
if ($val == '') continue;
if ($key != 'sign') {
if ($sign != '') {
$sign .= "&";
$urls .= "&";
}
$sign .= "$key=$val"; //拼接为url参数形式
$urls .= "$key=" . urlencode($val); //拼接为url参数形式
}
}
if (!$_POST['pay_no'] || md5($sign . $codepay_config['key']) != $_POST['sign']) { //不合法的数据 KEY密钥为你的密钥
exit('fail');
} else { //合法的数据
$out_trade_no = daddslashes($_POST['param']);
//流水号
$trade_no = daddslashes($_POST['pay_no']);
$price = (float)$_POST['price'];
if($out_trade_no == TRADE_NO && round($price,2)==round($order['money'],2) && $order['status']==0){
if($DB->exec("update `pre_order` set `status` ='1' where `trade_no`='$out_trade_no'")){
$DB->exec("update `pre_order` set `api_trade_no` ='$trade_no',`endtime` ='$date',`date` =NOW() where `trade_no`='$out_trade_no'");
processOrder($order);
}
}
exit('success');
}
?>

234
plugins/codepay/qrcode.php Normal file
View File

@@ -0,0 +1,234 @@
<?php
if(!defined('IN_PLUGIN'))exit();
require_once(PAY_ROOT."inc/codepay_config.php");
@header('Content-Type: text/html; charset=UTF-8');
$qr=''; //初始化一个默认的二维码
$codepay_path="https://codepay.fateqq.com";
$typename = $DB->getColumn("SELECT name FROM pre_type WHERE id='{$order['type']}' LIMIT 1");
if ($typename == 'wxpay') {
$typeName = '微信';
$type = 3;
} else if ($typename == 'qqpay' || $typename == 'tenpay') {
$typeName = 'QQ';
$type = 2;
} else {
$type = 1;
$typeName = '支付宝';
}
$price = $order['money'];
$param = TRADE_NO;
$pay_id = $clientip;
$data = array(
"id" => $codepay_config['id'],//平台ID号
"type" => $type,//支付方式
"price" => $price,//原价
"pay_id" => $pay_id, //可以是用户ID,站内商户订单号,用户名
"param" => $param,//自定义参数
// "https" => 1,//启用HTTPS
"act" => $codepay_config['act'],
"outTime" => $codepay_config['outTime'],//二维码超时设置
"page" => $codepay_config['page'],//付款页面展示方式
"return_url" => $siteurl.'pay/codepay/return/'.TRADE_NO.'/',//付款后附带加密参数跳转到该页面
"notify_url" => $conf['localurl'].'pay/codepay/notify/'.TRADE_NO.'/',//付款后通知该页面处理业务
"style" => $codepay_config['style'],//付款页面风格
"user_ip" => $clientip,//用户IP
"out_trade_no" => $param,//单号去重复
"createTime" => time(),//服务器时间
"qrcode_url" => $codepay_config['qrcode_url'],//本地化二维码
"chart" => strtolower('utf-8')//字符编码方式
//其他业务参数根据在线开发文档,添加参数.文档地址:https://codepay.fateqq.com/apiword/
//如"参数名"=>"参数值"
);
function create_link($params,$codepay_key,$host=""){
ksort($params); //重新排序$data数组
reset($params); //内部指针指向数组中的第一个元素
$sign = '';
$urls = '';
foreach ($params AS $key => $val) {
if ($val == '') continue;
if ($key != 'sign') {
if ($sign != '') {
$sign .= "&";
$urls .= "&";
}
$sign .= "$key=$val"; //拼接为url参数形式
$urls .= "$key=" . urlencode($val); //拼接为url参数形式
}
}
$key = md5($sign . $codepay_key);//替换为自己的密钥
$query = $urls . '&sign=' . $key; //创建订单所需的参数
$apiHost=$host?$host:"http://api2.xiuxiu888.com/creat_order/?";
$url = $apiHost.$query; //支付页面
return array("url"=>$url,"query"=>$query,"sign"=>$sign,"param"=>$urls);
}
$back=create_link($data,$codepay_config['key']);
$user_data = array(
"return_url" => $siteurl.'pay/codepay/return/'.TRADE_NO.'/',
"type" => $type,
"outTime" => $codepay_config["outTime"],
"codePay_id" => $codepay_config["id"],
"out_trade_no" => $param,
"price" => $price,
'money'=>$price,
'order_id'=>$param,
"subject"=>$row['name']
); //传给网页JS去执行
$user_data["qrcode_url"] = $codepay_config["qrcode_url"];
//中间那log 默认为8秒后隐藏
//改为自己的替换img目录下的use_开头的图片 你要保证你的二维码遮挡不会影响扫码
//二维码容错率决定你能遮挡多少部分
$user_data["logShowTime"] = $user_data["qrcode_url"]?1:8*1000;
$codepay_json = get_curl($back['url']);
if(empty($codepay_json)){
$data['call']="callback";
$data['page']="3";
$back=create_link($data,$codepay_config['key']);
$codepay_html='<script src="'.$back['url'].'"></script>';
}else{
$codepay_data = json_decode($codepay_json);
$qr = $codepay_data ? $codepay_data->qrcode : '';
$user_data["money"]=$codepay_data&&$codepay_data->money ? $codepay_data->money : $price;
$codepay_html="<script>callback({$codepay_json})</script>";
}
?><!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=<?php echo $codepay_config['chart'] ?>">
<meta http-equiv="Content-Language" content="zh-cn">
<meta name="apple-mobile-web-app-capable" content="no"/>
<meta name="apple-touch-fullscreen" content="yes"/>
<meta name="format-detection" content="telephone=no,email=no"/>
<meta name="apple-mobile-web-app-status-bar-style" content="white">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<title><?php echo $typeName ?>扫码支付</title>
<link href="<?php echo $codepay_path?>/css/wechat_pay.css" rel="stylesheet" media="screen">
<link href="//cdn.staticfile.org/toastr.js/latest/css/toastr.min.css" rel="stylesheet">
<link href="//cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
</head>
<body>
<div class="body">
<h1 class="mod-title">
<span class="ico_log ico-<?php echo $type ?>"></span>
</h1>
<div class="mod-ct">
<div class="order" style="color:red;font-size:16px">请务必规定时间内支付下面显示的金额
</div>
<div class="amount" style="position: relative;" ><span id="money">¥<?php echo $price ?></span><div style="position: absolute;font-size: 10px;top: 29px;left: 75%;"><a href="#" class="copy" id="copy" data-clipboard-text="<?php echo $user_data['money']?>">复制金额</a></div></div>
<div class="qrcode-img-wrapper" data-role="qrPayImgWrapper">
<div data-role="qrPayImg" class="qrcode-img-area">
<div class="ui-loading qrcode-loading" data-role="qrPayImgLoading" style="display: none;">加载中</div>
<div style="position: relative;display: inline-block;">
<img id='show_qrcode' alt="加载中..." src="<?php echo $qr ?>" width="210" height="210" style="display: block;">
<img onclick="$('#use').hide()" id="use" src="<?php echo $codepay_path?>/img/use_<?php echo $type ?>.png"
style="position: absolute;top: 50%;left: 50%;width:32px;height:32px;margin-left: -21px;margin-top: -21px">
</div>
</div>
</div>
<!-- 这里加一些自己的提示-->
<div class="time-item" id="msg">
<h1>二维码过期时间</h1>
<strong id="hour_show">0时</strong>
<strong id="minute_show">0分</strong>
<strong id="second_show">0秒</strong>
</div>
<div class="tip">
<div class="ico-scan"></div>
<div class="tip-text">
<p>请使用<?php echo $typeName ?>扫一扫</p>
<p>扫描二维码完成支付</p>
<p><div id="kf" style="display:none;"></div></p>
</div>
</div>
<div class="detail" id="orderDetail">
<dl class="detail-ct" id="desc" style="display: none;">
</dl>
<a href="javascript:void(0)" class="arrow"><i class="ico-arrow"></i></a>
</div>
<div class="tip-text">
</div>
</div>
<div class="foot">
<div class="inner">
<p>手机用户可保存上方二维码到手机中</p>
<p>在<?php echo $typeName ?>扫一扫中选择“相册”即可</p>
<p><div id="kfqq"></div></p>
</div>
</div>
</div>
<div class="copyRight"></div>
<!--注意下面加载顺序 顺序错乱会影响业务-->
<script src="<?php echo $codepay_path?>/js/jquery-1.10.2.min.js"></script>
<!--[if lt IE 8]>
<script src="<?php echo $codepay_path?>/js/json3.min.js"></script><![endif]-->
<script>
var user_data =<?php echo json_encode($user_data);?>
</script>
<script src="<?php echo $codepay_path?>/js/notify.js"></script>
<script src="<?php echo $codepay_path?>/js/codepay_util.js?v=2.1"></script>
<?php echo $codepay_html;?>
<script src="//cdn.staticfile.org/toastr.js/latest/js/toastr.min.js"></script>
<script src="//cdn.staticfile.org/clipboard.js/1.7.1/clipboard.min.js"></script>
<script>
setTimeout(function () {
$('#use').hide()
}, user_data.logShowTime || 10000);
check_pay = function () {
$.get("/getshop.php?trade_no=" + user_data.out_trade_no + "&r=" + Math.random(1), function (result) {
if (result.code == 1) {
alert('您所购买的商品已付款成功,感谢购买!');
window.location.href = result.backurl;
} else {
setTimeout(function () {
check_pay() }, 3000);//3秒检测一次自己的数据是否成功
}
}, 'json');
}
check_pay();
var clipboard = new Clipboard('.copy');
clipboard.on('success', function (e) {
toastr.success("复制成功,可扫码付款时候粘贴到金额栏付款");
});
clipboard.on('error', function(e) {
document.querySelector('.copy');
toastr.warning("复制失败,请记住下必须付款的金额 不能多不能少否则不能成功");
});
</script>
</body>
</html>

View File

@@ -0,0 +1,45 @@
<?php
/* *
* 码支付同步通知页面
*/
if(!defined('IN_PLUGIN'))exit();
require_once(PAY_ROOT."inc/codepay_config.php");
ksort($_GET); //排序get参数
reset($_GET); //内部指针指向数组中的第一个元素
$sign = '';
foreach ($_GET AS $key => $val) {
if ($val == '') continue;
if ($key != 'sign') {
if ($sign != '') {
$sign .= "&";
$urls .= "&";
}
$sign .= "$key=$val"; //拼接为url参数形式
$urls .= "$key=" . urlencode($val); //拼接为url参数形式
}
}
if (!$_GET['pay_no'] || md5($sign . $codepay_config['key']) != $_GET['sign']) { //不合法的数据 KEY密钥为你的密钥
sysmsg('验证失败!');
} else { //合法的数据
$out_trade_no = daddslashes($_GET['param']);
//流水号
$trade_no = daddslashes($_GET['pay_no']);
$price = (float)$_GET['price'];
if($out_trade_no == TRADE_NO && round($price,2)==round($order['money'],2)){
$url=creat_callback($order);
if($order['status']==0){
if($DB->exec("update `pre_order` set `status` ='1' where `trade_no`='$out_trade_no'")){
$DB->exec("update `pre_order` set `api_trade_no` ='$trade_no',`endtime` ='$date',`date` =NOW() where `trade_no`='$out_trade_no'");
processOrder($order,false);
}
echo '<script>window.location.href="'.$url['return'].'";</script>';
}else{
echo '<script>window.location.href="'.$url['return'].'";</script>';
}
}else{
sysmsg('订单信息校验失败');
}
}
?>

View File

@@ -0,0 +1,5 @@
<?php
if(!defined('IN_PLUGIN'))exit();
echo "<script>window.location.href='/pay/codepay/qrcode/{$trade_no}/?sitename={$sitename}';</script>";