From d643586c7373564bdd97d50e60539947b076f229 Mon Sep 17 00:00:00 2001 From: chengzhi Date: Thu, 18 May 2023 11:44:21 +0800 Subject: [PATCH 01/25] =?UTF-8?q?=E4=BF=AE=E6=94=B9:=20Refund=20=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=E6=96=B0=E5=A2=9E`currency`=20=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 6 +++ README.md | 4 +- VERSION | 2 +- build.gradle | 40 ++++++------------- example/build.gradle | 6 +-- example/res/your_rsa_private_key_pkcs8.pem | 29 +------------- .../main/java/com/pingxx/example/Main.java | 38 ++---------------- pom.xml | 4 +- src/main/java/com/pingplusplus/Pingpp.java | 2 +- .../java/com/pingplusplus/model/Refund.java | 8 ++++ .../java/com/pingplusplus/PingppTest.java | 2 +- 11 files changed, 39 insertions(+), 102 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1148b23..e21a646 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # ChangeLog +## 2.4.1 + +- 修改: Refund 对象新增`currency` 字段 +- 修改: 更新示例 Main.java 中设置私钥和私钥文件地址写法 +- 修改: build.gradle 镜像仓库使用阿里云源 + ## 2.4.0 > 本次更新有较多与旧版本不兼容的地方。 diff --git a/README.md b/README.md index 22b63f5..554ae7a 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ maven 远程仓库 Pingplusplus pingpp-java - 2.4.0 + 2.4.1 jar ``` @@ -65,7 +65,7 @@ repositories { 安装 Ping++ SDK ``` -compile 'Pingplusplus:pingpp-java:2.4.0' +compile 'Pingplusplus:pingpp-java:2.4.1' ``` ## 初始化 diff --git a/VERSION b/VERSION index 197c4d5..005119b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.4.0 +2.4.1 diff --git a/build.gradle b/build.gradle index 0025db6..cc365c6 100644 --- a/build.gradle +++ b/build.gradle @@ -1,16 +1,20 @@ buildscript { repositories { - jcenter() + maven { + url 'https://maven.aliyun.com/repository/central' + } + mavenLocal() + mavenCentral() } } -plugins { - id "com.jfrog.bintray" version "1.8.0" -} - allprojects { repositories { - jcenter() + maven { + url 'https://maven.aliyun.com/repository/central' + } + mavenLocal() + mavenCentral() } apply plugin: 'maven' apply plugin: 'maven-publish' @@ -21,8 +25,8 @@ sourceCompatibility = 1.8 targetCompatibility = 1.8 dependencies { - compile 'com.google.code.gson:gson:2.8.5' - compile 'commons-codec:commons-codec:1.10' + compile 'com.google.code.gson:gson:2.8.9' + compile 'commons-codec:commons-codec:1.13' testCompile 'junit:junit:4.12' } @@ -49,7 +53,6 @@ publishing { artifact javadocJar groupId 'Pingplusplus' artifactId 'pingpp-java' - version releaseVersion pom.withXml { def root = asNode() @@ -59,25 +62,6 @@ publishing { } } } - -bintray { - user = bintrayUser - key = bintrayApiKey - publications = ['mavenJava'] - dryRun = false - publish = true - pkg { - repo = 'maven' - name = 'pingplusplus' - licenses = ['MIT'] - labels = ['Ping++', 'pingxx', 'payment'] - vcsUrl = 'https://github.com/PingPlusPlus/pingpp-java.git' - version { - name = releaseVersion - } - } -} - model { tasks.generatePomFileForMavenJavaPublication { destination = file("pom.xml") diff --git a/example/build.gradle b/example/build.gradle index a9101ed..3c9bd78 100644 --- a/example/build.gradle +++ b/example/build.gradle @@ -1,12 +1,8 @@ apply plugin: 'java' -repositories { - jcenter() -} - dependencies { compile 'com.google.code.gson:gson:2.8.5' - compile 'commons-codec:commons-codec:1.10' + compile 'commons-codec:commons-codec:1.13' compile project(':') } diff --git a/example/res/your_rsa_private_key_pkcs8.pem b/example/res/your_rsa_private_key_pkcs8.pem index e4e042c..9da76fb 100644 --- a/example/res/your_rsa_private_key_pkcs8.pem +++ b/example/res/your_rsa_private_key_pkcs8.pem @@ -1,28 +1 @@ ------BEGIN PRIVATE KEY----- -MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDHYyS3FwoESp1h -GLYiBhy6k9Ag3lzGCIEvm50IIEkE0Ftc9qq44TWqyl+EHUpTMdcBOcI42JLO5stw -FOfCLa3PQStEJ4llIRFEKlsrHh67pvWd5RNaSBrvGlnFY40S+SZmjk2WF/h9dE9R -ic79t0YI0alD8dIl9Yu3OaEKo7VonBWFwOYMxjPhtORlq+EUF1XJd//yftQrKWTT -d7KaUonWzBCl4VzFop/OyTWYlTuZz3eYJaNpH5VaQ1vDgBAcPIeBvMf7NgBHMKW6 -LLmFd2LEYQ/6I7hkGTjysSzWEpO8bPWT6OEsJ2R2kFGOrSkr+G2MDcJ7ykXYAmz5 -+A3plS6ZAgMBAAECggEAVrgwR9GlcahiOtDcpn+yDxQq+aC9CQS561LrQZWJLKbS -leRS7IZHKTlLwdJbeUO8F7RfXQoVEBghc2YkRrhHWFUn1ES95VY0hElHzcET7Nn5 -CeuQNzwVOtljIg7iVNY4dXJ/HEDguu/Tb8tYU9FajItj60FJ/WiGk/JksJPzWsOC -VPVniy9fTbTLy1e+dCpCI6OXirtm7hvbodRNDjree0wSEzm7vL0wVzEZFo6kX+AB -GUwaoO7pPyH+hgyI5Iuhc65NHsHzTJpf8yNFl9QGhkxvm2Ff2oEtDt1idOTBrHB6 -tg+ti9Ctb2+2yzBnk14hsSYJnKitR7wM6ZCFPX4eYQKBgQD+JAREeFkodec/SC+G -X+4Q4Y68uMPkfUPrMKXM4cyY5wgXk64RBvRVxIxX7x6Y3tIKn9v8tWAprbsyVr15 -eb4RcAFEVwjuoZixhd9sIPsRhfdNolKn/fSPIsHL4ywcJMSIt7KVKHuQeqBNHy0o -0PxQjNej1ozsmrAWqV55cbKHswKBgQDI2JQRTPIEC/2y6LdmBVhGJW9OKWTYdVNj -q7rX+Yw4uxOtfd5hBqpvgZEklKEk72aazFdEcERlAm9SqoX09qk6zK/wcq4Xn5Q/ -qy8ecmjuyf2AK9X+HUdMerMVxhK9RpeevKYP/RO2F/wIN64anlQVYygVkXXgdOvW -hBE4YABKgwKBgDRtmbPGYB5ItHwJmERQZfx1i8zDESaB8RED6DBsJJkmkDTM8ovw -s1c+RPWfDuDalto6QFfR0xTGEmhAHLaCtwNB6AEBM4aHL8jvpTfZVfI3gN0zL3oY -mestcG1vYBouO504yE6dG2Ci6479b4OMGYFEjPfvuwLUpp8GMcc7/WihAoGANCp8 -mtm/ammq5VMof2kX+nAyrrx1ovsmQ5cRGpOIZhvBCqjMn6rZjci7aCLqj+tWXRKC -ABagzROK0o/T50JBxjHv6KYArcYW/Up7HI9ezdbM7wNzu2LjZ+veo+MkbuDs9J/P -CgwTmJI2NfQwVl2VPVDZ0nBLi5cSwk7fIiNdL/0CgYEAtECmC1QDs53Di2MIsa/F -e4sWfJGSDqEWqhcA/aPwf1skM6VJJXBBMV1qFtwgO1AlLnu9dQYra6ylsUoubVYI -XM9XK7EMhbqi57+Q75jHFTc0DnzOTyho5Gp4Ddi8dztmZGNWdWTGdeMqh+svqMXk -D6VdJeddyGu/Zlgj7Wk6whU= ------END PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDHYyS3FwoESp1hGLYiBhy6k9Ag3lzGCIEvm50IIEkE0Ftc9qq44TWqyl+EHUpTMdcBOcI42JLO5stwFOfCLa3PQStEJ4llIRFEKlsrHh67pvWd5RNaSBrvGlnFY40S+SZmjk2WF/h9dE9Ric79t0YI0alD8dIl9Yu3OaEKo7VonBWFwOYMxjPhtORlq+EUF1XJd//yftQrKWTTd7KaUonWzBCl4VzFop/OyTWYlTuZz3eYJaNpH5VaQ1vDgBAcPIeBvMf7NgBHMKW6LLmFd2LEYQ/6I7hkGTjysSzWEpO8bPWT6OEsJ2R2kFGOrSkr+G2MDcJ7ykXYAmz5+A3plS6ZAgMBAAECggEAVrgwR9GlcahiOtDcpn+yDxQq+aC9CQS561LrQZWJLKbSleRS7IZHKTlLwdJbeUO8F7RfXQoVEBghc2YkRrhHWFUn1ES95VY0hElHzcET7Nn5CeuQNzwVOtljIg7iVNY4dXJ/HEDguu/Tb8tYU9FajItj60FJ/WiGk/JksJPzWsOCVPVniy9fTbTLy1e+dCpCI6OXirtm7hvbodRNDjree0wSEzm7vL0wVzEZFo6kX+ABGUwaoO7pPyH+hgyI5Iuhc65NHsHzTJpf8yNFl9QGhkxvm2Ff2oEtDt1idOTBrHB6tg+ti9Ctb2+2yzBnk14hsSYJnKitR7wM6ZCFPX4eYQKBgQD+JAREeFkodec/SC+GX+4Q4Y68uMPkfUPrMKXM4cyY5wgXk64RBvRVxIxX7x6Y3tIKn9v8tWAprbsyVr15eb4RcAFEVwjuoZixhd9sIPsRhfdNolKn/fSPIsHL4ywcJMSIt7KVKHuQeqBNHy0o0PxQjNej1ozsmrAWqV55cbKHswKBgQDI2JQRTPIEC/2y6LdmBVhGJW9OKWTYdVNjq7rX+Yw4uxOtfd5hBqpvgZEklKEk72aazFdEcERlAm9SqoX09qk6zK/wcq4Xn5Q/qy8ecmjuyf2AK9X+HUdMerMVxhK9RpeevKYP/RO2F/wIN64anlQVYygVkXXgdOvWhBE4YABKgwKBgDRtmbPGYB5ItHwJmERQZfx1i8zDESaB8RED6DBsJJkmkDTM8ovws1c+RPWfDuDalto6QFfR0xTGEmhAHLaCtwNB6AEBM4aHL8jvpTfZVfI3gN0zL3oYmestcG1vYBouO504yE6dG2Ci6479b4OMGYFEjPfvuwLUpp8GMcc7/WihAoGANCp8mtm/ammq5VMof2kX+nAyrrx1ovsmQ5cRGpOIZhvBCqjMn6rZjci7aCLqj+tWXRKCABagzROK0o/T50JBxjHv6KYArcYW/Up7HI9ezdbM7wNzu2LjZ+veo+MkbuDs9J/PCgwTmJI2NfQwVl2VPVDZ0nBLi5cSwk7fIiNdL/0CgYEAtECmC1QDs53Di2MIsa/Fe4sWfJGSDqEWqhcA/aPwf1skM6VJJXBBMV1qFtwgO1AlLnu9dQYra6ylsUoubVYIXM9XK7EMhbqi57+Q75jHFTc0DnzOTyho5Gp4Ddi8dztmZGNWdWTGdeMqh+svqMXkD6VdJeddyGu/Zlgj7Wk6whU= \ No newline at end of file diff --git a/example/src/main/java/com/pingxx/example/Main.java b/example/src/main/java/com/pingxx/example/Main.java index 21275d3..0e25e93 100644 --- a/example/src/main/java/com/pingxx/example/Main.java +++ b/example/src/main/java/com/pingxx/example/Main.java @@ -41,43 +41,13 @@ public static void main(String[] args) throws Exception { Pingpp.appId = appId; // 设置私钥路径,用于请求签名 -// Pingpp.privateKeyPath = privateKeyFilePath; + //Pingpp.privateKeyPath = projectDir + privateKeyFilePath; /** * 或者直接设置私钥内容 - Pingpp.privateKey = "-----BEGIN RSA PRIVATE KEY-----\n" + - "... 私钥内容字符串 ...\n" + - "-----END RSA PRIVATE KEY-----\n"; + Pingpp.privateKey = "... PKCS8私钥内容字符串 ..."; */ - Pingpp.privateKey = "-----BEGIN PRIVATE KEY-----\n" + - "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDHYyS3FwoESp1h\n" + - "GLYiBhy6k9Ag3lzGCIEvm50IIEkE0Ftc9qq44TWqyl+EHUpTMdcBOcI42JLO5stw\n" + - "FOfCLa3PQStEJ4llIRFEKlsrHh67pvWd5RNaSBrvGlnFY40S+SZmjk2WF/h9dE9R\n" + - "ic79t0YI0alD8dIl9Yu3OaEKo7VonBWFwOYMxjPhtORlq+EUF1XJd//yftQrKWTT\n" + - "d7KaUonWzBCl4VzFop/OyTWYlTuZz3eYJaNpH5VaQ1vDgBAcPIeBvMf7NgBHMKW6\n" + - "LLmFd2LEYQ/6I7hkGTjysSzWEpO8bPWT6OEsJ2R2kFGOrSkr+G2MDcJ7ykXYAmz5\n" + - "+A3plS6ZAgMBAAECggEAVrgwR9GlcahiOtDcpn+yDxQq+aC9CQS561LrQZWJLKbS\n" + - "leRS7IZHKTlLwdJbeUO8F7RfXQoVEBghc2YkRrhHWFUn1ES95VY0hElHzcET7Nn5\n" + - "CeuQNzwVOtljIg7iVNY4dXJ/HEDguu/Tb8tYU9FajItj60FJ/WiGk/JksJPzWsOC\n" + - "VPVniy9fTbTLy1e+dCpCI6OXirtm7hvbodRNDjree0wSEzm7vL0wVzEZFo6kX+AB\n" + - "GUwaoO7pPyH+hgyI5Iuhc65NHsHzTJpf8yNFl9QGhkxvm2Ff2oEtDt1idOTBrHB6\n" + - "tg+ti9Ctb2+2yzBnk14hsSYJnKitR7wM6ZCFPX4eYQKBgQD+JAREeFkodec/SC+G\n" + - "X+4Q4Y68uMPkfUPrMKXM4cyY5wgXk64RBvRVxIxX7x6Y3tIKn9v8tWAprbsyVr15\n" + - "eb4RcAFEVwjuoZixhd9sIPsRhfdNolKn/fSPIsHL4ywcJMSIt7KVKHuQeqBNHy0o\n" + - "0PxQjNej1ozsmrAWqV55cbKHswKBgQDI2JQRTPIEC/2y6LdmBVhGJW9OKWTYdVNj\n" + - "q7rX+Yw4uxOtfd5hBqpvgZEklKEk72aazFdEcERlAm9SqoX09qk6zK/wcq4Xn5Q/\n" + - "qy8ecmjuyf2AK9X+HUdMerMVxhK9RpeevKYP/RO2F/wIN64anlQVYygVkXXgdOvW\n" + - "hBE4YABKgwKBgDRtmbPGYB5ItHwJmERQZfx1i8zDESaB8RED6DBsJJkmkDTM8ovw\n" + - "s1c+RPWfDuDalto6QFfR0xTGEmhAHLaCtwNB6AEBM4aHL8jvpTfZVfI3gN0zL3oY\n" + - "mestcG1vYBouO504yE6dG2Ci6479b4OMGYFEjPfvuwLUpp8GMcc7/WihAoGANCp8\n" + - "mtm/ammq5VMof2kX+nAyrrx1ovsmQ5cRGpOIZhvBCqjMn6rZjci7aCLqj+tWXRKC\n" + - "ABagzROK0o/T50JBxjHv6KYArcYW/Up7HI9ezdbM7wNzu2LjZ+veo+MkbuDs9J/P\n" + - "CgwTmJI2NfQwVl2VPVDZ0nBLi5cSwk7fIiNdL/0CgYEAtECmC1QDs53Di2MIsa/F\n" + - "e4sWfJGSDqEWqhcA/aPwf1skM6VJJXBBMV1qFtwgO1AlLnu9dQYra6ylsUoubVYI\n" + - "XM9XK7EMhbqi57+Q75jHFTc0DnzOTyho5Gp4Ddi8dztmZGNWdWTGdeMqh+svqMXk\n" + - "D6VdJeddyGu/Zlgj7Wk6whU=\n" + - "-----END PRIVATE KEY-----\n"; - + Pingpp.privateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDHYyS3FwoESp1hGLYiBhy6k9Ag3lzGCIEvm50IIEkE0Ftc9qq44TWqyl+EHUpTMdcBOcI42JLO5stwFOfCLa3PQStEJ4llIRFEKlsrHh67pvWd5RNaSBrvGlnFY40S+SZmjk2WF/h9dE9Ric79t0YI0alD8dIl9Yu3OaEKo7VonBWFwOYMxjPhtORlq+EUF1XJd//yftQrKWTTd7KaUonWzBCl4VzFop/OyTWYlTuZz3eYJaNpH5VaQ1vDgBAcPIeBvMf7NgBHMKW6LLmFd2LEYQ/6I7hkGTjysSzWEpO8bPWT6OEsJ2R2kFGOrSkr+G2MDcJ7ykXYAmz5+A3plS6ZAgMBAAECggEAVrgwR9GlcahiOtDcpn+yDxQq+aC9CQS561LrQZWJLKbSleRS7IZHKTlLwdJbeUO8F7RfXQoVEBghc2YkRrhHWFUn1ES95VY0hElHzcET7Nn5CeuQNzwVOtljIg7iVNY4dXJ/HEDguu/Tb8tYU9FajItj60FJ/WiGk/JksJPzWsOCVPVniy9fTbTLy1e+dCpCI6OXirtm7hvbodRNDjree0wSEzm7vL0wVzEZFo6kX+ABGUwaoO7pPyH+hgyI5Iuhc65NHsHzTJpf8yNFl9QGhkxvm2Ff2oEtDt1idOTBrHB6tg+ti9Ctb2+2yzBnk14hsSYJnKitR7wM6ZCFPX4eYQKBgQD+JAREeFkodec/SC+GX+4Q4Y68uMPkfUPrMKXM4cyY5wgXk64RBvRVxIxX7x6Y3tIKn9v8tWAprbsyVr15eb4RcAFEVwjuoZixhd9sIPsRhfdNolKn/fSPIsHL4ywcJMSIt7KVKHuQeqBNHy0o0PxQjNej1ozsmrAWqV55cbKHswKBgQDI2JQRTPIEC/2y6LdmBVhGJW9OKWTYdVNjq7rX+Yw4uxOtfd5hBqpvgZEklKEk72aazFdEcERlAm9SqoX09qk6zK/wcq4Xn5Q/qy8ecmjuyf2AK9X+HUdMerMVxhK9RpeevKYP/RO2F/wIN64anlQVYygVkXXgdOvWhBE4YABKgwKBgDRtmbPGYB5ItHwJmERQZfx1i8zDESaB8RED6DBsJJkmkDTM8ovws1c+RPWfDuDalto6QFfR0xTGEmhAHLaCtwNB6AEBM4aHL8jvpTfZVfI3gN0zL3oYmestcG1vYBouO504yE6dG2Ci6479b4OMGYFEjPfvuwLUpp8GMcc7/WihAoGANCp8mtm/ammq5VMof2kX+nAyrrx1ovsmQ5cRGpOIZhvBCqjMn6rZjci7aCLqj+tWXRKCABagzROK0o/T50JBxjHv6KYArcYW/Up7HI9ezdbM7wNzu2LjZ+veo+MkbuDs9J/PCgwTmJI2NfQwVl2VPVDZ0nBLi5cSwk7fIiNdL/0CgYEAtECmC1QDs53Di2MIsa/Fe4sWfJGSDqEWqhcA/aPwf1skM6VJJXBBMV1qFtwgO1AlLnu9dQYra6ylsUoubVYIXM9XK7EMhbqi57+Q75jHFTc0DnzOTyho5Gp4Ddi8dztmZGNWdWTGdeMqh+svqMXkD6VdJeddyGu/Zlgj7Wk6whU="; // Charge 示例 ChargeExample.runDemos(appId); @@ -120,6 +90,6 @@ public static String randomString(int length) { } public static int currentTimeSeconds() { - return (int)(System.currentTimeMillis() / 1000); + return (int) (System.currentTimeMillis() / 1000); } } diff --git a/pom.xml b/pom.xml index edca653..908d423 100644 --- a/pom.xml +++ b/pom.xml @@ -3,12 +3,12 @@ 4.0.0 Pingplusplus pingpp-java - 2.4.0 + 2.4.1 com.google.code.gson gson - 2.8.5 + 2.8.9 runtime diff --git a/src/main/java/com/pingplusplus/Pingpp.java b/src/main/java/com/pingplusplus/Pingpp.java index 334ad51..aa5d5c0 100644 --- a/src/main/java/com/pingplusplus/Pingpp.java +++ b/src/main/java/com/pingplusplus/Pingpp.java @@ -11,7 +11,7 @@ public abstract class Pingpp { /** * version */ - public static final String VERSION = "2.4.0"; + public static final String VERSION = "2.4.1"; /** * api key */ diff --git a/src/main/java/com/pingplusplus/model/Refund.java b/src/main/java/com/pingplusplus/model/Refund.java index f1145aa..fa94d1d 100644 --- a/src/main/java/com/pingplusplus/model/Refund.java +++ b/src/main/java/com/pingplusplus/model/Refund.java @@ -11,6 +11,7 @@ public class Refund extends APIResource { String object; String orderNo; Integer amount; + String currency; Long created; Boolean succeed; String status; @@ -167,6 +168,13 @@ public void setExtra(Map extra) { this.extra = extra; } + public String getCurrency() { + return currency; + } + + public void setCurrency(String currency) { + this.currency = currency; + } /** * 创建 refund * diff --git a/src/test/java/com/pingplusplus/PingppTest.java b/src/test/java/com/pingplusplus/PingppTest.java index a66d413..3ff1e7e 100644 --- a/src/test/java/com/pingplusplus/PingppTest.java +++ b/src/test/java/com/pingplusplus/PingppTest.java @@ -30,7 +30,7 @@ public class PingppTest { } @Test public void testVerifyVersions() { - assertEquals("Pingpp.VERSION should match", "2.4.0", Pingpp.VERSION); + assertEquals("Pingpp.VERSION should match", "2.4.1", Pingpp.VERSION); } @Test public void testCreateCharge() { From ba1e5050a0f8d4906d4a8c937f5b39ca6d187bc9 Mon Sep 17 00:00:00 2001 From: afon Date: Wed, 28 Feb 2024 14:37:50 +0800 Subject: [PATCH 02/25] update readme --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 554ae7a..7511ee1 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ maven 远程仓库 central bintray - https://jcenter.bintray.com + https://maven.aliyun.com/repository/jcenter ``` @@ -45,7 +45,7 @@ maven 远程仓库 Pingplusplus pingpp-java - 2.4.1 + 2.4.0 jar ``` @@ -57,7 +57,7 @@ gradle 远程仓库 ``` repositories { maven { - url "https://jcenter.bintray.com" + url "https://maven.aliyun.com/repository/jcenter" } } ``` @@ -65,7 +65,7 @@ repositories { 安装 Ping++ SDK ``` -compile 'Pingplusplus:pingpp-java:2.4.1' +compile 'Pingplusplus:pingpp-java:2.4.0' ``` ## 初始化 From 7a5ce0356cdd9f70fc2a5a53da989b0eab3b4b8c Mon Sep 17 00:00:00 2001 From: afon Date: Fri, 1 Mar 2024 19:25:44 +0800 Subject: [PATCH 03/25] maven publish to ossrh --- .gitignore | 1 + build.gradle | 19 +--- example/build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- pom.xml | 117 ++++++++++++++++++++++- 5 files changed, 117 insertions(+), 24 deletions(-) diff --git a/.gitignore b/.gitignore index 6e48406..c5693ed 100644 --- a/.gitignore +++ b/.gitignore @@ -60,3 +60,4 @@ org.eclipse.jdt.core.prefs example/out .vscode .classpath +target/ diff --git a/build.gradle b/build.gradle index cc365c6..b6f1944 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,7 @@ dependencies { compile 'com.google.code.gson:gson:2.8.9' compile 'commons-codec:commons-codec:1.13' - testCompile 'junit:junit:4.12' + testCompile 'junit:junit:4.13.2' } task sourcesJar(type: Jar, dependsOn: classes) { @@ -45,23 +45,6 @@ artifacts { archives sourcesJar, javadocJar } -publishing { - publications { - mavenJava(MavenPublication) { - from components.java - artifact sourcesJar - artifact javadocJar - groupId 'Pingplusplus' - artifactId 'pingpp-java' - - pom.withXml { - def root = asNode() - root.appendNode('name', 'pingpp-java') - root.appendNode('url', 'https://github.com/PingPlusPlus/pingpp-java') - } - } - } -} model { tasks.generatePomFileForMavenJavaPublication { destination = file("pom.xml") diff --git a/example/build.gradle b/example/build.gradle index 3c9bd78..9888ef6 100644 --- a/example/build.gradle +++ b/example/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'java' dependencies { - compile 'com.google.code.gson:gson:2.8.5' + compile 'com.google.code.gson:gson:2.8.9' compile 'commons-codec:commons-codec:1.13' compile project(':') diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 7b83409..f0ced99 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-all.zip diff --git a/pom.xml b/pom.xml index 908d423..11a8ca5 100644 --- a/pom.xml +++ b/pom.xml @@ -1,23 +1,132 @@ 4.0.0 - Pingplusplus + + com.pingxx pingpp-java 2.4.1 + + A Java SDK for Ping++ Payment API. + + + Apache License 2.0 + http://www.apache.org/licenses/LICENSE-2.0 + repo + + + + + scm:git:https://github.com/PingPlusPlus/pingpp-java.git + + + + afon + Afon + xufeng.weng@pingxx.com + + + + + 1.8 + 1.8 + + com.google.code.gson gson 2.8.9 - runtime + compile commons-codec commons-codec - 1.10 - runtime + 1.13 + compile + + + junit + junit + 4.13.2 + test + pingpp-java https://github.com/PingPlusPlus/pingpp-java + + + + ossrh + https://s01.oss.sonatype.org/content/repositories/snapshots + + + ossrh + https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/ + + + + + + + org.sonatype.plugins + nexus-staging-maven-plugin + 1.6.7 + true + + ossrh + https://s01.oss.sonatype.org/ + true + + + + org.apache.maven.plugins + maven-source-plugin + 2.2.1 + + + attach-sources + + jar-no-fork + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.9.1 + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.5 + + + sign-artifacts + verify + + sign + + + ${gpg.keyname} + ${gpg.passphrase} + + --pinentry-mode + loopback + + + + + + + From f40dbd88c8204c829329ab6ad91d0cc31fca853e Mon Sep 17 00:00:00 2001 From: GitButler Date: Mon, 4 Mar 2024 10:21:49 +0800 Subject: [PATCH 04/25] GitButler Integration Commit This is an integration commit for the virtual branches that GitButler is tracking. Due to GitButler managing multiple virtual branches, you cannot switch back and forth between git branches and virtual branches easily. If you switch to another branch, GitButler will need to be reinitialized. If you commit on this branch, GitButler will throw it away. Here are the branches that are currently applied: - mavenCentral 2.4.1 uploaded (refs/gitbutler/mavenCentral-2.4.1-uploaded-) branch head: 1fd9cb0ff440db9091e2527aa34fa954e490156f - Virtual branch (refs/gitbutler/Virtual-branch) branch head: ae14cee2dc590fec3baba4d22c200db526a0e744 - README.md - build.gradle - example/build.gradle Your previous branch was: refs/heads/master The sha for that commit was: 7a5ce0356cdd9f70fc2a5a53da989b0eab3b4b8c For more information about what we're doing here, check out our docs: https://docs.gitbutler.com/features/virtual-branches/integration-branch --- README.md | 19 +++++-------------- build.gradle | 36 +++--------------------------------- example/build.gradle | 6 +++--- 3 files changed, 11 insertions(+), 50 deletions(-) diff --git a/README.md b/README.md index 7511ee1..f2d3216 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Java 要求 JDK 8 及以上。 ### 手动安装 -JAR 下载地址: [pingpp-java](https://jcenter.bintray.com/Pingplusplus/pingpp-java/) +JAR 下载地址: [pingpp-java](https://mvnrepository.com/artifact/com.pingxx/pingpp-java) 请根据版本号下载相应的 JAR 文件并导入至工程。 @@ -29,14 +29,7 @@ JAR 下载地址: [pingpp-java](https://jcenter.bintray.com/Pingplusplus/pingpp- maven 远程仓库 ``` xml - - - false - - central - bintray - https://maven.aliyun.com/repository/jcenter - +mavenCentral ``` 安装 Ping++ SDK @@ -45,7 +38,7 @@ maven 远程仓库 Pingplusplus pingpp-java - 2.4.0 + 2.4.1 jar ``` @@ -56,16 +49,14 @@ gradle 远程仓库 ``` repositories { - maven { - url "https://maven.aliyun.com/repository/jcenter" - } + mavenCentral() } ``` 安装 Ping++ SDK ``` -compile 'Pingplusplus:pingpp-java:2.4.0' +implementation 'Pingplusplus:pingpp-java:2.4.1' ``` ## 初始化 diff --git a/build.gradle b/build.gradle index b6f1944..5ec6473 100644 --- a/build.gradle +++ b/build.gradle @@ -1,23 +1,13 @@ buildscript { repositories { - maven { - url 'https://maven.aliyun.com/repository/central' - } - mavenLocal() mavenCentral() } } allprojects { repositories { - maven { - url 'https://maven.aliyun.com/repository/central' - } - mavenLocal() mavenCentral() } - apply plugin: 'maven' - apply plugin: 'maven-publish' apply plugin: 'java' } @@ -25,28 +15,8 @@ sourceCompatibility = 1.8 targetCompatibility = 1.8 dependencies { - compile 'com.google.code.gson:gson:2.8.9' - compile 'commons-codec:commons-codec:1.13' + implementation 'com.google.code.gson:gson:2.8.9' + implementation 'commons-codec:commons-codec:1.13' - testCompile 'junit:junit:4.13.2' -} - -task sourcesJar(type: Jar, dependsOn: classes) { - classifier = 'sources' - from sourceSets.main.allSource -} - -task javadocJar(type: Jar, dependsOn: javadoc) { - classifier = 'javadoc' - from javadoc.destinationDir -} - -artifacts { - archives sourcesJar, javadocJar -} - -model { - tasks.generatePomFileForMavenJavaPublication { - destination = file("pom.xml") - } + testImplementation 'junit:junit:4.13.2' } diff --git a/example/build.gradle b/example/build.gradle index 9888ef6..92e80dd 100644 --- a/example/build.gradle +++ b/example/build.gradle @@ -1,8 +1,8 @@ apply plugin: 'java' dependencies { - compile 'com.google.code.gson:gson:2.8.9' - compile 'commons-codec:commons-codec:1.13' + implementation 'com.google.code.gson:gson:2.8.9' + implementation 'commons-codec:commons-codec:1.13' - compile project(':') + implementation 'com.pingxx:pingpp-java:2.4.1' } From ccd21224d0daf5c49b16f175a3f0440d98981ff3 Mon Sep 17 00:00:00 2001 From: afon Date: Tue, 5 Mar 2024 11:12:20 +0800 Subject: [PATCH 05/25] fix groupId Pingplusplus -> com.pingxx --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f2d3216..d926a69 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ mavenCentral ``` xml - Pingplusplus + com.pingxx pingpp-java 2.4.1 jar @@ -56,7 +56,7 @@ repositories { 安装 Ping++ SDK ``` -implementation 'Pingplusplus:pingpp-java:2.4.1' +implementation 'com.pingxx:pingpp-java:2.4.1' ``` ## 初始化 From 86cfe6019b00b2e7fefc3100645eb60ccfac4dc4 Mon Sep 17 00:00:00 2001 From: "chengliang.zhang" Date: Fri, 16 Aug 2024 15:08:59 +0800 Subject: [PATCH 06/25] update deprecate method of JsonParser --- .../java/com/pingplusplus/util/WxpubOAuth.java | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/util/WxpubOAuth.java (95%) diff --git a/src/main/java/com/pingplusplus/util/WxpubOAuth.java b/pingpp-sdk/src/main/java/com/pingplusplus/util/WxpubOAuth.java similarity index 95% rename from src/main/java/com/pingplusplus/util/WxpubOAuth.java rename to pingpp-sdk/src/main/java/com/pingplusplus/util/WxpubOAuth.java index d4aeced..d6a7815 100644 --- a/src/main/java/com/pingplusplus/util/WxpubOAuth.java +++ b/pingpp-sdk/src/main/java/com/pingplusplus/util/WxpubOAuth.java @@ -1,10 +1,12 @@ package com.pingplusplus.util; -import com.google.gson.*; +import com.google.gson.FieldNamingPolicy; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import com.pingplusplus.exception.ChannelException; import java.io.BufferedReader; -import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; @@ -157,8 +159,7 @@ public static String getJsapiTicket(String appId, String appSecret) throws Unsup String queryString = WxpubOAuth.httpBuildQuery(data); String accessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?" + queryString; String resp = httpGet(accessTokenUrl); - JsonParser jp = new JsonParser(); - JsonObject respJson = jp.parse(resp).getAsJsonObject(); + JsonObject respJson = JsonParser.parseString(resp).getAsJsonObject(); if (respJson.has("errcode")) { return respJson.toString(); } @@ -169,7 +170,7 @@ public static String getJsapiTicket(String appId, String appSecret) throws Unsup queryString = WxpubOAuth.httpBuildQuery(data); String jsapiTicketUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?" + queryString; resp = httpGet(jsapiTicketUrl); - JsonObject ticket = jp.parse(resp).getAsJsonObject(); + JsonObject ticket = JsonParser.parseString(resp).getAsJsonObject(); return ticket.get("ticket").getAsString(); } @@ -183,8 +184,7 @@ public static String getJsapiTicket(String appId, String appSecret) throws Unsup public static String getSignature(String charge, String jsapiTicket, String url) { if (null == charge || null == jsapiTicket || charge.isEmpty() || jsapiTicket.isEmpty()) return null; - JsonParser jp = new JsonParser(); - JsonObject chargeJson = jp.parse(charge).getAsJsonObject(); + JsonObject chargeJson = JsonParser.parseString(charge).getAsJsonObject(); if (!chargeJson.has("credential")) { return null; } @@ -206,9 +206,7 @@ public static String getSignature(String charge, String jsapiTicket, String url) crypt.reset(); crypt.update(string1.getBytes(CHARSET)); signature = byteToHex(crypt.digest()); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (UnsupportedEncodingException e) { + } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) { e.printStackTrace(); } From ee5cba935538270fe93388a5a5ee7deb6d7794b4 Mon Sep 17 00:00:00 2001 From: "chengliang.zhang" Date: Fri, 16 Aug 2024 16:22:11 +0800 Subject: [PATCH 07/25] update webhook verify demo --- .../pingxx/example/WebhooksVerifyExample.java | 99 +++---------------- 1 file changed, 13 insertions(+), 86 deletions(-) diff --git a/example/src/main/java/com/pingxx/example/WebhooksVerifyExample.java b/example/src/main/java/com/pingxx/example/WebhooksVerifyExample.java index 31af3fe..891e1ed 100644 --- a/example/src/main/java/com/pingxx/example/WebhooksVerifyExample.java +++ b/example/src/main/java/com/pingxx/example/WebhooksVerifyExample.java @@ -7,37 +7,25 @@ */ package com.pingxx.example; -import java.io.*; -import java.security.InvalidKeyException; -import java.security.KeyFactory; -import java.security.NoSuchAlgorithmException; -import java.security.PublicKey; -import java.security.Signature; -import java.security.SignatureException; -import java.security.spec.X509EncodedKeySpec; - -import org.apache.commons.codec.binary.Base64; +import com.pingplusplus.Pingpp; +import com.pingplusplus.net.APIResource; +import com.pingplusplus.util.PingppSignature; /** - * Created by sunkai on 15/5/19. webhooks 验证签名示例 - * + * webhooks 验证签名示例 + *

* 该实例演示如何对 Ping++ webhooks 通知进行验证。 * 验证是为了让开发者确认该通知来自 Ping++ ,防止恶意伪造通知。用户如果有别的验证机制,可以不进行验证签名。 - * + *

* 验证签名需要 签名、公钥、验证信息,该实例采用文件存储方式进行演示。 * 实际项目中,需要用户从异步通知的 HTTP header 中读取签名,从 HTTP body 中读取验证信息。公钥的存储方式也需要用户自行设定。 - * - * 该实例仅供演示如何验证签名,请务必不要直接 copy 到实际项目中使用。 - * + *

+ * 该实例仅供演示如何验证签名,请务必不要直接 copy 到实际项目中使用。 */ public class WebhooksVerifyExample { - - private static String pubKeyPath = "res/pingpp_public_key.pem"; - private static String eventPath = "res/webhooks_raw_post_data.json"; - private static String signPath = "res/signature.txt"; - /** * 验证 webhooks 签名,仅供参考 + * * @param args * @throws Exception */ @@ -46,78 +34,17 @@ public static void main(String[] args) throws Exception { } public static void runDemos() throws Exception { + String verifyPublicKey = Pingpp.verifyPublicKey; // 该数据请从 request 中获取原始 POST 请求数据, 以下仅作为示例 - String webhooksRawPostData = getStringFromFile(eventPath); + String webhooksRawPostData = "{\"id\":\"evt_400240816160755820469807\",\"created\":1723795675,\"livemode\":false,\"type\":\"charge.succeeded\",\"data\":{\"object\":{\"id\":\"ch_100240816592822384640019\",\"object\":\"charge\",\"created\":1723795492,\"livemode\":false,\"paid\":true,\"refunded\":false,\"reversed\":false,\"app\":\"app_eTC8yLuj9GSSL0yv\",\"channel\":\"wx_pub\",\"order_no\":\"1723795491985uqclqj7\",\"client_ip\":\"127.0.0.1\",\"amount\":100,\"amount_settle\":100,\"currency\":\"cny\",\"subject\":\"Your Subject\",\"body\":\"Your Body\",\"extra\":{\"open_id\":\"o7xEMsySBFG3MVHI-9VsAJX-j50W\",\"limit_pay\":\"no_credit\",\"bank_type\":\"your bank type\"},\"time_paid\":1723795675,\"time_expire\":1723802692,\"time_settle\":null,\"transaction_no\":\"1290362656202408163243920572\",\"refunds\":{\"object\":\"list\",\"url\":\"/v1/charges/ch_100240816592822384640019/refunds\",\"has_more\":false,\"data\":[]},\"amount_refunded\":0,\"failure_code\":null,\"failure_msg\":null,\"metadata\":{},\"credential\":{},\"description\":null}},\"object\":\"event\",\"request\":\"iar_mrrvj9ivPOaHPOi9aLPWPqvT\",\"pending_webhooks\":0}"; System.out.println("------- POST 原始数据 -------"); System.out.println(webhooksRawPostData); // 签名数据请从 request 的 header 中获取, key 为 X-Pingplusplus-Signature (请忽略大小写, 建议自己做格式化) - String signature = getStringFromFile(signPath); + String signature = "Ju5ItDM9Hblkm6Pbb/r3G9iM58oCtAUJlJDrOud0E23TUtGBxKYJSMcuTFbPgLGLKy5QHYovJJojjMjM1CMGCp82F+SOY1U2zuwzkAk0lVqhfQk+CWGpcyUzOtLOOblKidyuIb+axZDTIg4kK/JoOR2xMH3+cJD9BN6rtfzEDbHqyZIfv6n3y/LdZNhsXfQq+qoIRuLdHrFexk1USgk7SXFvH1pCOIt8o2+dryp/ixlNj1vGq57eE8sbEzPo72vxLtzPazlgR+67cS1bUxjzObh7YFbSSTJxkHDEIi3ipTpoiI7Kc5ng7EzsWgp3cAl7on5HztfFLfT8+Bjpdvtr6w=="; System.out.println("------- 签名 -------"); System.out.println(signature); - boolean result = verifyData(webhooksRawPostData, signature, getPubKey()); + boolean result = PingppSignature.verify(signature, webhooksRawPostData, verifyPublicKey, APIResource.CHARSET.name()); System.out.println("验签结果:" + (result ? "通过" : "失败")); } - - /** - * 读取文件, 部署 web 程序的时候, 签名和验签内容需要从 request 中获得 - * @param filePath - * @return - * @throws Exception - */ - public static String getStringFromFile(String filePath) throws Exception { - FileInputStream in = new FileInputStream(Main.projectDir + filePath); - InputStreamReader inReader = new InputStreamReader(in, "UTF-8"); - BufferedReader bf = new BufferedReader(inReader); - StringBuilder sb = new StringBuilder(); - String line; - do { - line = bf.readLine(); - if (line != null) { - if (sb.length() != 0) { - sb.append("\n"); - } - sb.append(line); - } - } while (line != null); - - return sb.toString(); - } - - /** - * 获得公钥 - * @return - * @throws Exception - */ - public static PublicKey getPubKey() throws Exception { - String pubKeyString = getStringFromFile(pubKeyPath); - pubKeyString = pubKeyString.replaceAll("(-+BEGIN PUBLIC KEY-+\\r?\\n|-+END PUBLIC KEY-+\\r?\\n?)", ""); - byte[] keyBytes = Base64.decodeBase64(pubKeyString.getBytes("UTF-8")); - - // generate public key - X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes); - KeyFactory keyFactory = KeyFactory.getInstance("RSA"); - - return keyFactory.generatePublic(spec); - } - - /** - * 验证签名 - * @param dataString - * @param signatureString - * @param publicKey - * @return - * @throws NoSuchAlgorithmException - * @throws InvalidKeyException - * @throws SignatureException - */ - public static boolean verifyData(String dataString, String signatureString, PublicKey publicKey) - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, UnsupportedEncodingException { - byte[] signatureBytes = Base64.decodeBase64(signatureString); - Signature signature = Signature.getInstance("SHA256withRSA"); - signature.initVerify(publicKey); - signature.update(dataString.getBytes("UTF-8")); - return signature.verify(signatureBytes); - } - } From a2f290817b21ddc119f524d1152b621ab6eced63 Mon Sep 17 00:00:00 2001 From: "chengliang.zhang" Date: Fri, 16 Aug 2024 16:26:38 +0800 Subject: [PATCH 08/25] move to pingpp-sdk --- pingpp-sdk/build.gradle | 49 ++++++ .../main/java/com/pingplusplus/Pingpp.java | 29 +++- .../exception/APIConnectionException.java | 0 .../pingplusplus/exception/APIException.java | 0 .../exception/AuthenticationException.java | 0 .../exception/ChannelException.java | 0 .../exception/InvalidRequestException.java | 0 .../exception/PingppException.java | 0 .../exception/RateLimitException.java | 0 .../com/pingplusplus/model/Agreement.java | 4 + .../model/AgreementCollection.java | 0 .../pingplusplus/model/AgreementNotify.java | 44 +++++ .../main/java/com/pingplusplus/model/App.java | 0 .../com/pingplusplus/model/BalanceBonus.java | 0 .../model/BalanceBonusCollection.java | 0 .../pingplusplus/model/BalanceSettlement.java | 0 .../model/BalanceSettlementCollection.java | 0 .../model/BalanceTransaction.java | 0 .../model/BalanceTransactionCollection.java | 0 .../pingplusplus/model/BalanceTransfer.java | 0 .../model/BalanceTransferCollection.java | 0 .../com/pingplusplus/model/BatchRefund.java | 0 .../model/BatchRefundCharges.java | 0 .../model/BatchRefundCollection.java | 0 .../com/pingplusplus/model/BatchTransfer.java | 0 .../model/BatchTransferCollection.java | 0 .../model/BatchTransferRecipient.java | 0 .../pingplusplus/model/BatchWithdrawal.java | 0 .../model/BatchWithdrawalCollection.java | 0 .../java/com/pingplusplus/model/CardInfo.java | 0 .../java/com/pingplusplus/model/Channel.java | 0 .../java/com/pingplusplus/model/Charge.java | 0 .../pingplusplus/model/ChargeCollection.java | 0 .../pingplusplus/model/ChargeEssentials.java | 0 .../model/ChargeRefundCollection.java | 0 .../java/com/pingplusplus/model/Contact.java | 0 .../java/com/pingplusplus/model/Coupon.java | 0 .../pingplusplus/model/CouponCollection.java | 0 .../pingplusplus/model/CouponTemplate.java | 0 .../model/CouponTemplateCollection.java | 0 .../model/CouponTemplateExpiration.java | 0 .../java/com/pingplusplus/model/Customs.java | 0 .../pingplusplus/model/CustomsCollection.java | 0 .../model/DeleteRoyaltyTemplate.java | 0 .../pingplusplus/model/DeletedChannel.java | 0 .../com/pingplusplus/model/DeletedCoupon.java | 0 .../model/DeletedCouponTemplate.java | 0 .../pingplusplus/model/DeletedObjectBase.java | 0 .../model/DeletedPingppObject.java | 0 .../model/DeletedSettleAccount.java | 0 .../model/DeletedSplitReceiver.java | 0 .../com/pingplusplus/model/DeletedSubApp.java | 0 .../java/com/pingplusplus/model/Event.java | 0 .../pingplusplus/model/EventCollection.java | 0 .../com/pingplusplus/model/EventData.java | 0 .../pingplusplus/model/Identification.java | 0 .../java/com/pingplusplus/model/Order.java | 0 .../pingplusplus/model/OrderCollection.java | 0 .../com/pingplusplus/model/OrderRefund.java | 0 .../model/OrderRefundCollection.java | 0 .../pingplusplus/model/PingppCollection.java | 0 .../model/PingppCollectionAPIResource.java | 0 .../com/pingplusplus/model/PingppError.java | 0 .../com/pingplusplus/model/PingppObject.java | 0 .../model/PingppObjectInterface.java | 0 .../model/PingppRawJsonObject.java | 0 .../pingplusplus/model/ProfitTransaction.java | 0 .../model/ProfitTransactionCollection.java | 0 .../java/com/pingplusplus/model/Recharge.java | 0 .../model/RechargeCollection.java | 0 .../pingplusplus/model/RechargeRefund.java | 0 .../model/RechargeRefundCollection.java | 0 .../com/pingplusplus/model/RedEnvelope.java | 0 .../model/RedEnvelopeCollection.java | 0 .../java/com/pingplusplus/model/Refund.java | 0 .../java/com/pingplusplus/model/Royalty.java | 0 .../pingplusplus/model/RoyaltyCollection.java | 0 .../pingplusplus/model/RoyaltyDataResult.java | 0 .../pingplusplus/model/RoyaltySettlement.java | 0 .../model/RoyaltySettlementCollection.java | 0 .../pingplusplus/model/RoyaltyTemplate.java | 0 .../model/RoyaltyTemplateCollection.java | 0 .../model/RoyaltyTransaction.java | 0 .../model/RoyaltyTransactionCollection.java | 0 .../com/pingplusplus/model/SettleAccount.java | 0 .../model/SettleAccountCollection.java | 0 .../model/SettleAccountRecipient.java | 0 .../com/pingplusplus/model/SplitProfit.java | 0 .../model/SplitProfitCollection.java | 0 .../model/SplitProfitRecipient.java | 0 .../com/pingplusplus/model/SplitReceiver.java | 0 .../model/SplitReceiverCollection.java | 0 .../java/com/pingplusplus/model/SubApp.java | 0 .../pingplusplus/model/SubAppCollection.java | 0 .../java/com/pingplusplus/model/SubBank.java | 0 .../pingplusplus/model/SubBankCollection.java | 0 .../java/com/pingplusplus/model/Summary.java | 0 .../java/com/pingplusplus/model/Transfer.java | 0 .../model/TransferCollection.java | 0 .../java/com/pingplusplus/model/User.java | 0 .../pingplusplus/model/UserCollection.java | 0 .../java/com/pingplusplus/model/UserPic.java | 0 .../java/com/pingplusplus/model/Webhooks.java | 0 .../com/pingplusplus/model/Withdrawal.java | 0 .../model/WithdrawalCollection.java | 0 .../model/WithdrawalCollectionBase.java | 0 .../com/pingplusplus/net/APIResource.java | 0 .../pingplusplus/net/AppBasedResource.java | 0 .../java/com/pingplusplus/net/HttpClient.java | 0 .../com/pingplusplus/net/HttpContent.java | 0 .../com/pingplusplus/net/HttpHeaders.java | 0 .../net/HttpURLConnectionClient.java | 8 + .../com/pingplusplus/net/PingppRequest.java | 0 .../com/pingplusplus/net/PingppResponse.java | 0 .../com/pingplusplus/net/RequestOptions.java | 19 +++ .../pingplusplus/net/SubAppBasedResource.java | 0 .../pingplusplus/net/UserBasedResource.java | 0 .../BatchRefundChargesSerializer.java | 0 .../BatchTransferRecipientSerializer.java | 0 .../serializer/ChargeDeserializer.java | 0 .../ChargeEssentialsSerializer.java | 0 .../ChargeRefundCollectionDeserializer.java | 0 .../CouponTemplateExpirationSerializer.java | 0 .../serializer/DoubleTypeSerializer.java | 0 .../serializer/EventDataDeserializer.java | 0 .../PingppRawJsonObjectDeserializer.java | 0 .../serializer/RedEnvelopeDeserializer.java | 0 .../SettleAccountRecipientSerializer.java | 0 .../serializer/SubAppDeserializer.java | 0 .../serializer/TransferDeserializer.java | 0 .../pingplusplus/util/CaseInsensitiveMap.java | 6 +- .../pingplusplus/util/PingppSignature.java | 150 ++++++++++++++++++ .../com/pingplusplus/util/StreamUtils.java | 0 .../com/pingplusplus/util/StringUtils.java | 21 +++ .../com/pingplusplus/util/WxLiteOAuth.java | 0 .../java/com/pingplusplus/CardInfoTest.java | 0 .../java/com/pingplusplus/PingppTest.java | 2 +- .../java/com/pingplusplus/PingppTestBase.java | 0 .../java/com/pingplusplus/PingppTestData.java | 29 +--- .../com/pingplusplus/RequestOptionsTest.java | 0 .../java/com/pingplusplus/SubBankTest.java | 0 .../java/com/pingplusplus/WebhookTest.java | 0 .../com/pingplusplus/WeixinOpenidTest.java | 0 .../agreement/AgreenmentTest.java | 0 .../balance/BalanceBonusTest.java | 0 .../balance/BalanceSettlementTest.java | 0 .../balance/BalanceTransactionTest.java | 0 .../balance/BalanceTransferTest.java | 0 .../coupon/CouponTemplateTest.java | 0 .../com/pingplusplus/coupon/CouponTest.java | 0 .../com/pingplusplus/order/OrderTest.java | 0 .../order/RoyaltySettlementTest.java | 0 .../order/RoyaltyTemplateTest.java | 0 .../com/pingplusplus/order/RoyaltyTest.java | 0 .../order/RoyaltyTransactionTest.java | 0 .../pingplusplus/recharge/RechargeTest.java | 0 .../settle_account/SettleAccountTest.java | 0 .../split/ProfitTransactionTest.java | 0 .../pingplusplus/split/SplitProfitTest.java | 0 .../pingplusplus/split/SplitReceiverTest.java | 0 .../com/pingplusplus/sub_app/ContactTest.java | 0 .../sub_app/SubAppChannelTest.java | 0 .../com/pingplusplus/sub_app/SubAppTest.java | 0 .../pingplusplus/transfer/TransferTest.java | 0 .../com/pingplusplus/user/UserPicTest.java | 0 .../java/com/pingplusplus/user/UserTest.java | 0 .../withdrawal/BatchWithdrawalTest.java | 0 .../withdrawal/WithdrawalTest.java | 0 168 files changed, 327 insertions(+), 34 deletions(-) create mode 100644 pingpp-sdk/build.gradle rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/Pingpp.java (79%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/exception/APIConnectionException.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/exception/APIException.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/exception/AuthenticationException.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/exception/ChannelException.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/exception/InvalidRequestException.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/exception/PingppException.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/exception/RateLimitException.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/Agreement.java (99%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/AgreementCollection.java (100%) create mode 100644 pingpp-sdk/src/main/java/com/pingplusplus/model/AgreementNotify.java rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/App.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/BalanceBonus.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/BalanceBonusCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/BalanceSettlement.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/BalanceSettlementCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/BalanceTransaction.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/BalanceTransactionCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/BalanceTransfer.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/BalanceTransferCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/BatchRefund.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/BatchRefundCharges.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/BatchRefundCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/BatchTransfer.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/BatchTransferCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/BatchTransferRecipient.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/BatchWithdrawal.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/BatchWithdrawalCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/CardInfo.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/Channel.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/Charge.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/ChargeCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/ChargeEssentials.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/ChargeRefundCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/Contact.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/Coupon.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/CouponCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/CouponTemplate.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/CouponTemplateCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/CouponTemplateExpiration.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/Customs.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/CustomsCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/DeleteRoyaltyTemplate.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/DeletedChannel.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/DeletedCoupon.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/DeletedCouponTemplate.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/DeletedObjectBase.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/DeletedPingppObject.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/DeletedSettleAccount.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/DeletedSplitReceiver.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/DeletedSubApp.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/Event.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/EventCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/EventData.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/Identification.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/Order.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/OrderCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/OrderRefund.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/OrderRefundCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/PingppCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/PingppCollectionAPIResource.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/PingppError.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/PingppObject.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/PingppObjectInterface.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/PingppRawJsonObject.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/ProfitTransaction.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/ProfitTransactionCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/Recharge.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/RechargeCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/RechargeRefund.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/RechargeRefundCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/RedEnvelope.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/RedEnvelopeCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/Refund.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/Royalty.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/RoyaltyCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/RoyaltyDataResult.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/RoyaltySettlement.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/RoyaltySettlementCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/RoyaltyTemplate.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/RoyaltyTemplateCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/RoyaltyTransaction.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/RoyaltyTransactionCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/SettleAccount.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/SettleAccountCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/SettleAccountRecipient.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/SplitProfit.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/SplitProfitCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/SplitProfitRecipient.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/SplitReceiver.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/SplitReceiverCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/SubApp.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/SubAppCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/SubBank.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/SubBankCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/Summary.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/Transfer.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/TransferCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/User.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/UserCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/UserPic.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/Webhooks.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/Withdrawal.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/WithdrawalCollection.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/model/WithdrawalCollectionBase.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/net/APIResource.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/net/AppBasedResource.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/net/HttpClient.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/net/HttpContent.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/net/HttpHeaders.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/net/HttpURLConnectionClient.java (87%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/net/PingppRequest.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/net/PingppResponse.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/net/RequestOptions.java (90%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/net/SubAppBasedResource.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/net/UserBasedResource.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/serializer/BatchRefundChargesSerializer.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/serializer/BatchTransferRecipientSerializer.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/serializer/ChargeDeserializer.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/serializer/ChargeEssentialsSerializer.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/serializer/ChargeRefundCollectionDeserializer.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/serializer/CouponTemplateExpirationSerializer.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/serializer/DoubleTypeSerializer.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/serializer/EventDataDeserializer.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/serializer/PingppRawJsonObjectDeserializer.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/serializer/RedEnvelopeDeserializer.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/serializer/SettleAccountRecipientSerializer.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/serializer/SubAppDeserializer.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/serializer/TransferDeserializer.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/util/CaseInsensitiveMap.java (90%) create mode 100644 pingpp-sdk/src/main/java/com/pingplusplus/util/PingppSignature.java rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/util/StreamUtils.java (100%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/util/StringUtils.java (68%) rename {src => pingpp-sdk/src}/main/java/com/pingplusplus/util/WxLiteOAuth.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/CardInfoTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/PingppTest.java (99%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/PingppTestBase.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/PingppTestData.java (77%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/RequestOptionsTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/SubBankTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/WebhookTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/WeixinOpenidTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/agreement/AgreenmentTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/balance/BalanceBonusTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/balance/BalanceSettlementTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/balance/BalanceTransactionTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/balance/BalanceTransferTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/coupon/CouponTemplateTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/coupon/CouponTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/order/OrderTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/order/RoyaltySettlementTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/order/RoyaltyTemplateTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/order/RoyaltyTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/order/RoyaltyTransactionTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/recharge/RechargeTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/settle_account/SettleAccountTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/split/ProfitTransactionTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/split/SplitProfitTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/split/SplitReceiverTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/sub_app/ContactTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/sub_app/SubAppChannelTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/sub_app/SubAppTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/transfer/TransferTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/user/UserPicTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/user/UserTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/withdrawal/BatchWithdrawalTest.java (100%) rename {src => pingpp-sdk/src}/test/java/com/pingplusplus/withdrawal/WithdrawalTest.java (100%) diff --git a/pingpp-sdk/build.gradle b/pingpp-sdk/build.gradle new file mode 100644 index 0000000..aafd483 --- /dev/null +++ b/pingpp-sdk/build.gradle @@ -0,0 +1,49 @@ +buildscript { + repositories { + maven { + url 'https://maven.aliyun.com/repository/central' + } + mavenLocal() + mavenCentral() + } +} + +plugins { + id "maven-publish" + id "java" +} + +configurations { + compileOnly { + extendsFrom annotationProcessor + } + testCompileOnly { + extendsFrom testAnnotationProcessor + } +} + +dependencies { + implementation 'com.google.code.gson:gson:2.10' + implementation 'commons-codec:commons-codec:1.17.0' + testImplementation 'junit:junit:4.13.2' +} + +java { + withSourcesJar() +} + +publishing { + publications { + mavenJava(MavenPublication) { + from components.java + versionMapping { + usage('java-api') { + fromResolutionOf('runtimeClasspath') + } + usage('java-runtime') { + fromResolutionResult() + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/pingplusplus/Pingpp.java b/pingpp-sdk/src/main/java/com/pingplusplus/Pingpp.java similarity index 79% rename from src/main/java/com/pingplusplus/Pingpp.java rename to pingpp-sdk/src/main/java/com/pingplusplus/Pingpp.java index aa5d5c0..023cd9d 100644 --- a/src/main/java/com/pingplusplus/Pingpp.java +++ b/pingpp-sdk/src/main/java/com/pingplusplus/Pingpp.java @@ -1,5 +1,11 @@ package com.pingplusplus; +import com.pingplusplus.net.APIResource; +import com.pingplusplus.util.StreamUtils; + +import java.io.FileInputStream; +import java.io.IOException; + /** * Ping++ Base class */ @@ -11,7 +17,7 @@ public abstract class Pingpp { /** * version */ - public static final String VERSION = "2.4.1"; + public static final String VERSION = "2.5.0"; /** * api key */ @@ -24,6 +30,7 @@ public abstract class Pingpp { private static volatile String apiBase = LIVE_API_BASE; public static volatile String privateKey; + public static volatile String verifyPublicKey; public static volatile String privateKeyPath; public static Boolean DEBUG = false; @@ -99,7 +106,6 @@ public static int getReadTimeout() { /** * 设置数据读取超时时间 (毫秒) - * * 不同接口的耗时时间不一样,部分接口的耗时可能比较长。 * * @param timeout timeout value in milliseconds @@ -133,4 +139,23 @@ public static String getAcceptLanguage() { public static void setAcceptLanguage(String acceptLanguage) { Pingpp.acceptLanguage = acceptLanguage; } + + public static void setVerifyPublicKeyPath(String keyFilePath) throws IOException { + Pingpp.verifyPublicKey = readKeyFromFilePath(keyFilePath); + } + + /** + * 读取密钥文件 + * + * @param filePath 文件路径 + * @return 密钥内容 + * @throws IOException IO 异常 + */ + private static String readKeyFromFilePath(String filePath) throws IOException { + FileInputStream inputStream = new FileInputStream(filePath); + String privateKey = StreamUtils.readToEnd(inputStream, APIResource.CHARSET); + inputStream.close(); + + return privateKey; + } } diff --git a/src/main/java/com/pingplusplus/exception/APIConnectionException.java b/pingpp-sdk/src/main/java/com/pingplusplus/exception/APIConnectionException.java similarity index 100% rename from src/main/java/com/pingplusplus/exception/APIConnectionException.java rename to pingpp-sdk/src/main/java/com/pingplusplus/exception/APIConnectionException.java diff --git a/src/main/java/com/pingplusplus/exception/APIException.java b/pingpp-sdk/src/main/java/com/pingplusplus/exception/APIException.java similarity index 100% rename from src/main/java/com/pingplusplus/exception/APIException.java rename to pingpp-sdk/src/main/java/com/pingplusplus/exception/APIException.java diff --git a/src/main/java/com/pingplusplus/exception/AuthenticationException.java b/pingpp-sdk/src/main/java/com/pingplusplus/exception/AuthenticationException.java similarity index 100% rename from src/main/java/com/pingplusplus/exception/AuthenticationException.java rename to pingpp-sdk/src/main/java/com/pingplusplus/exception/AuthenticationException.java diff --git a/src/main/java/com/pingplusplus/exception/ChannelException.java b/pingpp-sdk/src/main/java/com/pingplusplus/exception/ChannelException.java similarity index 100% rename from src/main/java/com/pingplusplus/exception/ChannelException.java rename to pingpp-sdk/src/main/java/com/pingplusplus/exception/ChannelException.java diff --git a/src/main/java/com/pingplusplus/exception/InvalidRequestException.java b/pingpp-sdk/src/main/java/com/pingplusplus/exception/InvalidRequestException.java similarity index 100% rename from src/main/java/com/pingplusplus/exception/InvalidRequestException.java rename to pingpp-sdk/src/main/java/com/pingplusplus/exception/InvalidRequestException.java diff --git a/src/main/java/com/pingplusplus/exception/PingppException.java b/pingpp-sdk/src/main/java/com/pingplusplus/exception/PingppException.java similarity index 100% rename from src/main/java/com/pingplusplus/exception/PingppException.java rename to pingpp-sdk/src/main/java/com/pingplusplus/exception/PingppException.java diff --git a/src/main/java/com/pingplusplus/exception/RateLimitException.java b/pingpp-sdk/src/main/java/com/pingplusplus/exception/RateLimitException.java similarity index 100% rename from src/main/java/com/pingplusplus/exception/RateLimitException.java rename to pingpp-sdk/src/main/java/com/pingplusplus/exception/RateLimitException.java diff --git a/src/main/java/com/pingplusplus/model/Agreement.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/Agreement.java similarity index 99% rename from src/main/java/com/pingplusplus/model/Agreement.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/Agreement.java index 42a6f9d..3039557 100644 --- a/src/main/java/com/pingplusplus/model/Agreement.java +++ b/pingpp-sdk/src/main/java/com/pingplusplus/model/Agreement.java @@ -190,6 +190,8 @@ public static Agreement retrieve(String id) throws PingppException { return retrieve(id, null); } + + /** * 查询签约(agreement) * @@ -251,4 +253,6 @@ public static Agreement cancel(String id, RequestOptions options) throws PingppE params.put("status", "canceled"); return APIResource.request(RequestMethod.PUT, instanceURL(Agreement.class, id), params, Agreement.class, options); } + + } diff --git a/src/main/java/com/pingplusplus/model/AgreementCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/AgreementCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/AgreementCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/AgreementCollection.java diff --git a/pingpp-sdk/src/main/java/com/pingplusplus/model/AgreementNotify.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/AgreementNotify.java new file mode 100644 index 0000000..9f0b326 --- /dev/null +++ b/pingpp-sdk/src/main/java/com/pingplusplus/model/AgreementNotify.java @@ -0,0 +1,44 @@ +package com.pingplusplus.model; + +import com.pingplusplus.exception.PingppException; +import com.pingplusplus.net.APIResource; +import com.pingplusplus.net.RequestOptions; + +import java.util.Map; + +public class AgreementNotify extends APIResource { + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Boolean getSucceed() { + return succeed; + } + + public void setSucceed(Boolean succeed) { + this.succeed = succeed; + } + + String id; + Boolean succeed; + + public static AgreementNotify create(String id, Map params) throws PingppException { + return create(id, params, null); + } + + /** + * + * @param agreementId + * @param params + * @param options + * @return + * @throws PingppException + */ + public static AgreementNotify create(String agreementId, Map params, RequestOptions options) throws PingppException { + return APIResource.request(APIResource.RequestMethod.POST, String.format("%s/notify", instanceURL(Agreement.class, agreementId)), params, AgreementNotify.class, options); + } +} diff --git a/src/main/java/com/pingplusplus/model/App.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/App.java similarity index 100% rename from src/main/java/com/pingplusplus/model/App.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/App.java diff --git a/src/main/java/com/pingplusplus/model/BalanceBonus.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/BalanceBonus.java similarity index 100% rename from src/main/java/com/pingplusplus/model/BalanceBonus.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/BalanceBonus.java diff --git a/src/main/java/com/pingplusplus/model/BalanceBonusCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/BalanceBonusCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/BalanceBonusCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/BalanceBonusCollection.java diff --git a/src/main/java/com/pingplusplus/model/BalanceSettlement.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/BalanceSettlement.java similarity index 100% rename from src/main/java/com/pingplusplus/model/BalanceSettlement.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/BalanceSettlement.java diff --git a/src/main/java/com/pingplusplus/model/BalanceSettlementCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/BalanceSettlementCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/BalanceSettlementCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/BalanceSettlementCollection.java diff --git a/src/main/java/com/pingplusplus/model/BalanceTransaction.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/BalanceTransaction.java similarity index 100% rename from src/main/java/com/pingplusplus/model/BalanceTransaction.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/BalanceTransaction.java diff --git a/src/main/java/com/pingplusplus/model/BalanceTransactionCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/BalanceTransactionCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/BalanceTransactionCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/BalanceTransactionCollection.java diff --git a/src/main/java/com/pingplusplus/model/BalanceTransfer.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/BalanceTransfer.java similarity index 100% rename from src/main/java/com/pingplusplus/model/BalanceTransfer.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/BalanceTransfer.java diff --git a/src/main/java/com/pingplusplus/model/BalanceTransferCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/BalanceTransferCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/BalanceTransferCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/BalanceTransferCollection.java diff --git a/src/main/java/com/pingplusplus/model/BatchRefund.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/BatchRefund.java similarity index 100% rename from src/main/java/com/pingplusplus/model/BatchRefund.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/BatchRefund.java diff --git a/src/main/java/com/pingplusplus/model/BatchRefundCharges.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/BatchRefundCharges.java similarity index 100% rename from src/main/java/com/pingplusplus/model/BatchRefundCharges.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/BatchRefundCharges.java diff --git a/src/main/java/com/pingplusplus/model/BatchRefundCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/BatchRefundCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/BatchRefundCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/BatchRefundCollection.java diff --git a/src/main/java/com/pingplusplus/model/BatchTransfer.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/BatchTransfer.java similarity index 100% rename from src/main/java/com/pingplusplus/model/BatchTransfer.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/BatchTransfer.java diff --git a/src/main/java/com/pingplusplus/model/BatchTransferCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/BatchTransferCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/BatchTransferCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/BatchTransferCollection.java diff --git a/src/main/java/com/pingplusplus/model/BatchTransferRecipient.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/BatchTransferRecipient.java similarity index 100% rename from src/main/java/com/pingplusplus/model/BatchTransferRecipient.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/BatchTransferRecipient.java diff --git a/src/main/java/com/pingplusplus/model/BatchWithdrawal.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/BatchWithdrawal.java similarity index 100% rename from src/main/java/com/pingplusplus/model/BatchWithdrawal.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/BatchWithdrawal.java diff --git a/src/main/java/com/pingplusplus/model/BatchWithdrawalCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/BatchWithdrawalCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/BatchWithdrawalCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/BatchWithdrawalCollection.java diff --git a/src/main/java/com/pingplusplus/model/CardInfo.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/CardInfo.java similarity index 100% rename from src/main/java/com/pingplusplus/model/CardInfo.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/CardInfo.java diff --git a/src/main/java/com/pingplusplus/model/Channel.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/Channel.java similarity index 100% rename from src/main/java/com/pingplusplus/model/Channel.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/Channel.java diff --git a/src/main/java/com/pingplusplus/model/Charge.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/Charge.java similarity index 100% rename from src/main/java/com/pingplusplus/model/Charge.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/Charge.java diff --git a/src/main/java/com/pingplusplus/model/ChargeCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/ChargeCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/ChargeCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/ChargeCollection.java diff --git a/src/main/java/com/pingplusplus/model/ChargeEssentials.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/ChargeEssentials.java similarity index 100% rename from src/main/java/com/pingplusplus/model/ChargeEssentials.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/ChargeEssentials.java diff --git a/src/main/java/com/pingplusplus/model/ChargeRefundCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/ChargeRefundCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/ChargeRefundCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/ChargeRefundCollection.java diff --git a/src/main/java/com/pingplusplus/model/Contact.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/Contact.java similarity index 100% rename from src/main/java/com/pingplusplus/model/Contact.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/Contact.java diff --git a/src/main/java/com/pingplusplus/model/Coupon.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/Coupon.java similarity index 100% rename from src/main/java/com/pingplusplus/model/Coupon.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/Coupon.java diff --git a/src/main/java/com/pingplusplus/model/CouponCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/CouponCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/CouponCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/CouponCollection.java diff --git a/src/main/java/com/pingplusplus/model/CouponTemplate.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/CouponTemplate.java similarity index 100% rename from src/main/java/com/pingplusplus/model/CouponTemplate.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/CouponTemplate.java diff --git a/src/main/java/com/pingplusplus/model/CouponTemplateCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/CouponTemplateCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/CouponTemplateCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/CouponTemplateCollection.java diff --git a/src/main/java/com/pingplusplus/model/CouponTemplateExpiration.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/CouponTemplateExpiration.java similarity index 100% rename from src/main/java/com/pingplusplus/model/CouponTemplateExpiration.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/CouponTemplateExpiration.java diff --git a/src/main/java/com/pingplusplus/model/Customs.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/Customs.java similarity index 100% rename from src/main/java/com/pingplusplus/model/Customs.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/Customs.java diff --git a/src/main/java/com/pingplusplus/model/CustomsCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/CustomsCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/CustomsCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/CustomsCollection.java diff --git a/src/main/java/com/pingplusplus/model/DeleteRoyaltyTemplate.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/DeleteRoyaltyTemplate.java similarity index 100% rename from src/main/java/com/pingplusplus/model/DeleteRoyaltyTemplate.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/DeleteRoyaltyTemplate.java diff --git a/src/main/java/com/pingplusplus/model/DeletedChannel.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/DeletedChannel.java similarity index 100% rename from src/main/java/com/pingplusplus/model/DeletedChannel.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/DeletedChannel.java diff --git a/src/main/java/com/pingplusplus/model/DeletedCoupon.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/DeletedCoupon.java similarity index 100% rename from src/main/java/com/pingplusplus/model/DeletedCoupon.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/DeletedCoupon.java diff --git a/src/main/java/com/pingplusplus/model/DeletedCouponTemplate.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/DeletedCouponTemplate.java similarity index 100% rename from src/main/java/com/pingplusplus/model/DeletedCouponTemplate.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/DeletedCouponTemplate.java diff --git a/src/main/java/com/pingplusplus/model/DeletedObjectBase.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/DeletedObjectBase.java similarity index 100% rename from src/main/java/com/pingplusplus/model/DeletedObjectBase.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/DeletedObjectBase.java diff --git a/src/main/java/com/pingplusplus/model/DeletedPingppObject.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/DeletedPingppObject.java similarity index 100% rename from src/main/java/com/pingplusplus/model/DeletedPingppObject.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/DeletedPingppObject.java diff --git a/src/main/java/com/pingplusplus/model/DeletedSettleAccount.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/DeletedSettleAccount.java similarity index 100% rename from src/main/java/com/pingplusplus/model/DeletedSettleAccount.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/DeletedSettleAccount.java diff --git a/src/main/java/com/pingplusplus/model/DeletedSplitReceiver.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/DeletedSplitReceiver.java similarity index 100% rename from src/main/java/com/pingplusplus/model/DeletedSplitReceiver.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/DeletedSplitReceiver.java diff --git a/src/main/java/com/pingplusplus/model/DeletedSubApp.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/DeletedSubApp.java similarity index 100% rename from src/main/java/com/pingplusplus/model/DeletedSubApp.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/DeletedSubApp.java diff --git a/src/main/java/com/pingplusplus/model/Event.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/Event.java similarity index 100% rename from src/main/java/com/pingplusplus/model/Event.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/Event.java diff --git a/src/main/java/com/pingplusplus/model/EventCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/EventCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/EventCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/EventCollection.java diff --git a/src/main/java/com/pingplusplus/model/EventData.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/EventData.java similarity index 100% rename from src/main/java/com/pingplusplus/model/EventData.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/EventData.java diff --git a/src/main/java/com/pingplusplus/model/Identification.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/Identification.java similarity index 100% rename from src/main/java/com/pingplusplus/model/Identification.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/Identification.java diff --git a/src/main/java/com/pingplusplus/model/Order.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/Order.java similarity index 100% rename from src/main/java/com/pingplusplus/model/Order.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/Order.java diff --git a/src/main/java/com/pingplusplus/model/OrderCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/OrderCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/OrderCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/OrderCollection.java diff --git a/src/main/java/com/pingplusplus/model/OrderRefund.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/OrderRefund.java similarity index 100% rename from src/main/java/com/pingplusplus/model/OrderRefund.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/OrderRefund.java diff --git a/src/main/java/com/pingplusplus/model/OrderRefundCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/OrderRefundCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/OrderRefundCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/OrderRefundCollection.java diff --git a/src/main/java/com/pingplusplus/model/PingppCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/PingppCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/PingppCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/PingppCollection.java diff --git a/src/main/java/com/pingplusplus/model/PingppCollectionAPIResource.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/PingppCollectionAPIResource.java similarity index 100% rename from src/main/java/com/pingplusplus/model/PingppCollectionAPIResource.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/PingppCollectionAPIResource.java diff --git a/src/main/java/com/pingplusplus/model/PingppError.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/PingppError.java similarity index 100% rename from src/main/java/com/pingplusplus/model/PingppError.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/PingppError.java diff --git a/src/main/java/com/pingplusplus/model/PingppObject.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/PingppObject.java similarity index 100% rename from src/main/java/com/pingplusplus/model/PingppObject.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/PingppObject.java diff --git a/src/main/java/com/pingplusplus/model/PingppObjectInterface.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/PingppObjectInterface.java similarity index 100% rename from src/main/java/com/pingplusplus/model/PingppObjectInterface.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/PingppObjectInterface.java diff --git a/src/main/java/com/pingplusplus/model/PingppRawJsonObject.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/PingppRawJsonObject.java similarity index 100% rename from src/main/java/com/pingplusplus/model/PingppRawJsonObject.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/PingppRawJsonObject.java diff --git a/src/main/java/com/pingplusplus/model/ProfitTransaction.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/ProfitTransaction.java similarity index 100% rename from src/main/java/com/pingplusplus/model/ProfitTransaction.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/ProfitTransaction.java diff --git a/src/main/java/com/pingplusplus/model/ProfitTransactionCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/ProfitTransactionCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/ProfitTransactionCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/ProfitTransactionCollection.java diff --git a/src/main/java/com/pingplusplus/model/Recharge.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/Recharge.java similarity index 100% rename from src/main/java/com/pingplusplus/model/Recharge.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/Recharge.java diff --git a/src/main/java/com/pingplusplus/model/RechargeCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/RechargeCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/RechargeCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/RechargeCollection.java diff --git a/src/main/java/com/pingplusplus/model/RechargeRefund.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/RechargeRefund.java similarity index 100% rename from src/main/java/com/pingplusplus/model/RechargeRefund.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/RechargeRefund.java diff --git a/src/main/java/com/pingplusplus/model/RechargeRefundCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/RechargeRefundCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/RechargeRefundCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/RechargeRefundCollection.java diff --git a/src/main/java/com/pingplusplus/model/RedEnvelope.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/RedEnvelope.java similarity index 100% rename from src/main/java/com/pingplusplus/model/RedEnvelope.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/RedEnvelope.java diff --git a/src/main/java/com/pingplusplus/model/RedEnvelopeCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/RedEnvelopeCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/RedEnvelopeCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/RedEnvelopeCollection.java diff --git a/src/main/java/com/pingplusplus/model/Refund.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/Refund.java similarity index 100% rename from src/main/java/com/pingplusplus/model/Refund.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/Refund.java diff --git a/src/main/java/com/pingplusplus/model/Royalty.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/Royalty.java similarity index 100% rename from src/main/java/com/pingplusplus/model/Royalty.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/Royalty.java diff --git a/src/main/java/com/pingplusplus/model/RoyaltyCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/RoyaltyCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/RoyaltyCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/RoyaltyCollection.java diff --git a/src/main/java/com/pingplusplus/model/RoyaltyDataResult.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/RoyaltyDataResult.java similarity index 100% rename from src/main/java/com/pingplusplus/model/RoyaltyDataResult.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/RoyaltyDataResult.java diff --git a/src/main/java/com/pingplusplus/model/RoyaltySettlement.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/RoyaltySettlement.java similarity index 100% rename from src/main/java/com/pingplusplus/model/RoyaltySettlement.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/RoyaltySettlement.java diff --git a/src/main/java/com/pingplusplus/model/RoyaltySettlementCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/RoyaltySettlementCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/RoyaltySettlementCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/RoyaltySettlementCollection.java diff --git a/src/main/java/com/pingplusplus/model/RoyaltyTemplate.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/RoyaltyTemplate.java similarity index 100% rename from src/main/java/com/pingplusplus/model/RoyaltyTemplate.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/RoyaltyTemplate.java diff --git a/src/main/java/com/pingplusplus/model/RoyaltyTemplateCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/RoyaltyTemplateCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/RoyaltyTemplateCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/RoyaltyTemplateCollection.java diff --git a/src/main/java/com/pingplusplus/model/RoyaltyTransaction.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/RoyaltyTransaction.java similarity index 100% rename from src/main/java/com/pingplusplus/model/RoyaltyTransaction.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/RoyaltyTransaction.java diff --git a/src/main/java/com/pingplusplus/model/RoyaltyTransactionCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/RoyaltyTransactionCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/RoyaltyTransactionCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/RoyaltyTransactionCollection.java diff --git a/src/main/java/com/pingplusplus/model/SettleAccount.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/SettleAccount.java similarity index 100% rename from src/main/java/com/pingplusplus/model/SettleAccount.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/SettleAccount.java diff --git a/src/main/java/com/pingplusplus/model/SettleAccountCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/SettleAccountCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/SettleAccountCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/SettleAccountCollection.java diff --git a/src/main/java/com/pingplusplus/model/SettleAccountRecipient.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/SettleAccountRecipient.java similarity index 100% rename from src/main/java/com/pingplusplus/model/SettleAccountRecipient.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/SettleAccountRecipient.java diff --git a/src/main/java/com/pingplusplus/model/SplitProfit.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/SplitProfit.java similarity index 100% rename from src/main/java/com/pingplusplus/model/SplitProfit.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/SplitProfit.java diff --git a/src/main/java/com/pingplusplus/model/SplitProfitCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/SplitProfitCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/SplitProfitCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/SplitProfitCollection.java diff --git a/src/main/java/com/pingplusplus/model/SplitProfitRecipient.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/SplitProfitRecipient.java similarity index 100% rename from src/main/java/com/pingplusplus/model/SplitProfitRecipient.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/SplitProfitRecipient.java diff --git a/src/main/java/com/pingplusplus/model/SplitReceiver.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/SplitReceiver.java similarity index 100% rename from src/main/java/com/pingplusplus/model/SplitReceiver.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/SplitReceiver.java diff --git a/src/main/java/com/pingplusplus/model/SplitReceiverCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/SplitReceiverCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/SplitReceiverCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/SplitReceiverCollection.java diff --git a/src/main/java/com/pingplusplus/model/SubApp.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/SubApp.java similarity index 100% rename from src/main/java/com/pingplusplus/model/SubApp.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/SubApp.java diff --git a/src/main/java/com/pingplusplus/model/SubAppCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/SubAppCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/SubAppCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/SubAppCollection.java diff --git a/src/main/java/com/pingplusplus/model/SubBank.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/SubBank.java similarity index 100% rename from src/main/java/com/pingplusplus/model/SubBank.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/SubBank.java diff --git a/src/main/java/com/pingplusplus/model/SubBankCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/SubBankCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/SubBankCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/SubBankCollection.java diff --git a/src/main/java/com/pingplusplus/model/Summary.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/Summary.java similarity index 100% rename from src/main/java/com/pingplusplus/model/Summary.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/Summary.java diff --git a/src/main/java/com/pingplusplus/model/Transfer.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/Transfer.java similarity index 100% rename from src/main/java/com/pingplusplus/model/Transfer.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/Transfer.java diff --git a/src/main/java/com/pingplusplus/model/TransferCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/TransferCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/TransferCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/TransferCollection.java diff --git a/src/main/java/com/pingplusplus/model/User.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/User.java similarity index 100% rename from src/main/java/com/pingplusplus/model/User.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/User.java diff --git a/src/main/java/com/pingplusplus/model/UserCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/UserCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/UserCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/UserCollection.java diff --git a/src/main/java/com/pingplusplus/model/UserPic.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/UserPic.java similarity index 100% rename from src/main/java/com/pingplusplus/model/UserPic.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/UserPic.java diff --git a/src/main/java/com/pingplusplus/model/Webhooks.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/Webhooks.java similarity index 100% rename from src/main/java/com/pingplusplus/model/Webhooks.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/Webhooks.java diff --git a/src/main/java/com/pingplusplus/model/Withdrawal.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/Withdrawal.java similarity index 100% rename from src/main/java/com/pingplusplus/model/Withdrawal.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/Withdrawal.java diff --git a/src/main/java/com/pingplusplus/model/WithdrawalCollection.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/WithdrawalCollection.java similarity index 100% rename from src/main/java/com/pingplusplus/model/WithdrawalCollection.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/WithdrawalCollection.java diff --git a/src/main/java/com/pingplusplus/model/WithdrawalCollectionBase.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/WithdrawalCollectionBase.java similarity index 100% rename from src/main/java/com/pingplusplus/model/WithdrawalCollectionBase.java rename to pingpp-sdk/src/main/java/com/pingplusplus/model/WithdrawalCollectionBase.java diff --git a/src/main/java/com/pingplusplus/net/APIResource.java b/pingpp-sdk/src/main/java/com/pingplusplus/net/APIResource.java similarity index 100% rename from src/main/java/com/pingplusplus/net/APIResource.java rename to pingpp-sdk/src/main/java/com/pingplusplus/net/APIResource.java diff --git a/src/main/java/com/pingplusplus/net/AppBasedResource.java b/pingpp-sdk/src/main/java/com/pingplusplus/net/AppBasedResource.java similarity index 100% rename from src/main/java/com/pingplusplus/net/AppBasedResource.java rename to pingpp-sdk/src/main/java/com/pingplusplus/net/AppBasedResource.java diff --git a/src/main/java/com/pingplusplus/net/HttpClient.java b/pingpp-sdk/src/main/java/com/pingplusplus/net/HttpClient.java similarity index 100% rename from src/main/java/com/pingplusplus/net/HttpClient.java rename to pingpp-sdk/src/main/java/com/pingplusplus/net/HttpClient.java diff --git a/src/main/java/com/pingplusplus/net/HttpContent.java b/pingpp-sdk/src/main/java/com/pingplusplus/net/HttpContent.java similarity index 100% rename from src/main/java/com/pingplusplus/net/HttpContent.java rename to pingpp-sdk/src/main/java/com/pingplusplus/net/HttpContent.java diff --git a/src/main/java/com/pingplusplus/net/HttpHeaders.java b/pingpp-sdk/src/main/java/com/pingplusplus/net/HttpHeaders.java similarity index 100% rename from src/main/java/com/pingplusplus/net/HttpHeaders.java rename to pingpp-sdk/src/main/java/com/pingplusplus/net/HttpHeaders.java diff --git a/src/main/java/com/pingplusplus/net/HttpURLConnectionClient.java b/pingpp-sdk/src/main/java/com/pingplusplus/net/HttpURLConnectionClient.java similarity index 87% rename from src/main/java/com/pingplusplus/net/HttpURLConnectionClient.java rename to pingpp-sdk/src/main/java/com/pingplusplus/net/HttpURLConnectionClient.java index af39110..41d2bcd 100644 --- a/src/main/java/com/pingplusplus/net/HttpURLConnectionClient.java +++ b/pingpp-sdk/src/main/java/com/pingplusplus/net/HttpURLConnectionClient.java @@ -2,6 +2,8 @@ import com.pingplusplus.Pingpp; import com.pingplusplus.exception.APIConnectionException; +import com.pingplusplus.exception.AuthenticationException; +import com.pingplusplus.util.PingppSignature; import com.pingplusplus.util.StreamUtils; import com.pingplusplus.util.StringUtils; @@ -37,6 +39,10 @@ public PingppResponse request(PingppRequest request) throws APIConnectionExcepti if (responseCode >= 200 && responseCode < 300) { responseBody = StreamUtils.readToEnd(conn.getInputStream(), APIResource.CHARSET); + boolean verified = PingppSignature.verify(headers, responseBody, request.options.getVerifyPublicKey(), APIResource.CHARSET.name()); + if (!verified) { + throw new AuthenticationException("响应签名验证失败,请检查验签公钥是否正确"); + } } else { responseBody = StreamUtils.readToEnd(conn.getErrorStream(), APIResource.CHARSET); } @@ -49,6 +55,8 @@ public PingppResponse request(PingppRequest request) throws APIConnectionExcepti + "Please check your internet connection and try again.", Pingpp.getApiBase(), e.getMessage()), e); + } catch (AuthenticationException e) { + throw new RuntimeException(e); } finally { if (conn != null) { conn.disconnect(); diff --git a/src/main/java/com/pingplusplus/net/PingppRequest.java b/pingpp-sdk/src/main/java/com/pingplusplus/net/PingppRequest.java similarity index 100% rename from src/main/java/com/pingplusplus/net/PingppRequest.java rename to pingpp-sdk/src/main/java/com/pingplusplus/net/PingppRequest.java diff --git a/src/main/java/com/pingplusplus/net/PingppResponse.java b/pingpp-sdk/src/main/java/com/pingplusplus/net/PingppResponse.java similarity index 100% rename from src/main/java/com/pingplusplus/net/PingppResponse.java rename to pingpp-sdk/src/main/java/com/pingplusplus/net/PingppResponse.java diff --git a/src/main/java/com/pingplusplus/net/RequestOptions.java b/pingpp-sdk/src/main/java/com/pingplusplus/net/RequestOptions.java similarity index 90% rename from src/main/java/com/pingplusplus/net/RequestOptions.java rename to pingpp-sdk/src/main/java/com/pingplusplus/net/RequestOptions.java index 4257b47..91f14bd 100644 --- a/src/main/java/com/pingplusplus/net/RequestOptions.java +++ b/pingpp-sdk/src/main/java/com/pingplusplus/net/RequestOptions.java @@ -6,6 +6,7 @@ public class RequestOptions { private final String apiKey; private final String appId; private final String privateKey; + private final String verifyPublicKey; private final int connectTimeout; private final int readTimeout; @@ -19,6 +20,7 @@ public static RequestOptions getDefault() { Pingpp.apiKey, Pingpp.appId, Pingpp.privateKey, + Pingpp.verifyPublicKey, Pingpp.getConnectTimeout(), Pingpp.getReadTimeout(), Pingpp.getMaxNetworkRetries(), @@ -29,6 +31,7 @@ private RequestOptions( String apiKey, String appId, String privateKey, + String verifyPublicKey, int connectTimeout, int readTimeout, int maxNetworkRetries, @@ -36,6 +39,7 @@ private RequestOptions( this.apiKey = apiKey; this.appId = appId; this.privateKey = privateKey; + this.verifyPublicKey = verifyPublicKey; this.connectTimeout = connectTimeout; this.readTimeout = readTimeout; this.maxNetworkRetries = maxNetworkRetries; @@ -70,6 +74,8 @@ public String getAcceptLanguage() { return acceptLanguage; } + public String getVerifyPublicKey() {return verifyPublicKey;} + public static RequestOptionsBuilder builder() { return new RequestOptionsBuilder(); } @@ -82,6 +88,7 @@ public static final class RequestOptionsBuilder { private int readTimeout; private int maxNetworkRetries; private String acceptLanguage; + private String verifyPublicKey; public RequestOptionsBuilder() { this.apiKey = Pingpp.apiKey; @@ -171,6 +178,7 @@ public RequestOptions build() { normalizeApiKey(this.apiKey), normalizeAppId(this.appId), normalizePrivateKey(this.privateKey), + normalizePublicVerifyKey(this.verifyPublicKey), connectTimeout, readTimeout, maxNetworkRetries, @@ -214,6 +222,17 @@ private static String normalizePrivateKey(String privateKey) { return normalized; } + private static String normalizePublicVerifyKey(String verifyPublicKey) { + if (verifyPublicKey == null) { + return null; + } + String normalized = verifyPublicKey.trim(); + if (normalized.isEmpty()) { + throw new InvalidRequestOptionsException("Empty publicVerifyKey specified!"); + } + return normalized; + } + private static String normalizeAcceptLanguage(String acceptLanguage) { // null acceptLanguage are considered "valid" if (acceptLanguage == null) { diff --git a/src/main/java/com/pingplusplus/net/SubAppBasedResource.java b/pingpp-sdk/src/main/java/com/pingplusplus/net/SubAppBasedResource.java similarity index 100% rename from src/main/java/com/pingplusplus/net/SubAppBasedResource.java rename to pingpp-sdk/src/main/java/com/pingplusplus/net/SubAppBasedResource.java diff --git a/src/main/java/com/pingplusplus/net/UserBasedResource.java b/pingpp-sdk/src/main/java/com/pingplusplus/net/UserBasedResource.java similarity index 100% rename from src/main/java/com/pingplusplus/net/UserBasedResource.java rename to pingpp-sdk/src/main/java/com/pingplusplus/net/UserBasedResource.java diff --git a/src/main/java/com/pingplusplus/serializer/BatchRefundChargesSerializer.java b/pingpp-sdk/src/main/java/com/pingplusplus/serializer/BatchRefundChargesSerializer.java similarity index 100% rename from src/main/java/com/pingplusplus/serializer/BatchRefundChargesSerializer.java rename to pingpp-sdk/src/main/java/com/pingplusplus/serializer/BatchRefundChargesSerializer.java diff --git a/src/main/java/com/pingplusplus/serializer/BatchTransferRecipientSerializer.java b/pingpp-sdk/src/main/java/com/pingplusplus/serializer/BatchTransferRecipientSerializer.java similarity index 100% rename from src/main/java/com/pingplusplus/serializer/BatchTransferRecipientSerializer.java rename to pingpp-sdk/src/main/java/com/pingplusplus/serializer/BatchTransferRecipientSerializer.java diff --git a/src/main/java/com/pingplusplus/serializer/ChargeDeserializer.java b/pingpp-sdk/src/main/java/com/pingplusplus/serializer/ChargeDeserializer.java similarity index 100% rename from src/main/java/com/pingplusplus/serializer/ChargeDeserializer.java rename to pingpp-sdk/src/main/java/com/pingplusplus/serializer/ChargeDeserializer.java diff --git a/src/main/java/com/pingplusplus/serializer/ChargeEssentialsSerializer.java b/pingpp-sdk/src/main/java/com/pingplusplus/serializer/ChargeEssentialsSerializer.java similarity index 100% rename from src/main/java/com/pingplusplus/serializer/ChargeEssentialsSerializer.java rename to pingpp-sdk/src/main/java/com/pingplusplus/serializer/ChargeEssentialsSerializer.java diff --git a/src/main/java/com/pingplusplus/serializer/ChargeRefundCollectionDeserializer.java b/pingpp-sdk/src/main/java/com/pingplusplus/serializer/ChargeRefundCollectionDeserializer.java similarity index 100% rename from src/main/java/com/pingplusplus/serializer/ChargeRefundCollectionDeserializer.java rename to pingpp-sdk/src/main/java/com/pingplusplus/serializer/ChargeRefundCollectionDeserializer.java diff --git a/src/main/java/com/pingplusplus/serializer/CouponTemplateExpirationSerializer.java b/pingpp-sdk/src/main/java/com/pingplusplus/serializer/CouponTemplateExpirationSerializer.java similarity index 100% rename from src/main/java/com/pingplusplus/serializer/CouponTemplateExpirationSerializer.java rename to pingpp-sdk/src/main/java/com/pingplusplus/serializer/CouponTemplateExpirationSerializer.java diff --git a/src/main/java/com/pingplusplus/serializer/DoubleTypeSerializer.java b/pingpp-sdk/src/main/java/com/pingplusplus/serializer/DoubleTypeSerializer.java similarity index 100% rename from src/main/java/com/pingplusplus/serializer/DoubleTypeSerializer.java rename to pingpp-sdk/src/main/java/com/pingplusplus/serializer/DoubleTypeSerializer.java diff --git a/src/main/java/com/pingplusplus/serializer/EventDataDeserializer.java b/pingpp-sdk/src/main/java/com/pingplusplus/serializer/EventDataDeserializer.java similarity index 100% rename from src/main/java/com/pingplusplus/serializer/EventDataDeserializer.java rename to pingpp-sdk/src/main/java/com/pingplusplus/serializer/EventDataDeserializer.java diff --git a/src/main/java/com/pingplusplus/serializer/PingppRawJsonObjectDeserializer.java b/pingpp-sdk/src/main/java/com/pingplusplus/serializer/PingppRawJsonObjectDeserializer.java similarity index 100% rename from src/main/java/com/pingplusplus/serializer/PingppRawJsonObjectDeserializer.java rename to pingpp-sdk/src/main/java/com/pingplusplus/serializer/PingppRawJsonObjectDeserializer.java diff --git a/src/main/java/com/pingplusplus/serializer/RedEnvelopeDeserializer.java b/pingpp-sdk/src/main/java/com/pingplusplus/serializer/RedEnvelopeDeserializer.java similarity index 100% rename from src/main/java/com/pingplusplus/serializer/RedEnvelopeDeserializer.java rename to pingpp-sdk/src/main/java/com/pingplusplus/serializer/RedEnvelopeDeserializer.java diff --git a/src/main/java/com/pingplusplus/serializer/SettleAccountRecipientSerializer.java b/pingpp-sdk/src/main/java/com/pingplusplus/serializer/SettleAccountRecipientSerializer.java similarity index 100% rename from src/main/java/com/pingplusplus/serializer/SettleAccountRecipientSerializer.java rename to pingpp-sdk/src/main/java/com/pingplusplus/serializer/SettleAccountRecipientSerializer.java diff --git a/src/main/java/com/pingplusplus/serializer/SubAppDeserializer.java b/pingpp-sdk/src/main/java/com/pingplusplus/serializer/SubAppDeserializer.java similarity index 100% rename from src/main/java/com/pingplusplus/serializer/SubAppDeserializer.java rename to pingpp-sdk/src/main/java/com/pingplusplus/serializer/SubAppDeserializer.java diff --git a/src/main/java/com/pingplusplus/serializer/TransferDeserializer.java b/pingpp-sdk/src/main/java/com/pingplusplus/serializer/TransferDeserializer.java similarity index 100% rename from src/main/java/com/pingplusplus/serializer/TransferDeserializer.java rename to pingpp-sdk/src/main/java/com/pingplusplus/serializer/TransferDeserializer.java diff --git a/src/main/java/com/pingplusplus/util/CaseInsensitiveMap.java b/pingpp-sdk/src/main/java/com/pingplusplus/util/CaseInsensitiveMap.java similarity index 90% rename from src/main/java/com/pingplusplus/util/CaseInsensitiveMap.java rename to pingpp-sdk/src/main/java/com/pingplusplus/util/CaseInsensitiveMap.java index aadfaa0..15f13cb 100644 --- a/src/main/java/com/pingplusplus/util/CaseInsensitiveMap.java +++ b/pingpp-sdk/src/main/java/com/pingplusplus/util/CaseInsensitiveMap.java @@ -82,17 +82,17 @@ public void clear() { @Override public Set keySet() { - return this.store.values().stream().map(entry -> entry.getKey()).collect(Collectors.toSet()); + return this.store.values().stream().map(Entry::getKey).collect(Collectors.toSet()); } @Override public Collection values() { - return this.store.values().stream().map(entry -> entry.getValue()).collect(Collectors.toList()); + return this.store.values().stream().map(Entry::getValue).collect(Collectors.toList()); } @Override public Set> entrySet() { - return this.store.values().stream().collect(Collectors.toSet()); + return new HashSet<>(this.store.values()); } // Utility diff --git a/pingpp-sdk/src/main/java/com/pingplusplus/util/PingppSignature.java b/pingpp-sdk/src/main/java/com/pingplusplus/util/PingppSignature.java new file mode 100644 index 0000000..a1db312 --- /dev/null +++ b/pingpp-sdk/src/main/java/com/pingplusplus/util/PingppSignature.java @@ -0,0 +1,150 @@ +package com.pingplusplus.util; + +import com.pingplusplus.Pingpp; +import com.pingplusplus.exception.AuthenticationException; +import com.pingplusplus.net.HttpHeaders; +import org.apache.commons.codec.binary.Base64; + +import java.io.UnsupportedEncodingException; +import java.security.*; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; + +/** + * Created by Afon on 2016/12/16. + */ +public class PingppSignature { + public static String sign(String data, String PEMEncodedPrivateKey, String charset) { + PrivateKey privateKey = getPrivateKeyFromPEM(PEMEncodedPrivateKey); + if (privateKey == null) { + return null; + } + + try { + Signature signature = Signature.getInstance("SHA256withRSA"); + signature.initSign(privateKey); + signature.update(data.getBytes(charset)); + byte[] signBytes = signature.sign(); + + return Base64.encodeBase64String(signBytes).replaceAll("[\n\r]", ""); + } catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException | UnsupportedEncodingException e) { + e.printStackTrace(); + } + + return null; + } + + /** + * webhook verify + * @param encodedSign + * @param data + * @param PEMEncodedPublicKey + * @param charset + * @return + * @throws AuthenticationException + */ + public static boolean verify(String encodedSign, String data, String PEMEncodedPublicKey, String charset) throws AuthenticationException { + if (StringUtils.isBlank(PEMEncodedPublicKey)) { + return true; + } + PublicKey publicKey = getPublicKeyFromPEM(PEMEncodedPublicKey); + if (publicKey == null) { + return true; + } + if (StringUtils.isBlank(encodedSign)) { + throw new AuthenticationException("响应签名 (X-Pingplusplus-Signature) 为空"); + } + try { + Signature signature = Signature.getInstance("SHA256withRSA"); + signature.initVerify(publicKey); + signature.update(data.getBytes(charset)); + return signature.verify(Base64.decodeBase64(encodedSign)); + } catch (InvalidKeyException | UnsupportedEncodingException | SignatureException | NoSuchAlgorithmException e) { + if (Pingpp.DEBUG) { + e.printStackTrace(); + } + return false; + } + } + + public static boolean verify(HttpHeaders headers, String data, String PEMEncodedPublicKey, String charset) throws AuthenticationException { + if (StringUtils.isBlank(PEMEncodedPublicKey)) { + return true; + } + PublicKey publicKey = getPublicKeyFromPEM(PEMEncodedPublicKey); + if (publicKey == null) { + return true; + } + if (!headers.firstValue("X-Pingplusplus-Signature").isPresent()) { + throw new AuthenticationException("响应签名 (X-Pingplusplus-Signature) 为空"); + } + String encodedSign = headers.firstValue("X-Pingplusplus-Signature").get(); + try { + Signature signature = Signature.getInstance("SHA256withRSA"); + signature.initVerify(publicKey); + signature.update(data.getBytes(charset)); + return signature.verify(Base64.decodeBase64(encodedSign)); + } catch (InvalidKeyException | UnsupportedEncodingException | SignatureException | NoSuchAlgorithmException e) { + if (Pingpp.DEBUG) { + e.printStackTrace(); + } + return false; + } + } + + + public static PrivateKey getPrivateKeyFromPEM(String PEMEncodedPrivateKey) { + PEMEncodedPrivateKey = PEMEncodedPrivateKey + .replaceAll("(-+BEGIN (RSA )?PRIVATE KEY-+\\r?\\n|-+END (RSA )?PRIVATE KEY-+\\r?\\n?)", ""); + byte[] privateKeyBytes = Base64.decodeBase64(PEMEncodedPrivateKey); + + try { + return generatePrivateKeyWithPKCS8(privateKeyBytes); + } catch (InvalidKeySpecException e) { + if (Pingpp.DEBUG) { + e.printStackTrace(); + } + return null; + } + } + + public static PrivateKey generatePrivateKeyWithPKCS8(byte[] privateKeyBytes) + throws InvalidKeySpecException { + try { + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes); + KeyFactory kf = KeyFactory.getInstance("RSA"); + return kf.generatePrivate(keySpec); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + return null; + } + + public static PublicKey getPublicKeyFromPEM(String PEMEncodedPublicKey) { + PEMEncodedPublicKey = PEMEncodedPublicKey + .replaceAll("(-+BEGIN (RSA )?PUBLIC KEY-+\\r?\\n|-+END (RSA )?PUBLIC KEY-+\\r?\\n?)", ""); + byte[] publicKeyBytes = Base64.decodeBase64(PEMEncodedPublicKey); + + try { + return generatePublicKey(publicKeyBytes); + } catch (InvalidKeySpecException e) { + if (Pingpp.DEBUG) { + e.printStackTrace(); + } + return null; + } + } + + public static PublicKey generatePublicKey(byte[] publicKeyBytes) + throws InvalidKeySpecException { + try { + X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes); + KeyFactory kf = KeyFactory.getInstance("RSA"); + return kf.generatePublic(keySpec); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/src/main/java/com/pingplusplus/util/StreamUtils.java b/pingpp-sdk/src/main/java/com/pingplusplus/util/StreamUtils.java similarity index 100% rename from src/main/java/com/pingplusplus/util/StreamUtils.java rename to pingpp-sdk/src/main/java/com/pingplusplus/util/StreamUtils.java diff --git a/src/main/java/com/pingplusplus/util/StringUtils.java b/pingpp-sdk/src/main/java/com/pingplusplus/util/StringUtils.java similarity index 68% rename from src/main/java/com/pingplusplus/util/StringUtils.java rename to pingpp-sdk/src/main/java/com/pingplusplus/util/StringUtils.java index 790145d..ef6ce39 100644 --- a/src/main/java/com/pingplusplus/util/StringUtils.java +++ b/pingpp-sdk/src/main/java/com/pingplusplus/util/StringUtils.java @@ -35,4 +35,25 @@ public static String join(String separator, List input) { return sb.toString(); } + + /** + * 是否为空 + * + * @param cs 字符串 + * @return 空 {@code true}; 非空 {@code false}. + */ + public static boolean isBlank(final CharSequence cs) { + if (cs == null) { + return true; + } + int l = cs.length(); + if (l > 0) { + for (int i = 0; i < l; i++) { + if (!Character.isWhitespace(cs.charAt(i))) { + return false; + } + } + } + return true; + } } diff --git a/src/main/java/com/pingplusplus/util/WxLiteOAuth.java b/pingpp-sdk/src/main/java/com/pingplusplus/util/WxLiteOAuth.java similarity index 100% rename from src/main/java/com/pingplusplus/util/WxLiteOAuth.java rename to pingpp-sdk/src/main/java/com/pingplusplus/util/WxLiteOAuth.java diff --git a/src/test/java/com/pingplusplus/CardInfoTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/CardInfoTest.java similarity index 100% rename from src/test/java/com/pingplusplus/CardInfoTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/CardInfoTest.java diff --git a/src/test/java/com/pingplusplus/PingppTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/PingppTest.java similarity index 99% rename from src/test/java/com/pingplusplus/PingppTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/PingppTest.java index 3ff1e7e..f66b60e 100644 --- a/src/test/java/com/pingplusplus/PingppTest.java +++ b/pingpp-sdk/src/test/java/com/pingplusplus/PingppTest.java @@ -30,7 +30,7 @@ public class PingppTest { } @Test public void testVerifyVersions() { - assertEquals("Pingpp.VERSION should match", "2.4.1", Pingpp.VERSION); + assertEquals("Pingpp.VERSION should match", "2.5.0", Pingpp.VERSION); } @Test public void testCreateCharge() { diff --git a/src/test/java/com/pingplusplus/PingppTestBase.java b/pingpp-sdk/src/test/java/com/pingplusplus/PingppTestBase.java similarity index 100% rename from src/test/java/com/pingplusplus/PingppTestBase.java rename to pingpp-sdk/src/test/java/com/pingplusplus/PingppTestBase.java diff --git a/src/test/java/com/pingplusplus/PingppTestData.java b/pingpp-sdk/src/test/java/com/pingplusplus/PingppTestData.java similarity index 77% rename from src/test/java/com/pingplusplus/PingppTestData.java rename to pingpp-sdk/src/test/java/com/pingplusplus/PingppTestData.java index a701fe3..815aa81 100644 --- a/src/test/java/com/pingplusplus/PingppTestData.java +++ b/pingpp-sdk/src/test/java/com/pingplusplus/PingppTestData.java @@ -18,34 +18,7 @@ public static String getAppID() { } public static String getPKCS8PrivateKey() { - return "-----BEGIN PRIVATE KEY-----\n" + - "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDHYyS3FwoESp1h\n" + - "GLYiBhy6k9Ag3lzGCIEvm50IIEkE0Ftc9qq44TWqyl+EHUpTMdcBOcI42JLO5stw\n" + - "FOfCLa3PQStEJ4llIRFEKlsrHh67pvWd5RNaSBrvGlnFY40S+SZmjk2WF/h9dE9R\n" + - "ic79t0YI0alD8dIl9Yu3OaEKo7VonBWFwOYMxjPhtORlq+EUF1XJd//yftQrKWTT\n" + - "d7KaUonWzBCl4VzFop/OyTWYlTuZz3eYJaNpH5VaQ1vDgBAcPIeBvMf7NgBHMKW6\n" + - "LLmFd2LEYQ/6I7hkGTjysSzWEpO8bPWT6OEsJ2R2kFGOrSkr+G2MDcJ7ykXYAmz5\n" + - "+A3plS6ZAgMBAAECggEAVrgwR9GlcahiOtDcpn+yDxQq+aC9CQS561LrQZWJLKbS\n" + - "leRS7IZHKTlLwdJbeUO8F7RfXQoVEBghc2YkRrhHWFUn1ES95VY0hElHzcET7Nn5\n" + - "CeuQNzwVOtljIg7iVNY4dXJ/HEDguu/Tb8tYU9FajItj60FJ/WiGk/JksJPzWsOC\n" + - "VPVniy9fTbTLy1e+dCpCI6OXirtm7hvbodRNDjree0wSEzm7vL0wVzEZFo6kX+AB\n" + - "GUwaoO7pPyH+hgyI5Iuhc65NHsHzTJpf8yNFl9QGhkxvm2Ff2oEtDt1idOTBrHB6\n" + - "tg+ti9Ctb2+2yzBnk14hsSYJnKitR7wM6ZCFPX4eYQKBgQD+JAREeFkodec/SC+G\n" + - "X+4Q4Y68uMPkfUPrMKXM4cyY5wgXk64RBvRVxIxX7x6Y3tIKn9v8tWAprbsyVr15\n" + - "eb4RcAFEVwjuoZixhd9sIPsRhfdNolKn/fSPIsHL4ywcJMSIt7KVKHuQeqBNHy0o\n" + - "0PxQjNej1ozsmrAWqV55cbKHswKBgQDI2JQRTPIEC/2y6LdmBVhGJW9OKWTYdVNj\n" + - "q7rX+Yw4uxOtfd5hBqpvgZEklKEk72aazFdEcERlAm9SqoX09qk6zK/wcq4Xn5Q/\n" + - "qy8ecmjuyf2AK9X+HUdMerMVxhK9RpeevKYP/RO2F/wIN64anlQVYygVkXXgdOvW\n" + - "hBE4YABKgwKBgDRtmbPGYB5ItHwJmERQZfx1i8zDESaB8RED6DBsJJkmkDTM8ovw\n" + - "s1c+RPWfDuDalto6QFfR0xTGEmhAHLaCtwNB6AEBM4aHL8jvpTfZVfI3gN0zL3oY\n" + - "mestcG1vYBouO504yE6dG2Ci6479b4OMGYFEjPfvuwLUpp8GMcc7/WihAoGANCp8\n" + - "mtm/ammq5VMof2kX+nAyrrx1ovsmQ5cRGpOIZhvBCqjMn6rZjci7aCLqj+tWXRKC\n" + - "ABagzROK0o/T50JBxjHv6KYArcYW/Up7HI9ezdbM7wNzu2LjZ+veo+MkbuDs9J/P\n" + - "CgwTmJI2NfQwVl2VPVDZ0nBLi5cSwk7fIiNdL/0CgYEAtECmC1QDs53Di2MIsa/F\n" + - "e4sWfJGSDqEWqhcA/aPwf1skM6VJJXBBMV1qFtwgO1AlLnu9dQYra6ylsUoubVYI\n" + - "XM9XK7EMhbqi57+Q75jHFTc0DnzOTyho5Gp4Ddi8dztmZGNWdWTGdeMqh+svqMXk\n" + - "D6VdJeddyGu/Zlgj7Wk6whU=\n" + - "-----END PRIVATE KEY-----"; + return "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDHYyS3FwoESp1hGLYiBhy6k9Ag3lzGCIEvm50IIEkE0Ftc9qq44TWqyl+EHUpTMdcBOcI42JLO5stwFOfCLa3PQStEJ4llIRFEKlsrHh67pvWd5RNaSBrvGlnFY40S+SZmjk2WF/h9dE9Ric79t0YI0alD8dIl9Yu3OaEKo7VonBWFwOYMxjPhtORlq+EUF1XJd//yftQrKWTTd7KaUonWzBCl4VzFop/OyTWYlTuZz3eYJaNpH5VaQ1vDgBAcPIeBvMf7NgBHMKW6LLmFd2LEYQ/6I7hkGTjysSzWEpO8bPWT6OEsJ2R2kFGOrSkr+G2MDcJ7ykXYAmz5+A3plS6ZAgMBAAECggEAVrgwR9GlcahiOtDcpn+yDxQq+aC9CQS561LrQZWJLKbSleRS7IZHKTlLwdJbeUO8F7RfXQoVEBghc2YkRrhHWFUn1ES95VY0hElHzcET7Nn5CeuQNzwVOtljIg7iVNY4dXJ/HEDguu/Tb8tYU9FajItj60FJ/WiGk/JksJPzWsOCVPVniy9fTbTLy1e+dCpCI6OXirtm7hvbodRNDjree0wSEzm7vL0wVzEZFo6kX+ABGUwaoO7pPyH+hgyI5Iuhc65NHsHzTJpf8yNFl9QGhkxvm2Ff2oEtDt1idOTBrHB6tg+ti9Ctb2+2yzBnk14hsSYJnKitR7wM6ZCFPX4eYQKBgQD+JAREeFkodec/SC+GX+4Q4Y68uMPkfUPrMKXM4cyY5wgXk64RBvRVxIxX7x6Y3tIKn9v8tWAprbsyVr15eb4RcAFEVwjuoZixhd9sIPsRhfdNolKn/fSPIsHL4ywcJMSIt7KVKHuQeqBNHy0o0PxQjNej1ozsmrAWqV55cbKHswKBgQDI2JQRTPIEC/2y6LdmBVhGJW9OKWTYdVNjq7rX+Yw4uxOtfd5hBqpvgZEklKEk72aazFdEcERlAm9SqoX09qk6zK/wcq4Xn5Q/qy8ecmjuyf2AK9X+HUdMerMVxhK9RpeevKYP/RO2F/wIN64anlQVYygVkXXgdOvWhBE4YABKgwKBgDRtmbPGYB5ItHwJmERQZfx1i8zDESaB8RED6DBsJJkmkDTM8ovws1c+RPWfDuDalto6QFfR0xTGEmhAHLaCtwNB6AEBM4aHL8jvpTfZVfI3gN0zL3oYmestcG1vYBouO504yE6dG2Ci6479b4OMGYFEjPfvuwLUpp8GMcc7/WihAoGANCp8mtm/ammq5VMof2kX+nAyrrx1ovsmQ5cRGpOIZhvBCqjMn6rZjci7aCLqj+tWXRKCABagzROK0o/T50JBxjHv6KYArcYW/Up7HI9ezdbM7wNzu2LjZ+veo+MkbuDs9J/PCgwTmJI2NfQwVl2VPVDZ0nBLi5cSwk7fIiNdL/0CgYEAtECmC1QDs53Di2MIsa/Fe4sWfJGSDqEWqhcA/aPwf1skM6VJJXBBMV1qFtwgO1AlLnu9dQYra6ylsUoubVYIXM9XK7EMhbqi57+Q75jHFTc0DnzOTyho5Gp4Ddi8dztmZGNWdWTGdeMqh+svqMXkD6VdJeddyGu/Zlgj7Wk6whU="; } public static String getChargeWebhooksData() { diff --git a/src/test/java/com/pingplusplus/RequestOptionsTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/RequestOptionsTest.java similarity index 100% rename from src/test/java/com/pingplusplus/RequestOptionsTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/RequestOptionsTest.java diff --git a/src/test/java/com/pingplusplus/SubBankTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/SubBankTest.java similarity index 100% rename from src/test/java/com/pingplusplus/SubBankTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/SubBankTest.java diff --git a/src/test/java/com/pingplusplus/WebhookTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/WebhookTest.java similarity index 100% rename from src/test/java/com/pingplusplus/WebhookTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/WebhookTest.java diff --git a/src/test/java/com/pingplusplus/WeixinOpenidTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/WeixinOpenidTest.java similarity index 100% rename from src/test/java/com/pingplusplus/WeixinOpenidTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/WeixinOpenidTest.java diff --git a/src/test/java/com/pingplusplus/agreement/AgreenmentTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/agreement/AgreenmentTest.java similarity index 100% rename from src/test/java/com/pingplusplus/agreement/AgreenmentTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/agreement/AgreenmentTest.java diff --git a/src/test/java/com/pingplusplus/balance/BalanceBonusTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/balance/BalanceBonusTest.java similarity index 100% rename from src/test/java/com/pingplusplus/balance/BalanceBonusTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/balance/BalanceBonusTest.java diff --git a/src/test/java/com/pingplusplus/balance/BalanceSettlementTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/balance/BalanceSettlementTest.java similarity index 100% rename from src/test/java/com/pingplusplus/balance/BalanceSettlementTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/balance/BalanceSettlementTest.java diff --git a/src/test/java/com/pingplusplus/balance/BalanceTransactionTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/balance/BalanceTransactionTest.java similarity index 100% rename from src/test/java/com/pingplusplus/balance/BalanceTransactionTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/balance/BalanceTransactionTest.java diff --git a/src/test/java/com/pingplusplus/balance/BalanceTransferTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/balance/BalanceTransferTest.java similarity index 100% rename from src/test/java/com/pingplusplus/balance/BalanceTransferTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/balance/BalanceTransferTest.java diff --git a/src/test/java/com/pingplusplus/coupon/CouponTemplateTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/coupon/CouponTemplateTest.java similarity index 100% rename from src/test/java/com/pingplusplus/coupon/CouponTemplateTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/coupon/CouponTemplateTest.java diff --git a/src/test/java/com/pingplusplus/coupon/CouponTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/coupon/CouponTest.java similarity index 100% rename from src/test/java/com/pingplusplus/coupon/CouponTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/coupon/CouponTest.java diff --git a/src/test/java/com/pingplusplus/order/OrderTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/order/OrderTest.java similarity index 100% rename from src/test/java/com/pingplusplus/order/OrderTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/order/OrderTest.java diff --git a/src/test/java/com/pingplusplus/order/RoyaltySettlementTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/order/RoyaltySettlementTest.java similarity index 100% rename from src/test/java/com/pingplusplus/order/RoyaltySettlementTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/order/RoyaltySettlementTest.java diff --git a/src/test/java/com/pingplusplus/order/RoyaltyTemplateTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/order/RoyaltyTemplateTest.java similarity index 100% rename from src/test/java/com/pingplusplus/order/RoyaltyTemplateTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/order/RoyaltyTemplateTest.java diff --git a/src/test/java/com/pingplusplus/order/RoyaltyTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/order/RoyaltyTest.java similarity index 100% rename from src/test/java/com/pingplusplus/order/RoyaltyTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/order/RoyaltyTest.java diff --git a/src/test/java/com/pingplusplus/order/RoyaltyTransactionTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/order/RoyaltyTransactionTest.java similarity index 100% rename from src/test/java/com/pingplusplus/order/RoyaltyTransactionTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/order/RoyaltyTransactionTest.java diff --git a/src/test/java/com/pingplusplus/recharge/RechargeTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/recharge/RechargeTest.java similarity index 100% rename from src/test/java/com/pingplusplus/recharge/RechargeTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/recharge/RechargeTest.java diff --git a/src/test/java/com/pingplusplus/settle_account/SettleAccountTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/settle_account/SettleAccountTest.java similarity index 100% rename from src/test/java/com/pingplusplus/settle_account/SettleAccountTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/settle_account/SettleAccountTest.java diff --git a/src/test/java/com/pingplusplus/split/ProfitTransactionTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/split/ProfitTransactionTest.java similarity index 100% rename from src/test/java/com/pingplusplus/split/ProfitTransactionTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/split/ProfitTransactionTest.java diff --git a/src/test/java/com/pingplusplus/split/SplitProfitTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/split/SplitProfitTest.java similarity index 100% rename from src/test/java/com/pingplusplus/split/SplitProfitTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/split/SplitProfitTest.java diff --git a/src/test/java/com/pingplusplus/split/SplitReceiverTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/split/SplitReceiverTest.java similarity index 100% rename from src/test/java/com/pingplusplus/split/SplitReceiverTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/split/SplitReceiverTest.java diff --git a/src/test/java/com/pingplusplus/sub_app/ContactTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/sub_app/ContactTest.java similarity index 100% rename from src/test/java/com/pingplusplus/sub_app/ContactTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/sub_app/ContactTest.java diff --git a/src/test/java/com/pingplusplus/sub_app/SubAppChannelTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/sub_app/SubAppChannelTest.java similarity index 100% rename from src/test/java/com/pingplusplus/sub_app/SubAppChannelTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/sub_app/SubAppChannelTest.java diff --git a/src/test/java/com/pingplusplus/sub_app/SubAppTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/sub_app/SubAppTest.java similarity index 100% rename from src/test/java/com/pingplusplus/sub_app/SubAppTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/sub_app/SubAppTest.java diff --git a/src/test/java/com/pingplusplus/transfer/TransferTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/transfer/TransferTest.java similarity index 100% rename from src/test/java/com/pingplusplus/transfer/TransferTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/transfer/TransferTest.java diff --git a/src/test/java/com/pingplusplus/user/UserPicTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/user/UserPicTest.java similarity index 100% rename from src/test/java/com/pingplusplus/user/UserPicTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/user/UserPicTest.java diff --git a/src/test/java/com/pingplusplus/user/UserTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/user/UserTest.java similarity index 100% rename from src/test/java/com/pingplusplus/user/UserTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/user/UserTest.java diff --git a/src/test/java/com/pingplusplus/withdrawal/BatchWithdrawalTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/withdrawal/BatchWithdrawalTest.java similarity index 100% rename from src/test/java/com/pingplusplus/withdrawal/BatchWithdrawalTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/withdrawal/BatchWithdrawalTest.java diff --git a/src/test/java/com/pingplusplus/withdrawal/WithdrawalTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/withdrawal/WithdrawalTest.java similarity index 100% rename from src/test/java/com/pingplusplus/withdrawal/WithdrawalTest.java rename to pingpp-sdk/src/test/java/com/pingplusplus/withdrawal/WithdrawalTest.java From 6836579ab2d75fd319181cdee55376698598566c Mon Sep 17 00:00:00 2001 From: "chengliang.zhang" Date: Fri, 16 Aug 2024 16:35:19 +0800 Subject: [PATCH 09/25] remove older src --- .../pingplusplus/util/PingppSignature.java | 61 ------------------- 1 file changed, 61 deletions(-) delete mode 100644 src/main/java/com/pingplusplus/util/PingppSignature.java diff --git a/src/main/java/com/pingplusplus/util/PingppSignature.java b/src/main/java/com/pingplusplus/util/PingppSignature.java deleted file mode 100644 index e234427..0000000 --- a/src/main/java/com/pingplusplus/util/PingppSignature.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.pingplusplus.util; - -import com.pingplusplus.Pingpp; -import org.apache.commons.codec.binary.Base64; - -import java.io.UnsupportedEncodingException; -import java.security.*; -import java.security.spec.InvalidKeySpecException; -import java.security.spec.PKCS8EncodedKeySpec; - -/** - * Created by Afon on 2016/12/16. - */ -public class PingppSignature { - public static String sign(String data, String PEMEncodedPrivateKey, String charset) { - PrivateKey privateKey = getPrivateKeyFromPEM(PEMEncodedPrivateKey); - if (privateKey == null) { - return null; - } - - try { - Signature signature = Signature.getInstance("SHA256withRSA"); - signature.initSign(privateKey); - signature.update(data.getBytes(charset)); - byte[] signBytes = signature.sign(); - - return Base64.encodeBase64String(signBytes).replaceAll("[\n\r]", ""); - } catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException | UnsupportedEncodingException e) { - e.printStackTrace(); - } - - return null; - } - - public static PrivateKey getPrivateKeyFromPEM(String PEMEncodedPrivateKey) { - PEMEncodedPrivateKey = PEMEncodedPrivateKey - .replaceAll("(-+BEGIN (RSA )?PRIVATE KEY-+\\r?\\n|-+END (RSA )?PRIVATE KEY-+\\r?\\n?)", ""); - byte[] privateKeyBytes = Base64.decodeBase64(PEMEncodedPrivateKey); - - try { - return generatePrivateKeyWithPKCS8(privateKeyBytes); - } catch (InvalidKeySpecException e) { - if (Pingpp.DEBUG) { - e.printStackTrace(); - } - return null; - } - } - - public static PrivateKey generatePrivateKeyWithPKCS8(byte[] privateKeyBytes) - throws InvalidKeySpecException { - try { - PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes); - KeyFactory kf = KeyFactory.getInstance("RSA"); - return kf.generatePrivate(keySpec); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } - return null; - } -} From 55df509888e6ed9c3b4b683dbd1b17ac5c12dcb2 Mon Sep 17 00:00:00 2001 From: "chengliang.zhang" Date: Fri, 16 Aug 2024 16:37:29 +0800 Subject: [PATCH 10/25] add wechat agreement example of notify --- CHANGELOG.md | 8 +++++ VERSION | 2 +- build.gradle | 4 +-- example/build.gradle | 11 ++++-- example/res/pingpp_public_key.pem | 9 ----- .../example/AgreementNotifyExample.java | 33 ++++++++++++++++++ .../src/main/resources/pingpp_public_key.pem | 9 +++++ libs/pingpp-sdk-2.5.0.jar | Bin 0 -> 165175 bytes pom.xml | 2 +- settings.gradle | 2 ++ 10 files changed, 64 insertions(+), 16 deletions(-) delete mode 100644 example/res/pingpp_public_key.pem create mode 100644 example/src/main/java/com/pingxx/example/AgreementNotifyExample.java create mode 100644 example/src/main/resources/pingpp_public_key.pem create mode 100644 libs/pingpp-sdk-2.5.0.jar diff --git a/CHANGELOG.md b/CHANGELOG.md index e21a646..38d544d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # ChangeLog +## 2.5.0 + +- 新增: 响应签名验签 +- 新增: 微信扣款预扣费通知实现 +- 更新: `RequestOptions` 新增`Ping++`公钥设置参数 +- 更新: webhook验签方法移动至 `PingppSignature` 类中 +- 更新: `gson` 到`2.10`;`commons-codec` 到 `1.17.0` + ## 2.4.1 - 修改: Refund 对象新增`currency` 字段 diff --git a/VERSION b/VERSION index 005119b..fad066f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.4.1 +2.5.0 \ No newline at end of file diff --git a/build.gradle b/build.gradle index 5ec6473..7958f2d 100644 --- a/build.gradle +++ b/build.gradle @@ -15,8 +15,8 @@ sourceCompatibility = 1.8 targetCompatibility = 1.8 dependencies { - implementation 'com.google.code.gson:gson:2.8.9' - implementation 'commons-codec:commons-codec:1.13' + implementation 'com.google.code.gson:gson:2.10' + implementation 'commons-codec:commons-codec:1.17.0' testImplementation 'junit:junit:4.13.2' } diff --git a/example/build.gradle b/example/build.gradle index 92e80dd..6c54003 100644 --- a/example/build.gradle +++ b/example/build.gradle @@ -1,8 +1,13 @@ apply plugin: 'java' dependencies { - implementation 'com.google.code.gson:gson:2.8.9' - implementation 'commons-codec:commons-codec:1.13' + implementation 'com.google.code.gson:gson:2.10' + implementation 'commons-codec:commons-codec:1.17.0' - implementation 'com.pingxx:pingpp-java:2.4.1' + // 方法 1. 本地文件系统依赖 + // implementation fileTree(dir: 'lib', includes: ['*jar']) + // 方法 2. 仓库依赖 + // implementation 'com.pingxx:pingpp-sdk:1.2.0' + // 方法 3.模块依赖 + implementation project(':pingpp-sdk') } diff --git a/example/res/pingpp_public_key.pem b/example/res/pingpp_public_key.pem deleted file mode 100644 index 7cf6d7c..0000000 --- a/example/res/pingpp_public_key.pem +++ /dev/null @@ -1,9 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzs8SiPoFQT9K0lWa6WSx -0d6UnA391KM2aFwijY0AK7r+MiAe07ivenopzFL3dqIRhQjuP7d30V85kWydN5UZ -cm/tZgm4K+8wttb988hOrzSjtPOMghHK+bnDwE8FIB+ZbHAZCEVhNfE6i9kLGbHH -Q617+mxUTJ3yEZG9CIgke475o2Blxy4UMsRYjo2gl5aanzmOmoZcbiC/R5hXSQUH -XV9/VzA7U//DIm8Xn7rerd1n8+KWCg4hrIIu/A0FKm8zyS4QwAwQO2wdzGB0h15t -uFLhjVz1W5ZPXjmCRLzTUoAvH12C6YFStvS5kjPcA66P1nSKk5o3koSxOumOs0iC -EQIDAQAB ------END PUBLIC KEY----- diff --git a/example/src/main/java/com/pingxx/example/AgreementNotifyExample.java b/example/src/main/java/com/pingxx/example/AgreementNotifyExample.java new file mode 100644 index 0000000..041c4fc --- /dev/null +++ b/example/src/main/java/com/pingxx/example/AgreementNotifyExample.java @@ -0,0 +1,33 @@ +package com.pingxx.example; + +import com.pingplusplus.exception.PingppException; +import com.pingplusplus.model.AgreementNotify; + +import java.util.HashMap; +import java.util.Map; + +public class AgreementNotifyExample { + private String appId; + + AgreementNotifyExample(String appId) { + this.appId = appId; + } + + public static void runDemos(String appId) { + AgreementNotifyExample example = new AgreementNotifyExample(appId); + System.out.println("------- 创建 charge -------"); + example.create("agr_123456"); + } + + public AgreementNotify create(String id) { + AgreementNotify agreementNotify = null; + Map params = new HashMap(); + params.put("amount", 100); + try { + agreementNotify = AgreementNotify.create(id, params); + } catch (PingppException e) { + e.printStackTrace(); + } + return agreementNotify; + } +} diff --git a/example/src/main/resources/pingpp_public_key.pem b/example/src/main/resources/pingpp_public_key.pem new file mode 100644 index 0000000..2cf7987 --- /dev/null +++ b/example/src/main/resources/pingpp_public_key.pem @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoXV1qdwYGq6lac+EIVxx +1/wGcjjy5InO08QBvUGDQMKAWjg/UvnNmnTZJvxUu18UVtwoHIls24EHZ96im3k0 +DPn43aSGyR417g9rqUL2N1H/0dCNcT8LY8sZL/sw/IV//IQcZYv/8EO6+7SClw+G +Jpib84QfmDgUPbQC0dhl1R1Q8e8RoE/+70yX6OY22kRr14KjRZiVQ0UMZS5KaPwS +FJ1egyNDCLFoLyhRQMV5vDxMdpIvxZuGW+3aTZkW8v/ISXWmSFpI/dlpxHp0+h6p +sdai2RzXYuyzbeOPyQEZkyGfR6BX2Gv/l80nEFNup7uNmAt/be9IdpSZlxpF4HlI +8wIDAQAB +-----END PUBLIC KEY----- diff --git a/libs/pingpp-sdk-2.5.0.jar b/libs/pingpp-sdk-2.5.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..a84aa3f051fad145eeba7dfabb2d8e84c53639a3 GIT binary patch literal 165175 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

#ifENXbR^^!DowVr%>I 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 Ifq#tu0bVL}fdBvi literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml index 11a8ca5..c0ac547 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.pingxx pingpp-java - 2.4.1 + 2.5.0 A Java SDK for Ping++ Payment API. diff --git a/settings.gradle b/settings.gradle index 05ca5f7..53e4f88 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,4 @@ rootProject.name = 'pingpp-java' include 'example' +include 'pingpp-sdk' + From 01ea9d756c3f1c68880304e470642e76364a33b0 Mon Sep 17 00:00:00 2001 From: "chengliang.zhang" Date: Fri, 16 Aug 2024 16:41:45 +0800 Subject: [PATCH 11/25] update example --- .../main/java/com/pingxx/example/Main.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/example/src/main/java/com/pingxx/example/Main.java b/example/src/main/java/com/pingxx/example/Main.java index 0e25e93..20750eb 100644 --- a/example/src/main/java/com/pingxx/example/Main.java +++ b/example/src/main/java/com/pingxx/example/Main.java @@ -3,6 +3,7 @@ import com.pingplusplus.Pingpp; import java.math.BigInteger; +import java.net.URL; import java.security.SecureRandom; /** @@ -30,6 +31,8 @@ public class Main { // 你生成的私钥路径 private final static String privateKeyFilePath = "res/your_rsa_private_key_pkcs8.pem"; + private final static String verifyKeyFilePath = "pingpp_public_key.pem"; + protected static String projectDir; public static void main(String[] args) throws Exception { @@ -43,12 +46,15 @@ public static void main(String[] args) throws Exception { // 设置私钥路径,用于请求签名 //Pingpp.privateKeyPath = projectDir + privateKeyFilePath; - /** + /* * 或者直接设置私钥内容 - Pingpp.privateKey = "... PKCS8私钥内容字符串 ..."; + * Pingpp.privateKey = "... PKCS8私钥内容字符串 ..."; */ Pingpp.privateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDHYyS3FwoESp1hGLYiBhy6k9Ag3lzGCIEvm50IIEkE0Ftc9qq44TWqyl+EHUpTMdcBOcI42JLO5stwFOfCLa3PQStEJ4llIRFEKlsrHh67pvWd5RNaSBrvGlnFY40S+SZmjk2WF/h9dE9Ric79t0YI0alD8dIl9Yu3OaEKo7VonBWFwOYMxjPhtORlq+EUF1XJd//yftQrKWTTd7KaUonWzBCl4VzFop/OyTWYlTuZz3eYJaNpH5VaQ1vDgBAcPIeBvMf7NgBHMKW6LLmFd2LEYQ/6I7hkGTjysSzWEpO8bPWT6OEsJ2R2kFGOrSkr+G2MDcJ7ykXYAmz5+A3plS6ZAgMBAAECggEAVrgwR9GlcahiOtDcpn+yDxQq+aC9CQS561LrQZWJLKbSleRS7IZHKTlLwdJbeUO8F7RfXQoVEBghc2YkRrhHWFUn1ES95VY0hElHzcET7Nn5CeuQNzwVOtljIg7iVNY4dXJ/HEDguu/Tb8tYU9FajItj60FJ/WiGk/JksJPzWsOCVPVniy9fTbTLy1e+dCpCI6OXirtm7hvbodRNDjree0wSEzm7vL0wVzEZFo6kX+ABGUwaoO7pPyH+hgyI5Iuhc65NHsHzTJpf8yNFl9QGhkxvm2Ff2oEtDt1idOTBrHB6tg+ti9Ctb2+2yzBnk14hsSYJnKitR7wM6ZCFPX4eYQKBgQD+JAREeFkodec/SC+GX+4Q4Y68uMPkfUPrMKXM4cyY5wgXk64RBvRVxIxX7x6Y3tIKn9v8tWAprbsyVr15eb4RcAFEVwjuoZixhd9sIPsRhfdNolKn/fSPIsHL4ywcJMSIt7KVKHuQeqBNHy0o0PxQjNej1ozsmrAWqV55cbKHswKBgQDI2JQRTPIEC/2y6LdmBVhGJW9OKWTYdVNjq7rX+Yw4uxOtfd5hBqpvgZEklKEk72aazFdEcERlAm9SqoX09qk6zK/wcq4Xn5Q/qy8ecmjuyf2AK9X+HUdMerMVxhK9RpeevKYP/RO2F/wIN64anlQVYygVkXXgdOvWhBE4YABKgwKBgDRtmbPGYB5ItHwJmERQZfx1i8zDESaB8RED6DBsJJkmkDTM8ovws1c+RPWfDuDalto6QFfR0xTGEmhAHLaCtwNB6AEBM4aHL8jvpTfZVfI3gN0zL3oYmestcG1vYBouO504yE6dG2Ci6479b4OMGYFEjPfvuwLUpp8GMcc7/WihAoGANCp8mtm/ammq5VMof2kX+nAyrrx1ovsmQ5cRGpOIZhvBCqjMn6rZjci7aCLqj+tWXRKCABagzROK0o/T50JBxjHv6KYArcYW/Up7HI9ezdbM7wNzu2LjZ+veo+MkbuDs9J/PCgwTmJI2NfQwVl2VPVDZ0nBLi5cSwk7fIiNdL/0CgYEAtECmC1QDs53Di2MIsa/Fe4sWfJGSDqEWqhcA/aPwf1skM6VJJXBBMV1qFtwgO1AlLnu9dQYra6ylsUoubVYIXM9XK7EMhbqi57+Q75jHFTc0DnzOTyho5Gp4Ddi8dztmZGNWdWTGdeMqh+svqMXkD6VdJeddyGu/Zlgj7Wk6whU="; + //(可选,推荐设置)设置响应验证公钥,用于验证响应是否真实有效;不设置或设置密钥错误将不验签 + Pingpp.setVerifyPublicKeyPath(getResPath(verifyKeyFilePath)); + // Charge 示例 ChargeExample.runDemos(appId); @@ -82,13 +88,21 @@ public static void main(String[] args) throws Exception { CustomsExample.runDemos(appId); } - private static SecureRandom random = new SecureRandom(); + private static final SecureRandom random = new SecureRandom(); public static String randomString(int length) { String str = new BigInteger(130, random).toString(32); return str.substring(0, length); } + public static String getResPath(String subPath) { + if (subPath == null) { + throw new NullPointerException(); + } + URL resource = Thread.currentThread().getContextClassLoader().getResource(subPath); + return resource != null ? resource.getPath() : subPath; + } + public static int currentTimeSeconds() { return (int) (System.currentTimeMillis() / 1000); } From a1641e4bc1311e79ebf16e82d2f4b85df9d5e089 Mon Sep 17 00:00:00 2001 From: afon Date: Mon, 19 Aug 2024 13:00:18 +0800 Subject: [PATCH 12/25] pom.xml updated --- pingpp-sdk/pom.xml | 134 +++++++++++++++++++++++++++++++++++++++++++++ pom.xml | 92 +++---------------------------- 2 files changed, 142 insertions(+), 84 deletions(-) create mode 100644 pingpp-sdk/pom.xml diff --git a/pingpp-sdk/pom.xml b/pingpp-sdk/pom.xml new file mode 100644 index 0000000..71ebc45 --- /dev/null +++ b/pingpp-sdk/pom.xml @@ -0,0 +1,134 @@ + + + 4.0.0 + + com.pingxx + pingpp-java + 2.5.1 + jar + + A Java SDK for Ping++ Payment API. + + + Apache License 2.0 + http://www.apache.org/licenses/LICENSE-2.0 + repo + + + + + scm:git:https://github.com/PingPlusPlus/pingpp-java.git + + + + afon + Afon + xufeng.weng@pingxx.com + + + + + 1.8 + 1.8 + + + + + com.google.code.gson + gson + 2.10.1 + compile + + + commons-codec + commons-codec + 1.17.0 + compile + + + junit + junit + 4.13.2 + test + + + + pingpp-java + https://github.com/PingPlusPlus/pingpp-java + + + + ossrh + https://s01.oss.sonatype.org/content/repositories/snapshots + + + ossrh + https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/ + + + + + + + org.sonatype.plugins + nexus-staging-maven-plugin + 1.6.7 + true + + ossrh + https://s01.oss.sonatype.org/ + true + + + + org.apache.maven.plugins + maven-source-plugin + 2.2.1 + + + attach-sources + + jar-no-fork + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.9.1 + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.5 + + + sign-artifacts + verify + + sign + + + ${gpg.keyname} + ${gpg.passphrase} + + --pinentry-mode + loopback + + + + + + + + diff --git a/pom.xml b/pom.xml index c0ac547..e452c42 100644 --- a/pom.xml +++ b/pom.xml @@ -1,10 +1,12 @@ - + 4.0.0 com.pingxx - pingpp-java + pingpp-sdk 2.5.0 + pom A Java SDK for Ping++ Payment API. @@ -26,35 +28,18 @@ + + pingpp-sdk + + 1.8 1.8 - - com.google.code.gson - gson - 2.8.9 - compile - - - commons-codec - commons-codec - 1.13 - compile - - - junit - junit - 4.13.2 - test - - pingpp-java - https://github.com/PingPlusPlus/pingpp-java - ossrh @@ -67,66 +52,5 @@ - - - org.sonatype.plugins - nexus-staging-maven-plugin - 1.6.7 - true - - ossrh - https://s01.oss.sonatype.org/ - true - - - - org.apache.maven.plugins - maven-source-plugin - 2.2.1 - - - attach-sources - - jar-no-fork - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.9.1 - - - attach-javadocs - - jar - - - - - - org.apache.maven.plugins - maven-gpg-plugin - 1.5 - - - sign-artifacts - verify - - sign - - - ${gpg.keyname} - ${gpg.passphrase} - - --pinentry-mode - loopback - - - - - - From 176106dd5b49d0fb0f00fe6a729ef716ed3f6f59 Mon Sep 17 00:00:00 2001 From: afon Date: Wed, 27 Nov 2024 15:17:26 +0800 Subject: [PATCH 13/25] Refactor: Correct the data types of elements within Map and List --- CHANGELOG.md | 4 ++ README.md | 4 +- VERSION | 2 +- build.gradle | 10 ---- example/build.gradle | 2 +- pingpp-sdk/build.gradle | 3 ++ pingpp-sdk/pom.xml | 2 +- .../main/java/com/pingplusplus/Pingpp.java | 2 +- .../com/pingplusplus/net/APIResource.java | 5 +- .../serializer/ChargeDeserializer.java | 20 +++---- .../ChargeRefundCollectionDeserializer.java | 10 +--- .../serializer/ObjectListDeserializer.java | 49 +++++++++++++++++ .../serializer/RedEnvelopeDeserializer.java | 7 ++- .../StringObjectMapDeserializer.java | 52 +++++++++++++++++++ .../serializer/SubAppDeserializer.java | 5 +- .../serializer/TransferDeserializer.java | 5 +- .../java/com/pingplusplus/util/GsonUtils.java | 25 +++++++++ .../java/com/pingplusplus/PingppTest.java | 44 ++++++++++++++++ pom.xml | 2 +- settings.gradle | 3 +- 20 files changed, 206 insertions(+), 50 deletions(-) create mode 100644 pingpp-sdk/src/main/java/com/pingplusplus/serializer/ObjectListDeserializer.java create mode 100644 pingpp-sdk/src/main/java/com/pingplusplus/serializer/StringObjectMapDeserializer.java create mode 100644 pingpp-sdk/src/main/java/com/pingplusplus/util/GsonUtils.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 38d544d..f7823bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # ChangeLog +## 2.5.2 + +- 修改: 正确 `Map` 以及 `List` 内的元素类型 + ## 2.5.0 - 新增: 响应签名验签 diff --git a/README.md b/README.md index d926a69..d49db1a 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ mavenCentral com.pingxx pingpp-java - 2.4.1 + 2.5.2 jar ``` @@ -56,7 +56,7 @@ repositories { 安装 Ping++ SDK ``` -implementation 'com.pingxx:pingpp-java:2.4.1' +implementation 'com.pingxx:pingpp-java:2.5.2' ``` ## 初始化 diff --git a/VERSION b/VERSION index fad066f..21b159d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.5.0 \ No newline at end of file +2.5.2 \ No newline at end of file diff --git a/build.gradle b/build.gradle index 7958f2d..e7c254d 100644 --- a/build.gradle +++ b/build.gradle @@ -10,13 +10,3 @@ allprojects { } apply plugin: 'java' } - -sourceCompatibility = 1.8 -targetCompatibility = 1.8 - -dependencies { - implementation 'com.google.code.gson:gson:2.10' - implementation 'commons-codec:commons-codec:1.17.0' - - testImplementation 'junit:junit:4.13.2' -} diff --git a/example/build.gradle b/example/build.gradle index 6c54003..9cc3666 100644 --- a/example/build.gradle +++ b/example/build.gradle @@ -7,7 +7,7 @@ dependencies { // 方法 1. 本地文件系统依赖 // implementation fileTree(dir: 'lib', includes: ['*jar']) // 方法 2. 仓库依赖 - // implementation 'com.pingxx:pingpp-sdk:1.2.0' + // implementation 'com.pingxx:pingpp-java:2.5.2' // 方法 3.模块依赖 implementation project(':pingpp-sdk') } diff --git a/pingpp-sdk/build.gradle b/pingpp-sdk/build.gradle index aafd483..cd44911 100644 --- a/pingpp-sdk/build.gradle +++ b/pingpp-sdk/build.gradle @@ -13,6 +13,9 @@ plugins { id "java" } +sourceCompatibility = 1.8 +targetCompatibility = 1.8 + configurations { compileOnly { extendsFrom annotationProcessor diff --git a/pingpp-sdk/pom.xml b/pingpp-sdk/pom.xml index 71ebc45..8c7da2b 100644 --- a/pingpp-sdk/pom.xml +++ b/pingpp-sdk/pom.xml @@ -5,7 +5,7 @@ com.pingxx pingpp-java - 2.5.1 + 2.5.2 jar A Java SDK for Ping++ Payment API. diff --git a/pingpp-sdk/src/main/java/com/pingplusplus/Pingpp.java b/pingpp-sdk/src/main/java/com/pingplusplus/Pingpp.java index 023cd9d..affc708 100644 --- a/pingpp-sdk/src/main/java/com/pingplusplus/Pingpp.java +++ b/pingpp-sdk/src/main/java/com/pingplusplus/Pingpp.java @@ -17,7 +17,7 @@ public abstract class Pingpp { /** * version */ - public static final String VERSION = "2.5.0"; + public static final String VERSION = "2.5.2"; /** * api key */ diff --git a/pingpp-sdk/src/main/java/com/pingplusplus/net/APIResource.java b/pingpp-sdk/src/main/java/com/pingplusplus/net/APIResource.java index aa7b48f..10bcb6c 100644 --- a/pingpp-sdk/src/main/java/com/pingplusplus/net/APIResource.java +++ b/pingpp-sdk/src/main/java/com/pingplusplus/net/APIResource.java @@ -3,9 +3,9 @@ import com.google.gson.*; import com.pingplusplus.Pingpp; import com.pingplusplus.exception.*; -import com.pingplusplus.exception.InvalidRequestException; import com.pingplusplus.model.*; import com.pingplusplus.serializer.*; +import com.pingplusplus.util.GsonUtils; import java.io.*; import java.lang.reflect.InvocationTargetException; @@ -41,8 +41,7 @@ protected enum RequestMethod { /** * Gson object use to transform json string to resource object */ - public static final Gson GSON = new GsonBuilder() - .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) + public static final Gson GSON = GsonUtils.baseGsonBuilder() .registerTypeAdapter(Charge.class, new ChargeDeserializer()) .registerTypeAdapter(RedEnvelope.class, new RedEnvelopeDeserializer()) .registerTypeAdapter(Transfer.class, new TransferDeserializer()) diff --git a/pingpp-sdk/src/main/java/com/pingplusplus/serializer/ChargeDeserializer.java b/pingpp-sdk/src/main/java/com/pingplusplus/serializer/ChargeDeserializer.java index 6043e2c..15ee2e3 100644 --- a/pingpp-sdk/src/main/java/com/pingplusplus/serializer/ChargeDeserializer.java +++ b/pingpp-sdk/src/main/java/com/pingplusplus/serializer/ChargeDeserializer.java @@ -1,8 +1,6 @@ package com.pingplusplus.serializer; -import com.google.gson.FieldNamingPolicy; import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; @@ -11,6 +9,7 @@ import com.pingplusplus.model.App; import com.pingplusplus.model.Charge; import com.pingplusplus.model.ChargeRefundCollection; +import com.pingplusplus.util.GsonUtils; import java.lang.reflect.Type; @@ -20,40 +19,41 @@ public class ChargeDeserializer implements JsonDeserializer { @Override - public Charge deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { - + public Charge deserialize(JsonElement jsonElement, + Type type, + JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { JsonObject chargeJson = jsonElement.getAsJsonObject(); if (null != chargeJson.getAsJsonObject("credential")) { JsonObject credentialJson = chargeJson.getAsJsonObject("credential"); JsonObject channelCredential; if (credentialJson.getAsJsonObject("wx") != null) { JsonObject wx = credentialJson.getAsJsonObject("wx"); - Long timeStamp = wx.get("timeStamp").getAsLong(); + long timeStamp = wx.get("timeStamp").getAsLong(); wx.addProperty("timeStamp", Long.toString(timeStamp)); } else if (credentialJson.getAsJsonObject("wx_pub") != null) { JsonObject wxPub = credentialJson.getAsJsonObject("wx_pub"); if (null == wxPub.get("signed_data") && wxPub.get("timeStamp") != null) { - Long timeStamp = wxPub.get("timeStamp").getAsLong(); + long timeStamp = wxPub.get("timeStamp").getAsLong(); wxPub.addProperty("timeStamp", Long.toString(timeStamp)); } } else if ((channelCredential = credentialJson.getAsJsonObject("bfb")) != null || (channelCredential = credentialJson.getAsJsonObject("bfb_wap")) != null) { if (channelCredential.has("total_amount")) { - Long total_amount = channelCredential.get("total_amount").getAsLong(); + long total_amount = channelCredential.get("total_amount").getAsLong(); channelCredential.addProperty("total_amount", Long.toString(total_amount)); } } else if ((channelCredential = credentialJson.getAsJsonObject("alipay")) != null || (channelCredential = credentialJson.getAsJsonObject("alipay_wap")) != null || (channelCredential = credentialJson.getAsJsonObject("alipay_pc_direct")) != null) { if (channelCredential.has("payment_type")) { - Long paymentType = channelCredential.get("payment_type").getAsLong(); + long paymentType = channelCredential.get("payment_type").getAsLong(); channelCredential.addProperty("payment_type", Long.toString(paymentType)); } } } - Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES). - registerTypeAdapter(ChargeRefundCollection.class, new ChargeRefundCollectionDeserializer()) + Gson gson = GsonUtils.baseGsonBuilder() + .registerTypeAdapter(ChargeRefundCollection.class, new ChargeRefundCollectionDeserializer()) .create(); JsonElement appElement = chargeJson.get("app"); Charge charge = gson.fromJson(jsonElement, Charge.class); diff --git a/pingpp-sdk/src/main/java/com/pingplusplus/serializer/ChargeRefundCollectionDeserializer.java b/pingpp-sdk/src/main/java/com/pingplusplus/serializer/ChargeRefundCollectionDeserializer.java index 8b1231a..48616ac 100644 --- a/pingpp-sdk/src/main/java/com/pingplusplus/serializer/ChargeRefundCollectionDeserializer.java +++ b/pingpp-sdk/src/main/java/com/pingplusplus/serializer/ChargeRefundCollectionDeserializer.java @@ -1,26 +1,20 @@ package com.pingplusplus.serializer; -import com.google.gson.FieldNamingPolicy; import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonParseException; -import com.google.gson.reflect.TypeToken; import com.pingplusplus.model.ChargeRefundCollection; -import com.pingplusplus.model.Refund; +import com.pingplusplus.util.GsonUtils; import java.lang.reflect.Type; -import java.util.List; public class ChargeRefundCollectionDeserializer implements JsonDeserializer { public ChargeRefundCollection deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - Gson gson = new GsonBuilder() - .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) - .create(); + Gson gson = GsonUtils.baseGsonBuilder().create(); return gson.fromJson(json, typeOfT); } diff --git a/pingpp-sdk/src/main/java/com/pingplusplus/serializer/ObjectListDeserializer.java b/pingpp-sdk/src/main/java/com/pingplusplus/serializer/ObjectListDeserializer.java new file mode 100644 index 0000000..134ba36 --- /dev/null +++ b/pingpp-sdk/src/main/java/com/pingplusplus/serializer/ObjectListDeserializer.java @@ -0,0 +1,49 @@ +package com.pingplusplus.serializer; + +import com.google.gson.*; +import com.pingplusplus.util.GsonUtils; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + +public class ObjectListDeserializer implements JsonDeserializer> { + + @Override + public List deserialize(JsonElement elem, + Type type, + JsonDeserializationContext context) { + List list = new ArrayList<>(); + JsonArray jsonArray = elem.getAsJsonArray(); + + for (JsonElement element : jsonArray) { + if (element.isJsonNull()) { + list.add(null); + } else if (element.isJsonPrimitive()) { + JsonPrimitive primitive = element.getAsJsonPrimitive(); + if (primitive.isNumber()) { + String numStr = primitive.getAsString(); + if (numStr.contains(".")) { + list.add(primitive.getAsDouble()); + } else { + try { + list.add(primitive.getAsLong()); + } catch (NumberFormatException e) { + list.add(primitive.getAsBigDecimal()); + } + } + } else if (primitive.isString()) { + list.add(primitive.getAsString()); + } else if (primitive.isBoolean()) { + list.add(primitive.getAsBoolean()); + } + } else if (element.isJsonArray()) { + list.add(context.deserialize(element, GsonUtils.LIST_OBJ)); + } else if (element.isJsonObject()) { + list.add(context.deserialize(element, GsonUtils.MAP_STR_OBJ)); + } + } + + return list; + } +} \ No newline at end of file diff --git a/pingpp-sdk/src/main/java/com/pingplusplus/serializer/RedEnvelopeDeserializer.java b/pingpp-sdk/src/main/java/com/pingplusplus/serializer/RedEnvelopeDeserializer.java index e2b6ee9..251279b 100644 --- a/pingpp-sdk/src/main/java/com/pingplusplus/serializer/RedEnvelopeDeserializer.java +++ b/pingpp-sdk/src/main/java/com/pingplusplus/serializer/RedEnvelopeDeserializer.java @@ -1,8 +1,6 @@ package com.pingplusplus.serializer; -import com.google.gson.FieldNamingPolicy; import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; @@ -11,6 +9,7 @@ import com.pingplusplus.model.App; import com.pingplusplus.model.ChargeRefundCollection; import com.pingplusplus.model.RedEnvelope; +import com.pingplusplus.util.GsonUtils; import java.lang.reflect.Type; @@ -21,8 +20,8 @@ public class RedEnvelopeDeserializer implements JsonDeserializer { @Override public RedEnvelope deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { JsonObject transFerJson = json.getAsJsonObject(); - Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES). - registerTypeAdapter(ChargeRefundCollection.class, new ChargeRefundCollectionDeserializer()) + Gson gson = GsonUtils.baseGsonBuilder() + .registerTypeAdapter(ChargeRefundCollection.class, new ChargeRefundCollectionDeserializer()) .create(); JsonElement appElement = transFerJson.get("app"); RedEnvelope redEnvelope = gson.fromJson(json, RedEnvelope.class); diff --git a/pingpp-sdk/src/main/java/com/pingplusplus/serializer/StringObjectMapDeserializer.java b/pingpp-sdk/src/main/java/com/pingplusplus/serializer/StringObjectMapDeserializer.java new file mode 100644 index 0000000..42ad230 --- /dev/null +++ b/pingpp-sdk/src/main/java/com/pingplusplus/serializer/StringObjectMapDeserializer.java @@ -0,0 +1,52 @@ +package com.pingplusplus.serializer; + +import com.google.gson.*; +import com.pingplusplus.util.GsonUtils; + +import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.Map; + +public class StringObjectMapDeserializer implements JsonDeserializer> { + + @Override + public Map deserialize(JsonElement elem, + Type type, + JsonDeserializationContext context) { + Map map = new HashMap<>(); + JsonObject jsonObject = elem.getAsJsonObject(); + + for (Map.Entry entry : jsonObject.entrySet()) { + String key = entry.getKey(); + JsonElement value = entry.getValue(); + + if (value.isJsonNull()) { + map.put(key, null); + } else if (value.isJsonPrimitive()) { + JsonPrimitive primitive = value.getAsJsonPrimitive(); + if (primitive.isNumber()) { + String numStr = primitive.getAsString(); + if (numStr.contains(".")) { + map.put(key, primitive.getAsDouble()); + } else { + try { + map.put(key, primitive.getAsLong()); + } catch (NumberFormatException e) { + map.put(key, primitive.getAsBigDecimal()); + } + } + } else if (primitive.isString()) { + map.put(key, primitive.getAsString()); + } else if (primitive.isBoolean()) { + map.put(key, primitive.getAsBoolean()); + } + } else if (value.isJsonArray()) { + map.put(key, context.deserialize(value, GsonUtils.LIST_OBJ)); + } else if (value.isJsonObject()) { + map.put(key, context.deserialize(value, GsonUtils.MAP_STR_OBJ)); + } + } + + return map; + } +} \ No newline at end of file diff --git a/pingpp-sdk/src/main/java/com/pingplusplus/serializer/SubAppDeserializer.java b/pingpp-sdk/src/main/java/com/pingplusplus/serializer/SubAppDeserializer.java index e3aa75a..a137464 100644 --- a/pingpp-sdk/src/main/java/com/pingplusplus/serializer/SubAppDeserializer.java +++ b/pingpp-sdk/src/main/java/com/pingplusplus/serializer/SubAppDeserializer.java @@ -2,6 +2,7 @@ import com.google.gson.*; import com.pingplusplus.model.*; +import com.pingplusplus.util.GsonUtils; import java.lang.reflect.Type; @@ -16,9 +17,7 @@ public SubApp deserialize(JsonElement jsonElement, Type type, JsonDeserializatio JsonObject subAppJson = jsonElement.getAsJsonObject(); - Gson gson = new GsonBuilder() - .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) - .create(); + Gson gson = GsonUtils.baseGsonBuilder().create(); JsonElement userElement = subAppJson.get("user"); SubApp subApp = gson.fromJson(jsonElement, SubApp.class); diff --git a/pingpp-sdk/src/main/java/com/pingplusplus/serializer/TransferDeserializer.java b/pingpp-sdk/src/main/java/com/pingplusplus/serializer/TransferDeserializer.java index cc7812f..c0ed8d9 100644 --- a/pingpp-sdk/src/main/java/com/pingplusplus/serializer/TransferDeserializer.java +++ b/pingpp-sdk/src/main/java/com/pingplusplus/serializer/TransferDeserializer.java @@ -1,8 +1,6 @@ package com.pingplusplus.serializer; -import com.google.gson.FieldNamingPolicy; import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; @@ -11,6 +9,7 @@ import com.pingplusplus.model.App; import com.pingplusplus.model.ChargeRefundCollection; import com.pingplusplus.model.Transfer; +import com.pingplusplus.util.GsonUtils; import java.lang.reflect.Type; @@ -22,7 +21,7 @@ public class TransferDeserializer implements JsonDeserializer { public Transfer deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { JsonObject transFerJson = json.getAsJsonObject(); - Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) + Gson gson = GsonUtils.baseGsonBuilder() .registerTypeAdapter(ChargeRefundCollection.class, new ChargeRefundCollectionDeserializer()) .create(); JsonElement appElement = transFerJson.get("app"); diff --git a/pingpp-sdk/src/main/java/com/pingplusplus/util/GsonUtils.java b/pingpp-sdk/src/main/java/com/pingplusplus/util/GsonUtils.java new file mode 100644 index 0000000..6187708 --- /dev/null +++ b/pingpp-sdk/src/main/java/com/pingplusplus/util/GsonUtils.java @@ -0,0 +1,25 @@ +package com.pingplusplus.util; + +import java.lang.reflect.Type; +import java.util.List; +import java.util.Map; + +import com.google.gson.FieldNamingPolicy; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import com.pingplusplus.serializer.ObjectListDeserializer; +import com.pingplusplus.serializer.StringObjectMapDeserializer; + +public final class GsonUtils { + public static final Type MAP_STR_OBJ = new TypeToken>() {}.getType(); + public static final Type LIST_OBJ = new TypeToken>() {}.getType(); + + private GsonUtils() {} + + public static GsonBuilder baseGsonBuilder() { + return new GsonBuilder() + .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) + .registerTypeAdapter(GsonUtils.MAP_STR_OBJ, new StringObjectMapDeserializer()) + .registerTypeAdapter(GsonUtils.LIST_OBJ, new ObjectListDeserializer()); + } +} diff --git a/pingpp-sdk/src/test/java/com/pingplusplus/PingppTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/PingppTest.java index f66b60e..949bbac 100644 --- a/pingpp-sdk/src/test/java/com/pingplusplus/PingppTest.java +++ b/pingpp-sdk/src/test/java/com/pingplusplus/PingppTest.java @@ -2,6 +2,7 @@ import com.pingplusplus.exception.PingppException; import com.pingplusplus.model.*; +import com.pingplusplus.net.APIResource; import org.junit.BeforeClass; import org.junit.Test; @@ -25,6 +26,49 @@ public class PingppTest { Pingpp.DEBUG = true; } + @Test public void testDeserialize() { + String jsonStr = "{\n" + + " \"id\": \"ch_1234567890\",\n" + + " \"object\": \"charge\",\n" + + " \"livemode\": true,\n" + + " \"paid\": true,\n" + + " \"refunded\": true,\n" + + " \"extra\": {\n" + + " \"discount_code\": \"ABCD\",\n" + + " \"discount_amount\": 20,\n" + + " \"score\": 60.12\n" + + " },\n" + + " \"time_paid\": 1732609210,\n" + + " \"time_expire\": 1732610502,\n" + + " \"time_settle\": null,\n" + + " \"transaction_no\": \"6523236536624\",\n" + + " \"amount_refunded\": 0,\n" + + " \"failure_code\": null,\n" + + " \"failure_msg\": null,\n" + + " \"metadata\": {\n" + + " \"code\": \"10000\",\n" + + " \"type\": \"PAYMENT\",\n" + + " \"list\": [10, 100, 1000]" + + " },\n" + + " \"credential\": {},\n" + + " \"description\": \"DESC\"\n" + + "}"; + Charge ch = APIResource.getGson().fromJson(jsonStr, Charge.class); + Object discountAmount = ch.getExtra().get("discount_amount"); + assertEquals(Long.class, discountAmount.getClass()); + assertEquals(20L, discountAmount); + Object score = ch.getExtra().get("score"); + assertEquals(Double.class, score.getClass()); + System.out.println("score value: " + score); + + Object metaCode = ch.getMetadata().get("code"); + assertEquals(String.class, metaCode.getClass()); + Object metaList = ch.getMetadata().get("list"); + assertEquals(ArrayList.class, metaList.getClass()); + Object metaListEle = ((ArrayList) metaList).get(0); + assertEquals(Long.class, metaListEle.getClass()); + } + @Test public void testSetApiKey() { assertEquals("apiKey should be set", "sk_test_ibbTe5jLGCi5rzfH4OqPW9KC", Pingpp.apiKey); } diff --git a/pom.xml b/pom.xml index e452c42..341583e 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.pingxx pingpp-sdk - 2.5.0 + 2.5.2 pom A Java SDK for Ping++ Payment API. diff --git a/settings.gradle b/settings.gradle index 53e4f88..c5a152d 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,3 @@ rootProject.name = 'pingpp-java' -include 'example' include 'pingpp-sdk' - +include 'example' From 4238f50cc7f2c20a926885f1d8ce9234d2500a1a Mon Sep 17 00:00:00 2001 From: "chengliang.zhang" Date: Thu, 10 Jul 2025 15:00:30 +0800 Subject: [PATCH 14/25] =?UTF-8?q?=E6=96=B0=E5=A2=9E:=E7=AD=BE=E7=BA=A6?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 4 +++ README.md | 4 +-- VERSION | 2 +- example/build.gradle | 2 +- .../com/pingxx/example/AgreementExample.java | 30 +++++++++++++++++++ .../example/AgreementNotifyExample.java | 2 +- pingpp-sdk/pom.xml | 2 +- .../main/java/com/pingplusplus/Pingpp.java | 2 +- .../com/pingplusplus/model/Agreement.java | 22 ++++++++++++++ .../pingplusplus/model/AgreementNotify.java | 2 +- pom.xml | 2 +- 11 files changed, 65 insertions(+), 9 deletions(-) create mode 100644 example/src/main/java/com/pingxx/example/AgreementExample.java diff --git a/CHANGELOG.md b/CHANGELOG.md index f7823bb..2aeb307 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # ChangeLog +## 2.5.3 + +- 新增: 签约修改接口 + ## 2.5.2 - 修改: 正确 `Map` 以及 `List` 内的元素类型 diff --git a/README.md b/README.md index d49db1a..d36d9a8 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ mavenCentral com.pingxx pingpp-java - 2.5.2 + 2.5.3 jar ``` @@ -56,7 +56,7 @@ repositories { 安装 Ping++ SDK ``` -implementation 'com.pingxx:pingpp-java:2.5.2' +implementation 'com.pingxx:pingpp-java:2.5.3' ``` ## 初始化 diff --git a/VERSION b/VERSION index 21b159d..a4db534 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.5.2 \ No newline at end of file +2.5.3 \ No newline at end of file diff --git a/example/build.gradle b/example/build.gradle index 9cc3666..248b559 100644 --- a/example/build.gradle +++ b/example/build.gradle @@ -7,7 +7,7 @@ dependencies { // 方法 1. 本地文件系统依赖 // implementation fileTree(dir: 'lib', includes: ['*jar']) // 方法 2. 仓库依赖 - // implementation 'com.pingxx:pingpp-java:2.5.2' + // implementation 'com.pingxx:pingpp-java:2.5.3' // 方法 3.模块依赖 implementation project(':pingpp-sdk') } diff --git a/example/src/main/java/com/pingxx/example/AgreementExample.java b/example/src/main/java/com/pingxx/example/AgreementExample.java new file mode 100644 index 0000000..205a51c --- /dev/null +++ b/example/src/main/java/com/pingxx/example/AgreementExample.java @@ -0,0 +1,30 @@ +package com.pingxx.example; + +import com.pingplusplus.exception.PingppException; +import com.pingplusplus.model.Agreement; + +import java.util.HashMap; +import java.util.Map; + +public class AgreementExample { + + private String appId; + + public AgreementExample(String appId) { + this.appId = appId; + } + + public static void runDemos(String appId) throws PingppException { + AgreementExample example = new AgreementExample(appId); + Agreement agrModify = example.modify(); + } + + public Agreement modify() throws PingppException { + String agreementId = "agr_123456"; + Map params = new HashMap<>(); + params.put("deduct_time", "2025-07-10"); + params.put("memo", "扣款失败,需延期扣款时间"); + + return Agreement.modify(agreementId, params); + } +} diff --git a/example/src/main/java/com/pingxx/example/AgreementNotifyExample.java b/example/src/main/java/com/pingxx/example/AgreementNotifyExample.java index 041c4fc..54c9fa5 100644 --- a/example/src/main/java/com/pingxx/example/AgreementNotifyExample.java +++ b/example/src/main/java/com/pingxx/example/AgreementNotifyExample.java @@ -15,7 +15,7 @@ public class AgreementNotifyExample { public static void runDemos(String appId) { AgreementNotifyExample example = new AgreementNotifyExample(appId); - System.out.println("------- 创建 charge -------"); + System.out.println("------- 签约扣款-商户预扣费通知 -------"); example.create("agr_123456"); } diff --git a/pingpp-sdk/pom.xml b/pingpp-sdk/pom.xml index 8c7da2b..645bfa3 100644 --- a/pingpp-sdk/pom.xml +++ b/pingpp-sdk/pom.xml @@ -5,7 +5,7 @@ com.pingxx pingpp-java - 2.5.2 + 2.5.3 jar A Java SDK for Ping++ Payment API. diff --git a/pingpp-sdk/src/main/java/com/pingplusplus/Pingpp.java b/pingpp-sdk/src/main/java/com/pingplusplus/Pingpp.java index affc708..986c5b7 100644 --- a/pingpp-sdk/src/main/java/com/pingplusplus/Pingpp.java +++ b/pingpp-sdk/src/main/java/com/pingplusplus/Pingpp.java @@ -17,7 +17,7 @@ public abstract class Pingpp { /** * version */ - public static final String VERSION = "2.5.2"; + public static final String VERSION = "2.5.3"; /** * api key */ diff --git a/pingpp-sdk/src/main/java/com/pingplusplus/model/Agreement.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/Agreement.java index 3039557..ae64880 100644 --- a/pingpp-sdk/src/main/java/com/pingplusplus/model/Agreement.java +++ b/pingpp-sdk/src/main/java/com/pingplusplus/model/Agreement.java @@ -3,6 +3,7 @@ import com.pingplusplus.exception.PingppException; import com.pingplusplus.net.APIResource; import com.pingplusplus.net.RequestOptions; + import java.util.HashMap; import java.util.Map; @@ -254,5 +255,26 @@ public static Agreement cancel(String id, RequestOptions options) throws PingppE return APIResource.request(RequestMethod.PUT, instanceURL(Agreement.class, id), params, Agreement.class, options); } + /** + * 签约修改 + * @param id + * @param params + * @param options + * @return + * @throws PingppException + */ + public static Agreement modify(String id,Map params, RequestOptions options) throws PingppException { + return APIResource.request(RequestMethod.POST, String.format("%s/%s/modify/", classURL(Agreement.class), id), params, Agreement.class, options); + } + /** + * 签约修改 + * @param id + * @param params + * @return + * @throws PingppException + */ + public static Agreement modify(String id, Map params) throws PingppException { + return modify(id, params, null); + } } diff --git a/pingpp-sdk/src/main/java/com/pingplusplus/model/AgreementNotify.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/AgreementNotify.java index 9f0b326..9fd9970 100644 --- a/pingpp-sdk/src/main/java/com/pingplusplus/model/AgreementNotify.java +++ b/pingpp-sdk/src/main/java/com/pingplusplus/model/AgreementNotify.java @@ -31,7 +31,7 @@ public static AgreementNotify create(String id, Map params) thro } /** - * + * 签约扣款-商户预扣费通知 * @param agreementId * @param params * @param options diff --git a/pom.xml b/pom.xml index 341583e..de90a4f 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.pingxx pingpp-sdk - 2.5.2 + 2.5.3 pom A Java SDK for Ping++ Payment API. From 69f76d3f5be1cdadf44ee038f325c0addb80bf44 Mon Sep 17 00:00:00 2001 From: "chengliang.zhang" Date: Thu, 10 Jul 2025 15:02:04 +0800 Subject: [PATCH 15/25] =?UTF-8?q?=E6=9B=BF=E6=8D=A2=20libs=20=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/pingxx/example/Main.java | 3 +++ ...gpp-sdk-2.5.0.jar => pingpp-sdk-2.5.3.jar} | Bin 165175 -> 172027 bytes 2 files changed, 3 insertions(+) rename libs/{pingpp-sdk-2.5.0.jar => pingpp-sdk-2.5.3.jar} (66%) diff --git a/example/src/main/java/com/pingxx/example/Main.java b/example/src/main/java/com/pingxx/example/Main.java index 20750eb..c38f9f2 100644 --- a/example/src/main/java/com/pingxx/example/Main.java +++ b/example/src/main/java/com/pingxx/example/Main.java @@ -86,6 +86,9 @@ public static void main(String[] args) throws Exception { // 报关 // 请使用 live key 调用该接口 CustomsExample.runDemos(appId); + + //签约代扣示例 + AgreementExample.runDemos(appId); } private static final SecureRandom random = new SecureRandom(); diff --git a/libs/pingpp-sdk-2.5.0.jar b/libs/pingpp-sdk-2.5.3.jar similarity index 66% rename from libs/pingpp-sdk-2.5.0.jar rename to libs/pingpp-sdk-2.5.3.jar index a84aa3f051fad145eeba7dfabb2d8e84c53639a3..72f00e6d7a1c197dadc6992a765a635ac0decff1 100644 GIT binary patch delta 40606 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

6AiMs7SR0wcXlWaEWn#wmArL+d1BVp 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 Date: Thu, 10 Jul 2025 18:13:45 +0800 Subject: [PATCH 16/25] Refactor: Migrate to parent POM and Central publishing --- pingpp-sdk/pom.xml | 49 ++++++++++++++++++++-------------------------- pom.xml | 23 +++++++++++----------- 2 files changed, 32 insertions(+), 40 deletions(-) diff --git a/pingpp-sdk/pom.xml b/pingpp-sdk/pom.xml index 645bfa3..46200bf 100644 --- a/pingpp-sdk/pom.xml +++ b/pingpp-sdk/pom.xml @@ -3,12 +3,18 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 4.0.0 - com.pingxx + + com.pingxx + pingpp-java-parent + 2.5.3 + + pingpp-java - 2.5.3 jar + pingpp-java A Java SDK for Ping++ Payment API. + https://github.com/PingPlusPlus/pingpp-java Apache License 2.0 @@ -54,37 +60,14 @@ - pingpp-java - https://github.com/PingPlusPlus/pingpp-java - - - ossrh - https://s01.oss.sonatype.org/content/repositories/snapshots - - - ossrh - https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/ - - - - org.sonatype.plugins - nexus-staging-maven-plugin - 1.6.7 - true - - ossrh - https://s01.oss.sonatype.org/ - true - - org.apache.maven.plugins maven-source-plugin - 2.2.1 + 3.3.1 attach-sources @@ -97,7 +80,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 2.9.1 + 3.11.2 attach-javadocs @@ -110,7 +93,7 @@ org.apache.maven.plugins maven-gpg-plugin - 1.5 + 3.2.8 sign-artifacts @@ -129,6 +112,16 @@ + + org.sonatype.central + central-publishing-maven-plugin + 0.8.0 + true + + central + true + + diff --git a/pom.xml b/pom.xml index de90a4f..5157010 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.pingxx - pingpp-sdk + pingpp-java-parent 2.5.3 pom @@ -40,17 +40,16 @@ - - - ossrh - https://s01.oss.sonatype.org/content/repositories/snapshots - - - ossrh - https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/ - - - + + + org.apache.maven.plugins + maven-deploy-plugin + 2.7 + + true + + + From 7014078842de1e24e5a784c9f5c9e56813ddd2ef Mon Sep 17 00:00:00 2001 From: afon Date: Fri, 11 Jul 2025 11:13:48 +0800 Subject: [PATCH 17/25] fix maven jar dependency --- CHANGELOG.md | 4 ++++ README.md | 4 ++-- VERSION | 2 +- example/build.gradle | 2 +- pingpp-sdk/pom.xml | 8 ++------ pom.xml | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2aeb307..364d6e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # ChangeLog +## 2.5.4 + +- 修正: 修复版本 2.5.3 中存在的 POM 依赖问题。建议用户直接升级到此版本。 + ## 2.5.3 - 新增: 签约修改接口 diff --git a/README.md b/README.md index d36d9a8..6d090fe 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ mavenCentral com.pingxx pingpp-java - 2.5.3 + 2.5.4 jar ``` @@ -56,7 +56,7 @@ repositories { 安装 Ping++ SDK ``` -implementation 'com.pingxx:pingpp-java:2.5.3' +implementation 'com.pingxx:pingpp-java:2.5.4' ``` ## 初始化 diff --git a/VERSION b/VERSION index a4db534..d21aa93 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.5.3 \ No newline at end of file +2.5.4 \ No newline at end of file diff --git a/example/build.gradle b/example/build.gradle index 248b559..d82583f 100644 --- a/example/build.gradle +++ b/example/build.gradle @@ -7,7 +7,7 @@ dependencies { // 方法 1. 本地文件系统依赖 // implementation fileTree(dir: 'lib', includes: ['*jar']) // 方法 2. 仓库依赖 - // implementation 'com.pingxx:pingpp-java:2.5.3' + // implementation 'com.pingxx:pingpp-java:2.5.4' // 方法 3.模块依赖 implementation project(':pingpp-sdk') } diff --git a/pingpp-sdk/pom.xml b/pingpp-sdk/pom.xml index 46200bf..706fa88 100644 --- a/pingpp-sdk/pom.xml +++ b/pingpp-sdk/pom.xml @@ -3,13 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 4.0.0 - - com.pingxx - pingpp-java-parent - 2.5.3 - - + com.pingxx pingpp-java + 2.5.4 jar pingpp-java diff --git a/pom.xml b/pom.xml index 5157010..2881efc 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.pingxx pingpp-java-parent - 2.5.3 + 2.5.4 pom A Java SDK for Ping++ Payment API. From d068a729ca5a0949abdbd281157cd8438812c9fb Mon Sep 17 00:00:00 2001 From: afon Date: Fri, 11 Jul 2025 11:19:47 +0800 Subject: [PATCH 18/25] skip install --- pom.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pom.xml b/pom.xml index 2881efc..62f8f65 100644 --- a/pom.xml +++ b/pom.xml @@ -42,6 +42,14 @@ + + org.apache.maven.plugins + maven-install-plugin + 2.5.2 + + true + + org.apache.maven.plugins maven-deploy-plugin From f36d6cbb9dd9c1028e68cf734b4bfa86b425407f Mon Sep 17 00:00:00 2001 From: "chengliang.zhang" Date: Mon, 19 Jan 2026 17:36:59 +0800 Subject: [PATCH 19/25] Release v2.5.5 --- pingpp-sdk/pom.xml | 2 +- .../src/main/java/com/pingplusplus/model/Refund.java | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/pingpp-sdk/pom.xml b/pingpp-sdk/pom.xml index 706fa88..f881d71 100644 --- a/pingpp-sdk/pom.xml +++ b/pingpp-sdk/pom.xml @@ -5,7 +5,7 @@ com.pingxx pingpp-java - 2.5.4 + 2.5.5 jar pingpp-java diff --git a/pingpp-sdk/src/main/java/com/pingplusplus/model/Refund.java b/pingpp-sdk/src/main/java/com/pingplusplus/model/Refund.java index fa94d1d..9120769 100644 --- a/pingpp-sdk/src/main/java/com/pingplusplus/model/Refund.java +++ b/pingpp-sdk/src/main/java/com/pingplusplus/model/Refund.java @@ -8,6 +8,7 @@ public class Refund extends APIResource { String id; + String app; String object; String orderNo; Integer amount; @@ -175,6 +176,14 @@ public String getCurrency() { public void setCurrency(String currency) { this.currency = currency; } + + public String getApp() { + return app; + } + + public void setApp(String app) { + this.app = app; + } /** * 创建 refund * From 9974e441b2c8488f1daa1524e14bda473413ff89 Mon Sep 17 00:00:00 2001 From: "chengliang.zhang" Date: Tue, 13 Jan 2026 15:17:55 +0800 Subject: [PATCH 20/25] =?UTF-8?q?gradle=20distributionUrl=20=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E9=98=BF=E9=87=8C=E4=BA=91=E9=95=9C=E5=83=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f0ced99..68566cb 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-all.zip +distributionUrl=https\://mirrors.aliyun.com/macports/distfiles/gradle/gradle-8.6-all.zip From dcd8f806ce0de8046ad9b49015390110b7f48988 Mon Sep 17 00:00:00 2001 From: "chengliang.zhang" Date: Mon, 19 Jan 2026 17:27:21 +0800 Subject: [PATCH 21/25] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E8=B4=A6=E5=8F=B7=E9=AA=8C=E7=AD=BE=E5=85=AC=E9=92=A5;refund?= =?UTF-8?q?=20=E5=AF=B9=E8=B1=A1=E6=96=B0=E5=A2=9E=E8=BF=94=E5=9B=9E=20app?= =?UTF-8?q?=20=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 4 ++++ README.md | 4 ++-- VERSION | 2 +- example/build.gradle | 2 +- example/src/main/resources/pingpp_public_key.pem | 13 +++++-------- pom.xml | 2 +- 6 files changed, 14 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 364d6e6..41bce62 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # ChangeLog +## 2.5.5 + +-更新: 退款 refund 新增返回 `app` 参数. + ## 2.5.4 - 修正: 修复版本 2.5.3 中存在的 POM 依赖问题。建议用户直接升级到此版本。 diff --git a/README.md b/README.md index 6d090fe..4157f1a 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ mavenCentral com.pingxx pingpp-java - 2.5.4 + 2.5.5 jar ``` @@ -56,7 +56,7 @@ repositories { 安装 Ping++ SDK ``` -implementation 'com.pingxx:pingpp-java:2.5.4' +implementation 'com.pingxx:pingpp-java:2.5.5' ``` ## 初始化 diff --git a/VERSION b/VERSION index d21aa93..160fe39 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.5.4 \ No newline at end of file +2.5.5 \ No newline at end of file diff --git a/example/build.gradle b/example/build.gradle index d82583f..c42040d 100644 --- a/example/build.gradle +++ b/example/build.gradle @@ -7,7 +7,7 @@ dependencies { // 方法 1. 本地文件系统依赖 // implementation fileTree(dir: 'lib', includes: ['*jar']) // 方法 2. 仓库依赖 - // implementation 'com.pingxx:pingpp-java:2.5.4' + // implementation 'com.pingxx:pingpp-java:2.5.5' // 方法 3.模块依赖 implementation project(':pingpp-sdk') } diff --git a/example/src/main/resources/pingpp_public_key.pem b/example/src/main/resources/pingpp_public_key.pem index 2cf7987..c0f5d19 100644 --- a/example/src/main/resources/pingpp_public_key.pem +++ b/example/src/main/resources/pingpp_public_key.pem @@ -1,9 +1,6 @@ -----BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoXV1qdwYGq6lac+EIVxx -1/wGcjjy5InO08QBvUGDQMKAWjg/UvnNmnTZJvxUu18UVtwoHIls24EHZ96im3k0 -DPn43aSGyR417g9rqUL2N1H/0dCNcT8LY8sZL/sw/IV//IQcZYv/8EO6+7SClw+G -Jpib84QfmDgUPbQC0dhl1R1Q8e8RoE/+70yX6OY22kRr14KjRZiVQ0UMZS5KaPwS -FJ1egyNDCLFoLyhRQMV5vDxMdpIvxZuGW+3aTZkW8v/ISXWmSFpI/dlpxHp0+h6p -sdai2RzXYuyzbeOPyQEZkyGfR6BX2Gv/l80nEFNup7uNmAt/be9IdpSZlxpF4HlI -8wIDAQAB ------END PUBLIC KEY----- +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDCJqcTaGUab0vBZSkGNE1AaGiY +RcbPd7QdCQuM8EpbEpEQGr9/NjbJHCLd3eaUmYM0vy34Wux+VHnw4ckiDfBuW6/Z +fIo5GBRCI/nZLOnWcOX98ZAXYnn/VVJXuBtHtHL8DWEbYmMp+Gl4k1rFSuQKk52k +YLXeFJZJV8CBV5jA+wIDAQAB +-----END PUBLIC KEY----- \ No newline at end of file diff --git a/pom.xml b/pom.xml index 62f8f65..8dcba5e 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.pingxx pingpp-java-parent - 2.5.4 + 2.5.5 pom A Java SDK for Ping++ Payment API. From cf7e423209bdc01a653fe2ce96a2581d70f1b913 Mon Sep 17 00:00:00 2001 From: "chengliang.zhang" Date: Mon, 13 Apr 2026 17:47:25 +0800 Subject: [PATCH 22/25] =?UTF-8?q?=E6=9B=B4=E6=96=B0:=20`RequestOptions`=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E`Ping++`=E9=AA=8C=E7=AD=BE=E5=85=AC=E9=92=A5?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 73 ++++++++++++++++++- example/build.gradle | 2 +- .../main/java/com/pingxx/example/Main.java | 64 ++++++++-------- .../main/java/com/pingplusplus/Pingpp.java | 2 +- .../com/pingplusplus/net/RequestOptions.java | 16 ++++ .../java/com/pingplusplus/PingppTest.java | 2 +- 6 files changed, 121 insertions(+), 38 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 41bce62..d36bfe4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # ChangeLog +## 2.5.6 + +- 更新: `RequestOptions` 新增`Ping++`验签公钥设置参数 + ## 2.5.5 -更新: 退款 refund 新增返回 `app` 参数. @@ -34,12 +38,13 @@ > 本次更新有较多与旧版本不兼容的地方。 -- 修改: 支持 JDK 8 及以上; +- 修改: 支持 JDK 8 及以上; - 修改: 异常抛出修改,统一声明为 `PingppException`,实际使用可以再做具体判断; - 废弃: 原接口,支持传 `apiKey` 参数的方法,全部删除,可以用 `RequestOptions` 代替; - 新增: 每个接口最后一个参数支持 `RequestOptions`; - 新增: `PingppException` 增加 `type`、`code`、`statusCode`; -- 新增: 对象增加 `getLastResponse()` 方法,可以用于获取当前这次请求的 `response` 对象,包含 `HTTP Status Code`、`Headers`、`Response Body` 等; +- 新增: 对象增加 `getLastResponse()` 方法,可以用于获取当前这次请求的 `response` 对象,包含 `HTTP Status Code`、`Headers`、 + `Response Body` 等; - 废弃: 取消对 `PKCS1` 格式私钥的支持,请转成 `PKCS8` 再使用; --- @@ -90,25 +95,34 @@ - 移除 `PingppAccount` ## 2.3.8 (2018-05-22) + #### 新增 + - WxLiteOAuth 接口 - Agreement 接口 #### 修改 + - 合并部分内部类 - WxpubOAuth 接口错误时增加异常 ## 2.3.7 (2018-03-16) + #### 新增 + - BalanceSettlement 接口 - CardInfo 接口 ## 2.3.5 (2018-02-27) + #### 修正 + - 部分对象字段从 Integer 改成 Long ## 2.3.4 (2018-01-10) + #### 修改 + - 移除已废弃接口 - 移除 transfer、batch_transfer 取消接口 - 更新示例 @@ -116,137 +130,190 @@ - settle_account 字段更新 ## 2.3.3 (2017-12-27) + #### 修正 + - 修正 javadoc ## 2.3.2 (2017-12-21) + #### 修正 + - 兼容 JDK 1.7 ## 2.3.1 (2017-12-08) + #### 修正 + - Event 解析修正 ## 2.3.0 (2017-12-01) + #### 更改 + - 合并账户系统相关接口 ## 2.2.5 (2017-10-10) + #### 新增 + - 新增重试机制 #### 修改 + - 优化 SDK ## 2.2.4 (2017-06-19) + #### 修改 + - Charge 增加字段 reversed,表示是否已撤销 - 针对渠道 isv_scan, isv_qr_isv_wap 增加撤销方法,`Charge.reverse(CHARGE_ID)` - Refund 增加 extra 字段 ## 2.2.3 (2017-03-27) + #### 修改 + - BatchTransfer 增加字段 ## 2.2.2 (2017-03-21) + #### 修正 + - alipay_pc_direct/alipay_wap 渠道 credential 字段类型的修正 ## 2.2.1 (2017-01-13) + #### 新增 + - 添加 gradle 相关文件 - 添加部分测试文件 - batch_transfer 更新/取消接口 #### 修改 + - 更改签名私钥获取方式 - Charge.list app[id] 参数改为必传 - 红包去除多余的参数 - batch_refund charges 字段格式修改 #### 修正 + - Webhooks 解析对象 batch_refund、batch_transfer、customs 对应事件错误 ## 2.2.0 + #### 新增 + - 添加 BatchRefund、BatchTransfer、Customs #### 修改 + - 签名生成规则变更 - 列表查询接口换成 `list` 方法,代替 `all` 方法 - 退款接口调用方式变更,直接使用 Refund 对象 - Refund 对象添加 charge_order_no, transaction_no 属性 ## 2.1.9 + #### 修改 -- 添加 RateLimitException + +- 添加 RateLimitException - 兼容 http 地址,仅为方便测试 ## 2.1.8 + #### 新增 + - Identification 身份证银行卡接口 ## 2.1.7 + #### 修正 + - RedEnvelope、Transfer 添加字段 ## 2.1.6 + #### 修正 + - 签名内容编码问题 ## 2.1.5 + #### 修改 + - 补充 RedEnvelope、Transfer 缺少字段 ## 2.1.4 + #### 修改 + - 更改 content-type 为 application/json ## 2.1.3 + - 兼容两种微信公众号接入方式 ## 2.1.2 + - 补全确实字段 - 修正 Event 解析 - 修正部分字符 JSON 序列化问题 - 添加请求签名 ## 2.1.1 + - 修正 extra 类型 - 兼容 jdk 1.6 ## 2.1.0 + - 添加应用内快捷支付对应接口 ## 2.0.10 + - 增加 Refund 对象 status 字段 ## 2.0.8 + - 增加 ChannelException ## 2.0.6 + - 增加企业转账、修改红包接口 ## 2.0.5 + - 增加 event sdk ## 2.0.4 + - 更改 sdk 目录格式,修复wx_pub渠道timeStamp 类型问题。 ## 2.0.3 + - 增加 apple pay ,重写 getcredential 方法。 ## 2.0.2 + - 增加微信红包 ## 2.0.1 + #### 更改 + 修改 wx credential 里的 timeStamp 类型为字符串,防止变成科学计数法 ## 2.0.0 + #### 更改 + 添加新渠道支持:百付宝、百付宝WAP、微信公众平台 ## 1.0.4 + #### 更改: + 添加 `Expanding` 机制 diff --git a/example/build.gradle b/example/build.gradle index c42040d..495f667 100644 --- a/example/build.gradle +++ b/example/build.gradle @@ -7,7 +7,7 @@ dependencies { // 方法 1. 本地文件系统依赖 // implementation fileTree(dir: 'lib', includes: ['*jar']) // 方法 2. 仓库依赖 - // implementation 'com.pingxx:pingpp-java:2.5.5' + // implementation 'com.pingxx:pingpp-java:2.5.6' // 方法 3.模块依赖 implementation project(':pingpp-sdk') } diff --git a/example/src/main/java/com/pingxx/example/Main.java b/example/src/main/java/com/pingxx/example/Main.java index c38f9f2..ccb7171 100644 --- a/example/src/main/java/com/pingxx/example/Main.java +++ b/example/src/main/java/com/pingxx/example/Main.java @@ -57,38 +57,38 @@ public static void main(String[] args) throws Exception { // Charge 示例 ChargeExample.runDemos(appId); - - // Refund 示例 - RefundExample.runDemos(); - - // RedEnvelope 示例 - RedEnvelopeExample.runDemos(appId); - - // Transfer 示例 - TransferExample.runDemos(appId); - - // Event 示例 - EventExample.runDemos(); - - // Webhooks 验证示例 - WebhooksVerifyExample.runDemos(); - - // 微信公众号 openid 相关示例 - WxPubOAuthExample.runDemos(appId); - - // 身份证银行卡信息认证接口 - // 请使用 live key 调用该接口 - // IdentificationExample.runDemos(appId); - - // 批量付款示例 - BatchTransferExample.runDemos(appId); - - // 报关 - // 请使用 live key 调用该接口 - CustomsExample.runDemos(appId); - - //签约代扣示例 - AgreementExample.runDemos(appId); +// +// // Refund 示例 +// RefundExample.runDemos(); +// +// // RedEnvelope 示例 +// RedEnvelopeExample.runDemos(appId); +// +// // Transfer 示例 +// TransferExample.runDemos(appId); +// +// // Event 示例 +// EventExample.runDemos(); +// +// // Webhooks 验证示例 +// WebhooksVerifyExample.runDemos(); +// +// // 微信公众号 openid 相关示例 +// WxPubOAuthExample.runDemos(appId); +// +// // 身份证银行卡信息认证接口 +// // 请使用 live key 调用该接口 +// // IdentificationExample.runDemos(appId); +// +// // 批量付款示例 +// BatchTransferExample.runDemos(appId); +// +// // 报关 +// // 请使用 live key 调用该接口 +// CustomsExample.runDemos(appId); +// +// //签约代扣示例 +// AgreementExample.runDemos(appId); } private static final SecureRandom random = new SecureRandom(); diff --git a/pingpp-sdk/src/main/java/com/pingplusplus/Pingpp.java b/pingpp-sdk/src/main/java/com/pingplusplus/Pingpp.java index 986c5b7..444f8b4 100644 --- a/pingpp-sdk/src/main/java/com/pingplusplus/Pingpp.java +++ b/pingpp-sdk/src/main/java/com/pingplusplus/Pingpp.java @@ -17,7 +17,7 @@ public abstract class Pingpp { /** * version */ - public static final String VERSION = "2.5.3"; + public static final String VERSION = "2.5.6"; /** * api key */ diff --git a/pingpp-sdk/src/main/java/com/pingplusplus/net/RequestOptions.java b/pingpp-sdk/src/main/java/com/pingplusplus/net/RequestOptions.java index 91f14bd..7a2b165 100644 --- a/pingpp-sdk/src/main/java/com/pingplusplus/net/RequestOptions.java +++ b/pingpp-sdk/src/main/java/com/pingplusplus/net/RequestOptions.java @@ -88,12 +88,23 @@ public static final class RequestOptionsBuilder { private int readTimeout; private int maxNetworkRetries; private String acceptLanguage; + + public String getVerifyPublicKey() { + return verifyPublicKey; + } + + public RequestOptionsBuilder setVerifyPublicKey(String verifyPublicKey) { + this.verifyPublicKey = normalizePublicVerifyKey(verifyPublicKey); + return this; + } + private String verifyPublicKey; public RequestOptionsBuilder() { this.apiKey = Pingpp.apiKey; this.appId = Pingpp.appId; this.privateKey = Pingpp.privateKey; + this.verifyPublicKey = Pingpp.verifyPublicKey; this.connectTimeout = Pingpp.getConnectTimeout(); this.readTimeout = Pingpp.getReadTimeout(); this.maxNetworkRetries = Pingpp.getMaxNetworkRetries(); @@ -132,6 +143,11 @@ public RequestOptionsBuilder setPrivateKey(String privateKey) { return this; } + public RequestOptionsBuilder clearVerifyPublicKey() { + this.verifyPublicKey = null; + return this; + } + public RequestOptionsBuilder clearAppId() { this.appId = null; return this; diff --git a/pingpp-sdk/src/test/java/com/pingplusplus/PingppTest.java b/pingpp-sdk/src/test/java/com/pingplusplus/PingppTest.java index 949bbac..368100a 100644 --- a/pingpp-sdk/src/test/java/com/pingplusplus/PingppTest.java +++ b/pingpp-sdk/src/test/java/com/pingplusplus/PingppTest.java @@ -74,7 +74,7 @@ public class PingppTest { } @Test public void testVerifyVersions() { - assertEquals("Pingpp.VERSION should match", "2.5.0", Pingpp.VERSION); + assertEquals("Pingpp.VERSION should match", "2.5.6", Pingpp.VERSION); } @Test public void testCreateCharge() { From 98e7945ffd95cef73e7949c5007b7fd0d5d47132 Mon Sep 17 00:00:00 2001 From: "chengliang.zhang" Date: Mon, 13 Apr 2026 17:53:09 +0800 Subject: [PATCH 23/25] uncomment --- .../main/java/com/pingxx/example/Main.java | 64 +++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/example/src/main/java/com/pingxx/example/Main.java b/example/src/main/java/com/pingxx/example/Main.java index ccb7171..c38f9f2 100644 --- a/example/src/main/java/com/pingxx/example/Main.java +++ b/example/src/main/java/com/pingxx/example/Main.java @@ -57,38 +57,38 @@ public static void main(String[] args) throws Exception { // Charge 示例 ChargeExample.runDemos(appId); -// -// // Refund 示例 -// RefundExample.runDemos(); -// -// // RedEnvelope 示例 -// RedEnvelopeExample.runDemos(appId); -// -// // Transfer 示例 -// TransferExample.runDemos(appId); -// -// // Event 示例 -// EventExample.runDemos(); -// -// // Webhooks 验证示例 -// WebhooksVerifyExample.runDemos(); -// -// // 微信公众号 openid 相关示例 -// WxPubOAuthExample.runDemos(appId); -// -// // 身份证银行卡信息认证接口 -// // 请使用 live key 调用该接口 -// // IdentificationExample.runDemos(appId); -// -// // 批量付款示例 -// BatchTransferExample.runDemos(appId); -// -// // 报关 -// // 请使用 live key 调用该接口 -// CustomsExample.runDemos(appId); -// -// //签约代扣示例 -// AgreementExample.runDemos(appId); + + // Refund 示例 + RefundExample.runDemos(); + + // RedEnvelope 示例 + RedEnvelopeExample.runDemos(appId); + + // Transfer 示例 + TransferExample.runDemos(appId); + + // Event 示例 + EventExample.runDemos(); + + // Webhooks 验证示例 + WebhooksVerifyExample.runDemos(); + + // 微信公众号 openid 相关示例 + WxPubOAuthExample.runDemos(appId); + + // 身份证银行卡信息认证接口 + // 请使用 live key 调用该接口 + // IdentificationExample.runDemos(appId); + + // 批量付款示例 + BatchTransferExample.runDemos(appId); + + // 报关 + // 请使用 live key 调用该接口 + CustomsExample.runDemos(appId); + + //签约代扣示例 + AgreementExample.runDemos(appId); } private static final SecureRandom random = new SecureRandom(); From d313e37d3f396ac0d804ae24b3648024a379884c Mon Sep 17 00:00:00 2001 From: "chengliang.zhang" Date: Mon, 13 Apr 2026 18:38:42 +0800 Subject: [PATCH 24/25] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7=E5=88=B02.5.6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- VERSION | 2 +- pom.xml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 4157f1a..1a8a82c 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ mavenCentral com.pingxx pingpp-java - 2.5.5 + 2.5.6 jar ``` @@ -56,7 +56,7 @@ repositories { 安装 Ping++ SDK ``` -implementation 'com.pingxx:pingpp-java:2.5.5' +implementation 'com.pingxx:pingpp-java:2.5.6' ``` ## 初始化 diff --git a/VERSION b/VERSION index 160fe39..1b03fe6 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.5.5 \ No newline at end of file +2.5.6 \ No newline at end of file diff --git a/pom.xml b/pom.xml index 8dcba5e..71f3e19 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.pingxx pingpp-java-parent - 2.5.5 + 2.5.6 pom A Java SDK for Ping++ Payment API. From 2461d32cc24f1cbc4b26c89a4fdf357d18bb6886 Mon Sep 17 00:00:00 2001 From: "chengliang.zhang" Date: Mon, 13 Apr 2026 18:40:11 +0800 Subject: [PATCH 25/25] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7=E5=88=B02.5.6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pingpp-sdk/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pingpp-sdk/pom.xml b/pingpp-sdk/pom.xml index f881d71..ab60a11 100644 --- a/pingpp-sdk/pom.xml +++ b/pingpp-sdk/pom.xml @@ -5,7 +5,7 @@ com.pingxx pingpp-java - 2.5.5 + 2.5.6 jar pingpp-java