共计 6864 个字符,预计需要花费 18 分钟才能阅读完成。
什么是集体免签领取
集体免签领取就是给集体用的领取接口,个别的领取接口都须要营业执照能力申请,集体很难申请的到,或者是没有资质去申请,要和领取商进行签约的。免签,顾名思义就是不须要签约。那么集体免签领取就有市场了,就是为了解决集体无奈轻易申请到领取接口的问题。
免签的计划有很多种
- APP 监听收款码的领取后果,而后批改页面的领取后果。
- 二次清理。款先到领有官网领取接口的商户中,由商户给你结算。
- Xposed 微信插件实现全自动监听创立收款码、以及收款过程,容易封号。
计划其实有很多种,然而以上的计划都有不少的毛病,当然这些计划仍有不少人在用,没方法,的确是解决问题的一种方法。而本次文章我也是通过简略的技术开发实现第一种 APP 监听收款码的免签领取形式。
APP 监听收款码的领取后果
整个过程很简略:
拜访 URL -> 查看数据库 2 分钟内未领取的订单金额 -> 如果 2 分钟内未领取的订单金额中存在以后订单一样的金额,须要在以后金额根底上 +0.01 元用于辨别订单的唯一性 -> 用户扫码领取 -> 安卓手机 APP 监听到这笔订单的收款 -> 将收款金额异步发送到服务器 -> 服务器批改数据库该笔订单金额的领取状态 -> 扫码页面始终在轮询订单的领取状态,发现已领取就批改页面的领取后果 -> 实现领取。
上代码
index.php
该页面是用于创立订单的,其中 $order_price = 0.01;
就是创立一笔 0.01 元的订单。创立订单前,程序会查询数据库来确定以后金额是否存在未领取的订单,如果存在,需领取的金额会在以后订单金额根底上 +0.01 元。
为什么要这么做?因为 APP 监听只能监听到收到了多少钱,无奈监听到订单号,所以无奈辨别这个金额是你领取的还是其他人领取的。
所以在以后订单有效期内,你须要留神两件事,第一,你这个程序的访问量肯定不能太高,不容许高并发的状况呈现,适宜小众,小规模,小流量的业务应用,一旦人多了,短时间内订单量多了,很难做到精准的监听领取后果。
<!DOCTYPE html> | |
<html> | |
<head> | |
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> | |
<meta http-equiv="X-UA-Compatible" content="IE=edge"> | |
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0,viewport-fit=cover"> | |
<meta charset="utf-8"> | |
<script src="./js/jquery.min.js"></script> | |
<link rel="stylesheet" href="./css/style.css"> | |
<title> 微信赞叹码免签约领取实现原理 Demo</title> | |
</head> | |
<body onload="clock(120)"> | |
<?php | |
// 数据库配置 | |
include './Db.php'; | |
// 实例化类 | |
$db = new DB_API($config); | |
// 订单号 | |
$order_num = date('Ymd').time(); | |
// 订单金额 | |
$order_price = 0.01; | |
// 获取未领取订单列表 | |
$getOrderList = $db->set_table('mqpay_order')->findAll(['order_status' => 1]); | |
// 遍历订单 | |
$orderNoExpire = array(); | |
for ($i = 0; $i < count($getOrderList); $i++) { | |
// 订单工夫 | |
$order_time = json_decode(json_encode($getOrderList[$i]))->order_time; | |
// 订单金额 | |
$order_money = json_decode(json_encode($getOrderList[$i]))->order_money; | |
// 获取 2 分钟未领取的订单 | |
if(countTimes(time(),strtotime($order_time)) <= 2){ | |
// 如果存在 | |
$orderNoExpire[] = $order_money;} | |
} | |
// 判断是否有 2 分钟未领取的订单 | |
if(count($orderNoExpire) == 0){$needPay = $order_price;}else{ | |
// 获取 2 分钟未领取的订单的最大金额 +0.01 | |
$needPay = max($orderNoExpire) + 0.01; | |
} | |
// 创立订单 | |
creatOrder($order_num,$order_price,$needPay,$db); | |
// 创立订单 | |
function creatOrder($order_num,$order_price,$needPay,$db){ | |
// 订单参数 | |
$createOrder = [ | |
'order_num' => $order_num, | |
'order_price' => $order_price, | |
'order_money' => $needPay, | |
]; | |
// 创立 | |
$createOrderResult = $db->set_table('mqpay_order')->add($createOrder); | |
if($createOrderResult){ | |
// 胜利 | |
echo '<div class="payInfoCard"> | |
<div class="header"> 里客云科技 </div> | |
<div class="moneyCard"> | |
<div class="text"> 领取金额 </div> | |
<div class="money"><span class="rmb">¥</span>'.$needPay.'</div> | |
<!-- 二维码 --> | |
<img src="./img/zsm.jpg" id="zsmQrcode" class="zsmQrcode" /> | |
<p class="payWarning"> 请辨认上方赞叹码 </p> | |
<p class="payWarning"> 点击 <span class="blueFont"> 其余金额 </span> 输出 '.$needPay.' 元 </p> | |
<p class="payWarningMini"> 输出的金额必须要完全一致 </p> | |
<p id="orderExpireTime"></p> | |
<p id="orderNum" style="display:none;">'.$order_num.'</p> | |
<p id="needPay" style="display:none;">'.$needPay.'</p> | |
</div> | |
</div> | |
<!-- 提醒 --> | |
<p class="payTips"> 咱们通过机器人监测本次领取 <br/> 领取后会立即显示领取后果 <br/> 领取后没显示领取后果请分割人工解决 <br/> 人工微信号:sansure2016</p>'; | |
}else{ | |
// 失败 | |
echo '<div class="payInfoCard"> | |
<div class="header"> 里客云科技 </div> | |
<div class="moneyCard" style="padding:20px 20px;"> | |
创立订单失败!</div> | |
</div>'; | |
} | |
} | |
// 计算工夫戳的差值 | |
function countTimes($begin,$end){ | |
$begintimes = $begin; | |
$endtimes = $end; | |
$timediff = abs($endtimes - $begintimes); | |
$days = intval($timediff / 86400); | |
$remain = $timediff % 86400; | |
$hours = intval($remain / 3600); | |
$remain = $remain % 3600; | |
$mins = intval($remain / 60); | |
$secs = $remain % 60; | |
return $mins; | |
} | |
?> | |
<script> | |
// 每 2 秒获取一次领取后果 | |
var checkPayInterval = setInterval('checkPay()',2000); | |
// 获取领取后果 | |
function checkPay(){ | |
// 获取订单号和领取金额 | |
var orderNum = $("#orderNum").text(); | |
var needPay = $("#needPay").text(); | |
$.ajax({ | |
type: "GET", | |
url: "./checkPay.php?order_num="+orderNum+"&order_money="+needPay, | |
success: function(res){ | |
// 判断领取后果 | |
if(res.code == 200){console.log('领取胜利'); | |
$("#zsmQrcode").prop("src","./img/success.png"); | |
$('#orderExpireTime').css('display','none'); | |
clearInterval(checkPayInterval); | |
}else{console.log(res.msg); | |
} | |
} | |
}); | |
} | |
// 倒计时 | |
function clock(times){ | |
// 获取时分秒 | |
var h=parseInt(times/3600); | |
var m=parseInt((times%3600)/60); | |
var s=(times%3600)%60; | |
// 在页面中显示倒计时 | |
$('#orderExpireTime').html(m+"分"+s+"秒后过期"); | |
// 倒计时 | |
if(times > 0){ | |
times = times-1; | |
setTimeout(function (){clock(times); | |
}, 1000); | |
}else{ | |
// 显示订单过期 | |
$("#zsmQrcode").prop("src","./img/expire.png"); | |
$('#orderExpireTime').text('订单已过期,请刷新页面!'); | |
// 完结轮询 | |
clearInterval(checkPayInterval); | |
console.log('订单过期,进行监听'); | |
} | |
} | |
</script> | |
</body> | |
</html> |
checkPay.php
这个是用于订单页面实时监听领取后果的,每 2 秒就查一次数据库获取订单的领取后果,2 分钟后未领取会进行查问。
<?php | |
// 页面编码 | |
header("Content-type:application/json"); | |
// 数据库配置 | |
include './Db.php'; | |
// 实例化类 | |
$db = new DB_API($config); | |
// 获取订单号和领取金额 | |
$order_num = $_GET['order_num']; | |
$order_money = $_GET['order_money']; | |
// 依据订单号和订单金额来查问领取后果 | |
$getOrderPayStatus = $db->set_table('mqpay_order')->find(['order_num'=>$order_num,'order_money'=>$order_money]); | |
// 判断领取后果 | |
if($getOrderPayStatus){ | |
// 领取状态 | |
$order_status = json_decode(json_encode($getOrderPayStatus))->order_status; | |
if($order_status == 2){ | |
// 领取胜利 | |
$payResult = array( | |
'code' => 200, | |
'msg' => '领取胜利' | |
); | |
}else{ | |
// 未领取 | |
$payResult = array( | |
'code' => 202, | |
'msg' => '未领取' | |
); | |
} | |
}else{ | |
// 无后果 | |
$payResult = array( | |
'code' => 201, | |
'msg' => '未领取' | |
); | |
} | |
// 返回 JSON | |
echo json_encode($payResult,JSON_UNESCAPED_UNICODE); | |
?> |
notify.php
这个是异步回调,在 APP 监听软件须要配置这个文件的 URL 和传递的参数,将监听到的金额 POST 给你的服务器而后批改数据库的领取后果,以实现领取回调的目标。
<?php | |
// 页面编码 | |
header("Content-type:application/json"); | |
// 原文 | |
$orderMsg = $_GET['orderMsg']; | |
// 数据库配置 | |
include './Db.php'; | |
// 实例化类 | |
$db = new DB_API($config); | |
// 订单金额、需领取的金额、告诉原文、db 实例 | |
updateOrder($orderMsg,$db); | |
// 批改领取后果 | |
function updateOrder($orderMsg,$db){ | |
// 截取 | |
// 示例:二维码赞叹到账 1.00 元 | |
// 截取【到账】前面的 | |
$money_1 = substr($orderMsg, strripos($orderMsg, "到账") + 6); | |
// 截取【元】后面的 | |
$money_2 = substr($money_1, 0, strrpos($money_1, "元")); | |
// 更新订单 | |
$updateOrderResult = $db->set_table('mqpay_order')->update(['order_status'=>1,'order_money'=>$money_2],['order_status'=>2,'order_paytime'=>time(),'order_msg'=>$orderMsg]); | |
if($updateOrderResult){ | |
// 胜利 | |
$ret = array( | |
'code' => 200, | |
'msg' => '领取胜利', | |
'order_num' => $order_num, | |
'order_money' => $money_2, | |
'order_msg' => $orderMsg | |
); | |
}else{ | |
// 失败 | |
$ret = array( | |
'code' => 200, | |
'msg' => '领取失败', | |
'order_num' => $order_num | |
); | |
} | |
} | |
// 返回 JSON | |
echo json_encode($ret,JSON_UNESCAPED_UNICODE); | |
?> |
残缺代码
以上 3 个文件是外围代码,仅作技术剖析实现原理。残缺的代码波及到款式、图片、数据库操作类、以及数据库表 SQL 语句、监听 APP 源码及安装包。
Demo 图片
页面也是非常简单的,也是由自己设计,页面精简好看。
监听 APP 配置
监听 APP 配置也挺简略的,只须要将 notify.php 的线上 URL 配置至 APP 即可。具体操作请看截图:
1、关上 APP,抉择 【发送通道】 点击 【Webhook】,抉择【GET 申请】,输出 notify.php 所在服务器的 URL,上面的参数填写【orderMsg=[msg]】 即可。
2、抉择【转发规定】,点击【利用】,增加转发规定,【APP 包名】,抉择【是】,包名输出【com.tencent.mm】,抉择的发送通道是上一步你创立的通道,下方的模板间接抉择告诉内容即可。
到这里,APP 根本实现配置,而后将这个 APP 的主动启动开启,以及退出电池优化白名单,保障这个 APP 能始终在后盾运行不被杀死。
赞叹码获取
为什么用赞叹码而不必收款码?因为收款码更容易被风控,收款码更加适宜面对面扫码收款,而不适宜线上近程收款,因为你的每一笔领取,都会记录付款 ip 地址,定位等信息,扫码次数多了,就会被零碎判断近程付款,容易触发风控。赞叹码是用于网络上的赞叹应用,相对来说是比收款码平安的。
取得本人的赞叹码后,将赞叹码的那局部裁剪进去,替换掉源码中 zsm.jpg
这个文件就行了。赞叹码是能够设置赞叹的疏导语的,能够将疏导语批改为【请点击其余金额输出】,疏导用户。
源码下载
这个源码只有单页面,没有后盾,只适宜集体单页部署应用或者钻研、学习、二次开发,不适宜开箱即用,当然其实你有点根底,也算是开箱即用,上传到服务器,批改数据库配置,导入数据库表,配置好赞叹码,配制好 APP 异步回调,也是能够用来做单页的收款的,只有你的金额是固定的,的确是开箱即用。
JXU1RkFFJXU0RkUxJXU1M0Y3JXVGRjFBc2Fuc3VyZTIwMTYlMjAlMjAldTUyQTAldTYyMTEldThCRjcldTU5MDcldTZDRTgldUZGMUEldTUxNEQldTdCN0UldTY1MkYldTRFRDgldTZFOTAldTc4MDEldUZGMDgldThCRjcldTYyMTEldTU1OUQldTY3NkYldTU0OTYldTU1NjEldTUzNzMldTUzRUYldTgzQjcldTUzRDYldTUyMzAldTZFOTAldTc4MDEldUZGMDk=
(请解密以上的 base64 编码)
作者
TANKING