刚刚接入了一下云片网的短信验证功能,用于注册或者特使登录的短信验证。
http://www.yunpian.com/ 官网
云片不同于其他第三方短信验证,这个短信验证更多的注重后台与平台交互,而客户端只需要简单调用服务器接口,然后对返回数据进行比对验证,就可以了,客户端很方便。
云片网内的注册了,收费了,短信模板了就不说了,直接根据后台提示完成,然后后台服务器对接就行。
重点来说android端开发的流程。
1.发网络请求,一般情况是只传一个手机号参数就行,从服务器的接口获取三个数据(手机号,时间戳,和签名秘钥)
/** * 从服务器端获取短信验证码 */ private void getMsgFromService(String phoneNumber) { String url = Constant.MESSAGE + phoneNumber; System.out.println(url+"-------获取验证短信-----"); StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() { @Override public void onResponse(String s) { try { JSONObject object = new JSONObject(s); int ec = object.getInt("ec"); if (ec == 200) { Toast.makeText(LoginActivity.this, "验证码已发送!", Toast.LENGTH_SHORT).show(); JSONObject data = object.getJSONObject("data"); mobile = data.getString("mobile"); timestamp = data.getString("timestamp"); signature = data.getString("signature"); } else { Toast.makeText(LoginActivity.this, "验证码发送失败!", Toast.LENGTH_SHORT).show(); } } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { } }); queue.add(request); }(网络请求,我用的是volley )
这个签名秘钥应该就是服务器后台和云片交互后生成的(后台那一块不是太了解)
2.拿到三个数据,这个时候手机差不多就收到短信了。
现在总共四个数据。(3个接口返回的,一个短信接收到的)
验证规则就是:手机号,时间戳,验证码 通过MD5加密后生成的字符串,与签名秘钥 完全相同,则短信验证通过。
if (!Tools.encrypt(mobile, timestamp, stryanzheng).equals(signature)) { Toast.makeText(LoginActivity.this, "验证码输入错误!", Toast.LENGTH_SHORT).show(); return; }
MD5加密算法
/** * 加密算法 * token、时间戳,验证码、手机号放到数组A里面 * 对数组A进行字典排序 * 再把数组A拼接成一个字符串B * 对字符串B进行MD5加密,最后生成签名 */ public static String encrypt(String mobile, String timestamp, String code) { ArrayList<String> arrayList = new ArrayList<>(); arrayList.add(mobile); arrayList.add(timestamp); arrayList.add(code); arrayList.add(Constant.MSGTOKEN); if (arrayList.size() < 1) { return null; } else { Collections.sort(arrayList); StringBuffer buffer = new StringBuffer(); int length = arrayList.size(); for (int i = 0; i < length; i++) { buffer.append(arrayList.get(i)); } return MD5Util.md5(buffer.toString()); } }
MD5加密过程
public final static String md5(String s) { char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; try { byte[] btInput = s.getBytes(); // 获得MD5摘要算法的 MessageDigest 对象 MessageDigest mdInst = MessageDigest.getInstance("MD5"); // 使用指定的字节更新摘要 mdInst.update(btInput); // 获得密文 byte[] md = mdInst.digest(); // 把密文转换成十六进制的字符串形式 int j = md.length; char str[] = new char[j * 2]; int k = 0; for (int i = 0; i < j; i++) { byte byte0 = md[i]; str[k++] = hexDigits[byte0 >>> 4 & 0xf]; str[k++] = hexDigits[byte0 & 0xf]; } return new String(str); } catch (Exception e) { e.printStackTrace(); return null; } }
本地比对验证,验证通过,则短信验证通过,否则验证失败。
基本的逻辑就是这些,期间可以自己控制,按钮30秒点一次啊什么的,这个就不帖了,有需要的可以联系我,这个应该很简单。
结束。
如有不明确的地方,可以回复,荣幸与各位开发者公共探讨。
原创文章,转载请注明出处:
http://blog.youkuaiyun.com/qq_33078541?viewmode=contents