1
0
Files
helper/application/common/validate/MemberList.php
2020-08-06 14:58:51 +08:00

133 lines
5.3 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
// +------------------------------------------------+
// |http://www.cjango.com |
// +------------------------------------------------+
// | 修复BUG不是一朝一夕的事情等我喝醉了再说吧 |
// +------------------------------------------------+
// | Author: 小陈叔叔 <Jason.Chen> |
// +------------------------------------------------+
namespace app\common\validate;
use think\Validate;
class MemberList extends Validate
{
/**
* 验证规则
* @var array
*/
protected $rule = [
'username' => 'require',
'level' => 'require',
'mobile' => 'require|number|length:11',
'id_card' => 'require|checkIdCard',
'bank' => 'require|chs',
' ' => 'require|number',
'password' => 'require',
'referee' => 'require',
'referee_number' => 'require',
'contact' => 'require',
'contact_number' => 'require',
];
/**
* 提示信息
* @var array
*/
protected $message = [
'username.require' => '姓名必须填写',
'level.require' => '会员级别必须填写',
'mobile.require' => '电话必须填写',
'mobile.number' => '电话必须是数字',
'mobile.length' => '电话号码位数不对应该是11位',
'id_card.require' => '身份证号必须填写',
'id_card.checkIdCard' => '身份证号错误',
'bank.require' => '银行必须填写',
'bank.chs' => '银行只能是中文',
'bank_card.require' => '卡号必须填写',
'bank_card.number' => '卡号必须是数字',
'password.require' => '密码必须填写',
'referee.require' => '推荐人必须填写',
'referee_number.require' => '推荐人编号必须填写',
'contact.require' => '接点人必须填写',
'contact_number.require' => '接点人编号必须填写',
];
/**
* 验证场景
* @var array
*/
protected $scene = [
'add' => ['username', 'level', 'mobile', 'id_card', 'bank', 'bank_card', 'password', 'referee', 'referee_number', 'contact', 'contact_number'],
];
protected function checkIdCard($value, $rule, $data)
{
$idcard = $value;
$City = array(11 => "北京", 12 => "天津", 13 => "河北", 14 => "山西", 15 => "内蒙古", 21 => "辽宁", 22 => "吉林", 23 => "黑龙江", 31 => "上海", 32 => "江苏", 33 => "浙江", 34 => "安徽", 35 => "福建", 36 => "江西", 37 => "山东", 41 => "河南", 42 => "湖北", 43 => "湖南", 44 => "广东", 45 => "广西", 46 => "海南", 50 => "重庆", 51 => "四川", 52 => "贵州", 53 => "云南", 54 => "西藏", 61 => "陕西", 62 => "甘肃", 63 => "青海", 64 => "宁夏", 65 => "新疆", 71 => "台湾", 81 => "香港", 82 => "澳门", 91 => "国外");
$iSum = 0;
$idCardLength = strlen($idcard);
//长度验证
if (!preg_match('/^\d{17}(\d|x)$/i', $idcard) and !preg_match('/^\d{15}$/i', $idcard)) {
return false;
}
//地区验证
if (!array_key_exists(intval(substr($idcard, 0, 2)), $City)) {
return false;
}
// 15位身份证验证生日转换为18位
if ($idCardLength == 15) {
$sBirthday = '19' . substr($idcard, 6, 2) . '-' . substr($idcard, 8, 2) . '-' . substr($idcard, 10, 2);
$d = new \DateTime($sBirthday);
$dd = $d->format('Y-m-d');
if ($sBirthday != $dd) {
return false;
}
$idcard = substr($idcard, 0, 6) . "19" . substr($idcard, 6, 9); //15to18
$Bit18 = self::getVerifyBit($idcard); //算出第18位校验码
$idcard = $idcard . $Bit18;
}
// 判断是否大于2078年小于1900年
$year = substr($idcard, 6, 4);
if ($year < 1900 || $year > 2078) {
return false;
}
//18位身份证处理
$sBirthday = substr($idcard, 6, 4) . '-' . substr($idcard, 10, 2) . '-' . substr($idcard, 12, 2);
$d = new \DateTime($sBirthday);
$dd = $d->format('Y-m-d');
if ($sBirthday != $dd) {
return false;
}
//身份证编码规范验证
$idcard_base = substr($idcard, 0, 17);
if (strtoupper(substr($idcard, 17, 1)) != self::getVerifyBit($idcard_base)) {
return false;
}
return true;
}
// 计算身份证校验码根据国家标准GB 11643-1999
public function getVerifyBit($idcard_base)
{
if (strlen($idcard_base) != 17) {
return false;
}
//加权因子
$factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
//校验码对应值
$verify_number_list = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
$checksum = 0;
for ($i = 0; $i < strlen($idcard_base); $i++) {
$checksum += substr($idcard_base, $i, 1) * $factor[$i];
}
$mod = $checksum % 11;
$verify_number = $verify_number_list[$mod];
return $verify_number;
}
}