pom.xml
@@ -12,6 +12,7 @@ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <org.springframework-version>4.3.0.RELEASE</org.springframework-version> <spring.mongodb.version>1.10.10.RELEASE</spring.mongodb.version> <kafka.client.version>0.10.1.1</kafka.client.version> </properties> <dependencies> @@ -274,26 +275,6 @@ <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>vpush</groupId> <artifactId>vpush-server-sdk</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>opush</groupId> <artifactId>opush-server-sdk</artifactId> <version>1.0.6</version> </dependency> <dependency> <groupId>mipush</groupId> <artifactId>MiPush_SDK_Server_Http</artifactId> <version>1.0.11</version> </dependency> <dependency> <groupId>ok-http</groupId> <artifactId>okhttp</artifactId> @@ -304,6 +285,58 @@ <groupId>okio</groupId> <artifactId>okio</artifactId> <version>1.17.2</version> </dependency> <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-core --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.2.3</version> </dependency> <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <!-- kafka --> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>${kafka.client.version}</version> <scope>compile</scope> <exclusions> <exclusion> <artifactId>slf4j-api</artifactId> <groupId>org.slf4j</groupId> </exclusion> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka_2.11</artifactId> <version>${kafka.client.version}</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency> @@ -351,6 +384,21 @@ <version>2.5.2</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.4</version> <executions> <execution> <id>attach-sources</id> <phase>verify</phase><!-- 要绑定到的生命周期的阶段 在verify之后,install之前执行下面指定的goal --> <goals> <goal>jar-no-fork</goal><!-- 类似执行mvn source:jar --> </goals> </execution> </executions> </plugin> </plugins> <resources> src/main/java/com/huawei/push/android/AndroidNotification.java
File was deleted src/main/java/com/huawei/push/android/BadgeNotification.java
File was deleted src/main/java/com/huawei/push/android/Button.java
File was deleted src/main/java/com/huawei/push/android/ClickAction.java
File was deleted src/main/java/com/huawei/push/android/Color.java
File was deleted src/main/java/com/huawei/push/android/LightSettings.java
File was deleted src/main/java/com/huawei/push/apns/Alert.java
File was deleted src/main/java/com/huawei/push/apns/ApnsHeaders.java
File was deleted src/main/java/com/huawei/push/apns/ApnsHmsOptions.java
File was deleted src/main/java/com/huawei/push/apns/Aps.java
File was deleted src/main/java/com/huawei/push/examples/SendApnsMessage.java
File was deleted src/main/java/com/huawei/push/examples/SendConditionMessage.java
File was deleted src/main/java/com/huawei/push/examples/SendDataMessage.java
File was deleted src/main/java/com/huawei/push/examples/SendInstanceAppMessage.java
File was deleted src/main/java/com/huawei/push/examples/SendNotifyMessage.java
File was deleted src/main/java/com/huawei/push/examples/SendTestMessage.java
File was deleted src/main/java/com/huawei/push/examples/SendTopicMessage.java
File was deleted src/main/java/com/huawei/push/examples/SendWebpushMessage.java
File was deleted src/main/java/com/huawei/push/exception/HuaweiException.java
File was deleted src/main/java/com/huawei/push/exception/HuaweiMesssagingException.java
File was deleted src/main/java/com/huawei/push/message/AndroidConfig.java
File was deleted src/main/java/com/huawei/push/message/ApnsConfig.java
File was deleted src/main/java/com/huawei/push/message/Message.java
File was deleted src/main/java/com/huawei/push/message/Notification.java
File was deleted src/main/java/com/huawei/push/message/TokenMessage.java
File was deleted src/main/java/com/huawei/push/message/TopicMessage.java
File was deleted src/main/java/com/huawei/push/message/WebPushConfig.java
File was deleted src/main/java/com/huawei/push/messaging/HuaweiApp.java
File was deleted src/main/java/com/huawei/push/messaging/HuaweiCredential.java
File was deleted src/main/java/com/huawei/push/messaging/HuaweiMessageClient.java
File was deleted src/main/java/com/huawei/push/messaging/HuaweiMessageClientImpl.java
File was deleted src/main/java/com/huawei/push/messaging/HuaweiMessaging.java
File was deleted src/main/java/com/huawei/push/messaging/HuaweiOption.java
File was deleted src/main/java/com/huawei/push/messaging/HuaweiScheduledExecutor.java
File was deleted src/main/java/com/huawei/push/messaging/HuaweiService.java
File was deleted src/main/java/com/huawei/push/messaging/HuaweiThreadManager.java
File was deleted src/main/java/com/huawei/push/messaging/ImplHuaweiTrampolines.java
File was deleted src/main/java/com/huawei/push/messaging/ThreadManager.java
File was deleted src/main/java/com/huawei/push/messaging/TokenRefresher.java
File was deleted src/main/java/com/huawei/push/model/Importance.java
File was deleted src/main/java/com/huawei/push/model/TopicOperation.java
File was deleted src/main/java/com/huawei/push/model/Urgency.java
File was deleted src/main/java/com/huawei/push/model/Visibility.java
File was deleted src/main/java/com/huawei/push/reponse/SendResponse.java
File was deleted src/main/java/com/huawei/push/reponse/TopicListResponse.java
File was deleted src/main/java/com/huawei/push/reponse/TopicSendResponse.java
File was deleted src/main/java/com/huawei/push/util/CollectionUtils.java
File was deleted src/main/java/com/huawei/push/util/IgnoreSSLUtils.java
File was deleted src/main/java/com/huawei/push/util/InitAppUtils.java
File was deleted src/main/java/com/huawei/push/util/ResponceCodeProcesser.java
File was deleted src/main/java/com/huawei/push/util/ValidatorUtils.java
File was deleted src/main/java/com/huawei/push/webpush/WebActions.java
File was deleted src/main/java/com/huawei/push/webpush/WebHmsOptions.java
File was deleted src/main/java/com/huawei/push/webpush/WebNotification.java
File was deleted src/main/java/com/huawei/push/webpush/WebpushHeaders.java
File was deleted src/main/java/org/yeshi/utils/ios/pay/IOSPayVerifyUtil.java
New file @@ -0,0 +1,111 @@ package org.yeshi.utils.ios.pay; import com.google.gson.Gson; import net.sf.json.JSONObject; import org.yeshi.utils.HttpUtil; import org.yeshi.utils.ios.pay.vo.IOSAPPBuyVerifyResult; import javax.net.ssl.*; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.Locale; public class IOSPayVerifyUtil { private static class TrustAnyTrustManager implements X509TrustManager { public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[]{}; } } private static class TrustAnyHostnameVerifier implements HostnameVerifier { public boolean verify(String hostname, SSLSession session) { return true; } } private static final String url_sandbox = "https://sandbox.itunes.apple.com/verifyReceipt"; private static final String url_verify = "https://buy.itunes.apple.com/verifyReceipt"; /** * 应用内购验证 * * @param receipt * @param sandbox * @return */ public static IOSAPPBuyVerifyResult buyAppVerify(String receipt, String password, boolean sandbox) throws Exception { //环境判断 线上/开发环境用不同的请求链接 String url = ""; if (sandbox) { url = url_sandbox; //沙盒测试 } else { url = url_verify; //线上测试 } try { SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom()); URL console = new URL(url); HttpsURLConnection conn = (HttpsURLConnection) console.openConnection(); conn.setSSLSocketFactory(sc.getSocketFactory()); conn.setHostnameVerifier(new TrustAnyHostnameVerifier()); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json"); conn.setRequestProperty("Proxy-Connection", "Keep-Alive"); conn.setDoInput(true); conn.setDoOutput(true); BufferedOutputStream hurlBufOus = new BufferedOutputStream(conn.getOutputStream()); JSONObject data = new JSONObject(); data.put("receipt-data", receipt); if (password != null) data.put("password", password); String str = String.format(Locale.CHINA, data.toString());//拼成固定的格式传给平台 hurlBufOus.write(str.getBytes()); hurlBufOus.flush(); InputStream is = conn.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); String line = null; StringBuffer sb = new StringBuffer(); while ((line = reader.readLine()) != null) { sb.append(line); } System.out.println(sb.toString()); JSONObject root = JSONObject.fromObject(sb.toString()); if (root.optInt("status") != 0) { throw new Exception("苹果服务器返回的状态出错:" + sb.toString()); } JSONObject receiptNew = root.optJSONObject("receipt"); Gson gson = new Gson(); IOSAPPBuyVerifyResult verifyResult = gson.fromJson(receiptNew.toString(), IOSAPPBuyVerifyResult.class); return verifyResult; } catch (Exception ex) { ex.printStackTrace(); throw new Exception("苹果服务器异常:" + ex.getMessage()); } } public static void main(String[] args) { String receiptData = "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"; try { IOSAPPBuyVerifyResult result= buyAppVerify(receiptData, "28ca52e358b94c4eba3de41dfa7dd023", true); System.out.println(result); } catch (Exception e) { e.printStackTrace(); } } } src/main/java/org/yeshi/utils/ios/pay/vo/IOSAPPBuyVerifyResult.java
New file @@ -0,0 +1,162 @@ package org.yeshi.utils.ios.pay.vo; import com.google.gson.annotations.SerializedName; import java.util.Date; import java.util.List; public class IOSAPPBuyVerifyResult { @SerializedName("bundle_id") private String bundleId; @SerializedName("application_version") private String applicationVersion; @SerializedName("receipt_creation_date_ms") private Long receiptCreationDateMs; @SerializedName("receipt_creation_date") private Date receiptCreationDate; @SerializedName("request_date") private Date requestDate; @SerializedName("request_date_ms") private Long requestDateMs; @SerializedName("in_app") private List<OrderInfo> inApps; public String getBundleId() { return bundleId; } public void setBundleId(String bundleId) { this.bundleId = bundleId; } public String getApplicationVersion() { return applicationVersion; } public void setApplicationVersion(String applicationVersion) { this.applicationVersion = applicationVersion; } public Long getReceiptCreationDateMs() { return receiptCreationDateMs; } public void setReceiptCreationDateMs(Long receiptCreationDateMs) { this.receiptCreationDateMs = receiptCreationDateMs; } public Date getReceiptCreationDate() { return receiptCreationDate; } public void setReceiptCreationDate(Date receiptCreationDate) { this.receiptCreationDate = receiptCreationDate; } public Date getRequestDate() { return requestDate; } public void setRequestDate(Date requestDate) { this.requestDate = requestDate; } public Long getRequestDateMs() { return requestDateMs; } public void setRequestDateMs(Long requestDateMs) { this.requestDateMs = requestDateMs; } public List<OrderInfo> getInApps() { return inApps; } public void setInApps(List<OrderInfo> inApps) { this.inApps = inApps; } public static class OrderInfo { private int quantity;//数量 @SerializedName("product_id") private String product_id;//商品编号 @SerializedName("transaction_id") private String transactionId;//订单号 @SerializedName("original_transaction_id") private String originalTransactionId;//原始订单号 @SerializedName("purchase_date") private Date purchaseDate;//付款日期 @SerializedName("purchase_date_ms") private long purchaseDateMs; @SerializedName("original_purchase_date") private Date originalPurchaseDate;//原始付款日期 @SerializedName("original_purchase_date_ms") private Long originalPurchaseDateMs; public int getQuantity() { return quantity; } public void setQuantity(int quantity) { this.quantity = quantity; } public String getProduct_id() { return product_id; } public void setProduct_id(String product_id) { this.product_id = product_id; } public String getTransactionId() { return transactionId; } public void setTransactionId(String transactionId) { this.transactionId = transactionId; } public String getOriginalTransactionId() { return originalTransactionId; } public void setOriginalTransactionId(String originalTransactionId) { this.originalTransactionId = originalTransactionId; } public Date getPurchaseDate() { return purchaseDate; } public void setPurchaseDate(Date purchaseDate) { this.purchaseDate = purchaseDate; } public long getPurchaseDateMs() { return purchaseDateMs; } public void setPurchaseDateMs(long purchaseDateMs) { this.purchaseDateMs = purchaseDateMs; } public Date getOriginalPurchaseDate() { return originalPurchaseDate; } public void setOriginalPurchaseDate(Date originalPurchaseDate) { this.originalPurchaseDate = originalPurchaseDate; } public Long getOriginalPurchaseDateMs() { return originalPurchaseDateMs; } public void setOriginalPurchaseDateMs(Long originalPurchaseDateMs) { this.originalPurchaseDateMs = originalPurchaseDateMs; } } } src/main/java/org/yeshi/utils/log/KafkaAppender.java
New file @@ -0,0 +1,144 @@ package org.yeshi.utils.log; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.ConsoleAppender; import org.apache.kafka.clients.producer.Callback; import org.apache.kafka.clients.producer.Producer; import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.clients.producer.RecordMetadata; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class KafkaAppender extends ConsoleAppender<ILoggingEvent> { public static final Logger LOGGER = LoggerFactory.getLogger(KafkaAppender.class); private String bootstrapServers; private String topic; private String batchSize; private String lingerMs; private String compressionType; private String retries; private String maxRequestSize; private String isSend; private Producer<String, String> producer; public KafkaAppender(){ } @Override public void start() { super.start(); if ("true".equals(this.isSend)) { if (producer == null) { producer = KafkaUtil.createProducer(this.bootstrapServers, this.batchSize, this.lingerMs, this.compressionType, this.retries, this.maxRequestSize, "", ""); } } } @Override public void stop() { super.stop(); if ("true".equals(this.isSend)) { this.producer.close(); } LOGGER.info("Stopping kafkaAppender..."); } @Override protected void append(ILoggingEvent eventObject) { byte[] byteArray; String log; // 对日志格式进行解码 byteArray = this.encoder.encode(eventObject); log = new String(byteArray); ProducerRecord<String, String> record = new ProducerRecord<>(this.topic, log); if (eventObject.getMarker() == null && "true".equals(this.isSend)) { //如果需要进行分析日志,可以对record进行数据结构重构下 producer.send(record, new Callback() { @Override public void onCompletion(RecordMetadata metadata, Exception exception) { if (exception != null) { LOGGER.error("Send log to kafka failed: [{}]", log); } } }); } } public String getBootstrapServers() { return bootstrapServers; } public void setBootstrapServers(String bootstrapServers) { this.bootstrapServers = bootstrapServers; } public String getTopic() { return topic; } public void setTopic(String topic) { this.topic = topic; } public String getBatchSize() { return batchSize; } public void setBatchSize(String batchSize) { this.batchSize = batchSize; } public String getLingerMs() { return lingerMs; } public void setLingerMs(String lingerMs) { this.lingerMs = lingerMs; } public String getCompressionType() { return compressionType; } public void setCompressionType(String compressionType) { this.compressionType = compressionType; } public String getRetries() { return retries; } public void setRetries(String retries) { this.retries = retries; } public String getMaxRequestSize() { return maxRequestSize; } public void setMaxRequestSize(String maxRequestSize) { this.maxRequestSize = maxRequestSize; } public String getIsSend() { return isSend; } public void setIsSend(String isSend) { this.isSend = isSend; } public Producer<String, String> getProducer() { return producer; } public void setProducer(Producer<String, String> producer) { this.producer = producer; } } src/main/java/org/yeshi/utils/log/KafkaUtil.java
New file @@ -0,0 +1,66 @@ package org.yeshi.utils.log; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.Producer; import org.apache.kafka.clients.producer.ProducerConfig; import java.util.Properties; public class KafkaUtil { public static Producer<String, String> createProducer( String bootstrapServers, String batchSize, String lingerMs, String compressionType, String retries, String maxRequestSize, String username, String password) { // 当配置项为IS_UNDEFINED时,使用默认值 if (bootstrapServers == null) { bootstrapServers = "kafka地址"; } if (batchSize.contains("IS_UNDEFINED")) { batchSize = "50000"; } if (lingerMs.contains("IS_UNDEFINED")) { lingerMs = "60000"; } if (retries.contains("IS_UNDEFINED")) { retries = "3"; } if (maxRequestSize.contains("IS_UNDEFINED")) { maxRequestSize = "5242880"; } Properties properties = new Properties(); // kafka地址,集群用逗号分隔开 properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); // acks取值: // 0: kafka不返回确认信息,不保证record是否被收到,因为没有返回所以重试机制不会生效 // 1: partition leader确认record写入到日志中,但不保证信息是否被正确复制 // all: leader会等待所有信息被同步后返回确认信息 properties.put(ProducerConfig.ACKS_CONFIG, "1"); properties.put(ProducerConfig.RETRIES_CONFIG, Integer.valueOf(retries)); // 批量发送,当达到batch size最大值触发发送机制(10.0后支持批量发送) properties.put(ProducerConfig.BATCH_SIZE_CONFIG, Integer.valueOf(batchSize)); // 该配置是指在batch.size数量未达到时,指定时间内也会推送数据 properties.put(ProducerConfig.LINGER_MS_CONFIG, Integer.valueOf(lingerMs)); // 配置缓存 properties.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 33554432); if (!compressionType.contains("IS_UNDEFINED")) { // 指定压缩算法 properties.put(ProducerConfig.COMPRESSION_TYPE_CONFIG, compressionType); } // 每个请求的消息大小 properties.put(ProducerConfig.MAX_REQUEST_SIZE_CONFIG, Integer.valueOf(maxRequestSize)); properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer"); properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer"); if (!"".equals(username)) { properties.put("security.protocol", "SASL_PLAINTEXT"); properties.put("sasl.mechanism", "PLAIN"); properties.put("sasl.jaas.config", "org.apache.kafka.common.security.scram.ScramLoginModule required username=\"" + "用戶名" + "\" password=\"" + "密碼" + "\";"); } return new KafkaProducer<String, String>(properties); } } src/main/java/org/yeshi/utils/push/HuaWeiPushUtil.java
File was deleted src/main/java/org/yeshi/utils/push/MeiZuPushUtil.java
File was deleted src/main/java/org/yeshi/utils/push/OppoPushUtil.java
File was deleted src/main/java/org/yeshi/utils/push/VIVOPushUtil.java
File was deleted src/main/java/org/yeshi/utils/push/XiaoMiPushUtil.java
File was deleted