銀行カード番号の合法性検証小結
銀行カード番号の合法性の検証について、ネット上の主流の検証アルゴリズムはluhnアルゴリズムで、コードは以下の通りである.
しかし、一部の地方的な商業銀行では、このアルゴリズムは適用されず、実際の応用では平安銀行(元深セン発展銀行16ビットデビットカード)の古いカードがluhnアルゴリズムを通過できないことが分かった.
仕方なく銀行カードBin号の合法性を検証するしかなく、実際のカード番号の合法性は金融支払いインタフェースに移管されて判断され、アルゴリズムのサポートはありません.の
ネット上で最も多くBin号の合法性を検証するのが最も多くて、コードは本当に面倒で、だからネット上で各種の調査、最終的に良心のインターフェースを発見して、アリが提供したBin号の無料のインターフェースを検証します:
https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8&cardNo=検証対象銀行カード番号&cardBinCheck=true
jsonデータを返すには、次のようにします.
フロントページで使用しようとしたが、ドメイン間操作にかかわるためjsonpを使用したが、返されたデータブラウザは常に受信データ構文エラーを報告し、具体的な原因が見つからず、使用コードは以下の通りである.
バックグラウンドで正常に呼び出すことができ、http Getメソッドで呼び出すことができます.コードは次のとおりです.
{"bank":"ICBC","validated":true,"cardType":"DC","key":"6212261106001211212","messages":[],"stat":"ok"} ICBC
アリペイ銀行パートナーページ:https://ab.alipay.com/i/yinhang.htm
アリペイ銀行の略号ページ:https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.M7qlQG&treeId=63&articleId=103763&docType=1
参照ドキュメント:https://www.digglife.net/articles/cnbankcard.html
/**
* Luhm
* @author mengrang
* @since 2016/09/18
*/
public static char getBankCardCheckCode(String nonCheckCodeCardId){
if(nonCheckCodeCardId == null || nonCheckCodeCardId.trim().length() == 0
|| !nonCheckCodeCardId.matches("\\d+")||nonCheckCodeCardId.trim().length()<15
||nonCheckCodeCardId.trim().length()>18) {
// N
return 'N';
}
char[] chs = nonCheckCodeCardId.trim().toCharArray();
int luhmSum = 0;
// luh
for(int i = chs.length - 1, j = 0; i >= 0; i--, j++) {
int k = chs[i] - '0';
if(j % 2 == 0) { //
k *= 2;
k = k / 10 + k % 10;
}
luhmSum += k;
}
return (luhmSum % 10 == 0) ? '0' : (char)((10 - luhmSum % 10) + '0');
}
銀行カード番号の最後の番号はチェックボックスです.しかし、一部の地方的な商業銀行では、このアルゴリズムは適用されず、実際の応用では平安銀行(元深セン発展銀行16ビットデビットカード)の古いカードがluhnアルゴリズムを通過できないことが分かった.
仕方なく銀行カードBin号の合法性を検証するしかなく、実際のカード番号の合法性は金融支払いインタフェースに移管されて判断され、アルゴリズムのサポートはありません.の
ネット上で最も多くBin号の合法性を検証するのが最も多くて、コードは本当に面倒で、だからネット上で各種の調査、最終的に良心のインターフェースを発見して、アリが提供したBin号の無料のインターフェースを検証します:
https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8&cardNo=検証対象銀行カード番号&cardBinCheck=true
jsonデータを返すには、次のようにします.
{"bank":"SPABANK","validated":true,"cardType":"DC","key":"6225380004804588","messages":[],"stat":"ok"}
{"bank":"BJBANK","validated":true,"cardType":"CC","key":"1475288866977-8125-10.208.0.26-684929885","messages":[],"stat":"ok"}
{"validated":false,"key":"62129611060012231","stat":"ok","messages":[{"errorCodes":"CARD_BIN_NOT_MATCH","name":"cardNo"}]}
このインタフェースは、銀行Bin番号の正当性を返すかどうか、所属銀行(bank)、銀行カードタイプ(cardType,DC:デビットカード、CC:クレジットカード)である.フロントページで使用しようとしたが、ドメイン間操作にかかわるためjsonpを使用したが、返されたデータブラウザは常に受信データ構文エラーを報告し、具体的な原因が見つからず、使用コードは以下の通りである.
$.ajax({
url: 'https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8&cardNo='+cardNum+'&cardBinCheck=true',
type: "get",
dataType: "jsonp",
async:false,
jsonp:'callback',
jsonpCallback:'success_jsonpCallback',
success: function(data) {
var ob = data;
}
});
Firebugは、常にデータが欠落していることを示す";"jsは正常に実行できません.これもあまりよく知られていないので、後で研究する機会があります.バックグラウンドで正常に呼び出すことができ、http Getメソッドで呼び出すことができます.コードは次のとおりです.
public static String HttpGet(String url) {
// HttpClient ;
System.setProperty("org.apache.commons.logging.Log","org.apache.commons.logging.impl.SimpleLog");
System.setProperty("org.apache.commons.logging.simplelog.showdatetime","true");
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.commons.httpclient","stdout");
HttpClient httpClient = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
HttpResponse response = null;
HttpEntity httpEntity = null;
String content = null;
try {
response = httpClient.execute(get);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
// gzip,
if(!ObjectUtil.isEmpty(response.getLastHeader("Content-Encoding")) && (response.getLastHeader("Content-Encoding").toString()).indexOf("gzip")>=0){
response.setEntity(new GzipDecompressingEntity(response.getEntity()));
}
httpEntity = response.getEntity();
content = EntityUtils.toString(httpEntity);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != httpEntity) {
try {
httpEntity.consumeContent();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return content;
}
public static void main(String[] args) throws IOException {
String url = "https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8&cardNo=621226***600******2&cardBinCheck=true";
String res = HttpClientUtil.HttpGet(url);
System.out.println(res);
JSONObject jsonOb = JSON.parseObject(res);
String bank = jsonOb.getString("bank");
System.out.println(bank);
}
印刷データは次のとおりです.{"bank":"ICBC","validated":true,"cardType":"DC","key":"6212261106001211212","messages":[],"stat":"ok"} ICBC
アリペイ銀行パートナーページ:https://ab.alipay.com/i/yinhang.htm
アリペイ銀行の略号ページ:https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.M7qlQG&treeId=63&articleId=103763&docType=1
参照ドキュメント:https://www.digglife.net/articles/cnbankcard.html