文档中(保密)提供了php的加解密方法,这里就不重复描述,java方法类型提供如下
小程序前端:
<button open-type="getRealnameAuthInfo" bindgetrealnameauthinfo="queryuserInfo" style='font-size: 40rpx;border-radius:0rpx; background-color: #005bac; line-height: 90rpx;color:white;' category-id="{{[99, 6]}}">获取实名</button>
前端需要注意的是行业目录坐标category-id,具体不重复。
后端加密解密java代码
/** * 私钥加密 */public static String sign(String request, String privateKey) throws Exception {byte[] data = request.getBytes("UTF-8");byte[] keyBytes = Base64Util.decode(privateKey);PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance("RSA");PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);Signature signature = Signature.getInstance("SHA256WithRSA");signature.initSign(privateK);signature.update(data);return Base64Util.encode(signature.sign());}// 私钥解密public static String decryptByPrivateKey(String content, String Key) throws Exception {// 将base64编码后的私钥字符串转成PrivateKey实例byte[] keyBytes = Base64.getDecoder().decode(Key.getBytes());PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance("RSA");PrivateKey privateKey = keyFactory.generatePrivate(keySpec);// 获取私钥Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] cipherText = Base64.getDecoder().decode(content);byte[] decryptText = cipher.doFinal(cipherText);return new String(decryptText, "gbk");}
由于接口为高级接口,不能公开,提供java后端加密解密方法,仅供参考
续:
有人私底下问我是不是少个类,我现在给补上。这个类很简单的。
package com.app.wii.util;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;import it.sauronsoftware.base64.Base64;/** * <p> * BASE64编码解码工具包 * </p> * <p> * 依赖javabase64-1.3.1.jar * </p> * * @author IceWee * @date 2012-5-19 * @version 1.0 */public class Base64Utils { /** * 文件读取缓冲区大小 */ private static final int CACHE_SIZE = 1024; /** * <p> * BASE64字符串解码为二进制数据 * </p> * * @param base64 * @return * @throws Exception */ public static byte[] decode(String base64) throws Exception { return Base64.decode(base64.getBytes()); } /** * <p> * 二进制数据编码为BASE64字符串 * </p> * * @param bytes * @return * @throws Exception */ public static String encode(byte[] bytes) throws Exception { return new String(Base64.encode(bytes)); } /** * <p> * 将文件编码为BASE64字符串 * </p> * <p> * 大文件慎用,可能会导致内存溢出 * </p> * * @param filePath 文件绝对路径 * @return * @throws Exception */ public static String encodeFile(String filePath) throws Exception { byte[] bytes = fileToByte(filePath); return encode(bytes); } /** * <p> * BASE64字符串转回文件 * </p> * * @param filePath 文件绝对路径 * @param base64 编码字符串 * @throws Exception */ public static void decodeToFile(String filePath, String base64) throws Exception { byte[] bytes = decode(base64); byteArrayToFile(bytes, filePath); } /** * <p> * 文件转换为二进制数组 * </p> * * @param filePath 文件路径 * @return * @throws Exception */ public static byte[] fileToByte(String filePath) throws Exception { byte[] data = new byte[0]; File file = new File(filePath); if (file.exists()) { FileInputStream in = new FileInputStream(file); ByteArrayOutputStream out = new ByteArrayOutputStream(2048); byte[] cache = new byte[CACHE_SIZE]; int nRead = 0; while ((nRead = in.read(cache)) != -1) { out.write(cache, 0, nRead); out.flush(); } out.close(); in.close(); data = out.toByteArray(); } return data; } /** * <p> * 二进制数据写文件 * </p> * * @param bytes 二进制数据 * @param filePath 文件生成目录 */ public static void byteArrayToFile(byte[] bytes, String filePath) throws Exception { InputStream in = new ByteArrayInputStream(bytes); File destFile = new File(filePath); if (!destFile.getParentFile().exists()) { destFile.getParentFile().mkdirs(); } destFile.createNewFile(); OutputStream out = new FileOutputStream(destFile); byte[] cache = new byte[CACHE_SIZE]; int nRead = 0; while ((nRead = in.read(cache)) != -1) { out.write(cache, 0, nRead); out.flush(); } out.close(); in.close(); } }
调用demo
/** * * @param appid 小程序id * @param secret 小程序secret * @param key 私钥 * @param paramMap * @param i 防止token失效,递归处理,通常为3 * @return 返回map key分别为:encrytedname :姓名,encrytedid:身份证 * @throws Exception * @author pangxianhe * @date 2018年11月21日 */public static Map<String, Object> queryRealName(String appid, String secret, String key, Map<String, Object> paramMap, int i)throws Exception {access_token = StringUtil.isNotEmpty(access_token) ? access_token : queryToken(appid, secret);String getrealnameinfo = "https://api.weixin.qq.com/cgi-bin/wxopen/getrealnameinfo?access_token=ACCESS_TOKEN".replaceAll("ACCESS_TOKEN", access_token);String categoryreturn = HttpUtil.sendPost(getrealnameinfo, JSONObject.fromObject(paramMap).toString());Map<String, Object> returnMap = null;if (StringUtil.isNotEmpty(categoryreturn)) {JSONObject jsonObject = JSONObject.fromObject(categoryreturn);Object errcode = jsonObject.get("errcode");//token失效重新获取if ("40001".equals(errcode.toString())) {if (i > 0) {i = i - 1;access_token = queryToken(appid, secret);//递归处理,i通常为3return queryRealName(appid, secret, key, paramMap, i);}} else if ("0".equals(errcode.toString())) {String encryted_real_name = (String) jsonObject.get("encryted_real_name");String encryted_credential_id = (String) jsonObject.get("encryted_credential_id");String encrytedname = decryptByPrivateKey(encryted_real_name, key);String encrytedid = decryptByPrivateKey(encryted_credential_id, key);if (StringUtil.isNotEmpty(encrytedname) && StringUtil.isNotEmpty(encrytedid)) {returnMap = new HashMap<String, Object>();returnMap.put("encrytedname", encrytedname);returnMap.put("encrytedid", encrytedid);}} else {// 获取失败}}return returnMap;}
调用的action
/** * 返回实名信息 * * @return * @throws Exception */public String queryrealnameinfo() throws Exception {Map<String, Object> returnMap = new HashMap<String, Object>();String userid = (String) requestMap.get("userid");String auth_token = (String) requestMap.get("auth_token");String orderid = (String) requestMap.get("orderid");boolean flag = false;DatabaseContextHolder.setCustomerType(MappingConstant.DTS);DtsSystemManagePojo dtsSystemManagePojo = dtsSystemManageService.queryPojo("car_real_name_auth_info");String key = dtsSystemManagePojo.getServiceprivatekey();// 私钥String mch_id = dtsSystemManagePojo.getServiceaccount();String cert_serialno = dtsSystemManagePojo.getServicepublickey(); //Date date = new Date();String timestamp = Long.toString(date.getTime()).substring(0, 10);try {Map<String, Object> paramMap = new HashMap<String, Object>();paramMap.put("auth_token", auth_token);paramMap.put("mch_id", mch_id);// 商户号paramMap.put("cert_serialno", cert_serialno);paramMap.put("timestamp", timestamp);String ori_content = "cert_serialno=" + cert_serialno + "×tamp=" + timestamp;String valuersa = ProcTokenUtil.sign(ori_content, key);paramMap.put("sign", valuersa);Map<String, Object> backMap = ProcTokenUtil.queryRealName(appid, appsecret, key, paramMap, 3);if (StringUtil.isNotEmpty(backMap)) {String username = (String) backMap.get("encrytedname");String idcard = (String) backMap.get("encrytedid");returnMap.put("idcard", idcard);DatabaseContextHolder.setCustomerType(MappingConstant.WII);wiiUserService.saveUserRealname(userid, username, idcard);// 根据orderid查询订单id身份证姓名是否一样WiiInsuranceCollectPojo orderPoJo = wiiCarOrderflowService.queryOrderflowPojo(orderid);if (StringUtil.isNotEmpty(orderPoJo)) {String customername = orderPoJo.getCustomername();String certificatecode = orderPoJo.getCertificatecode();if (username.equalsIgnoreCase(customername) && idcard.equalsIgnoreCase(certificatecode)) {flag = true;}}}} catch (Exception e) {e.printStackTrace();}returnMap.put("flag", flag);write(JSONObject.fromObject(returnMap).toString());return SUCCESS;}