From bfe2af67c3def43ab46f84ac0639f0cae0e10e89 Mon Sep 17 00:00:00 2001 From: renjianbo <18691577328@qq.com> Date: Mon, 29 Dec 2025 15:20:51 +0800 Subject: [PATCH] first commit --- opush-server-sdk-1.1.0.jar | Bin 0 -> 39706 bytes pom.xml | 85 ++++ .../com/oppo/push/OppoPushApplication.java | 21 + .../com/oppo/push/config/OppoPushConfig.java | 44 ++ .../oppo/push/controller/PushController.java | 75 ++++ .../oppo/push/service/OppoPushService.java | 212 ++++++++++ src/main/resources/application.properties | 16 + .../spring-configuration-metadata.json | 48 +++ target/classes/application.properties | 16 + .../com/oppo/push/OppoPushApplication.class | Bin 0 -> 1081 bytes .../com/oppo/push/config/OppoPushConfig.class | Bin 0 -> 4218 bytes .../oppo/push/controller/PushController.class | Bin 0 -> 3286 bytes .../oppo/push/service/OppoPushService.class | Bin 0 -> 9952 bytes test-request.json | 7 + 调测使用说明.txt | 388 ++++++++++++++++++ 通讯与服务类消息说明.md | 136 ++++++ 16 files changed, 1048 insertions(+) create mode 100644 opush-server-sdk-1.1.0.jar create mode 100644 pom.xml create mode 100644 src/main/java/com/oppo/push/OppoPushApplication.java create mode 100644 src/main/java/com/oppo/push/config/OppoPushConfig.java create mode 100644 src/main/java/com/oppo/push/controller/PushController.java create mode 100644 src/main/java/com/oppo/push/service/OppoPushService.java create mode 100644 src/main/resources/application.properties create mode 100644 target/classes/META-INF/spring-configuration-metadata.json create mode 100644 target/classes/application.properties create mode 100644 target/classes/com/oppo/push/OppoPushApplication.class create mode 100644 target/classes/com/oppo/push/config/OppoPushConfig.class create mode 100644 target/classes/com/oppo/push/controller/PushController.class create mode 100644 target/classes/com/oppo/push/service/OppoPushService.class create mode 100644 test-request.json create mode 100644 调测使用说明.txt create mode 100644 通讯与服务类消息说明.md diff --git a/opush-server-sdk-1.1.0.jar b/opush-server-sdk-1.1.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..81ac628ef4a2f9e516449a635c33e4c223e3168f GIT binary patch literal 39706 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 literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..120c905 --- /dev/null +++ b/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + com.oppo.push + oppo-push-server + 1.0.0 + jar + + OPPO Push Server + OPPO推送服务测试后台 + + + 1.8 + 1.8 + 1.8 + UTF-8 + 2.7.0 + + + + + + org.springframework.boot + spring-boot-starter-web + ${spring-boot.version} + + + + + org.springframework.boot + spring-boot-configuration-processor + ${spring-boot.version} + true + + + + + com.oppo.push + opush-server-sdk + 1.1.0 + system + ${project.basedir}/opush-server-sdk-1.1.0.jar + + + + + org.apache.httpcomponents + httpclient + 4.5.13 + + + + + com.alibaba + fastjson + 1.2.83 + + + + + org.projectlombok + lombok + 1.18.24 + provided + + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + true + + + + + + diff --git a/src/main/java/com/oppo/push/OppoPushApplication.java b/src/main/java/com/oppo/push/OppoPushApplication.java new file mode 100644 index 0000000..d57be47 --- /dev/null +++ b/src/main/java/com/oppo/push/OppoPushApplication.java @@ -0,0 +1,21 @@ +package com.oppo.push; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * OPPO推送服务主应用 + */ +@SpringBootApplication +public class OppoPushApplication { + + public static void main(String[] args) { + SpringApplication.run(OppoPushApplication.class, args); + System.out.println("========================================"); + System.out.println("OPPO推送服务已启动"); + System.out.println("API地址: http://localhost:8080/api/push"); + System.out.println("健康检查: http://localhost:8080/api/push/health"); + System.out.println("========================================"); + } +} + diff --git a/src/main/java/com/oppo/push/config/OppoPushConfig.java b/src/main/java/com/oppo/push/config/OppoPushConfig.java new file mode 100644 index 0000000..e319cd8 --- /dev/null +++ b/src/main/java/com/oppo/push/config/OppoPushConfig.java @@ -0,0 +1,44 @@ +package com.oppo.push.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * OPPO推送服务配置类 + */ +@Data +@Configuration +@ConfigurationProperties(prefix = "oppo.push") +public class OppoPushConfig { + /** + * 应用Key + */ + private String appKey; + + /** + * 应用密钥 + */ + private String appSecret; + + /** + * 主密钥 + */ + private String masterSecret; + + /** + * API地址 + */ + private String apiUrl = "https://api.push.oppo.com"; + + /** + * 通讯与服务(原私信)频道ID + */ + private String channelIdIm = "previte_message"; + + /** + * 通讯与服务(原私信)频道名称 + */ + private String channelNameIm = "消息推送"; +} + diff --git a/src/main/java/com/oppo/push/controller/PushController.java b/src/main/java/com/oppo/push/controller/PushController.java new file mode 100644 index 0000000..607be3b --- /dev/null +++ b/src/main/java/com/oppo/push/controller/PushController.java @@ -0,0 +1,75 @@ +package com.oppo.push.controller; + +import com.oppo.push.service.OppoPushService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.Map; + +/** + * 推送测试控制器 + */ +@Slf4j +@RestController +@RequestMapping("/api/push") +public class PushController { + + @Autowired + private OppoPushService pushService; + + /** + * 测试发送通讯与服务(原私信)类消息 + * + * @param request 请求参数 + * @return 推送结果 + */ + @PostMapping("/send") + public Map sendMessage(@RequestBody Map request) { + String targetValue = request.get("targetValue"); // registration_id或alias + String title = request.get("title"); + String content = request.get("content"); + String messageType = request.getOrDefault("messageType", "1"); // 1:通知栏消息, 2:透传消息 + + if (targetValue == null || title == null || content == null) { + Map error = new HashMap<>(); + error.put("success", false); + error.put("message", "参数不完整:需要targetValue、title、content"); + return error; + } + + return pushService.sendMessage(targetValue, title, content, Integer.parseInt(messageType)); + } + + /** + * 获取Access Token(用于测试) + */ + @GetMapping("/token") + public Map getToken() { + try { + String token = pushService.getAccessToken(); + Map result = new HashMap<>(); + result.put("success", true); + result.put("token", token); + return result; + } catch (Exception e) { + Map result = new HashMap<>(); + result.put("success", false); + result.put("message", e.getMessage()); + return result; + } + } + + /** + * 健康检查 + */ + @GetMapping("/health") + public Map health() { + Map result = new HashMap<>(); + result.put("status", "ok"); + result.put("service", "OPPO Push Server"); + return result; + } +} + diff --git a/src/main/java/com/oppo/push/service/OppoPushService.java b/src/main/java/com/oppo/push/service/OppoPushService.java new file mode 100644 index 0000000..1084ff2 --- /dev/null +++ b/src/main/java/com/oppo/push/service/OppoPushService.java @@ -0,0 +1,212 @@ +package com.oppo.push.service; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.oppo.push.config.OppoPushConfig; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; + +/** + * OPPO推送服务类 + */ +@Slf4j +@Service +public class OppoPushService { + + @Autowired + private OppoPushConfig config; + + private String accessToken; + private long tokenExpireTime; + + /** + * 获取Access Token + */ + public String getAccessToken() { + // 如果token未过期,直接返回 + if (accessToken != null && System.currentTimeMillis() < tokenExpireTime) { + return accessToken; + } + + try { + String url = config.getApiUrl() + "/v1/auth"; + + long timestamp = System.currentTimeMillis(); + Map params = new HashMap<>(); + params.put("app_key", config.getAppKey()); + params.put("timestamp", timestamp); + params.put("sign", generateSign(config.getAppKey(), timestamp, config.getMasterSecret())); + + String response = sendPostRequest(url, JSON.toJSONString(params)); + JSONObject jsonResponse = JSON.parseObject(response); + + if (jsonResponse.getInteger("code") == 0) { + accessToken = jsonResponse.getString("data"); + // token有效期通常为24小时,这里设置为23小时,提前刷新 + tokenExpireTime = System.currentTimeMillis() + 23 * 60 * 60 * 1000; + log.info("获取Access Token成功: {}", accessToken); + return accessToken; + } else { + log.error("获取Access Token失败: {}", response); + throw new RuntimeException("获取Access Token失败: " + jsonResponse.getString("message")); + } + } catch (Exception e) { + log.error("获取Access Token异常", e); + throw new RuntimeException("获取Access Token异常", e); + } + } + + /** + * 发送通讯与服务(原私信)类消息 + * + * @param targetValue 目标值(可以是token、registration_id等) + * @param title 消息标题 + * @param content 消息内容 + * @param messageType 消息类型(1:通知栏消息, 2:透传消息) + * @return 推送结果 + */ + public Map sendMessage(String targetValue, String title, String content, int messageType) { + try { + String token = getAccessToken(); + String url = config.getApiUrl() + "/v1/message/notification/single"; + + // 构建消息体 + Map message = new HashMap<>(); + message.put("target_type", 1); // 1:registration_id, 2:alias, 3:tag + message.put("target_value", targetValue); + + // 通知栏消息参数 + Map notification = new HashMap<>(); + notification.put("title", title); + notification.put("content", content); + notification.put("click_action_type", 1); // 1:打开应用首页, 2:打开应用内页, 3:打开网页, 4:打开应用内页(Intent) + notification.put("click_action_type_value", ""); + + // 通讯与服务(原私信)类消息特殊参数 + // 根据OPPO官方文档,通讯与服务类消息需要设置channel_id和channel_name + notification.put("channel_id", config.getChannelIdIm()); // 通讯与服务频道ID: previte_message + notification.put("channel_name", config.getChannelNameIm()); // 频道名称: 消息推送 + + // extra参数(可选,用于传递额外信息) + Map extra = new HashMap<>(); + extra.put("message_type", "chat"); // 标识为私信类消息 + notification.put("extra", extra); + + message.put("notification", notification); + + // 请求头 + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json;charset=UTF-8"); + headers.put("auth_token", token); + + String response = sendPostRequestWithHeaders(url, JSON.toJSONString(message), headers); + JSONObject jsonResponse = JSON.parseObject(response); + + Map result = new HashMap<>(); + result.put("success", jsonResponse.getInteger("code") == 0); + result.put("code", jsonResponse.getInteger("code")); + result.put("message", jsonResponse.getString("message")); + result.put("data", jsonResponse.get("data")); + + log.info("发送消息结果: {}", result); + return result; + } catch (Exception e) { + log.error("发送消息异常", e); + Map result = new HashMap<>(); + result.put("success", false); + result.put("message", "发送消息异常: " + e.getMessage()); + return result; + } + } + + /** + * 发送单点推送(使用SDK方式) + */ + public Map sendSinglePush(String registrationId, String title, String content) { + try { + // 这里使用OPPO SDK的方式发送 + // 注意:需要根据实际的SDK API进行调整 + return sendMessage(registrationId, title, content, 1); + } catch (Exception e) { + log.error("发送单点推送异常", e); + Map result = new HashMap<>(); + result.put("success", false); + result.put("message", "发送单点推送异常: " + e.getMessage()); + return result; + } + } + + /** + * 生成签名 + * 签名算法:MD5(app_key + timestamp + master_secret) + */ + private String generateSign(String appKey, long timestamp, String masterSecret) { + try { + String signStr = appKey + timestamp + masterSecret; + java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5"); + byte[] bytes = md.digest(signStr.getBytes(StandardCharsets.UTF_8)); + StringBuilder sb = new StringBuilder(); + for (byte b : bytes) { + sb.append(String.format("%02x", b)); + } + return sb.toString(); + } catch (Exception e) { + throw new RuntimeException("生成签名失败", e); + } + } + + /** + * 发送POST请求 + */ + private String sendPostRequest(String url, String jsonBody) throws Exception { + CloseableHttpClient httpClient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(url); + httpPost.setHeader("Content-Type", "application/json;charset=UTF-8"); + httpPost.setEntity(new StringEntity(jsonBody, StandardCharsets.UTF_8)); + + try (CloseableHttpResponse response = httpClient.execute(httpPost)) { + HttpEntity entity = response.getEntity(); + return EntityUtils.toString(entity, StandardCharsets.UTF_8); + } finally { + httpClient.close(); + } + } + + /** + * 发送带自定义请求头的POST请求 + */ + private String sendPostRequestWithHeaders(String url, String jsonBody, Map headers) throws Exception { + CloseableHttpClient httpClient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(url); + + // 设置默认请求头 + httpPost.setHeader("Content-Type", "application/json;charset=UTF-8"); + + // 设置自定义请求头 + if (headers != null) { + headers.forEach(httpPost::setHeader); + } + + httpPost.setEntity(new StringEntity(jsonBody, StandardCharsets.UTF_8)); + + try (CloseableHttpResponse response = httpClient.execute(httpPost)) { + HttpEntity entity = response.getEntity(); + return EntityUtils.toString(entity, StandardCharsets.UTF_8); + } finally { + httpClient.close(); + } + } +} + diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..ccc2da8 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,16 @@ +# OPPO推送服务配置 +# 请在OPPO开放平台获取以下信息:https://open.oppomobile.com +oppo.push.appKey=bb0819c889ae40cd8bde5a8ad4e670fe +oppo.push.appSecret=9b5a0e6d560e406dbb70fbb4e0e38098 +oppo.push.masterSecret=9b5a0e6d560e406dbb70fbb4e0e38098 + +# 通讯与服务(原私信)频道配置 +oppo.push.channel.id.im=previte_message +oppo.push.channel.name.im=消息推送 + +# 推送服务地址 +oppo.push.api.url=https://api.push.oppo.com + +# 服务器端口 +server.port=8080 + diff --git a/target/classes/META-INF/spring-configuration-metadata.json b/target/classes/META-INF/spring-configuration-metadata.json new file mode 100644 index 0000000..a1c24db --- /dev/null +++ b/target/classes/META-INF/spring-configuration-metadata.json @@ -0,0 +1,48 @@ +{ + "groups": [ + { + "name": "oppo.push", + "type": "com.oppo.push.config.OppoPushConfig", + "sourceType": "com.oppo.push.config.OppoPushConfig" + } + ], + "properties": [ + { + "name": "oppo.push.api-url", + "type": "java.lang.String", + "description": "API地址", + "sourceType": "com.oppo.push.config.OppoPushConfig" + }, + { + "name": "oppo.push.app-key", + "type": "java.lang.String", + "description": "应用Key", + "sourceType": "com.oppo.push.config.OppoPushConfig" + }, + { + "name": "oppo.push.app-secret", + "type": "java.lang.String", + "description": "应用密钥", + "sourceType": "com.oppo.push.config.OppoPushConfig" + }, + { + "name": "oppo.push.channel-id-im", + "type": "java.lang.String", + "description": "通讯与服务(原私信)频道ID", + "sourceType": "com.oppo.push.config.OppoPushConfig" + }, + { + "name": "oppo.push.channel-name-im", + "type": "java.lang.String", + "description": "通讯与服务(原私信)频道名称", + "sourceType": "com.oppo.push.config.OppoPushConfig" + }, + { + "name": "oppo.push.master-secret", + "type": "java.lang.String", + "description": "主密钥", + "sourceType": "com.oppo.push.config.OppoPushConfig" + } + ], + "hints": [] +} \ No newline at end of file diff --git a/target/classes/application.properties b/target/classes/application.properties new file mode 100644 index 0000000..ccc2da8 --- /dev/null +++ b/target/classes/application.properties @@ -0,0 +1,16 @@ +# OPPO推送服务配置 +# 请在OPPO开放平台获取以下信息:https://open.oppomobile.com +oppo.push.appKey=bb0819c889ae40cd8bde5a8ad4e670fe +oppo.push.appSecret=9b5a0e6d560e406dbb70fbb4e0e38098 +oppo.push.masterSecret=9b5a0e6d560e406dbb70fbb4e0e38098 + +# 通讯与服务(原私信)频道配置 +oppo.push.channel.id.im=previte_message +oppo.push.channel.name.im=消息推送 + +# 推送服务地址 +oppo.push.api.url=https://api.push.oppo.com + +# 服务器端口 +server.port=8080 + diff --git a/target/classes/com/oppo/push/OppoPushApplication.class b/target/classes/com/oppo/push/OppoPushApplication.class new file mode 100644 index 0000000000000000000000000000000000000000..63e6efff910c1f0dbab2c9098dd24a54cce2e2c7 GIT binary patch literal 1081 zcma)5O-~a+7=DHiTWS$#1;GylQE96(P4qyhk|2qRNn;yp>cP{rF74oUXR|x&#|^F| z8h-%B7(>EM#D_- z>niRBev_AIRi?#?>)Ns|v{X(E0}P|<;-%oWa2mW+Tes?(;nZE}NWIL^pUGAk23FN` zD}jCtB{7Io3?oJ9SdW5M&GMdznr$(pimEQ`s_>-Qcbo&dDSd{y;)#V6C`n65hhZY~ ztawyVMSId|6tdL>#*mI7#gJ28gZr-WuX&eHr)CY?(c=~zl2-6am+JhSIQ5=?XTg7jis5U*6tGLw&A*| ze7&@oU(9pi%1B{xWEpOUn>*pbe*5!A`{T|@H+a($wr&#n!fTLH(mfbqNK{nd)vX88 z2yL>5j2FxVsFBBkqh-sgN?#g+97pL$<`j9kC$EugM4%NB91&}EM0B6@)J1Rsvmo;5 zZ2^6>qDMeBMmtW(2nTcfh<}TY6J*UXkicoO$-^HAhiNy2GZ-O{x$H&3fP9MOeqi+J z9wt&3zhm0q)ec_oV5WoS{3y?K6la*Mi8@018zo(gVIC@6%1 InmRe~7qM<9uK)l5 literal 0 HcmV?d00001 diff --git a/target/classes/com/oppo/push/config/OppoPushConfig.class b/target/classes/com/oppo/push/config/OppoPushConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..513f608bc3c22836bced0779c8b13adeff38bf1b GIT binary patch literal 4218 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 literal 0 HcmV?d00001 diff --git a/target/classes/com/oppo/push/service/OppoPushService.class b/target/classes/com/oppo/push/service/OppoPushService.class new file mode 100644 index 0000000000000000000000000000000000000000..71b37cca1994eda8ebc20236a57a1bef3dc3eb4d GIT binary patch literal 9952 zcmb_i3w%`7ng4%DCiiA?12}*>R57R&2*d#u3KNYbfDjCzgoj8GZzea%kjczAbBBko z;sa~7C@NZOt*G_UZd(PbNf0Y-t-5Qi+THG}-R^cDpxw51-@EN@OaJHGJCn)GfcX2Z z@|%0^Ip6utcfRlcJjjZb0;>27*bt2U(2z8_~y^(C9=fW+Kj#O{2lW7rrY;`W_ z#s{4CdhEqF6OXc+! zgj%G@I3et>v97`j^F5)`nRv3dCu0vd+fteSNS9+LvymP<=B6?`B6dNf$ikeP+7{1f zIqL0L%*kfgr23tt5_M$XovvcXmB+ejaLM*Gr>x;F1+rXVUKC5jlX16|nwdUhouFn> zs@n--B2F`Ks^GLzJzeSvV&Qaz1$DiS>*gyf zS(zK?ax!ad>Ra0-W+&F!nYeoQJ8Lh}5(ZI?MhlY>qLgl5oHm(OqV?lofx90=K^GS5 zXu|XvMdJEeQo?=QLIcJGF&#|?W{kp6=Z>uF3|N?nS%OnyxlG1Mx=NQT;)#TkhbmmI zc${ZpEXEm_O$C;kqAeFsbUPVEcD{u=1cSH`^9;-toO2QwvhWF<>nVO=I=(iO2x0+R z3`9pus;zF}B3vvmw%UoDv#N)CD>jkm5wuaMge^ftaEa3NCj}FWr}%1`vCc#ru@l)k zCt~N^K1ILS!V+9ckFe8eC)q7%t~9Z1EngdY$z>MW)!s}ubu^f#iR&r-tY;(V}L#gm`3s;P2CViQ+qaK}DYhaC_VT1?gTUdwnG*&vtcrd?M zOkX8MQdUrs-(_M0&7k5%*0l#H)JAMF@F_xVM4uh0WUn&9)q?TUmltbVjkK7!hEUGN zdy{GdT^3?$17iu*6*iHU>2zWl#|;uGj)fjD%vimC@ag0v!GdDped8=Il0I**@~$A_ z=r^#15lMm0PQ<(HE}LN{>u$-Wl9A<|t5#Y_DEL@zO1*i!lrTvPDWoZAmWIAOm33D; z*XF2&5@q^}m#1 z!CA-Ms5i;N^|(P0r25;FuEU(b08?@G5d-^#gzrt*Y2ed&xaySS4_dexw-D9wq`OWz zq7D=7CT^pI-L`87u^qQt_zdpw+}cw~iL?58s-U_6QzL4AJ+RZn=LBcGfA`Rldmi*c zU8BwiNAK8kn&=((ppUg4=(u3Q;L%(O|qy|#6Pm|=ZbjT2=Ph|De}K0xvvsmoWE9)w9lrzKT$rs-Obo0eoC@p zjhXm6_OQ%VJ8ND;U77fM!DJ?AZqQSza)1_cVsv*eUc2Vf=J_W6ksDDZ#AaQcD*GI< za1`$`1e9c#^>MdvnPanbqNgqW2)HRguR`!N@pBp^o70tH5Wm2$4E%Cb5N}JR60E?L z(LYc|zp9vvKgjUE9sgqCU-55@3Djvx@Xp7}B3JagO#BC#9=YeEvUE z7#6;X7fh*Rp79iaWcLH_-E#2g-Cv>Me6vVBL3_N>Xd_jUaeCufx{vbpc6x0@#;|IZ zvCN^Pt3z+=`P$f&QwXaSi{}Pqyi7D?0#8sn9c3M!LE`R?h;Qh{@m`i;mYgc5F>Vn6 z?Mc?A$r!CXr-IIW%~s~pQYT^gm?4t{Q}klVcq-yMZ-l8L*==XK7kSQ{wd4#rlQ5!F zZ=O#rct9_n;ZxF67RXtaG|ChvM@rbX!*%G-lYQ|jO_{N=O>O)fOU{+4%(mTnmuyVm z*rvvK_-Hg`I-}Io+2?N$N|VeoWag+kT&+S6mS$Clw~g{(j%cAGmdutpcl_1-sLIkIQBSG$lo!yykQD#R8Q_$mT1C33c)YM@(i zrnk&-3`0G4d0MO5$WvHVwu?o4kzk|2LkH)$v>Cz^Vz5v_WP{Qsiw#-CVo%kAcG`~h zIgvisO-JGb=|qGHh><+9j2(+~lSW=5Jm59(Ov2lb#ZHf{1H=V9NS}zqqC_g|sG@3w zRf{3ZDy-`-IpDZ`sqU;^TAeO}vJ{u_M=rCZLsqazX8!Op!G~6=zC~uNGh`Ld*QIiD zhsu3CswMg*C@bX()_t;C5UJoa$A>m+MhdyclC{En6eXm`k#)xOG7TwZc*CmJlq=;b zLpE^5QVEM~Q9+ZIY!n_j4QD$;flEK{EnljFTGwXc{+Z3cqA50i3H_*5^Yv>>y<9EV z7_wP#VX4R`Gv5+h!BSlx<&`wK0*;Eb6qIi1F;qp|Sh}E2@E)7Bye7!<8bNqgUS6(> zB7P^ZW0^1M-Nr51qOP6-F$HL4vUpGiBxMK>;zh@U!Xd(vv|LMnvAerFbLlh_YSy81 zpI!{A0x?m*fT${@wp2F*M6j>mcnscU@c9r}F#np0fpQ-~xqp_JNU24Ua@xGIrAlZk z!-1jA(eA@kR>q-7>xNv<^iXQR5dy(SN$&Z|?!=kgj{&WfZ@Q}GCQCjoJH2$IuPs%Q zC=To1U1kW7TP(R%Zc}lb1!J13t$?u-eHC=;bJQ~T>EGG}uGynp6xmE3O0 zXN1=P29wYd24un6K3a}DP2ncknaX8i&ZTj6g*u_+BK$m+y#<~#WJ@lW)h&~gQb(JJ ze{W6HBs$|P z7sl4g?vl*om-9uk=4<|S<7978J};LU@{nL=DfInPJhHG$DLm#XxcJrF*nm7ZPUSnR zo#(uaMxm26gx4Qa%gj(onTG6RWp!dwV%gI?rts`lt*(+VN!`x#&ET7QntWENn`*Y} z{XR?g@uFNmdD+dU$^TD5h*abGHiJ*~UtLIsG2xq-bbv2aID@~6Dfj{5Ox;7jQkVMv zvT0ZK$CZu4xT^5B zxyc`I^q%$*y1l`sncFHu_;%|ccD;zHOubn>;7=yAReg3Aw0A}$sT%`GLyk0WZ(%tghvl|DAIj1 z58`o;lI#R4d2DDcqn|8zv@||)xR1OsJCfU`E*ju!W^83xvZjFF&nG+wh8Cs zI^Gi8&feYp-0(2w<0(Y3A1!!==ipaK`3^22$A$O+ZTJlqX}c`*bnn|`4qnDrhz}ki zF^mmFNEPQjhp*y~D97#S#n(6*;0o8^>-Yvi@c~Z7v!oEN1Sl(e^an`)yq387v}2rA zYd{Pvs4>vVhrzQqjw!gYTm3xE2TyBU?nO?j!k~gi^;=wuV3p^a1~C*3lq2Dwr_g9^ z9tK9(2pys=zvWxq2z{G6R&dBum|-*Y-C6#y8Twvxq4|2zJTvsip*IU7Z+U=uyU_7N zuj9|Wjy&tSa9!vxLVs1D`f<3j}^sCfo8)x-E_pHo99=MNV;9$|+Un0XxldM!BC-vAWP1q(a*e)IXY_JK}OPt>Y61Y*4xJj<#CI7A1Dfi-Lc@DQ| z;6I_lpFHmaU$y>E17EdXWvfb$zQz^Dt#+S!%DhFpk44FC5so%c&c)i10+ckO`)ajIwNhi= z3I_@+94M@CAin~627PV^$j#$%fOC}--iGR96m5*>gWCTVC~wsN=#Pbe$}#zhD$h-i zaqh`as`e(yF@EX`j9SX~aH*D>yoXCbC!AmCv;|zzG;>yS&7jookJb==1n*2 z9}eiWqq27nTPb93w_1y^3w>nDs$OaL!O&tp65eYE1!`0RK;w5hF&01nrHz(U$)3aG~G&^E*DEH z4Yr-CQc1>BXOw8hQdl0um{By2WxOGm7__Dc8^Dxf%tjnkI9D_t2CLLpQ2s&6C%L;C zn&N3~jPH@NDw6gN%fgk1Wa);PL(;BG3P$KbSst!ABr7+}q7{bZ@9+duYkQy)U3DfXSu)UsO9}E7Y<+= zW9VGw*H-4&Wz4Q?FvQsVB4h3#U1ErCFg#KYU~j>Wd;M~Nx{(aIRgvo+$%;#yjKS@a zldbHT%fjPpvW?bj#hJ2QcF=kX_z4)txK#Z}Fpw(^S!&3D{&%&($gE7mkXj4#cvQ5U z4Ez=iybc>^XgEe0ilU2Vs43XbZxE<1vaPNq)<#5l^#!=eSH?oQ=o{^hh z$HeAvV8fu?xc()%88|4rst^v8nx2<(3{K2>v^_JvXM1LI-}Y9xPT8LQw7o(|f7sej zkQDbChn4#(U`Kz9-e1B5EKdGNy zq1ej5Vga*d0N-ZoRff6O>CtbnTzr!=-XgajF#Enup6_t}yUa;%)05w!C%nt-^h1q; z)wCZqRY1YB1r$8%qkyA2t5tKIuWCHhaJ79J4@%;>8V_|`X|l#cun-#cOlGTUjgXx% ze~0r7ZN+1_7!4yJU{>;sTL~@(f+wOZhm2o;>R^#)tZ>D@IQuO3S|xYpk4Zw0lFzY^ b#jM; extra = new HashMap<>(); +extra.put("message_type", "chat"); // 标识为私信类消息 +notification.put("extra", extra); +``` + +## 消息体结构 + +发送通讯与服务类消息时,完整的消息体结构如下: + +```json +{ + "target_type": 1, + "target_value": "设备的registration_id", + "notification": { + "title": "消息标题", + "content": "消息内容", + "click_action_type": 1, + "click_action_type_value": "", + "channel_id": "previte_message", + "channel_name": "消息推送", + "extra": { + "message_type": "chat" + } + } +} +``` + +## 测试步骤 + +### 1. 确保配置正确 + +检查 `application.properties` 文件: +```properties +oppo.push.channel.id.im=previte_message +oppo.push.channel.name.im=消息推送 +``` + +### 2. 启动服务 + +```bash +mvn spring-boot:run +``` + +### 3. 发送测试消息 + +使用 curl 命令: +```bash +curl -X POST http://localhost:8080/api/push/send \ + -H "Content-Type: application/json" \ + -d '{ + "targetValue": "您的registration_id", + "title": "测试私信", + "content": "这是一条通讯与服务类消息", + "messageType": "1" + }' +``` + +### 4. 验证结果 + +- 检查API返回:`success` 应为 `true` +- 检查设备:消息应出现在OPPO手机的"消息推送"频道中 +- 检查日志:查看控制台输出的详细日志 + +## 注意事项 + +1. **频道ID必须正确**:`channel_id` 必须设置为 `previte_message`,否则消息不会被识别为普通通知 + +2. **频道名称**:`channel_name` 设置为 `消息推送`,这是OPPO系统识别的标准名称 + +3. **设备端配置**:确保移动应用已正确集成OPPO推送SDK,并且应用已获得通知权限 + +4. **registration_id**:必须使用真实的设备registration_id,不能随意填写 + +5. **消息分类**:通过设置 `channel_id` 为 `previte_message`,消息会被OPPO系统自动分类为"通讯与服务"类消息 + +## 常见问题 + +### Q1: 消息发送成功但设备收不到? +**A**: 检查以下几点: +- 设备是否在线 +- 应用是否已获得通知权限 +- registration_id是否正确 +- 应用是否已正确集成OPPO推送SDK + +### Q2: 消息收到了但不是通讯与服务类? +**A**: 检查: +- `channel_id` 是否正确设置为 `previte_message` +- 查看日志确认消息体中的参数是否正确 + +### Q3: 如何确认消息类型? +**A**: +- 在OPPO手机上,通讯与服务类消息会显示在"消息推送"频道中 +- 可以通过OPPO开放平台的推送统计查看消息分类 + +## 相关文档 + +- [OPPO推送服务文档 - 通讯与服务类消息](https://open.oppomobile.com/documentation/page/info?id=13189) +- [OPPO开放平台](https://open.oppomobile.com) + +## 技术支持 + +如有问题,请: +1. 查看控制台日志获取详细错误信息 +2. 检查OPPO开放平台的推送统计 +3. 参考OPPO官方文档 +