信用卡 《php 5 in practice中文版》里提供的信用卡验证php代码
《php 5 in practice中文版》里提供的信用卡验证php代码 [代码片段(67行)]
<?php //afunctionthatwillacceptandcleanupccnumbers functionstandardize_credit($num){ //removeallnon-digitsfromthestring returnpreg_replace('/[^0-9]/','',$num); } //afunctiontocheckthevalidityofaccnumber //itmustbeprovidedwiththenumberitself,aswellas //acharacterspecifyingthetypeofcc: //m=mastercard,v=visa,d=discover,a=americanexpress functionvalidate_credit($num,$type){ //firstperformtheccspecifictests: //storeafewevaluationswewillneedoften: $len=strlen($num); $d2=substr($num,0,2); //ifvisamuststartwitha4,andbe13or16digitslong: if((($type=='v')&&(($num{0}!=4)|| !(($len==13)||($len==16))))|| //ifmastercard,startwith51-56,andbe16digitslong: (($type=='m')&&(($d2<51)|| ($d2>56)||($len!=16)))|| //ifamericanexpress,startwith34or37,15digitslong: (($type=='a')&&(!(($d2==34)|| ($d2==37))||($len!=15)))|| //ifdiscover:startwith6011and16digitslong (($type=='d')&&((substr($num,0,4)!=6011)|| ($len!=16)))){ //invalidcard: returnfalse; } //ifwearestillhere,thentimetomanipulateanddothemod10 //algorithm.firstbreakthenumberintoanarrayofcharacters: $digits=str_split($num); //nowreverseit: $digits=array_reverse($digits); //doubleeveryotherdigit: foreach(range(1,count($digits)-1,2)as$x){ //doubleit $digits[$x]*=2; //ifthisisnowover10,goaheadandadditsdigits,easiersince //thefirstdigitwillalwaysbe1 if($digits[$x]>9){ $digits[$x]=($digits[$x]-10)+1; } } //now,addallthisvaluestogethertogetthechecksum $checksum=array_sum($digits); //ifthiswasdivisibleby10,thentrue,elseit'sinvalid return(($checksum%10)==0)?true:false; } //checkvariouscreditcardnumbers: $nums=array( '344234534664577'=>'a','3794234534664577'=>'a', '4938748398324'=>'v','4123-1234-5342'=>'v', '5184729384567434'=>'m','5723x2345x2345x6161'=>'m', '6011601160116011'=>'d','6012392563242423'=>'d', ); foreach($numsas$num=>$type){ $st=standardize_credit($num); $valid=validate_credit($st,$type); $output=$valid?'valid':'invalid'; echo"<p>{$st}-{$type}={$output}</p>\n"; } ?>
精彩图集
精彩文章