OPPO推送服务 - API成功推送消息文档
==========================================

一、服务配置信息
------------------------------------------
包名: com.xunpaisoft.social
AppId: 32150237
AppKey: bb0819c889ae40cd8bde5a8ad4e670fe
AppSecret: 9b5a0e6d560e406dbb70fbb4e0e38098
AppServerSecret: 2d8b4e922d60453d987f0d09de6eb4a6

服务地址: http://localhost:8080/android/push
请求方法: POST
Content-Type: application/json;charset=UTF-8


二、API接口说明
------------------------------------------
接口地址: http://localhost:8080/android/push
请求方法: POST
请求头: Content-Type: application/json;charset=UTF-8


三、请求参数说明
------------------------------------------
所有参数都在HTTP body中以JSON格式传递：

参数名              类型      必填    说明
------------------------------------------------------------------
pushType            int       是      推送类型，OPPO推送固定为 5
pushMessageType     int       是      消息类型，0表示普通消息
packageName         String    是      应用包名，固定为: com.xunpaisoft.social
deviceToken         String    是      OPPO设备的registration_id
pushContent         String    是      推送消息内容
sender              String    否      发送者ID
senderName          String    否      发送者名称（会作为推送标题显示）
target              String    否      目标ID
targetName          String    否      目标名称
convType            int       否      会话类型，0表示单聊
line                int       否      消息行，0表示普通消息
cntType             int       否      内容类型，1表示文本
serverTime          long      否      服务器时间戳（毫秒）
unReceivedMsg       int       否      未接收消息数
mentionedType       int       否      提及类型，0表示未提及
isHiddenDetail      boolean   否      是否隐藏详情，false表示显示详情
language            String    否      语言，zh表示中文
messageId           long      否      消息ID（建议使用时间戳）
republish           boolean   否      是否重新发布，false表示新消息
existBadgeNumber    int       否      已存在的角标数字


四、成功推送示例
------------------------------------------

示例1: 使用curl命令推送消息

curl -X POST http://localhost:8080/android/push \
  -H "Content-Type: application/json;charset=UTF-8" \
  -d '{
    "pushType": 5,
    "pushMessageType": 0,
    "packageName": "com.xunpaisoft.social",
    "deviceToken": "OPPO_CN_95ac9afc103d70bb26441ec0cbb06b97",
    "pushContent": "我是api",
    "sender": "api_user",
    "senderName": "知你",
    "target": "test_target",
    "targetName": "测试目标",
    "convType": 0,
    "line": 0,
    "cntType": 1,
    "serverTime": 1767146875000,
    "unReceivedMsg": 1,
    "mentionedType": 0,
    "isHiddenDetail": false,
    "language": "zh",
    "messageId": 1767146875,
    "republish": false,
    "existBadgeNumber": 0
  }'


示例2: 使用测试脚本推送

cd /home/renjianbo/push/push_server
./test_push_8080.sh OPPO_CN_95ac9afc103d70bb26441ec0cbb06b97


示例3: 使用Python发送推送

import requests
import json
import time

url = "http://localhost:8080/android/push"
headers = {
    "Content-Type": "application/json;charset=UTF-8"
}

data = {
    "pushType": 5,
    "pushMessageType": 0,
    "packageName": "com.xunpaisoft.social",
    "deviceToken": "OPPO_CN_95ac9afc103d70bb26441ec0cbb06b97",
    "pushContent": "我是api",
    "sender": "api_user",
    "senderName": "知你",
    "target": "test_target",
    "targetName": "测试目标",
    "convType": 0,
    "line": 0,
    "cntType": 1,
    "serverTime": int(time.time() * 1000),
    "unReceivedMsg": 1,
    "mentionedType": 0,
    "isHiddenDetail": False,
    "language": "zh",
    "messageId": int(time.time()),
    "republish": False,
    "existBadgeNumber": 0
}

response = requests.post(url, headers=headers, json=data)
print(response.text)


示例4: 使用Java发送推送

import java.net.HttpURLConnection;
import java.net.URL;
import java.io.OutputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import com.google.gson.Gson;
import java.util.HashMap;
import java.util.Map;

public class OppoPushTest {
    public static void main(String[] args) throws Exception {
        String url = "http://localhost:8080/android/push";
        URL obj = new URL(url);
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();
        
        con.setRequestMethod("POST");
        con.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
        con.setDoOutput(true);
        
        Map<String, Object> data = new HashMap<>();
        data.put("pushType", 5);
        data.put("pushMessageType", 0);
        data.put("packageName", "com.xunpaisoft.social");
        data.put("deviceToken", "OPPO_CN_95ac9afc103d70bb26441ec0cbb06b97");
        data.put("pushContent", "我是api");
        data.put("sender", "api_user");
        data.put("senderName", "知你");
        data.put("target", "test_target");
        data.put("targetName", "测试目标");
        data.put("convType", 0);
        data.put("line", 0);
        data.put("cntType", 1);
        data.put("serverTime", System.currentTimeMillis());
        data.put("unReceivedMsg", 1);
        data.put("mentionedType", 0);
        data.put("isHiddenDetail", false);
        data.put("language", "zh");
        data.put("messageId", System.currentTimeMillis() / 1000);
        data.put("republish", false);
        data.put("existBadgeNumber", 0);
        
        String json = new Gson().toJson(data);
        
        try (OutputStream os = con.getOutputStream()) {
            byte[] input = json.getBytes("utf-8");
            os.write(input, 0, input.length);
        }
        
        int responseCode = con.getResponseCode();
        System.out.println("Response Code: " + responseCode);
        
        try (BufferedReader br = new BufferedReader(
                new InputStreamReader(con.getInputStream(), "utf-8"))) {
            StringBuilder response = new StringBuilder();
            String responseLine;
            while ((responseLine = br.readLine()) != null) {
                response.append(responseLine.trim());
            }
            System.out.println("Response: " + response.toString());
        }
    }
}


五、成功响应示例
------------------------------------------
HTTP状态码: 200

响应内容: ok

服务器日志示例:
Server response: MessageId: 32150237-1-1-6954857b816b510175dc87a7 
ErrorCode: ReturnCode{code=0, message='Success'} 
Reason: OK


六、重要参数说明
------------------------------------------

1. pushType: 必须设置为 5，表示OPPO推送类型

2. deviceToken: OPPO设备的registration_id
   - 格式: OPPO_CN_xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
   - 需要从OPPO手机应用中获取
   - 每个设备有唯一的registration_id

3. senderName: 推送标题
   - 会显示在推送通知的标题位置
   - 例如: "知你"

4. pushContent: 推送内容
   - 会显示在推送通知的内容位置
   - 例如: "我是api"
   - 内容长度建议不超过200字符

5. packageName: 必须与配置的包名一致
   - 固定值: com.xunpaisoft.social

6. serverTime: 服务器时间戳（毫秒）
   - 可以使用: System.currentTimeMillis() (Java)
   - 或: int(time.time() * 1000) (Python)
   - 或: $(date +%s)000 (Shell)

7. messageId: 消息ID
   - 建议使用时间戳
   - 用于消息去重


七、测试验证
------------------------------------------

成功测试记录:
- 测试时间: 2025-12-31 10:07:55
- 推送标题: 知你
- 推送内容: 我是api
- MessageId: 32150237-1-1-6954857b816b510175dc87a7
- 状态: Success (code=0)
- 设备Token: OPPO_CN_95ac9afc103d70bb26441ec0cbb06b97
- 手机接收: ✓ 已成功收到推送通知


八、常见问题
------------------------------------------

1. 推送失败，返回错误
   - 检查deviceToken是否正确
   - 检查packageName是否匹配
   - 检查服务是否正常运行在8080端口
   - 查看服务器日志: tail -f push.log

2. 手机未收到推送
   - 检查手机网络连接
   - 检查应用推送权限设置
   - 检查应用是否在后台运行
   - 检查OPPO手机的通知设置

3. 服务启动失败
   - 检查端口8080是否被占用
   - 检查config目录下的配置文件是否正确
   - 查看日志文件了解详细错误信息


九、服务管理
------------------------------------------

启动服务:
cd /home/renjianbo/push/push_server
nohup java -jar ../push_server-master/target/push-0.1.2.jar > push.log 2>&1 &

停止服务:
pkill -f "push-0.1.2.jar"

查看日志:
tail -f push.log

检查服务状态:
netstat -tlnp | grep 8080


十、配置文件位置
------------------------------------------
配置文件: /home/renjianbo/push/push_server/config/oppo.properties
服务端口: /home/renjianbo/push/push_server/config/application.properties
测试脚本: /home/renjianbo/push/push_server/test_push_8080.sh


==========================================
文档生成时间: 2025-12-31
测试状态: ✓ 已成功验证推送功能

