Commit 62aebea8 authored by jwc's avatar jwc

短信服务,ocr识别身份证,营业执照

parent ec983ac5
# common-api # common-api
紫鹰科技公共服务api 紫鹰科技公共服务api
# 支持swagger,lombok
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.zing</groupId>
<artifactId>common-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>common</name>
<description>项目模版</description>
<distributionManagement>
<repository>
<id>releases</id>
<name>releases</name>
<url>http://repos.manong.atliangtian.com/repository/maven-releases/</url>
<uniqueVersion>true</uniqueVersion>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>snapshots</name>
<url>http://repos.manong.atliangtian.com/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>cn.zing.starter</groupId>
<artifactId>web-common-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>cn.zingfin</groupId>
<artifactId>common</artifactId>
<version>0.0.2-SNAPSHOT</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.xiaoymin/swagger-bootstrap-ui-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>1.9.6</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</exclusion>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-green</artifactId>
<version>3.6.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.51</version>
</dependency>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.8.3</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<!-- 过滤后缀为pem、pfx的证书文件 -->
<nonFilteredFileExtensions>
<nonFilteredFileExtension>pfx</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.5.6.RELEASE</version>
<configuration>
<mainClass>cn.zingfin.finance.FinanceApplication</mainClass>
<layout>JAR</layout>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<!-- 处理文件时替换文件中的变量 -->
<filtering>true</filtering>
<excludes>
<!-- 打包时排除文件,可自行添加test.yml -->
<exclude>application.yml</exclude>
<exclude>application-dev.yml</exclude>
<exclude>application-publish.yml</exclude>
<!-- <exclude>application-test.yml</exclude>-->
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<!-- 打包时所包含得文件 -->
<includes>
<include>application.yml</include>
<include>application-${env}.yml</include>
</includes>
</resource>
</resources>
</build>
</project>
package cn.zingfin;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* @author jwc
*/
@SpringBootApplication
@EnableSwagger2
//@MapperScan(basePackages = {"cn.zingfin.common.mapper"})
public class CommonApplication {
public static void main(String[] args) {
SpringApplication.run(CommonApplication.class, args);
}
}
package cn.zingfin.base;
import lombok.Data;
/**
* @author chsm
* @version v1.0
* @since 2020/8/10 16:24
*/
@Data
public class BaseOpenApiRequest {
/**
* 接入方公钥
*/
private String appPublicKey;
/**
* 为接入方生成的md5Key
*/
private String md5Key;
}
package cn.zingfin.common.enums;
/**
* @author jwc
* @date 2020/9/1 15:57
*/
public enum OcrCardTypeEnum {
/**
*
*/
CARD_TYPE_ID_CARD_FRONT("id_card_front", "身份证正面"),
CARD_TYPE_ID_CARD_BACK("id_card_front", "身份证反面"),
CARD_TYPE_BUSINESS_LICENSE("business-license", "营业执照"),
;
private final String type;
private final String msg;
OcrCardTypeEnum(String type, String msg) {
this.type = type;
this.msg = msg;
}
public String getMsg() {
return msg;
}
public String getType() {
return type;
}
}
package cn.zingfin.common.enums;
import cn.zingfin.constant.ErrorCode;
/**
* @author jwc
* @version v1.0
* @since 2020/9/01 13:44
*/
public enum OpenApiErrorCodeEnums implements ErrorCode {
/**
*
*/
FAIL(10001, "请求失败,联系管理员"),
;
private final int code;
private final String message;
OpenApiErrorCodeEnums(int code, String message) {
this.code = code;
this.message = message;
}
@Override
public int getCode() {
return code;
}
@Override
public String getMessage() {
return message;
}
}
package cn.zingfin.common.util;
import sun.security.tools.keytool.CertAndKeyGen;
import sun.security.x509.*;
import java.io.*;
import java.security.*;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.util.Date;
import java.util.Map;
import java.util.Random;
/**
* fileName:IssueCert
*
* @author jwc
* @date 2020/9/1 9:36
* -------------------------
* 功能和描述:颁发证书
**/
public class IssueCert {
private static SecureRandom secureRandom;
static {
try {
secureRandom = SecureRandom.getInstance("SHA1PRNG", "SUN");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchProviderException e) {
e.printStackTrace();
}
}
/**
* 私钥证书-用于签名
*/
public static final String ISSUE_PFX_FILE = "D:\\signverify\\mycert\\ISSUE.pfx";
/**
* 公钥证书-用于验签
*/
public static final String ISSUE_CRT_FILE = "D:\\signverify\\mycert\\ISSUE.cer";
/**
* 定义pfx根证书文件
*/
public static final String ROOT_ISSUE_PFX_FILE = "D:\\signverify\\rootcert\\ROOTCA.pfx";
/**
* 定义私钥证书的密码
*/
public static final String ROOT_ISSUE_PFX_PASSWORD = "123456";
/**
* 定义crt根证书文件
*/
public static final String ROOT_ISSUE_CRT_FILE = "D:\\signverify\\rootcert\\ROOTCA.cer";
/**
* 定义根证书的别名
*/
public static final String ROOT_ISSUE_ALIAS = "rootca";
/**
* 证书别名
*/
public static final String ISSUE_ALIAS = "subject";
/**
* 私钥证书密码
*/
public static final String ISSUE_PASSWORD = "123456";
/**
* 签名算法
*/
public static final String SIG_ALG = "MD5WithRSA";
public static void main(String[] args) {
try {
X500Name issue = new X500Name("CN=RootCA,OU=ISI,O=BenZeph,L=CD,ST=SC,C=CN");
X500Name subject = new X500Name(
"CN=subject,OU=ISI,O=BenZeph,L=CD,ST=SC,C=CN");
createIssueCert(issue, subject);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
*
*/
public static void createIssueCert(X500Name rootX500name, X500Name subjectX500Name) {
try {
CertAndKeyGen certAndKeyGen = new CertAndKeyGen("RSA", SIG_ALG, null);
//生成密钥时候使用的随机数的来源
certAndKeyGen.setRandom(secureRandom);
//设置密钥的大小
certAndKeyGen.generate(1024);
//设置时间,设置证书有效期的时候需要使用到
long validity = 60L * 60L * 24L * 3650;
Date startDate = new Date();
Date endDate = new Date();
endDate.setTime(startDate.getTime() + validity * 1000);
//设置证书有效期
CertificateValidity interval = new CertificateValidity(startDate, endDate);
//获取X509CertInfo对象,并为其添加所有的强制属性
X509CertInfo info = new X509CertInfo();
info.set(X509CertInfo.VERSION, new CertificateVersion(CertificateVersion.V3));
info.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber(new Random().nextInt() & 0x7fffffff));
AlgorithmId algID = AlgorithmId.get(SIG_ALG);
info.set(X509CertInfo.ALGORITHM_ID, new CertificateAlgorithmId(algID));
info.set(X509CertInfo.SUBJECT, subjectX500Name);
info.set(X509CertInfo.KEY, new CertificateX509Key(certAndKeyGen.getPublicKey()));
info.set(X509CertInfo.VALIDITY, interval);
info.set(X509CertInfo.ISSUER, rootX500name);
PrivateKey privateKey = getPrivateKey();
X509CertImpl cert = new X509CertImpl(info);
cert.sign(privateKey, SIG_ALG);
//X509Certificate certificate = (X509Certificate) cert;
X509Certificate x509Certificate = readX509Certificate();
X509Certificate[] x509Certificates = new X509Certificate[]{cert, x509Certificate};
IssueCertUtils.createKeyStore(ISSUE_ALIAS, certAndKeyGen.getPrivateKey(), ISSUE_PASSWORD.toCharArray(), x509Certificates, ISSUE_PFX_FILE);
OutputStream outputStream = new FileOutputStream(new File(ISSUE_CRT_FILE));
outputStream.write(cert.getEncoded());
outputStream.close();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchProviderException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (SignatureException e) {
e.printStackTrace();
}
}
/**
* 获取私钥
*
* @return
*/
private static PrivateKey getPrivateKey() {
try {
//后去指定类型的KeyStore对象
KeyStore keyStore = KeyStore.getInstance("PKCS12");
InputStream in = null;
in = new FileInputStream(ROOT_ISSUE_PFX_FILE);
keyStore.load(in, ROOT_ISSUE_PFX_PASSWORD.toCharArray());
in.close();
//使用指定的密码来获取指定的别名对应的私钥
Key key = keyStore.getKey(ROOT_ISSUE_ALIAS, ROOT_ISSUE_PFX_PASSWORD.toCharArray());
return (PrivateKey) key;
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (UnrecoverableKeyException e) {
e.printStackTrace();
}
return null;
}
/**
* 读取crt根证书信息
*
* @return
*/
private static X509Certificate readX509Certificate() {
InputStream inputStream = null;
try {
inputStream = new FileInputStream(ROOT_ISSUE_CRT_FILE);
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
X509Certificate certificate = (X509Certificate) certificateFactory.generateCertificate(inputStream);
inputStream.close();
return certificate;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
\ No newline at end of file
package cn.zingfin.common.util;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.security.Key;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
/**
* fileName:IssueCertUtils
*
* @author jwc
* @date 2020/9/1 9:51
* -------------------------
* 功能和描述:工具类
**/
public class IssueCertUtils {
private IssueCertUtils() {
}
/**
* 证书私钥的存储设施
*
* @param alias 别名(会与对应的privateKey关联)
* @param privateKey 密钥-私钥
* @param password 密码(用来保护私钥的密码)
* @param certificates 证书链
* @param pfxFile pfx文件
*/
public static void createKeyStore(String alias, Key privateKey, char[] password, Certificate[] certificates, String pfxFile) {
try {
//获取指定类型的KeyStore对象
KeyStore keyStore = KeyStore.getInstance("PKCS12");
//加载KeyStore
keyStore.load(null, password);
//将给定的密钥分配给指定的别名,并用给定的密码来保护它
keyStore.setKeyEntry(alias, privateKey, password, certificates);
//以下几步就是想私钥证书导出
OutputStream outputStream = new FileOutputStream(pfxFile);
keyStore.store(outputStream, password);
outputStream.close();
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
\ No newline at end of file
package cn.zingfin.common.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sun.security.tools.keytool.CertAndKeyGen;
import sun.security.x509.X500Name;
import java.io.*;
import java.security.*;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
/**
* fileName:IssueRootCert
*
* @author jwc
* @date 2020/9/1 9:34
* -------------------------
* 功能和描述:颁发根证书
**/
public class IssueRootCert {
public static final Logger logger = LoggerFactory.getLogger(IssueRootCert.class);
private static SecureRandom secureRandom;
static {
//定义随机数来源
try {
secureRandom = SecureRandom.getInstance("SHA1PRNG", "SUN");
} catch (NoSuchAlgorithmException e) {
logger.error("算法不存在");
} catch (NoSuchProviderException e) {
logger.error("该随机数提供者不存在");
}
}
/**
* 定义pfx根证书文件
*/
public static final String ROOT_ISSUE_PFX_FILE = "D:\\signverify\\rootcert\\ROOTCA.pfx";
/**
* 定义私钥证书的密码
*/
public static final String ROOT_ISSUE_PFX_PASSWORD = "123456";
/**
* 定义crt根证书文件
*/
public static final String ROOT_ISSUE_CRT_FILE = "D:\\signverify\\rootcert\\ROOTCA.cer";
/**
* 定义根证书的别名
*/
public static final String ROOT_ISSUE_ALIAS = "rootca";
public static void main(String[] args) {
try {
X500Name issue = new X500Name("CN=RootCA,OU=ISI,O=BenZeph,L=CD,ST=SC,C=CN");
issueRootCert(issue);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 签名算法
*/
public static final String ALGORITHM = "MD5WithRSA";
public static void issueRootCert(X500Name x500Name) {
try {
CertAndKeyGen certAndKeyGen = new CertAndKeyGen("RSA", ALGORITHM, null);
//设置生成密钥时使用的随机数的来源
certAndKeyGen.setRandom(secureRandom);
//设置密钥长度,太短容易被攻击破解
certAndKeyGen.generate(1024);
//时间间隔设置为10年(设置证书有效期的时候需要使用到)
long interval = 60L * 60L * 24L * 3650;
//
X509Certificate x509Certificate = certAndKeyGen.getSelfCertificate(x500Name, interval);
X509Certificate[] x509Certificates = new X509Certificate[]{x509Certificate};
IssueCertUtils.createKeyStore(ROOT_ISSUE_ALIAS, certAndKeyGen.getPrivateKey(), ROOT_ISSUE_PFX_PASSWORD.toCharArray(), x509Certificates, ROOT_ISSUE_PFX_FILE);
//根据私钥导出公钥
OutputStream outputStream = new FileOutputStream(new File(ROOT_ISSUE_CRT_FILE));
outputStream.write(x509Certificate.getEncoded());
outputStream.close();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchProviderException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (SignatureException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
\ No newline at end of file
package cn.zingfin.common.util;
import cn.zingfin.exception.BizException;
import cn.zingfin.sign.DefaultClient;
import cn.zingfin.web.model.ScanRequest;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
/**
* fileName:SignVerifyDemo
*
* @author :jwc
* Date :2020/9/1
* -------------------------
* 功能和描述:
**/
public class SignVerifyDemo {
public static final String PRIVATE_KEY_PASSWORD = "123456";
public static final String PUBLIC_KEY_FILE_PATH = "D:\\signverify\\mycert\\ISSUE.cer";
//public static final String PUBLIC_KEY_FILE_PATH = "D:\\signature\\mykey.cer";
public static final String PRIVATE_KEY_FILE_PATH = "D:\\signverify\\mycert\\ISSUE.pfx";
//public static final String PRIVATE_KEY_FILE_PATH = "D:\\signature\\mykey.pfx";
public static final String ALIAS_NAME = "subject";
public static final String DEFAULT_UTF8 = "UTF-8";
public static void main(String[] args) throws BizException {
// String originalData = "Hello我是原始的数据World";
// String sign = sign(originalData);
// System.out.println(sign);
// boolean verify = verify(sign, originalData);
// if (verify) {
// System.out.println("验签通过");
// } else {
// System.out.println("验签失败");
// }
// 我们的公钥
String myPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApusTucCRkkb7RFbwmgD8UcDrnO0R+J0+/SiFxc8EXY3gcyEe/Jv20jL+4aJJmoUzYhe73iP/Fg/BAM+xOlaFxmrc27RjlTtxhJHfIbLADsOrd3Qn6+TzUrUuKsoytIWhIsmty5SmKMLhb+US8JiWAKkR5Qlu92pWvppN4gwWB37i6gCoRZ/swhN5EEA+wFsJMVoX+CHJEOspoT47F/+aYyV38zY4W39aa8roJdtxzZuCkPqRDwy70Nr84jlRJev+su8yiH+Ka/3vY6vE92V+0/gBMbpwwLE6BKmT9sm3XpPXSTh3ybaGxWaBVuv9l03drx0wRVA6FG3s0ut0NRQH5QIDAQAB";
// 对方的私钥
String appPrivateKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCm6xO5wJGSRvtEVvCaAPxRwOuc7RH4nT79KIXFzwRdjeBzIR78m/bSMv7hokmahTNiF7veI/8WD8EAz7E6VoXGatzbtGOVO3GEkd8hssAOw6t3dCfr5PNStS4qyjK0haEiya3LlKYowuFv5RLwmJYAqRHlCW73ala+mk3iDBYHfuLqAKhFn+zCE3kQQD7AWwkxWhf4IckQ6ymhPjsX/5pjJXfzNjhbf1pryugl23HNm4KQ+pEPDLvQ2vziOVEl6/6y7zKIf4pr/e9jq8T3ZX7T+AExunDAsToEqZP2ybdek9dJOHfJtobFZoFW6/2XTd2vHTBFUDoUbezS63Q1FAflAgMBAAECggEAcZH6/uT+ZyeyqOH6nN5Uz49TAJfxJVZgWEGtG1TqpHj3IX6Epd28h3K5J26TY/aDape5dMDLPAiGCnZGIOpj5Qgqs7Y+F3i1mTzjM/t6X9FUplc7Hm7N/BVYjza6X0eYxqGwhZbjo1JNryOOynMXhOWETnEntmH9GXzFxyrwBjJ4skUDK78I8vDmazj0hVj7VULWjhH0ufG17mDme7mVjJh1oOpCqEVoCqkMRHWsZg8o0bwYOczxoQG+T9vdR7K9GyLdFctFUGZNlZPsyDVcPrsC4IP+a8630YMxI06DBS/r8xTqS3Dh2YWcuNB0TQsUDg/nms+y+tT9fwFk1rX+9QKBgQD/eqFa+t+RLAkUbAvwLtDpgahtOkM7SnucuF101mnYff8LtjImZ//3pQltrHTRo++b1nWcVQcNb1rljuJ9Fgs9dzMP9DSnziYNcbAxUrcA0kTiDUOuOvxoVjvpGRkHKnEmXhZWQrhOP2sb15LpbDE6GBFs4xcIW8jat1cdem033wKBgQCnQjb2b88OgDssROf7GmXjUsSheeLshrxvf2dxiBomjtg0h9WKjP2ONoLKxwJNICBqvr1SbteIMQmw8/2QwCDvcx0JjNgkwuX6HabwmJ5qJFtn9wHB2gq1JZzoLvfwVr+uCVUF/EDciCqts08ynzYZoCbJ0LhTXdsQSDeGGRrIuwKBgQCcyIobRlhLRAXydXhCFsj4dCyDk7zMtyHzBKW93ROp23DYpCBUt4A7XxnRJ4OtX/jc3xjgLsIcOZlDxZMzBoMxXmSExu5FiNqLZ5ikPEm4hFHnlBJT6zkZYspze4aDgkVcMWNt3pYy1vKJbJtpCo+PQlP3ScnJxGIX72nT2l0KawKBgCrOioyV3xNiBEL3O7wLbIo6k7KUJFzOuwl6PPpUkATQSEthfGiiXv53uw+00UT19PX87S1cyvLDQiy0tW/HjGZcOtFH58W4z+0si55GIT0fIvm/wQZhDJ6CCt9tre0n9pTPNKB8iAkpHGsqWhmln839LBA4yAQmIDvRj8xVPoKjAoGBAP33PLwqJhVxgpG6uMhjmF3fEdTrrd40yEI0SnPHMRnQflbkXr+u6EOUWtVR4y5Buj0+ckNzIZXJ5k2GhpxT/vWmkEiOH4+WpTruQDuoa6S/nHP6QuP2AaGZyBDCfeTAWGp8i5HAsPSBdLyylgnmfkfQEVGZlEgUITjf31exJawu";
ScanRequest scanRequest = new ScanRequest();
scanRequest.setPictureUrl("https://zing-finance.oss-cn-hangzhou.aliyuncs.com/%E8%90%A5%E4%B8%9A%E6%89%A7%E7%85%A7.png");
String md5 = "f5226bbba1eca51c03a56df636d44b1c";
DefaultClient defaultClient = new DefaultClient("http://localhost:8080", appPrivateKey, md5, myPublicKey, "1");
String testData = defaultClient.execute(scanRequest, "/open/api/ocr/v1/scanForBusiness");
System.out.println(testData);
}
/**
* 签名
*/
public static String sign(String originalData) {
String base64Sign = "";
try {
//返回与此给定的别名的密码,并用给定的密钥来恢复它
PrivateKey privateKey = getPrivateKey();
//返回指定签名的Signature对象
Signature sign = Signature.getInstance("SHA1withRSA");
//初始化这个用于签名的对象
sign.initSign(privateKey);
byte[] bysData = originalData.getBytes(DEFAULT_UTF8);
//使用指定的byte数组更新要签名的数据
sign.update(bysData);
//返回所有已经更新数据的签名字节
byte[] signByte = sign.sign();
//对其进行Base64编码
BASE64Encoder encoder = new BASE64Encoder();
base64Sign = encoder.encode(signByte);
} catch (Exception e) {
System.out.println("签名异常");
e.printStackTrace();
}
return base64Sign;
}
/**
* 验签
*
* @param signStr 签名数据
* @param originalData 原始数据
* @return
*/
public static boolean verify(String signStr, String originalData) {
System.out.println("开始进行验签,原始数据为:" + originalData);
try {
//从此证书对象中获取公钥
PublicKey publicKey = getPublicKey();
//将签名数据
BASE64Decoder decoder = new BASE64Decoder();
byte[] signed = decoder.decodeBuffer(signStr);
//通过Signature的getInstance方法,获取指定签名算法的Signature对象
Signature signature = Signature.getInstance("SHA1withRSA");
//初始化用于验证的对象
signature.initVerify(publicKey);
//使用指定的byte[]更新要验证的数据
signature.update(originalData.getBytes(DEFAULT_UTF8));
//验证传入的签名
return signature.verify(signed);
} catch (Exception e) {
return false;
}
}
/**
* 获取公钥
*
* @return
*/
private static PublicKey getPublicKey() {
InputStream in = null;
try {
in = new FileInputStream(PUBLIC_KEY_FILE_PATH);
//获取实现指定证书类型的CertificateFactory对象
CertificateFactory cf = CertificateFactory.getInstance("x509");
//生成一个证书对象,并从执行的输入流中读取数据对它进行初始化
Certificate certificate = cf.generateCertificate(in);
//从此证书中获取公钥
return certificate.getPublicKey();
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
if (null != in) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 获取私钥
*
* @return
*/
private static PrivateKey getPrivateKey() {
InputStream in = null;
try {
in = new FileInputStream(PRIVATE_KEY_FILE_PATH);
//返回指定类型的KeyStore对象
KeyStore keyStore = KeyStore.getInstance("PKCS12");
char[] pscs = PRIVATE_KEY_PASSWORD.toCharArray();
//从给定的输入流中加载此keyStore
keyStore.load(in, pscs);
//返回与给定别名关联的密钥,并用给定的密码来恢复它
return (PrivateKey) keyStore.getKey(ALIAS_NAME, pscs);
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
if (null != in) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
package cn.zingfin.config;
import com.github.xiaoymin.swaggerbootstrapui.annotations.EnableSwaggerBootstrapUI;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* SwaggerConfig
*
* @author jwc
* @date 2020-08-31
*/
@Configuration
@EnableSwagger2
//@EnableSwaggerBootstrapUI
@Profile({"dev", "test"})
public class SwaggerConfig {
@Bean
public Docket controller() {
return new Docket(DocumentationType.SWAGGER_2)
.groupName("后台接口")
.apiInfo(apiInfo("公共服务后台", "1.0.0"))
.select()
.apis(RequestHandlerSelectors.basePackage("cn.zingfin.web.controller"))
.paths(PathSelectors.any())
.build();
}
// @Bean
// public Docket openApiController() {
// return new Docket(DocumentationType.SWAGGER_2)
// .groupName("开放平台接口")
// .apiInfo(apiInfo("common项目后台", "1.0.0"))
// .select()
// .apis(RequestHandlerSelectors.basePackage("cn.zingfin.platform.agent.openapi.controller"))
// .paths(PathSelectors.any())
// .build();
// }
private ApiInfo apiInfo(String title, String version) {
Contact contact = new Contact("common平台", "http://www.zingfin.cn", "66382668@qq.com");
return new ApiInfoBuilder()
.title(title)
.description("demo项目接口")
.termsOfServiceUrl("http://zingfin.cn/")
.contact(contact)
.version(version)
.build();
}
}
package cn.zingfin.domain.service;
import cn.zingfin.exception.OpenApiException;
import cn.zingfin.web.model.BusinessLicenseInfoModel;
import cn.zingfin.web.model.IdCardInfoModel;
import cn.zingfin.web.model.ScanRequest;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.exceptions.ClientException;
/**
* @author jwc
* @date 2020/8/31 15:41
*/
public interface OcrService {
/**
* 扫描身份证
*
* @param url 图片url(必须为http or https)
*/
IdCardInfoModel scanForIdCard(ScanRequest url) throws ClientException, OpenApiException;
/**
* 扫描营业执照
*
* @param scanRequest
* @return
*/
BusinessLicenseInfoModel scanForBusiness(ScanRequest scanRequest) throws ClientException, OpenApiException;
}
package cn.zingfin.domain.service;
import cn.zingfin.exception.OpenApiException;
import cn.zingfin.web.model.SmsRequest;
/**
* @author jwc
* @date 2020/9/1 18:48
*/
public interface SmsService {
/**
* 发送短信
*
* @param smsRequest
* @return
* @throws OpenApiException
*/
Boolean sendSms(SmsRequest smsRequest) throws OpenApiException;
}
package cn.zingfin.domain.service.impl;
import cn.zingfin.common.enums.OcrCardTypeEnum;
import cn.zingfin.common.enums.OpenApiErrorCodeEnums;
import cn.zingfin.domain.service.OcrService;
import cn.zingfin.exception.OpenApiException;
import cn.zingfin.properties.AccessKeyAndSecret;
import cn.zingfin.web.model.BusinessLicenseInfoModel;
import cn.zingfin.web.model.IdCardInfoModel;
import cn.zingfin.web.model.ScanRequest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.green.model.v20180509.ImageSyncScanRequest;
import com.aliyuncs.http.FormatType;
import com.aliyuncs.http.HttpResponse;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.http.ProtocolType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
/**
* @author jwc
* @date 2020/8/31 15:40
*/
@Service
@Slf4j
public class OcrServiceImpl implements OcrService {
@Resource
private AccessKeyAndSecret accessKeyAndSecret;
@Override
public IdCardInfoModel scanForIdCard(ScanRequest scanRequest) throws ClientException, OpenApiException {
IClientProfile profile = DefaultProfile
.getProfile("cn-shanghai", accessKeyAndSecret.getAccessKey(), accessKeyAndSecret.getSecret());
DefaultProfile
.addEndpoint("cn-shanghai", "cn-shanghai", "Green", "green.cn-shanghai.aliyuncs.com");
IAcsClient client = new DefaultAcsClient(profile);
String cardType = OcrCardTypeEnum.CARD_TYPE_ID_CARD_FRONT.getType();
JSONObject httpBody = getHttpBody(scanRequest.getPictureUrl(), cardType);
ImageSyncScanRequest imageSyncScanRequest = getImageSyncScanRequest(httpBody);
HttpResponse httpResponse;
try {
httpResponse = client.doAction(imageSyncScanRequest);
} catch (Exception e) {
throw new OpenApiException(e.getMessage());
}
return (IdCardInfoModel) handleResult(httpResponse, cardType);
}
@Override
public BusinessLicenseInfoModel scanForBusiness(ScanRequest scanRequest) throws ClientException, OpenApiException {
IClientProfile profile = DefaultProfile
.getProfile("cn-shanghai", accessKeyAndSecret.getAccessKey(), accessKeyAndSecret.getSecret());
DefaultProfile
.addEndpoint("cn-shanghai", "cn-shanghai", "Green", "green.cn-shanghai.aliyuncs.com");
IAcsClient client = new DefaultAcsClient(profile);
String cardType = OcrCardTypeEnum.CARD_TYPE_BUSINESS_LICENSE.getType();
JSONObject httpBody = getHttpBody(scanRequest.getPictureUrl(), cardType);
ImageSyncScanRequest imageSyncScanRequest = getImageSyncScanRequest(httpBody);
HttpResponse httpResponse = null;
try {
httpResponse = client.doAction(imageSyncScanRequest);
} catch (Exception e) {
e.printStackTrace();
}
return (BusinessLicenseInfoModel) handleResult(httpResponse, cardType);
}
/**
* 处理返回结果
*
* @param httpResponse
* @param cardType
*/
private Object handleResult(HttpResponse httpResponse, String cardType) throws OpenApiException {
// 服务端接收到请求,并完成处理返回的结果。
if (httpResponse != null && httpResponse.isSuccess()) {
JSONObject scrResponse = JSON.parseObject(org.apache.commons.codec.binary.StringUtils.newStringUtf8(httpResponse.getHttpContent()));
System.out.println(JSON.toJSONString(scrResponse));
int requestCode = scrResponse.getIntValue("code");
// 每一张图片的检测结果。
JSONArray taskResults = scrResponse.getJSONArray("data");
if (200 == requestCode) {
for (Object taskResult : taskResults) {
// 单张图片的处理结果。
int taskCode = ((JSONObject) taskResult).getIntValue("code");
// 对应检测场景下图片的处理结果。如果是多个场景,则会有每个场景的结果。
JSONArray sceneResults = ((JSONObject) taskResult).getJSONArray("results");
if (200 == taskCode) {
for (Object sceneResult : sceneResults) {
String scene = ((JSONObject) sceneResult).getString("scene");
String suggestion = ((JSONObject) sceneResult).getString("suggestion");
//do something
// 识别出来的身份证信息。
if ("review".equals(suggestion) && "ocr".equals(scene)) {
if (Objects.equals(cardType, "id-card-front")) {
return getIdCardInfoModel((JSONObject) sceneResult);
}
if (Objects.equals(cardType, "business-license")) {
return getBusinessLicenseInfoModel((JSONObject) sceneResult);
}
}
}
} else {
// 单张图片处理失败,原因视具体的情况详细分析。
System.out.println("task process fail. task response:" + JSON.toJSONString(taskResult));
}
}
} else {
// 表明请求整体处理失败,原因视具体的情况详细分析。
System.out.println("the whole image scan request failed. response:" + JSON.toJSONString(scrResponse));
throw new OpenApiException(OpenApiErrorCodeEnums.FAIL);
}
}
return null;
}
private IdCardInfoModel getIdCardInfoModel(JSONObject sceneResult) {
IdCardInfoModel idCardInfoModel;
JSONObject idCardInfo = sceneResult.getJSONObject("idCardInfo");
idCardInfoModel = JSONObject.toJavaObject(idCardInfo, IdCardInfoModel.class);
return idCardInfoModel;
}
private BusinessLicenseInfoModel getBusinessLicenseInfoModel(JSONObject sceneResult) {
BusinessLicenseInfoModel businessLicenseInfoModel;
JSONObject idCardInfo = sceneResult.getJSONObject("businessLicenseInfo");
businessLicenseInfoModel = JSONObject.toJavaObject(idCardInfo, BusinessLicenseInfoModel.class);
return businessLicenseInfoModel;
}
private ImageSyncScanRequest getImageSyncScanRequest(JSONObject httpBody) {
ImageSyncScanRequest imageSyncScanRequest = new ImageSyncScanRequest();
// 指定返回格式。
imageSyncScanRequest.setAcceptFormat(FormatType.JSON);
// 指定请求方法。
imageSyncScanRequest.setMethod(MethodType.POST);
imageSyncScanRequest.setEncoding("utf-8");
// 支持HTTP和HTTPS。
imageSyncScanRequest.setProtocol(ProtocolType.HTTP);
imageSyncScanRequest.setHttpContent(org.apache.commons.codec.binary.StringUtils.getBytesUtf8(httpBody.toJSONString()), "UTF-8", FormatType.JSON);
// 请设置超时时间,服务端全链路处理超时时间为10秒,请据此做相应设置。
// 如果您设置的ReadTimeout小于服务端处理的时间,程序中会获得一个read timeout异常。
imageSyncScanRequest.setConnectTimeout(3000);
imageSyncScanRequest.setReadTimeout(10000);
return imageSyncScanRequest;
}
/**
* 构造httpBody
*
* @param url 图片url
* @return
*/
private JSONObject getHttpBody(String url, String cardType) {
JSONObject httpBody = new JSONObject();
// 设置要检测的场景。ocr:表示OCR图文识别和OCR卡证识别。
httpBody.put("scenes", Collections.singletonList("ocr"));
// 设置待检测的图片,一张图片对应一个检测任务。
// 多张图片同时检测时,处理时间由最后一张处理完的图片决定。
// 通常情况下批量检测的平均响应时间比单任务检测长,一次批量提交的图片数越多,响应时间被拉长的概率越高
// 代码中以单张图片检测作为示例,如果需要批量检测多张图片,请自行构建多个任务。
JSONObject task = new JSONObject();
task.put("dataId", UUID.randomUUID().toString());
// 设置图片链接。例如:https://zing-finance.oss-cn-hangzhou.aliyuncs.com/%E8%BA%AB%E4%BB%BD%E8%AF%81%E6%AD%A3%E9%9D%A2.jpg
task.put("url", url);
task.put("time", new Date());
httpBody.put("tasks", Collections.singletonList(task));
// 需要OCR卡证识别时,设置卡证类型。
JSONObject cardExtras = new JSONObject();
// 身份证正面识别。
cardExtras.put("card", cardType);
// 身份证反面。
//cardExtras.put("card", "id-card-back");
httpBody.put("extras", cardExtras);
return httpBody;
}
}
package cn.zingfin.domain.service.impl;
import cn.zingfin.common.enums.OpenApiErrorCodeEnums;
import cn.zingfin.domain.service.SmsService;
import cn.zingfin.exception.OpenApiException;
import cn.zingfin.properties.AccessKeyAndSecret;
import cn.zingfin.web.model.SmsRequest;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* @author jwc
* @date 2020/9/1 18:48
*/
@Service
@Slf4j
public class SmsServiceImpl implements SmsService {
@Resource
private AccessKeyAndSecret accessKeyAndSecret;
@Override
public Boolean sendSms(SmsRequest smsRequest) throws OpenApiException {
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyAndSecret.getAccessKey(), accessKeyAndSecret.getSecret());
IAcsClient client = new DefaultAcsClient(profile);
CommonRequest request = new CommonRequest();
request.setSysMethod(MethodType.POST);
request.setSysDomain("dysmsapi.aliyuncs.com");
request.setSysVersion("2017-05-25");
request.setSysAction("SendSms");
request.putQueryParameter("RegionId", "cn-hangzhou");
request.putQueryParameter("PhoneNumbers", smsRequest.getPhoneNumbers());
request.putQueryParameter("SignName", smsRequest.getSignName());
request.putQueryParameter("TemplateCode", smsRequest.getTemplateCode());
request.putQueryParameter("TemplateParam", smsRequest.getTemplateParam());
try {
CommonResponse response = client.getCommonResponse(request);
return 200 == response.getHttpStatus();
} catch (ClientException e) {
log.info(e.getMessage());
throw new OpenApiException(OpenApiErrorCodeEnums.FAIL);
}
}
}
package cn.zingfin.exception;
import cn.zingfin.constant.ErrorCode;
/**
* @author chsm
* @version v1.0
* @since 2020/8/11 13:39
*/
public class OpenApiException extends Exception {
/**
* 错误码
*/
private int code;
public int getCode() {
return code;
}
public OpenApiException(ErrorCode errorCode) {
super(errorCode.getMessage());
this.code = errorCode.getCode();
}
public OpenApiException(String message) {
super(message);
}
}
package cn.zingfin.factory;
import cn.zingfin.base.BaseOpenApiRequest;
import cn.zingfin.properties.OpenApiPlatformKey;
import cn.zingfin.sign.DefaultServer;
import org.springframework.stereotype.Component;
/**
* @author chsm
* @version v1.0
* @since 2020/8/10 16:20
*/
@Component
public class DefaultServerFactory {
private final OpenApiPlatformKey openApiPlatformKey;
public DefaultServerFactory(OpenApiPlatformKey openApiPlatformKey) {
this.openApiPlatformKey = openApiPlatformKey;
}
public DefaultServer getDefaultServer(BaseOpenApiRequest request) {
return new DefaultServer(openApiPlatformKey.getPrivateKey(), request.getAppPublicKey(), request.getMd5Key());
}
}
package cn.zingfin.factory;
import cn.zingfin.base.BaseOpenApiRequest;
import cn.zingfin.properties.OpenApiPlatformKey;
import cn.zingfin.sign.ResponseDataHandle;
import org.springframework.stereotype.Component;
/**
* @author chsm
* @version v1.0
* @since 2020/8/11 9:45
*/
@Component
public class ResponseDataHandleFactory {
private final OpenApiPlatformKey openApiPlatformKey;
public ResponseDataHandleFactory(OpenApiPlatformKey openApiPlatformKey) {
this.openApiPlatformKey = openApiPlatformKey;
}
public ResponseDataHandle getResponseDataHandle(BaseOpenApiRequest request) {
return new ResponseDataHandle(openApiPlatformKey.getPrivateKey(), request.getAppPublicKey(), request.getMd5Key());
}
}
package cn.zingfin.handle;
import cn.zingfin.base.BaseOpenApiRequest;
import cn.zingfin.exception.BizException;
import cn.zingfin.factory.DefaultServerFactory;
import cn.zingfin.factory.ResponseDataHandleFactory;
import cn.zingfin.properties.OpenApiPlatformKey;
import cn.zingfin.sign.DefaultServer;
import cn.zingfin.sign.ResponseDataHandle;
import cn.zingfin.util.ResultUtils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**
* @author chsm
* @version v1.0
* @since 2020/8/11 10:15
*/
@Component
public class OpenApiHandle {
// private static final String mdKey = "f5226bbba1eca51c03a56df636d44b1c"; // 123456md5
@Resource
public DefaultServerFactory defaultServerFactory;
@Resource
public ResponseDataHandleFactory responseDataHandleFactory;
@Resource
private OpenApiPlatformKey openApiPlatformKey;
/**
* 请求加密参数,每次请求时set,响应后remove
*/
public ThreadLocal<BaseOpenApiRequest> baseOpenApiRequest = new ThreadLocal<>();
private static final Gson GSON = new GsonBuilder().create();
/**
* 执行http数据解码
*
* @param request http request
* @param r 响应参数class
* @param <R> 响应参数泛型
* @return
*/
public <R> R execute(HttpServletRequest request, Class<R> r) {
BaseOpenApiRequest baseOpenApiRequest = new BaseOpenApiRequest();
baseOpenApiRequest.setAppPublicKey(openApiPlatformKey.getPublicKey());
baseOpenApiRequest.setMd5Key(openApiPlatformKey.getMdKey());
this.baseOpenApiRequest.set(baseOpenApiRequest);
DefaultServer defaultServer = defaultServerFactory.getDefaultServer(baseOpenApiRequest);
String bizContent = null;
try {
bizContent = defaultServer.getBizContent(request);
} catch (BizException e) {
e.printStackTrace();
}
System.out.println(bizContent);
return GSON.fromJson(bizContent, r);
}
/**
* 获取响应数据
*
* @param data 需要响应的数据
* @param response http response
* @param <T> 响应数据类型
* @return 响应数据map
*/
public <T> Map<String, String> returnHandle(T data, HttpServletResponse response) {
ResponseDataHandle responseDataHandle = responseDataHandleFactory.getResponseDataHandle(baseOpenApiRequest.get());
baseOpenApiRequest.remove();
return responseDataHandle.handle(ResultUtils.handleSuccessResult(data), response);
}
}
package cn.zingfin.properties;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* @author jwc
* @date 2020/9/1 18:33
*/
@Component
@Data
public class AccessKeyAndSecret {
/**
* accessKeyId
*/
@Value("${aliyun.accessKeyId}")
private String accessKey;
/**
* secret
*/
@Value("${aliyun.accessKeySecret}")
private String secret;
}
package cn.zingfin.properties;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @author chsm
* @version v1.0
* @since 2020/8/10 16:21
*/
@Data
@Component
//@ConfigurationProperties(prefix = "zing.open.api")
public class OpenApiPlatformKey {
/**
* 公钥
*/
@Value("${zing.open.api.publicKey}")
private String publicKey;
/**
* 私钥
*/
@Value("${zing.open.api.privateKey}")
private String privateKey;
/**
* mdKey
*/
@Value("${zing.open.api.mdKey}")
private String mdKey;
}
package cn.zingfin.web.controller;
import cn.zingfin.properties.OpenApiPlatformKey;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* @author jwc
* @date 2020/8/31 10:28
*/
@Api(tags = "测试接口")
@RequestMapping("/main")
@RestController
public class HelloWorldController {
@Resource
private OpenApiPlatformKey openApiPlatformKey;
@ApiOperation("测试")
@GetMapping("/hello")
public String hello() {
String publicKey = openApiPlatformKey.getPublicKey();
String privateKey = openApiPlatformKey.getPrivateKey();
System.out.println(publicKey + "/n" + privateKey);
return "hello world!";
}
}
package cn.zingfin.web.controller;
import cn.zingfin.domain.service.OcrService;
import cn.zingfin.exception.OpenApiException;
import cn.zingfin.handle.OpenApiHandle;
import cn.zingfin.web.model.BusinessLicenseInfoModel;
import cn.zingfin.web.model.IdCardInfoModel;
import cn.zingfin.web.model.ScanRequest;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.exceptions.ClientException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**
* @author jwc
* @date 2020/8/31 17:01
*/
@Api(tags = "ocr图片识别接口")
@RequestMapping("/open/api/ocr")
@RestController
public class OcrController {
private final OcrService ocrService;
private final OpenApiHandle openApiHandle;
public OcrController(OcrService ocrService, OpenApiHandle openApiHandle) {
this.ocrService = ocrService;
this.openApiHandle = openApiHandle;
}
@ApiOperation("ocr识别身份证")
@PostMapping("/v1/scanForIdCard")
public Map<String, String> scanForIdCard(HttpServletRequest request, HttpServletResponse response) throws ClientException, OpenApiException {
ScanRequest scanRequest = openApiHandle.execute(request, ScanRequest.class);
IdCardInfoModel idCardInfoModel = ocrService.scanForIdCard(scanRequest);
return openApiHandle.returnHandle(idCardInfoModel, response);
}
@ApiOperation("ocr识别营业执照")
@PostMapping("/v1/scanForBusiness")
public Map<String, String> scanForBusiness(HttpServletRequest request, HttpServletResponse response) throws ClientException, OpenApiException {
ScanRequest scanRequest = openApiHandle.execute(request, ScanRequest.class);
BusinessLicenseInfoModel businessLicenseInfoModel = ocrService.scanForBusiness(scanRequest);
return openApiHandle.returnHandle(businessLicenseInfoModel, response);
}
}
package cn.zingfin.web.controller;
import cn.zingfin.domain.service.impl.SmsServiceImpl;
import cn.zingfin.exception.OpenApiException;
import cn.zingfin.handle.OpenApiHandle;
import cn.zingfin.web.model.IdCardInfoModel;
import cn.zingfin.web.model.ScanRequest;
import cn.zingfin.web.model.SmsRequest;
import com.aliyuncs.exceptions.ClientException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**
* @author jwc
* @date 2020/9/1 18:45
*/
@Api(tags = "sms短信服务")
@RequestMapping("/open/api/sms")
@RestController
public class SmsController {
private final SmsServiceImpl smsService;
private final OpenApiHandle openApiHandle;
public SmsController(SmsServiceImpl smsService, OpenApiHandle openApiHandle) {
this.smsService = smsService;
this.openApiHandle = openApiHandle;
}
@ApiOperation("sms短信")
@PostMapping("/v1/sendSms")
public Map<String, String> sendSms(HttpServletRequest request, HttpServletResponse response) throws ClientException, OpenApiException {
SmsRequest smsRequest = openApiHandle.execute(request, SmsRequest.class);
Boolean isSuccess = smsService.sendSms(smsRequest);
return openApiHandle.returnHandle(isSuccess, response);
}
}
package cn.zingfin.web.model;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author jwc
* @date 2020/9/1 16:06
*/
@Data
public class BusinessLicenseInfoModel {
@ApiModelProperty(value = "注册号")
private String regNum;
@ApiModelProperty(value = "公司名称")
private String companyName;
@ApiModelProperty(value = "公司类型")
private String companyType;
@ApiModelProperty(value = "企业法人")
private String legalPerson;
@ApiModelProperty(value = "注册日期")
private String establishDate;
@ApiModelProperty(value = "营业终止日期")
private String vaildPeriod;
@ApiModelProperty(value = "地址")
private String address;
@ApiModelProperty(value = "注册资本")
private String capital;
@ApiModelProperty(value = "经营范围")
private String business;
@ApiModelProperty(value = "是否是副本")
private Boolean copy;
@ApiModelProperty(value = "副本号")
private String copyId;
@ApiModelProperty(value = "证照编号")
private String certSN;
@ApiModelProperty(value = "统一社会信用代码")
private String creditCode;
@ApiModelProperty(value = "组织机构代码")
private String organizationCode;
@ApiModelProperty(value = "税务登记号")
private String taxCode;
@ApiModelProperty(value = "公司编号")
private String companySN;
@ApiModelProperty(value = "组成形式")
private String composition;
@ApiModelProperty(value = "实收资本")
private String paidInCapital;
}
package cn.zingfin.web.model;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author jwc
* @date 2020/9/1 15:08
*/
@Data
public class IdCardInfoModel {
@ApiModelProperty(value = "身份证号")
private String number;
@ApiModelProperty(value = "住址")
private String address;
@ApiModelProperty(value = "民族")
private String nationality;
@ApiModelProperty(value = "签发机构")
private String authority;
@ApiModelProperty(value = "性别")
private String sex;
@ApiModelProperty(value = "姓名")
private String name;
@ApiModelProperty(value = "证件顺时针旋转的角度")
private Float angle;
@ApiModelProperty(value = "身份证照片是否是复印件")
private Float copy;
@ApiModelProperty(value = "出生日期。格式:yyyy-MM-dd。")
private String birth;
@ApiModelProperty(value = "有效期开始日期。格式:yyyy-MM-dd。")
private String startDate;
@ApiModelProperty(value = "有效期结束日期。格式:yyyy-MM-dd。")
private String endDate;
@ApiModelProperty(value = "证件类型。取值:\n" +
"front:身份证正面(人像面)\n" +
"back:身份证背面(国徽面)\n" +
"front_back:正常身份证正反同页\n" +
"interim_front:临时身份证正面(人像面)\n" +
"interim_back:临时身份证背面(国徽面)\n" +
"interim_front_back:临时身份证正反同页")
private String type;
@ApiModelProperty(value = "证件号码是否合法")
private Boolean numberValid;
}
package cn.zingfin.web.model;
import lombok.Data;
/**
* @author jwc
* @date 2020/8/31 14:46
*/
@Data
public class InputModel {
private String name;
}
package cn.zingfin.web.model;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* @author jwc
* @date 2020/9/1 14:45
*/
@Data
public class ScanRequest {
@NotBlank(message = "图片url不能为空")
@ApiModelProperty(value = "图片url")
private String pictureUrl;
}
package cn.zingfin.web.model;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author jwc
* @date 2020/9/2 8:05
*/
@Data
public class SmsRequest {
@ApiModelProperty(value = "电话号码")
private String phoneNumbers;
@ApiModelProperty(value = "签名名称")
private String signName;
@ApiModelProperty(value = "模板code")
private String templateCode;
@ApiModelProperty(value = "模板参数")
private String templateParam;
}
zing:
open:
api:
publicKey: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApusTucCRkkb7RFbwmgD8UcDrnO0R+J0+/SiFxc8EXY3gcyEe/Jv20jL+4aJJmoUzYhe73iP/Fg/BAM+xOlaFxmrc27RjlTtxhJHfIbLADsOrd3Qn6+TzUrUuKsoytIWhIsmty5SmKMLhb+US8JiWAKkR5Qlu92pWvppN4gwWB37i6gCoRZ/swhN5EEA+wFsJMVoX+CHJEOspoT47F/+aYyV38zY4W39aa8roJdtxzZuCkPqRDwy70Nr84jlRJev+su8yiH+Ka/3vY6vE92V+0/gBMbpwwLE6BKmT9sm3XpPXSTh3ybaGxWaBVuv9l03drx0wRVA6FG3s0ut0NRQH5QIDAQAB"
privateKey: "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCm6xO5wJGSRvtEVvCaAPxRwOuc7RH4nT79KIXFzwRdjeBzIR78m/bSMv7hokmahTNiF7veI/8WD8EAz7E6VoXGatzbtGOVO3GEkd8hssAOw6t3dCfr5PNStS4qyjK0haEiya3LlKYowuFv5RLwmJYAqRHlCW73ala+mk3iDBYHfuLqAKhFn+zCE3kQQD7AWwkxWhf4IckQ6ymhPjsX/5pjJXfzNjhbf1pryugl23HNm4KQ+pEPDLvQ2vziOVEl6/6y7zKIf4pr/e9jq8T3ZX7T+AExunDAsToEqZP2ybdek9dJOHfJtobFZoFW6/2XTd2vHTBFUDoUbezS63Q1FAflAgMBAAECggEAcZH6/uT+ZyeyqOH6nN5Uz49TAJfxJVZgWEGtG1TqpHj3IX6Epd28h3K5J26TY/aDape5dMDLPAiGCnZGIOpj5Qgqs7Y+F3i1mTzjM/t6X9FUplc7Hm7N/BVYjza6X0eYxqGwhZbjo1JNryOOynMXhOWETnEntmH9GXzFxyrwBjJ4skUDK78I8vDmazj0hVj7VULWjhH0ufG17mDme7mVjJh1oOpCqEVoCqkMRHWsZg8o0bwYOczxoQG+T9vdR7K9GyLdFctFUGZNlZPsyDVcPrsC4IP+a8630YMxI06DBS/r8xTqS3Dh2YWcuNB0TQsUDg/nms+y+tT9fwFk1rX+9QKBgQD/eqFa+t+RLAkUbAvwLtDpgahtOkM7SnucuF101mnYff8LtjImZ//3pQltrHTRo++b1nWcVQcNb1rljuJ9Fgs9dzMP9DSnziYNcbAxUrcA0kTiDUOuOvxoVjvpGRkHKnEmXhZWQrhOP2sb15LpbDE6GBFs4xcIW8jat1cdem033wKBgQCnQjb2b88OgDssROf7GmXjUsSheeLshrxvf2dxiBomjtg0h9WKjP2ONoLKxwJNICBqvr1SbteIMQmw8/2QwCDvcx0JjNgkwuX6HabwmJ5qJFtn9wHB2gq1JZzoLvfwVr+uCVUF/EDciCqts08ynzYZoCbJ0LhTXdsQSDeGGRrIuwKBgQCcyIobRlhLRAXydXhCFsj4dCyDk7zMtyHzBKW93ROp23DYpCBUt4A7XxnRJ4OtX/jc3xjgLsIcOZlDxZMzBoMxXmSExu5FiNqLZ5ikPEm4hFHnlBJT6zkZYspze4aDgkVcMWNt3pYy1vKJbJtpCo+PQlP3ScnJxGIX72nT2l0KawKBgCrOioyV3xNiBEL3O7wLbIo6k7KUJFzOuwl6PPpUkATQSEthfGiiXv53uw+00UT19PX87S1cyvLDQiy0tW/HjGZcOtFH58W4z+0si55GIT0fIvm/wQZhDJ6CCt9tre0n9pTPNKB8iAkpHGsqWhmln839LBA4yAQmIDvRj8xVPoKjAoGBAP33PLwqJhVxgpG6uMhjmF3fEdTrrd40yEI0SnPHMRnQflbkXr+u6EOUWtVR4y5Buj0+ckNzIZXJ5k2GhpxT/vWmkEiOH4+WpTruQDuoa6S/nHP6QuP2AaGZyBDCfeTAWGp8i5HAsPSBdLyylgnmfkfQEVGZlEgUITjf31exJawu"
mdKey: "f5226bbba1eca51c03a56df636d44b1c"
aliyun:
accessKeyId: "LTAI4GBuqJxv5x1DG64kjJYs"
accessKeySecret: "m9ECgeQ3t9o5YSbnpxUnea7NmizBQV"
zing:
open:
api:
publicKey: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApusTucCRkkb7RFbwmgD8UcDrnO0R+J0+/SiFxc8EXY3gcyEe/Jv20jL+4aJJmoUzYhe73iP/Fg/BAM+xOlaFxmrc27RjlTtxhJHfIbLADsOrd3Qn6+TzUrUuKsoytIWhIsmty5SmKMLhb+US8JiWAKkR5Qlu92pWvppN4gwWB37i6gCoRZ/swhN5EEA+wFsJMVoX+CHJEOspoT47F/+aYyV38zY4W39aa8roJdtxzZuCkPqRDwy70Nr84jlRJev+su8yiH+Ka/3vY6vE92V+0/gBMbpwwLE6BKmT9sm3XpPXSTh3ybaGxWaBVuv9l03drx0wRVA6FG3s0ut0NRQH5QIDAQAB"
privateKey: "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCm6xO5wJGSRvtEVvCaAPxRwOuc7RH4nT79KIXFzwRdjeBzIR78m/bSMv7hokmahTNiF7veI/8WD8EAz7E6VoXGatzbtGOVO3GEkd8hssAOw6t3dCfr5PNStS4qyjK0haEiya3LlKYowuFv5RLwmJYAqRHlCW73ala+mk3iDBYHfuLqAKhFn+zCE3kQQD7AWwkxWhf4IckQ6ymhPjsX/5pjJXfzNjhbf1pryugl23HNm4KQ+pEPDLvQ2vziOVEl6/6y7zKIf4pr/e9jq8T3ZX7T+AExunDAsToEqZP2ybdek9dJOHfJtobFZoFW6/2XTd2vHTBFUDoUbezS63Q1FAflAgMBAAECggEAcZH6/uT+ZyeyqOH6nN5Uz49TAJfxJVZgWEGtG1TqpHj3IX6Epd28h3K5J26TY/aDape5dMDLPAiGCnZGIOpj5Qgqs7Y+F3i1mTzjM/t6X9FUplc7Hm7N/BVYjza6X0eYxqGwhZbjo1JNryOOynMXhOWETnEntmH9GXzFxyrwBjJ4skUDK78I8vDmazj0hVj7VULWjhH0ufG17mDme7mVjJh1oOpCqEVoCqkMRHWsZg8o0bwYOczxoQG+T9vdR7K9GyLdFctFUGZNlZPsyDVcPrsC4IP+a8630YMxI06DBS/r8xTqS3Dh2YWcuNB0TQsUDg/nms+y+tT9fwFk1rX+9QKBgQD/eqFa+t+RLAkUbAvwLtDpgahtOkM7SnucuF101mnYff8LtjImZ//3pQltrHTRo++b1nWcVQcNb1rljuJ9Fgs9dzMP9DSnziYNcbAxUrcA0kTiDUOuOvxoVjvpGRkHKnEmXhZWQrhOP2sb15LpbDE6GBFs4xcIW8jat1cdem033wKBgQCnQjb2b88OgDssROf7GmXjUsSheeLshrxvf2dxiBomjtg0h9WKjP2ONoLKxwJNICBqvr1SbteIMQmw8/2QwCDvcx0JjNgkwuX6HabwmJ5qJFtn9wHB2gq1JZzoLvfwVr+uCVUF/EDciCqts08ynzYZoCbJ0LhTXdsQSDeGGRrIuwKBgQCcyIobRlhLRAXydXhCFsj4dCyDk7zMtyHzBKW93ROp23DYpCBUt4A7XxnRJ4OtX/jc3xjgLsIcOZlDxZMzBoMxXmSExu5FiNqLZ5ikPEm4hFHnlBJT6zkZYspze4aDgkVcMWNt3pYy1vKJbJtpCo+PQlP3ScnJxGIX72nT2l0KawKBgCrOioyV3xNiBEL3O7wLbIo6k7KUJFzOuwl6PPpUkATQSEthfGiiXv53uw+00UT19PX87S1cyvLDQiy0tW/HjGZcOtFH58W4z+0si55GIT0fIvm/wQZhDJ6CCt9tre0n9pTPNKB8iAkpHGsqWhmln839LBA4yAQmIDvRj8xVPoKjAoGBAP33PLwqJhVxgpG6uMhjmF3fEdTrrd40yEI0SnPHMRnQflbkXr+u6EOUWtVR4y5Buj0+ckNzIZXJ5k2GhpxT/vWmkEiOH4+WpTruQDuoa6S/nHP6QuP2AaGZyBDCfeTAWGp8i5HAsPSBdLyylgnmfkfQEVGZlEgUITjf31exJawu"
mdKey: "f5226bbba1eca51c03a56df636d44b1c"
aliyun:
accessKeyId: "LTAI4GBuqJxv5x1DG64kjJYs"
accessKeySecret: "m9ECgeQ3t9o5YSbnpxUnea7NmizBQV"
\ No newline at end of file
mybatis-plus:
mapper-locations: classpath:mapper/*.xml
global-config:
db-config:
logic-delete-value: 0 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 1 # 逻辑未删除值(默认为 0)
logging:
level:
root: info
cn.zingfin.mapper: debug
spring:
profiles:
active: '@env@'
application:
name: common-api
servlet:
multipart:
max-file-size: 1073741824
max-request-size: 1073741824
datasource:
url: jdbc:mysql://39.170.1.99:3306/agent?characterEncoding=utf-8&useLocalSessionState=true&autoReconnect=true
username: agent
password: "qMyWRrnPO@hcPlp@"
driver-class-name: com.mysql.jdbc.Driver
server:
port: 8080
zing:
yima:
send-url: https://viwings.vihost.cn/
sms:
send-url: https://viwings.vihost.cn/
secret-key: 4a30-8bd3-e56e1cff2531
open:
api:
publicKey: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApusTucCRkkb7RFbwmgD8UcDrnO0R+J0+/SiFxc8EXY3gcyEe/Jv20jL+4aJJmoUzYhe73iP/Fg/BAM+xOlaFxmrc27RjlTtxhJHfIbLADsOrd3Qn6+TzUrUuKsoytIWhIsmty5SmKMLhb+US8JiWAKkR5Qlu92pWvppN4gwWB37i6gCoRZ/swhN5EEA+wFsJMVoX+CHJEOspoT47F/+aYyV38zY4W39aa8roJdtxzZuCkPqRDwy70Nr84jlRJev+su8yiH+Ka/3vY6vE92V+0/gBMbpwwLE6BKmT9sm3XpPXSTh3ybaGxWaBVuv9l03drx0wRVA6FG3s0ut0NRQH5QIDAQAB"
privateKey: "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCm6xO5wJGSRvtEVvCaAPxRwOuc7RH4nT79KIXFzwRdjeBzIR78m/bSMv7hokmahTNiF7veI/8WD8EAz7E6VoXGatzbtGOVO3GEkd8hssAOw6t3dCfr5PNStS4qyjK0haEiya3LlKYowuFv5RLwmJYAqRHlCW73ala+mk3iDBYHfuLqAKhFn+zCE3kQQD7AWwkxWhf4IckQ6ymhPjsX/5pjJXfzNjhbf1pryugl23HNm4KQ+pEPDLvQ2vziOVEl6/6y7zKIf4pr/e9jq8T3ZX7T+AExunDAsToEqZP2ybdek9dJOHfJtobFZoFW6/2XTd2vHTBFUDoUbezS63Q1FAflAgMBAAECggEAcZH6/uT+ZyeyqOH6nN5Uz49TAJfxJVZgWEGtG1TqpHj3IX6Epd28h3K5J26TY/aDape5dMDLPAiGCnZGIOpj5Qgqs7Y+F3i1mTzjM/t6X9FUplc7Hm7N/BVYjza6X0eYxqGwhZbjo1JNryOOynMXhOWETnEntmH9GXzFxyrwBjJ4skUDK78I8vDmazj0hVj7VULWjhH0ufG17mDme7mVjJh1oOpCqEVoCqkMRHWsZg8o0bwYOczxoQG+T9vdR7K9GyLdFctFUGZNlZPsyDVcPrsC4IP+a8630YMxI06DBS/r8xTqS3Dh2YWcuNB0TQsUDg/nms+y+tT9fwFk1rX+9QKBgQD/eqFa+t+RLAkUbAvwLtDpgahtOkM7SnucuF101mnYff8LtjImZ//3pQltrHTRo++b1nWcVQcNb1rljuJ9Fgs9dzMP9DSnziYNcbAxUrcA0kTiDUOuOvxoVjvpGRkHKnEmXhZWQrhOP2sb15LpbDE6GBFs4xcIW8jat1cdem033wKBgQCnQjb2b88OgDssROf7GmXjUsSheeLshrxvf2dxiBomjtg0h9WKjP2ONoLKxwJNICBqvr1SbteIMQmw8/2QwCDvcx0JjNgkwuX6HabwmJ5qJFtn9wHB2gq1JZzoLvfwVr+uCVUF/EDciCqts08ynzYZoCbJ0LhTXdsQSDeGGRrIuwKBgQCcyIobRlhLRAXydXhCFsj4dCyDk7zMtyHzBKW93ROp23DYpCBUt4A7XxnRJ4OtX/jc3xjgLsIcOZlDxZMzBoMxXmSExu5FiNqLZ5ikPEm4hFHnlBJT6zkZYspze4aDgkVcMWNt3pYy1vKJbJtpCo+PQlP3ScnJxGIX72nT2l0KawKBgCrOioyV3xNiBEL3O7wLbIo6k7KUJFzOuwl6PPpUkATQSEthfGiiXv53uw+00UT19PX87S1cyvLDQiy0tW/HjGZcOtFH58W4z+0si55GIT0fIvm/wQZhDJ6CCt9tre0n9pTPNKB8iAkpHGsqWhmln839LBA4yAQmIDvRj8xVPoKjAoGBAP33PLwqJhVxgpG6uMhjmF3fEdTrrd40yEI0SnPHMRnQflbkXr+u6EOUWtVR4y5Buj0+ckNzIZXJ5k2GhpxT/vWmkEiOH4+WpTruQDuoa6S/nHP6QuP2AaGZyBDCfeTAWGp8i5HAsPSBdLyylgnmfkfQEVGZlEgUITjf31exJawu"
oss:
endpoint: oss-cn-hangzhou.aliyuncs.com
accessKeyId: LTAI4GBuqJxv5x1DG64kjJYs
accessKeySecret: m9ECgeQ3t9o5YSbnpxUnea7NmizBQV
bucketName: zing-finance
path: bankTicket/
alipay:
alipay-cert-path: alipayCertPublicKey_RSA2.crt
merchant-cert-path: appCertPublicKey_2016091600527336.crt
alipay-root-cert-path: alipayRootCert.crt
app-id: 2016091600527336
merchant-private-key: "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCh4mudKkTxRRYWVqXUQgQjcauKh0fw79Fs1qDOZ4aeyo3dToRHMjL740rT5iZdKm6kBzKDNOux5d93h9DlK4fkSgmS3F0P0FvJ7GapnsZpd5y17hF7QYR6fUuMpWe7Dk1h8V+GexArsUYn669H5ZteAh8G0/0NkP5jNR1RrwY0t+JeyRngry+YovCR3XFf9Y5bHWNL1/yj2hc1ATBdOFyF40XuMaOhcrswXB98gUa8v2KeyhnEsIS07t5R0qqxlpGIluU0QGOdh65M/2LDtPL1Icsf45l4VmO7anv2No0wlrC3IEe3hXoNAJNRtbrvm2OQyfO3BzsWMej1dqp1WJu9AgMBAAECggEAdTAFGwbIVaffb1hWPyty932H4oY/y+ivQAy25/QFfdm/jJ8UHr32LmXBe1e2GednpJIZPOYIYQW5GTxWOi+i9d2qxIeFTrdUWv4o600m8J5H8WNfgExTbKBbGnt6dezKk8Y5ko5vjFGOKcPxZSiPqiP69eRr4XA+1u5SRRlgcrQr/h1zSpRgGsakgZ44WRbVae6I2Bnn1uLZS8g3Od3RfiAGWeDQjXv+tHK0HvqfHhSrKGk085ui+uL7kKo0kTQcLfgYzTsYK0pOTwUqrsCiNwG/29M0mih41D5VRx+waIiyO+GfRng8g45j2tMhxNdLw8v8oqPq6pYrNThl52oAAQKBgQDPhFB1ycF0Bl7WEKNkBISez3X3HpS27rwpSZMgk5WMWbQEpK7TiYw4nusQmZjR5/S0y0AwnZgIGmdgMYNCwTAC8wkJ0vHaYmF0Ta3G4BSM2YIM2gI/5yqloN5upZCtU/x3PRKqgycsalBaPEeGaRdAUv/INZbiGuuBiaKqgPd7vQKBgQDHtM9LTXaKcHuOrjye8loTRiywuZa3orv1HVXZeG4u9ct9dCp836jiz1ZxEyfWh04vZsuYVj5HD6KDg20htQTInO84JyCCyTxijAeDBkikkx1WW57jwLycWlVDUl6Vjoa4ELZHKJB9/D9RppyTY2zbFE5fA1c3Eek50+jVVmegAQKBgQCvvSEar3MaXC7CYLLOiBj8GTuQvSA6T7Gf0YQ8yV+TzX/rkr/Pu6O5a7QsibdmxGZzGdHRmhTff+TeDPBZfxu207Vq0W8qf7iCcypgyvH8WlONqK7RCWcPf04ALEx6zS54mIsPRiTNs3c7A+Oay7L6MZAWMHQIJb4eJL5SYQe1jQKBgQCXIJo6ly1cyJCIQgy4EBjgOxu4xUlsQGdSr9d20i83tGRA1PcONsd8lIEK4v8j1pLxRi5OYv2QEyHdukiM2Ir9Md3KNbnhn13mCafpnIi+mmH6Jy2Plxxkieu6HYxcS1Zh1qvKH8VwwcI9DQOyeew3wh8owcNvdktzqoypXVDgAQKBgGTqRjPEsXAZdATnzoVUxRwZNbWhLnMfKuUzRfbWLFhmG4ttwOG6mFgtBiWi8poWhGvk6J+Fzn/7n/fOUvfUsr5FcruBX3R1mwHOnIgslw0vmg8DzNx1u8wJceBXbhbBikMuZO8MGJLbDWKhknJJMgT4td8QYaZOpLGmkvss+ptt"
gateway-host: "openapi.alipaydev.com"
package ocr;
import cn.zingfin.exception.BizException;
import cn.zingfin.sign.DefaultClient;
import cn.zingfin.web.model.ScanRequest;
/**
* @author jwc
* @date 2020/9/2 9:22
*/
public class OcrBusinessTest {
public static void main(String[] args) throws BizException {
String myPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApusTucCRkkb7RFbwmgD8UcDrnO0R+J0+/SiFxc8EXY3gcyEe/Jv20jL+4aJJmoUzYhe73iP/Fg/BAM+xOlaFxmrc27RjlTtxhJHfIbLADsOrd3Qn6+TzUrUuKsoytIWhIsmty5SmKMLhb+US8JiWAKkR5Qlu92pWvppN4gwWB37i6gCoRZ/swhN5EEA+wFsJMVoX+CHJEOspoT47F/+aYyV38zY4W39aa8roJdtxzZuCkPqRDwy70Nr84jlRJev+su8yiH+Ka/3vY6vE92V+0/gBMbpwwLE6BKmT9sm3XpPXSTh3ybaGxWaBVuv9l03drx0wRVA6FG3s0ut0NRQH5QIDAQAB";
// 对方的私钥
String appPrivateKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCm6xO5wJGSRvtEVvCaAPxRwOuc7RH4nT79KIXFzwRdjeBzIR78m/bSMv7hokmahTNiF7veI/8WD8EAz7E6VoXGatzbtGOVO3GEkd8hssAOw6t3dCfr5PNStS4qyjK0haEiya3LlKYowuFv5RLwmJYAqRHlCW73ala+mk3iDBYHfuLqAKhFn+zCE3kQQD7AWwkxWhf4IckQ6ymhPjsX/5pjJXfzNjhbf1pryugl23HNm4KQ+pEPDLvQ2vziOVEl6/6y7zKIf4pr/e9jq8T3ZX7T+AExunDAsToEqZP2ybdek9dJOHfJtobFZoFW6/2XTd2vHTBFUDoUbezS63Q1FAflAgMBAAECggEAcZH6/uT+ZyeyqOH6nN5Uz49TAJfxJVZgWEGtG1TqpHj3IX6Epd28h3K5J26TY/aDape5dMDLPAiGCnZGIOpj5Qgqs7Y+F3i1mTzjM/t6X9FUplc7Hm7N/BVYjza6X0eYxqGwhZbjo1JNryOOynMXhOWETnEntmH9GXzFxyrwBjJ4skUDK78I8vDmazj0hVj7VULWjhH0ufG17mDme7mVjJh1oOpCqEVoCqkMRHWsZg8o0bwYOczxoQG+T9vdR7K9GyLdFctFUGZNlZPsyDVcPrsC4IP+a8630YMxI06DBS/r8xTqS3Dh2YWcuNB0TQsUDg/nms+y+tT9fwFk1rX+9QKBgQD/eqFa+t+RLAkUbAvwLtDpgahtOkM7SnucuF101mnYff8LtjImZ//3pQltrHTRo++b1nWcVQcNb1rljuJ9Fgs9dzMP9DSnziYNcbAxUrcA0kTiDUOuOvxoVjvpGRkHKnEmXhZWQrhOP2sb15LpbDE6GBFs4xcIW8jat1cdem033wKBgQCnQjb2b88OgDssROf7GmXjUsSheeLshrxvf2dxiBomjtg0h9WKjP2ONoLKxwJNICBqvr1SbteIMQmw8/2QwCDvcx0JjNgkwuX6HabwmJ5qJFtn9wHB2gq1JZzoLvfwVr+uCVUF/EDciCqts08ynzYZoCbJ0LhTXdsQSDeGGRrIuwKBgQCcyIobRlhLRAXydXhCFsj4dCyDk7zMtyHzBKW93ROp23DYpCBUt4A7XxnRJ4OtX/jc3xjgLsIcOZlDxZMzBoMxXmSExu5FiNqLZ5ikPEm4hFHnlBJT6zkZYspze4aDgkVcMWNt3pYy1vKJbJtpCo+PQlP3ScnJxGIX72nT2l0KawKBgCrOioyV3xNiBEL3O7wLbIo6k7KUJFzOuwl6PPpUkATQSEthfGiiXv53uw+00UT19PX87S1cyvLDQiy0tW/HjGZcOtFH58W4z+0si55GIT0fIvm/wQZhDJ6CCt9tre0n9pTPNKB8iAkpHGsqWhmln839LBA4yAQmIDvRj8xVPoKjAoGBAP33PLwqJhVxgpG6uMhjmF3fEdTrrd40yEI0SnPHMRnQflbkXr+u6EOUWtVR4y5Buj0+ckNzIZXJ5k2GhpxT/vWmkEiOH4+WpTruQDuoa6S/nHP6QuP2AaGZyBDCfeTAWGp8i5HAsPSBdLyylgnmfkfQEVGZlEgUITjf31exJawu";
ScanRequest scanRequest = new ScanRequest();
scanRequest.setPictureUrl("https://zing-finance.oss-cn-hangzhou.aliyuncs.com/%E8%90%A5%E4%B8%9A%E6%89%A7%E7%85%A7.png");
String md5 = "f5226bbba1eca51c03a56df636d44b1c";
DefaultClient defaultClient = new DefaultClient("http://localhost:8080", appPrivateKey, md5, myPublicKey, "1");
String testData = defaultClient.execute(scanRequest, "/open/api/ocr/v1/scanForBusiness");
System.out.println(testData);
}
}
package ocr;
import cn.zingfin.exception.BizException;
import cn.zingfin.sign.DefaultClient;
import cn.zingfin.web.model.ScanRequest;
/**
* @author jwc
* @date 2020/9/2 9:16
*/
public class OcrIdCardTest {
public static void main(String[] args) throws BizException {
String myPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApusTucCRkkb7RFbwmgD8UcDrnO0R+J0+/SiFxc8EXY3gcyEe/Jv20jL+4aJJmoUzYhe73iP/Fg/BAM+xOlaFxmrc27RjlTtxhJHfIbLADsOrd3Qn6+TzUrUuKsoytIWhIsmty5SmKMLhb+US8JiWAKkR5Qlu92pWvppN4gwWB37i6gCoRZ/swhN5EEA+wFsJMVoX+CHJEOspoT47F/+aYyV38zY4W39aa8roJdtxzZuCkPqRDwy70Nr84jlRJev+su8yiH+Ka/3vY6vE92V+0/gBMbpwwLE6BKmT9sm3XpPXSTh3ybaGxWaBVuv9l03drx0wRVA6FG3s0ut0NRQH5QIDAQAB";
// 对方的私钥
String appPrivateKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCm6xO5wJGSRvtEVvCaAPxRwOuc7RH4nT79KIXFzwRdjeBzIR78m/bSMv7hokmahTNiF7veI/8WD8EAz7E6VoXGatzbtGOVO3GEkd8hssAOw6t3dCfr5PNStS4qyjK0haEiya3LlKYowuFv5RLwmJYAqRHlCW73ala+mk3iDBYHfuLqAKhFn+zCE3kQQD7AWwkxWhf4IckQ6ymhPjsX/5pjJXfzNjhbf1pryugl23HNm4KQ+pEPDLvQ2vziOVEl6/6y7zKIf4pr/e9jq8T3ZX7T+AExunDAsToEqZP2ybdek9dJOHfJtobFZoFW6/2XTd2vHTBFUDoUbezS63Q1FAflAgMBAAECggEAcZH6/uT+ZyeyqOH6nN5Uz49TAJfxJVZgWEGtG1TqpHj3IX6Epd28h3K5J26TY/aDape5dMDLPAiGCnZGIOpj5Qgqs7Y+F3i1mTzjM/t6X9FUplc7Hm7N/BVYjza6X0eYxqGwhZbjo1JNryOOynMXhOWETnEntmH9GXzFxyrwBjJ4skUDK78I8vDmazj0hVj7VULWjhH0ufG17mDme7mVjJh1oOpCqEVoCqkMRHWsZg8o0bwYOczxoQG+T9vdR7K9GyLdFctFUGZNlZPsyDVcPrsC4IP+a8630YMxI06DBS/r8xTqS3Dh2YWcuNB0TQsUDg/nms+y+tT9fwFk1rX+9QKBgQD/eqFa+t+RLAkUbAvwLtDpgahtOkM7SnucuF101mnYff8LtjImZ//3pQltrHTRo++b1nWcVQcNb1rljuJ9Fgs9dzMP9DSnziYNcbAxUrcA0kTiDUOuOvxoVjvpGRkHKnEmXhZWQrhOP2sb15LpbDE6GBFs4xcIW8jat1cdem033wKBgQCnQjb2b88OgDssROf7GmXjUsSheeLshrxvf2dxiBomjtg0h9WKjP2ONoLKxwJNICBqvr1SbteIMQmw8/2QwCDvcx0JjNgkwuX6HabwmJ5qJFtn9wHB2gq1JZzoLvfwVr+uCVUF/EDciCqts08ynzYZoCbJ0LhTXdsQSDeGGRrIuwKBgQCcyIobRlhLRAXydXhCFsj4dCyDk7zMtyHzBKW93ROp23DYpCBUt4A7XxnRJ4OtX/jc3xjgLsIcOZlDxZMzBoMxXmSExu5FiNqLZ5ikPEm4hFHnlBJT6zkZYspze4aDgkVcMWNt3pYy1vKJbJtpCo+PQlP3ScnJxGIX72nT2l0KawKBgCrOioyV3xNiBEL3O7wLbIo6k7KUJFzOuwl6PPpUkATQSEthfGiiXv53uw+00UT19PX87S1cyvLDQiy0tW/HjGZcOtFH58W4z+0si55GIT0fIvm/wQZhDJ6CCt9tre0n9pTPNKB8iAkpHGsqWhmln839LBA4yAQmIDvRj8xVPoKjAoGBAP33PLwqJhVxgpG6uMhjmF3fEdTrrd40yEI0SnPHMRnQflbkXr+u6EOUWtVR4y5Buj0+ckNzIZXJ5k2GhpxT/vWmkEiOH4+WpTruQDuoa6S/nHP6QuP2AaGZyBDCfeTAWGp8i5HAsPSBdLyylgnmfkfQEVGZlEgUITjf31exJawu";
ScanRequest scanRequest = new ScanRequest();
scanRequest.setPictureUrl("https://zing-finance.oss-cn-hangzhou.aliyuncs.com/%E8%90%A5%E4%B8%9A%E6%89%A7%E7%85%A7.png");
String md5 = "f5226bbba1eca51c03a56df636d44b1c";
DefaultClient defaultClient = new DefaultClient("http://localhost:8080", appPrivateKey, md5, myPublicKey, "1");
String testData = defaultClient.execute(scanRequest, "/open/api/ocr/v1/scanForIdCard");
System.out.println(testData);
}
}
package sms;
import cn.zingfin.exception.BizException;
import cn.zingfin.sign.DefaultClient;
import cn.zingfin.web.model.ScanRequest;
import cn.zingfin.web.model.SmsRequest;
/**
* @author jwc
* @date 2020/9/2 9:23
*/
public class SmsTest {
public static void main(String[] args) throws BizException {
String myPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApusTucCRkkb7RFbwmgD8UcDrnO0R+J0+/SiFxc8EXY3gcyEe/Jv20jL+4aJJmoUzYhe73iP/Fg/BAM+xOlaFxmrc27RjlTtxhJHfIbLADsOrd3Qn6+TzUrUuKsoytIWhIsmty5SmKMLhb+US8JiWAKkR5Qlu92pWvppN4gwWB37i6gCoRZ/swhN5EEA+wFsJMVoX+CHJEOspoT47F/+aYyV38zY4W39aa8roJdtxzZuCkPqRDwy70Nr84jlRJev+su8yiH+Ka/3vY6vE92V+0/gBMbpwwLE6BKmT9sm3XpPXSTh3ybaGxWaBVuv9l03drx0wRVA6FG3s0ut0NRQH5QIDAQAB";
// 对方的私钥
String appPrivateKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCm6xO5wJGSRvtEVvCaAPxRwOuc7RH4nT79KIXFzwRdjeBzIR78m/bSMv7hokmahTNiF7veI/8WD8EAz7E6VoXGatzbtGOVO3GEkd8hssAOw6t3dCfr5PNStS4qyjK0haEiya3LlKYowuFv5RLwmJYAqRHlCW73ala+mk3iDBYHfuLqAKhFn+zCE3kQQD7AWwkxWhf4IckQ6ymhPjsX/5pjJXfzNjhbf1pryugl23HNm4KQ+pEPDLvQ2vziOVEl6/6y7zKIf4pr/e9jq8T3ZX7T+AExunDAsToEqZP2ybdek9dJOHfJtobFZoFW6/2XTd2vHTBFUDoUbezS63Q1FAflAgMBAAECggEAcZH6/uT+ZyeyqOH6nN5Uz49TAJfxJVZgWEGtG1TqpHj3IX6Epd28h3K5J26TY/aDape5dMDLPAiGCnZGIOpj5Qgqs7Y+F3i1mTzjM/t6X9FUplc7Hm7N/BVYjza6X0eYxqGwhZbjo1JNryOOynMXhOWETnEntmH9GXzFxyrwBjJ4skUDK78I8vDmazj0hVj7VULWjhH0ufG17mDme7mVjJh1oOpCqEVoCqkMRHWsZg8o0bwYOczxoQG+T9vdR7K9GyLdFctFUGZNlZPsyDVcPrsC4IP+a8630YMxI06DBS/r8xTqS3Dh2YWcuNB0TQsUDg/nms+y+tT9fwFk1rX+9QKBgQD/eqFa+t+RLAkUbAvwLtDpgahtOkM7SnucuF101mnYff8LtjImZ//3pQltrHTRo++b1nWcVQcNb1rljuJ9Fgs9dzMP9DSnziYNcbAxUrcA0kTiDUOuOvxoVjvpGRkHKnEmXhZWQrhOP2sb15LpbDE6GBFs4xcIW8jat1cdem033wKBgQCnQjb2b88OgDssROf7GmXjUsSheeLshrxvf2dxiBomjtg0h9WKjP2ONoLKxwJNICBqvr1SbteIMQmw8/2QwCDvcx0JjNgkwuX6HabwmJ5qJFtn9wHB2gq1JZzoLvfwVr+uCVUF/EDciCqts08ynzYZoCbJ0LhTXdsQSDeGGRrIuwKBgQCcyIobRlhLRAXydXhCFsj4dCyDk7zMtyHzBKW93ROp23DYpCBUt4A7XxnRJ4OtX/jc3xjgLsIcOZlDxZMzBoMxXmSExu5FiNqLZ5ikPEm4hFHnlBJT6zkZYspze4aDgkVcMWNt3pYy1vKJbJtpCo+PQlP3ScnJxGIX72nT2l0KawKBgCrOioyV3xNiBEL3O7wLbIo6k7KUJFzOuwl6PPpUkATQSEthfGiiXv53uw+00UT19PX87S1cyvLDQiy0tW/HjGZcOtFH58W4z+0si55GIT0fIvm/wQZhDJ6CCt9tre0n9pTPNKB8iAkpHGsqWhmln839LBA4yAQmIDvRj8xVPoKjAoGBAP33PLwqJhVxgpG6uMhjmF3fEdTrrd40yEI0SnPHMRnQflbkXr+u6EOUWtVR4y5Buj0+ckNzIZXJ5k2GhpxT/vWmkEiOH4+WpTruQDuoa6S/nHP6QuP2AaGZyBDCfeTAWGp8i5HAsPSBdLyylgnmfkfQEVGZlEgUITjf31exJawu";
SmsRequest smsRequest = new SmsRequest();
smsRequest.setPhoneNumbers("18355551987");
smsRequest.setSignName("杭州良田美地");
smsRequest.setTemplateCode("SMS_200985057");
smsRequest.setTemplateParam("{\"code\":\"123456\"}");
String md5 = "f5226bbba1eca51c03a56df636d44b1c";
DefaultClient defaultClient = new DefaultClient("http://localhost:8080", appPrivateKey, md5, myPublicKey, "1");
String testData = defaultClient.execute(smsRequest, "/open/api/sms/v1/sendSms");
System.out.println(testData);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment