Android号码认证接入指南
2019.06.25 17:46:36
SDK说明
一键登录SDK提供移动与电信的一键登录及本机校验功能
SDK集成
1、添加aar包依赖
将从官网下载下来的一键登录aar包放到项目的libs目录下,然后在模块的build.gradle中的dependencies添加相关依赖
示例:
dependencies {
implementation(name: 'libary-release', ext: 'aar')//aar包具体名称请以官网下载下来为准
implementation 'com.google.code.gson:gson:2.8.5' // SDK内部用到,需要配置
implementation 'com.squareup.okhttp3:okhttp:3.3.1' // SDK内部用到,需要配置
}
然后在app的build.gradle的android下添加
repositories {
flatDir {
dirs 'libs'
}
}
SDK接口
QuickLogin
本机校验和一键登录功能的提供类,主要提供获取单例,预取号,本机校验/一键登录,设置预取url等接口
1 获取QuickLogin单例
QuickLogin login = QuickLogin.getInstance(getApplicationContext(), BUSINESS_ID);// BUSINESS_ID为从易盾官网申请的业务id
2 预取号(一键登录前务必先调用该接口获取手机掩码)
login.prefetchMobileNumber(new QuickLoginPreMobileListener() {
@Override
public void onGetMobileNumberSuccess(String YDToken, final String mobileNumber) {
}
@Override
public void onGetMobileNumberError(String YDToken, final String msg) {
}
});
3 一键登录
NOITE:调用一键登录接口前请务必调用预取号接口,在预取号接口的成功回调中调用一键登录接口,获取运营商token与易盾token
API定义:
/**
* 一键登录功能,使用该接口前需要先调用fetchPreviewMobileNumber接口进行预取号
*
* @param listener 回调监听器
*/
public void onePass(final QuickLoginTokenListener listener)
使用示例
login.onePass(new QuickLoginTokenListener() {
@Override
public void onGetTokenSuccess(final String YDToken, final String accessCode) {
Log.d(TAG, String.format("yd token is:%s accessCode is:%s", YDToken, accessCode));
tokenValidate(YDToken, accessCode, true);
}
@Override
public void onGetTokenError(String YDToken, String msg) {
Log.d(TAG, "获取运营商token失败:" + msg);
}
});
4 本机校验
API定义:
public void getToken(final String mobileNumber, final QuickLoginTokenListener listener)
第一个参数表示用户输入的进行本机校验的手机号码,第二个参数是获取token的回调监听器
使用示例:
login.getToken(mobileNumber, new QuickLoginTokenListener() {
@Override
public void onGetTokenSuccess(final String YDToken, final String accessCode) {
runOnUiThread(new Runnable() {
@Override
public void run() {
// Toast.makeText(getApplicationContext(), "获取Token成功" + YDToken + accessCode, Toast.LENGTH_LONG).show();
Log.d(TAG, "获取Token成功" + YDToken + accessCode);
tokenValidate(YDToken, accessCode, false);
}
});
}
@Override
public void onGetTokenError(final String YDToken, final String msg) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "获取Token失败" + YDToken + msg, Toast.LENGTH_LONG).show();
}
});
}
});
5 设置预取数据url
public void setPreCheckUrl(String url)
QuickLoginPreMobileListener
预取号的回调监听器,接入者需要实现该接口的如下2个抽象方法
public abstract class QuickLoginPreMobileListener implements QuickLoginListener {
/**
* @param YDToken 易盾Token
* @param mobileNumber 获取的手机号码掩码
*/
void onGetMobileNumberSuccess(String YDToken, String mobileNumber);
/**
* @param YDToken 易盾Token
* @param msg 获取手机号掩码失败原因
*/
void onGetMobileNumberError(String YDToken, String msg);
}
QuickLoginTokenListener
一键登录或本机校验的获取运营商accessToken的回调监听器,接入者需要实现该接口的如下2个抽象方法
public abstract class QuickLoginTokenListener implements QuickLoginListener {
/**
* @param YDToken 易盾token
* @param accessCode 运营商accessCode
*/
void onGetTokenSuccess(String YDToken, String accessCode);
/**
* @param YDToken 易盾token
* @param msg 出错提示信息
*/
void onGetTokenError(String YDToken, String msg);
}
使用步骤
1创建QuickLogin对象实例
QuickLogin login = QuickLogin.getInstance(getApplicationContext(),
2根据本机校验或一键登录需求调用对应的接口
2.1 一键登录
2.1.1 调用prefetchMobileNumber接口预取号
login.prefetchMobileNumber(new QuickLoginPreMobileListener() {
@Override
public void onGetMobileNumberSuccess(String YDToken, final String mobileNumber) {
// 在该成功回调中能够获取到此次请求的易盾token以及预取号获取的手机掩码
}
@Override
public void onGetMobileNumberError(String YDToken, final String msg) {
// 在该错误回调中能够获取到此次请求的易盾token以及预取号获取手机掩码失败的原因
}
});
2.1.1 调用onePass一键登录
login.onePass(new QuickLoginTokenListener() {
@Override
public void onGetTokenSuccess(final String YDToken, final String accessCode) {
Log.d(TAG, String.format("yd token is:%s accessCode is:%s", YDToken, accessCode));
// 在一键登录获取token的成功回调中使用易盾token和运营商token去做token的验证,具体验证规则请参看服务端给出的说明文档
tokenValidate(YDToken, accessCode, true);
}
@Override
public void onGetTokenError(String YDToken, String msg) {
Log.d(TAG, "获取运营商token失败:" + msg);
// 一键登录获取token失败的回调
}
});
2.2 本机校验
调用getToken接口进行本机校验
// 本机校验获取token
login.getToken(mobileNumber, new QuickLoginTokenListener() {
@Override
public void onGetTokenSuccess(final String YDToken, final String accessCode) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "获取Token成功" + YDToken + accessCode, Toast.LENGTH_LONG).show();
Log.d(TAG, "获取Token成功" + YDToken + accessCode);
tokenValidate(YDToken, accessCode, false);
}
});
}
@Override
public void onGetTokenError(final String YDToken, final String msg) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "获取Token失败" + YDToken + msg, Toast.LENGTH_LONG).show();
}
});
}
});
完整demo代码示例
public class LoginActivity extends AppCompatActivity {
public static final String TAG = "QuickLogin";
private static String BUSINESS_ID;
private static String mSecretKey;
private static String mSecretId;
private static String mVerifyUrl, mOnePassUrl;
private boolean isTest = false;
private String mMobileNumber;
private TextView tvMobileNumber;
private EditText etMobileNumber;
private Button btnVerify, btnOnePass;
private QuickLogin login;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initArgs();
login = QuickLogin.getInstance(getApplicationContext(), BUSINESS_ID);
tvMobileNumber = findViewById(R.id.tv_mobile_number);
etMobileNumber = findViewById(R.id.et_mobile_number);
btnVerify = findViewById(R.id.btn_verify);
btnVerify.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mMobileNumber = etMobileNumber.getText().toString();
mobileNumberVerify(mMobileNumber);
}
});
btnOnePass = findViewById(R.id.btn_one_pass);
getPreMobileNumber();
}
private void initArgs() {
if (isTest) {
// BUSINESS_ID = "35d60d532b4f4c4c84f3e243c1989a27"; //本机校验
BUSINESS_ID = "3cc9408f47414f03a75947c108e60034"; // 一键登录
mSecretKey = "abf908daf58a9737a9205142b81e1606";
mSecretId = "e535e1074974d472a12f5d6e55e521bc";
mVerifyUrl = "http://eredar-server-test.nis.netease.com/v1/check";
mOnePassUrl = "http://eredar-server-test.nis.netease.com/v1/oneclick/check";
} else {
//BUSINESS_ID = "1412f24fcadc4f1e9b11590221a3e4eb";//本机校验
BUSINESS_ID = "b55f3c7d4729455c9c3fb23872065401";//一键登录
mSecretKey = "72b2db9cb89c5c9d9efb1d1d9950a38e";//"71vqiij2bnp114tupvojvhom9u";
mSecretId = "a4c49cbb2b2420492e132b4c2e03634f";// "123456123456";
mVerifyUrl = "http://ye.dun.163yun.com/v1/check";
mOnePassUrl = "http://ye.dun.163yun.com/v1/oneclick/check";
}
}
private void mobileNumberVerify(String mobileNumber) {
// 本机校验获取token
login.getToken(mobileNumber, new QuickLoginTokenListener() {
@Override
public void onGetTokenSuccess(final String YDToken, final String accessCode) {
runOnUiThread(new Runnable() {
@Override
public void run() {
// Toast.makeText(getApplicationContext(), "获取Token成功" + YDToken + accessCode, Toast.LENGTH_LONG).show();
Log.d(TAG, "获取Token成功" + YDToken + accessCode);
tokenValidate(YDToken, accessCode, false);
}
});
}
@Override
public void onGetTokenError(final String YDToken, final String msg) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "获取Token失败" + YDToken + msg, Toast.LENGTH_LONG).show();
}
});
}
});
}
private void getPreMobileNumber() {
// 预取号与一键登录
login.prefetchMobileNumber(new QuickLoginPreMobileListener() {
@Override
public void onGetMobileNumberSuccess(String YDToken, final String mobileNumber) {
Log.d(TAG, "[onGetMobileNumberSuccess]callback mobileNumber is:" + mobileNumber);
runOnUiThread(new Runnable() {
@Override
public void run() {
tvMobileNumber.setText(mobileNumber);
btnOnePass.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
login.onePass(new QuickLoginTokenListener() {
@Override
public void onGetTokenSuccess(final String YDToken, final String accessCode) {
Log.d(TAG, String.format("yd token is:%s accessCode is:%s", YDToken, accessCode));
tokenValidate(YDToken, accessCode, true);
}
@Override
public void onGetTokenError(String YDToken, String msg) {
Log.d(TAG, "获取运营商token失败:" + msg);
}
});
}
});
}
});
}
@Override
public void onGetMobileNumberError(String YDToken, final String msg) {
Log.e(TAG, "[onGetMobileNumberError]callback error msg is:" + msg);
runOnUiThread(new Runnable() {
@Override
public void run() {
tvMobileNumber.setText(msg);
}
});
}
});
}
//本机校验
private void tokenValidate(String token, String accessCode, final boolean isOnePass) {
String nonce = Utils.getRandomString(32);
String timestamp = String.valueOf(System.currentTimeMillis());
//生成签名信息
final HashMap<String, String> map = new HashMap<>();
map.put("accessToken", accessCode);
map.put("businessId", BUSINESS_ID);
map.put("token", token);
map.put("nonce", nonce);
map.put("timestamp", timestamp);
map.put("version", "v1");
map.put("secretId", mSecretId);
if (!isOnePass) {
map.put("phone", mMobileNumber);
}
String sign = Utils.generateSign(mSecretKey, map);
StringBuffer sburl = new StringBuffer();
if (isOnePass) {
sburl.append(mOnePassUrl);
} else {
sburl.append(mVerifyUrl);
}
sburl.append("?accessToken=" + accessCode);
sburl.append("&businessId=" + BUSINESS_ID);
sburl.append("&token=" + token);
sburl.append("&signature=" + sign);
sburl.append("&nonce=" + nonce);
sburl.append("×tamp=" + timestamp);
sburl.append("&version=" + "v1");
sburl.append("&secretId=" + mSecretId);
sburl.append("&phone=" + mMobileNumber);
final String reqUrl = sburl.toString();
HttpUtil.doGetRequest(reqUrl, new HttpUtil.ResponseCallBack() {
@Override
public void onSuccess(String result) {
try {
Log.e(QuickLogin.TAG, result);
JSONObject j = new JSONObject(result);
int retCode = j.getInt("code");
if (retCode == 200) {
if (isOnePass) {
String msg = j.getString("msg");
JSONObject data = j.getJSONObject("data");
String mobileNumber = data.getString("phone");
if (!TextUtils.isEmpty(mobileNumber)) {
Utils.showToast(LoginActivity.this, "一键登录通过");
} else {
Utils.showToast(LoginActivity.this, "一键登录不通过" + msg);
}
} else {
JSONObject data = j.getJSONObject("data");
int result2 = data.getInt("result");
if (result2 == 1) {
Utils.showToast(LoginActivity.this, "本机校验通过");
} else if (result2 == 2) {
Utils.showToast(LoginActivity.this, "本机校验不通过");
} else {
Utils.showToast(LoginActivity.this, "无法确认校验是否通过");
}
}
} else {
String tip = isOnePass ? "一键登录校验token失败:" : "本机校验token失败:";
Utils.showToast(LoginActivity.this, tip + j.toString());
}
} catch (JSONException e) {
e.printStackTrace();
Log.e(QuickLogin.TAG, "error:" + e.toString());
}
}
@Override
public void onError(int errorCode, String msg) {
Log.e(QuickLogin.TAG, "校验token出现错误" + msg);
}
});
}
}