Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
common-api
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
计万成
common-api
Commits
62aebea8
Commit
62aebea8
authored
Sep 02, 2020
by
jwc
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
短信服务,ocr识别身份证,营业执照
parent
ec983ac5
Changes
35
Show whitespace changes
Inline
Side-by-side
Showing
35 changed files
with
1872 additions
and
1 deletion
+1872
-1
README.md
README.md
+2
-1
pom.xml
pom.xml
+193
-0
src/main/java/cn/zingfin/CommonApplication.java
src/main/java/cn/zingfin/CommonApplication.java
+19
-0
src/main/java/cn/zingfin/base/BaseOpenApiRequest.java
src/main/java/cn/zingfin/base/BaseOpenApiRequest.java
+23
-0
src/main/java/cn/zingfin/common/enums/OcrCardTypeEnum.java
src/main/java/cn/zingfin/common/enums/OcrCardTypeEnum.java
+31
-0
src/main/java/cn/zingfin/common/enums/OpenApiErrorCodeEnums.java
...n/java/cn/zingfin/common/enums/OpenApiErrorCodeEnums.java
+35
-0
src/main/java/cn/zingfin/common/util/IssueCert.java
src/main/java/cn/zingfin/common/util/IssueCert.java
+221
-0
src/main/java/cn/zingfin/common/util/IssueCertUtils.java
src/main/java/cn/zingfin/common/util/IssueCertUtils.java
+59
-0
src/main/java/cn/zingfin/common/util/IssueRootCert.java
src/main/java/cn/zingfin/common/util/IssueRootCert.java
+107
-0
src/main/java/cn/zingfin/common/util/SignVerifyDemo.java
src/main/java/cn/zingfin/common/util/SignVerifyDemo.java
+183
-0
src/main/java/cn/zingfin/config/SwaggerConfig.java
src/main/java/cn/zingfin/config/SwaggerConfig.java
+59
-0
src/main/java/cn/zingfin/domain/service/OcrService.java
src/main/java/cn/zingfin/domain/service/OcrService.java
+30
-0
src/main/java/cn/zingfin/domain/service/SmsService.java
src/main/java/cn/zingfin/domain/service/SmsService.java
+20
-0
src/main/java/cn/zingfin/domain/service/impl/OcrServiceImpl.java
...n/java/cn/zingfin/domain/service/impl/OcrServiceImpl.java
+191
-0
src/main/java/cn/zingfin/domain/service/impl/SmsServiceImpl.java
...n/java/cn/zingfin/domain/service/impl/SmsServiceImpl.java
+55
-0
src/main/java/cn/zingfin/exception/OpenApiException.java
src/main/java/cn/zingfin/exception/OpenApiException.java
+29
-0
src/main/java/cn/zingfin/factory/DefaultServerFactory.java
src/main/java/cn/zingfin/factory/DefaultServerFactory.java
+26
-0
src/main/java/cn/zingfin/factory/ResponseDataHandleFactory.java
...in/java/cn/zingfin/factory/ResponseDataHandleFactory.java
+26
-0
src/main/java/cn/zingfin/handle/OpenApiHandle.java
src/main/java/cn/zingfin/handle/OpenApiHandle.java
+83
-0
src/main/java/cn/zingfin/properties/AccessKeyAndSecret.java
src/main/java/cn/zingfin/properties/AccessKeyAndSecret.java
+25
-0
src/main/java/cn/zingfin/properties/OpenApiPlatformKey.java
src/main/java/cn/zingfin/properties/OpenApiPlatformKey.java
+35
-0
src/main/java/cn/zingfin/web/controller/HelloWorldController.java
.../java/cn/zingfin/web/controller/HelloWorldController.java
+32
-0
src/main/java/cn/zingfin/web/controller/OcrController.java
src/main/java/cn/zingfin/web/controller/OcrController.java
+53
-0
src/main/java/cn/zingfin/web/controller/SmsController.java
src/main/java/cn/zingfin/web/controller/SmsController.java
+43
-0
src/main/java/cn/zingfin/web/model/BusinessLicenseInfoModel.java
...n/java/cn/zingfin/web/model/BusinessLicenseInfoModel.java
+48
-0
src/main/java/cn/zingfin/web/model/IdCardInfoModel.java
src/main/java/cn/zingfin/web/model/IdCardInfoModel.java
+44
-0
src/main/java/cn/zingfin/web/model/InputModel.java
src/main/java/cn/zingfin/web/model/InputModel.java
+12
-0
src/main/java/cn/zingfin/web/model/ScanRequest.java
src/main/java/cn/zingfin/web/model/ScanRequest.java
+17
-0
src/main/java/cn/zingfin/web/model/SmsRequest.java
src/main/java/cn/zingfin/web/model/SmsRequest.java
+21
-0
src/main/resources/application-dev.yml
src/main/resources/application-dev.yml
+11
-0
src/main/resources/application-publish.yml
src/main/resources/application-publish.yml
+10
-0
src/main/resources/application.yml
src/main/resources/application.yml
+54
-0
src/test/java/ocr/OcrBusinessTest.java
src/test/java/ocr/OcrBusinessTest.java
+23
-0
src/test/java/ocr/OcrIdCardTest.java
src/test/java/ocr/OcrIdCardTest.java
+24
-0
src/test/java/sms/SmsTest.java
src/test/java/sms/SmsTest.java
+28
-0
No files found.
README.md
View file @
62aebea8
# common-api
# common-api
紫鹰科技公共服务api
紫鹰科技公共服务api
# 支持swagger,lombok
\ No newline at end of file
pom.xml
0 → 100644
View file @
62aebea8
<?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>
src/main/java/cn/zingfin/CommonApplication.java
0 → 100644
View file @
62aebea8
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
);
}
}
src/main/java/cn/zingfin/base/BaseOpenApiRequest.java
0 → 100644
View file @
62aebea8
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
;
}
src/main/java/cn/zingfin/common/enums/OcrCardTypeEnum.java
0 → 100644
View file @
62aebea8
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
;
}
}
src/main/java/cn/zingfin/common/enums/OpenApiErrorCodeEnums.java
0 → 100644
View file @
62aebea8
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
;
}
}
src/main/java/cn/zingfin/common/util/IssueCert.java
0 → 100644
View file @
62aebea8
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
src/main/java/cn/zingfin/common/util/IssueCertUtils.java
0 → 100644
View file @
62aebea8
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
src/main/java/cn/zingfin/common/util/IssueRootCert.java
0 → 100644
View file @
62aebea8
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
src/main/java/cn/zingfin/common/util/SignVerifyDemo.java
0 → 100644
View file @
62aebea8
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
();
}
}
}
}
}
src/main/java/cn/zingfin/config/SwaggerConfig.java
0 → 100644
View file @
62aebea8
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
();
}
}
src/main/java/cn/zingfin/domain/service/OcrService.java
0 → 100644
View file @
62aebea8
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
;
}
src/main/java/cn/zingfin/domain/service/SmsService.java
0 → 100644
View file @
62aebea8
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
;
}
src/main/java/cn/zingfin/domain/service/impl/OcrServiceImpl.java
0 → 100644
View file @
62aebea8
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
;
}
}
src/main/java/cn/zingfin/domain/service/impl/SmsServiceImpl.java
0 → 100644
View file @
62aebea8
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
);
}
}
}
src/main/java/cn/zingfin/exception/OpenApiException.java
0 → 100644
View file @
62aebea8
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
);
}
}
src/main/java/cn/zingfin/factory/DefaultServerFactory.java
0 → 100644
View file @
62aebea8
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
());
}
}
src/main/java/cn/zingfin/factory/ResponseDataHandleFactory.java
0 → 100644
View file @
62aebea8
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
());
}
}
src/main/java/cn/zingfin/handle/OpenApiHandle.java
0 → 100644
View file @
62aebea8
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
);
}
}
src/main/java/cn/zingfin/properties/AccessKeyAndSecret.java
0 → 100644
View file @
62aebea8
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
;
}
src/main/java/cn/zingfin/properties/OpenApiPlatformKey.java
0 → 100644
View file @
62aebea8
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
;
}
src/main/java/cn/zingfin/web/controller/HelloWorldController.java
0 → 100644
View file @
62aebea8
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!"
;
}
}
src/main/java/cn/zingfin/web/controller/OcrController.java
0 → 100644
View file @
62aebea8
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
);
}
}
src/main/java/cn/zingfin/web/controller/SmsController.java
0 → 100644
View file @
62aebea8
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
);
}
}
src/main/java/cn/zingfin/web/model/BusinessLicenseInfoModel.java
0 → 100644
View file @
62aebea8
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
;
}
src/main/java/cn/zingfin/web/model/IdCardInfoModel.java
0 → 100644
View file @
62aebea8
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
;
}
src/main/java/cn/zingfin/web/model/InputModel.java
0 → 100644
View file @
62aebea8
package
cn
.
zingfin
.
web
.
model
;
import
lombok.Data
;
/**
* @author jwc
* @date 2020/8/31 14:46
*/
@Data
public
class
InputModel
{
private
String
name
;
}
src/main/java/cn/zingfin/web/model/ScanRequest.java
0 → 100644
View file @
62aebea8
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
;
}
src/main/java/cn/zingfin/web/model/SmsRequest.java
0 → 100644
View file @
62aebea8
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
;
}
src/main/resources/application-dev.yml
0 → 100644
View file @
62aebea8
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"
src/main/resources/application-publish.yml
0 → 100644
View file @
62aebea8
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
src/main/resources/application.yml
0 → 100644
View file @
62aebea8
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"
src/test/java/ocr/OcrBusinessTest.java
0 → 100644
View file @
62aebea8
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
);
}
}
src/test/java/ocr/OcrIdCardTest.java
0 → 100644
View file @
62aebea8
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
);
}
}
src/test/java/sms/SmsTest.java
0 → 100644
View file @
62aebea8
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
);
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment