android客户端直接调用芝麻信用的人脸认证
来源:互联网 发布:鳄鱼皮 知乎 编辑:程序博客网 时间:2024/04/30 03:42
按理说,这些都应该是服务端完成的事情。可是由于种种原因,我放了一句狠话。。。
然后只能自己搞了。。。。
1、由于芝麻信用提供的SDK,在android端直接使用SSL证书验证是不通过的。所以当时有点后悔说的狠话。
2、SDK用不了,没办法只能自己动手,自己拼接参数,写请求。
3、不废话,直接开始。
(1)、解压下载的SDK源码。
找到 WebUtils.java (在解压后的“com\antgroup\zmxy\openplatform\api\internal\util”目录下)。打开 WebUtils.java 查看源码。
找到“getConnection()”方法,你会看到很蛋疼的一句话“默认认证不通过,进行证书校验。”
我们修改 return true; //默认认证不通过,进行证书校验。(真操蛋,直接改成true,看你还怎么不给我通过)。之后保存,把webutils.java 复制到自己的工程中,调用芝麻信用时使用。
(2)、自己拼参数,开始认证。就直接上代码了。
public class FaceUtils { private String path = "";//回调地址 private static String biz_no = ""; private Context context; private static FaceUtils faceUtils; private String IP = "https://zmopenapi.zmxy.com.cn/openapi.do"; private String app_id = "自己的APP_ID"; private String private_key = "自己的私钥"; private String public_key = "支付宝的公钥(不是应用公钥,别搞错了)"; private AdapterViewClickListener clickListener; public static FaceUtils getInstance() { if (faceUtils == null) { faceUtils = new FaceUtils(); } return faceUtils; } /** * 启动芝麻认证 * * @param name * @param id_num */ public void startFace(Context context, final String name, final String id_num,String path) { this.path = path; this.context = context; new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub String params = ""; String sign = ""; JSONObject identity_param = new JSONObject(); try { identity_param.put("identity_type", "CERT_INFO"); identity_param.put("cert_type", "IDENTITY_CARD"); identity_param.put("cert_name", name); identity_param.put("cert_no", id_num); } catch (JSONException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } long time = System.currentTimeMillis(); String signCanshu = "transaction_id=ZGYD" + new SimpleDateFormat("yyyyMMddHHmmss").format(time) + "0001234" + "&product_code=w1010100000000002978" + "&biz_code=FACE" + "&identity_param=" + identity_param.toString() + "&ext_biz_param={}"; try { params = RSACoderUtil.encrypt(signCanshu, "UTF-8", public_key); sign = RSACoderUtil.sign(signCanshu, "UTF-8", private_key); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } Map<String, String> map = new HashMap<>(); map.put("app_id", app_id); map.put("charset", "UTF-8"); map.put("method", "zhima.customer.certification.initialize"); map.put("version", "1.0"); map.put("platform", "zmop"); map.put("params", params); map.put("sign", sign); String result = ""; try { result = com.huahan.finance.utils.WebUtils.doPost(IP, map, 15000, 15000); HHLog.i("mtj", "result = " + result); try { JSONObject object = new JSONObject(result); String jieresult = RSACoderUtil.decrypt( object.getString("biz_response"), private_key, "UTF-8"); HHLog.i("mtj", "解密== " + jieresult); JSONObject bizObject = new JSONObject(jieresult); biz_no = bizObject.getString("biz_no"); handler.sendEmptyMessage(0); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); HHLog.i("mtj", "result 解密e= " + e.getMessage()); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); HHLog.i("mtj", "result e= " + e.getMessage()); } } }).start(); } /** * 获取认证url * * @param biz */ public void getUrl() { ZhimaCustomerCertificationCertifyRequest request = new ZhimaCustomerCertificationCertifyRequest(); request.setPlatform("zmop"); request.setBizNo(biz_no);// 必要参数 // 设置回调地址,必填. 如果需要直接在支付宝APP里面打开回调地址使用alipay协议 // alipay://www.taobao.com 或者 alipays://www.taobao.com,分别对应http和https请求 request.setReturnUrl(path);// 必要参数 DefaultZhimaClient client = new DefaultZhimaClient( "https://zmopenapi.zmxy.com.cn/openapi.do", app_id, private_key, public_key); try { String url = client.generatePageRedirectInvokeUrl(request); HHLog.i("mtj", "开始认证url==" + url); doVerify(url); } catch (ZhimaApiException e) { e.printStackTrace(); HHLog.i("mtj", "开始认证错误==" + e.getMessage()); } } public String Result(String params) { String result = ""; try { result = RSACoderUtil.decrypt(params, private_key, "UTF-8"); } catch (Exception e) { // TODO: handle exception } return result; } /** * 查询认证结果 * * @param biz */ public void QueryNum(AdapterViewClickListener clickListener) { this.clickListener = clickListener; if (!TextUtils.isEmpty(biz_no)) { new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub String params = ""; String sign = ""; String signCanshu = "biz_no=" + biz_no; try { params = RSACoderUtil.encrypt(signCanshu, "UTF-8", public_key); sign = RSACoderUtil.sign(signCanshu, "UTF-8", private_key); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } Map<String, String> map = new HashMap<>(); map.put("app_id", app_id); map.put("charset", "UTF-8"); map.put("method", "zhima.customer.certification.query"); map.put("version", "1.0"); map.put("platform", "zmop"); map.put("params", params); map.put("sign", sign); String result = ""; String passed = ""; try { result = WebUtils.doPost(IP, map, 15000, 15000); JSONObject jsonObject = new JSONObject(result); JSONObject jObject = new JSONObject( RSACoderUtil.decrypt( jsonObject.getString("biz_response"), private_key, "UTF-8")); HHLog.i("mtj", "认证结果==" + jObject.toString()); passed = jObject.getString("passed"); } catch (Exception e) { e.printStackTrace(); HHLog.i("mtj", "认证结果=e=" + e.getMessage()); } Message message = new Message(); message.what = 1; message.obj = passed; handler.sendMessage(message); } }).start(); } } private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); switch (msg.what) { case 0:// 认证 getUrl(); break; case 1:// 查询 String passed = (String) msg.obj; if ("true".equals(passed)) { clickListener.adapterViewClick(1, null); } else {// 未通过 clickListener.adapterViewClick(0, null); } biz_no = ""; break; default: break; } } }; /** * 启动支付宝进行认证 * * @param url * 开放平台返回的URL * @param url */ @SuppressWarnings("deprecation") private void doVerify(String url) { if (hasApplication()) { Intent action = new Intent(Intent.ACTION_VIEW); StringBuilder builder = new StringBuilder(); // 这里使用固定appid 20000067 builder.append("alipays://platformapi/startapp?appId=20000067&url="); builder.append(URLEncoder.encode(url)); action.setData(Uri.parse(builder.toString())); context.startActivity(action); } else { // 处理没有安装支付宝的情况 DialogUtils.showOptionDialog(context, context.getString(R.string.load_zfb), new OnOptionDialogClickListener() { @Override public void onClick(Dialog paramDialog, View paramView) { // TODO Auto-generated method stub Intent action = new Intent(Intent.ACTION_VIEW); action.setData(Uri.parse("https://m.alipay.com")); action.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(action); paramDialog.dismiss(); } }, new OnOptionDialogClickListener() { @Override public void onClick(Dialog paramDialog, View paramView) { // TODO Auto-generated method stub paramDialog.dismiss(); } }, true); } } /** * 判断是否安装了支付宝 * * @return true 为已经安装 * @return */ private boolean hasApplication() { PackageManager manager = context.getPackageManager(); Intent action = new Intent(Intent.ACTION_VIEW); action.setData(Uri.parse("alipays://")); List list = manager.queryIntentActivities(action, PackageManager.GET_RESOLVED_FILTER); return list != null && list.size() > 0; }}
认证的初始化、查询认证结果的参数请求都在上面的代码里,里面的一些结果的处理都是自己的demo里用到的。到时候都改成自己的结果处理就行了,请求参数是一样的。
OK,就是放狠话了,怎么了,嘿嘿。。。
关于回调地址,再调起自己的APP内某个页面的方法,请参照,我之前的一篇文章JS启用本地安卓APP的方法
4 0
- android客户端直接调用芝麻信用的人脸认证
- Android 自定义控件 仿支付宝芝麻信用的刻度盘
- Java如何调用芝麻信用分?
- 芝麻信用
- 芝麻信用
- Android 芝麻认证和获取芝麻分
- Android芝麻信用接入(旧版本)
- 谈谈对接芝麻信用踩的坑
- 芝麻信用分800+的技巧,get!
- 谈谈对接芝麻信用踩的坑
- 芝麻信用分SDK接入,显示芝麻信用授权界面(Android)
- 芝麻信用分SDK接入,显示芝麻信用授权界面(Android)
- 实名认证 芝麻认证 人脸识别 集成
- 芝麻信用接口
- 【芝麻信用对接】-decode_private_key_error
- Android 仿支付宝9.0芝麻信用分效果
- Android仿支付宝9.5芝麻信用分仪表盘
- android模拟支付宝芝麻信用(上)
- POJ 3311 Hie with the Pie(Floyd + 状压dp)
- 为什么使用%lf读取double型的值,而用%f进行显示?
- Tomcat启动时卡在“INFO: Deploying web application directory ”
- 计算机图形学实验————漫游三维迷宫
- 没有实习的我,如何拿到阿里产品 offer
- android客户端直接调用芝麻信用的人脸认证
- MySQL concat、concat_ws、group_concat函数用法
- shell date命令总结
- 位运算
- Java图片按钮——JButton相关参数设置
- Java虚拟机内存理解
- docker网络方案之weave实战篇
- 排序算法时间复杂度与空间复杂度
- junit之Matcher,Assert.assertThat