开发流程步骤详解
一、初准备(基础材料):
1.https://jiguang.cn,注册账号创建应用
2.在应用设置-推送设置中,配置好android和ios相关配置选项
3.开发文档https://docs.jiguang.cn/jpush/server/push/rest_api_v3_push/
二、功能业务(前后端配合完成):
1.当用户在客户端登录成功后,调用获取 RegistrationID API,并根据业务场景选择,为用户设置tags标签组、alias别名
2.把设置好的tags标签或alias别名告诉给后端开发人员并保存(因为做推送的时候,我们就可以通过标签组,或别名来给指定的人群推送消息了)
三、功能业务(后端):
根据自己业务场景所需,进行推送消息即可
四、功能业务(前端):
1.当后端推送一条信息时,手机可以正常接收,当用户点击打开信息时触发极光推送的点击事件(这块自行查阅),后端会携带业务场景所需参数,前端可以根据参数进行页面功能展示
五、PHP代码示例
<?php
namespace app\lib\push;
class JpushSend
{
private $app_key = 'acxxxxxxx'; // 极光推送中,所创建应用中获取
private $master_secret = 'a0xxxxxxx'; // 同理
private $url = "https://api.jpush.cn/v3/push"; // 推送api接口
public function __construct($app_key = null, $master_secret = null, $url = null)
{
if ($app_key) $this->app_key = $app_key;
if ($master_secret) $this->master_secret = $master_secret;
if ($url) $this->url = $url;
}
public function send_pub($receiver, $push_data, $extras, $m_time=86400)
{
$message = "";//存储推送状态
$result = $this->push($receiver, $push_data, $extras, $m_time);
if ($result) {
$res_arr = json_decode($result, true);
if (isset($res_arr['error'])) { //如果返回了error则证明失败
echo $res_arr['error']['message']; //错误信息
$error_code = $res_arr['error']['code']; //错误码
switch ($error_code) {
case 200:
$message = '发送成功!';
break;
case 1000:
$message = '失败(系统内部错误)';
break;
case 1001:
$message = '失败(只支持 HTTP Post 方法,不支持 Get 方法)';
break;
case 1002:
$message = '失败(缺少了必须的参数)';
break;
case 1003:
$message = '失败(参数值不合法)';
break;
case 1004:
$message = '失败(验证失败)';
break;
case 1005:
$message = '失败(消息体太大)';
break;
case 1008:
$message = '失败(appkey参数非法)';
break;
case 1020:
$message = '失败(只支持 HTTPS 请求)';
break;
case 1030:
$message = '失败(内部服务超时)';
break;
default:
$message = '失败(返回其他状态,目前不清楚额,请联系开发人员!)';
break;
}
} else {
$message = "success"; // 发送成功
}
} else {
$message = 'fail'; // 其他
}
return $message; // 发送失败,打印错误信息
}
/**
* @param $receiver // 接收对象 场景1所有人,场景2别名,注意按别名推送时,参数是一个数组型如['alias1','alias2']
* @param $push_data // 基础发送展示 title、content
* @param $extras // 业务逻辑 额外参数 自定义
* @param $m_time //保存离线时间的秒数默认为一天 注意参数类型是一个非负整数型
* @return bool|mixed
*/
public function push($receiver, $push_data, $extras, $m_time)
{
$base64 = base64_encode("$this->app_key:$this->master_secret");
$header = array("Authorization:Basic $base64", "Content-Type:application/json");
$data = array();
$data['platform'] = 'all'; //目标用户终端手机的平台类型android,ios,winphone,all所有平台
if ($receiver == 'all') {
$data['audience'] = $receiver; //目标用户(all所有)
}else{
$data['audience']['alias'] = $receiver; // 目标(别名)用户 $receiver是个数组
}
$data['notification'] = array(
// 统一的模式--标准模式
// "alert"=>$push_data,
//安卓自定义
"android" => array(
"alert" => $push_data['title'],
"title" => $push_data['content'],
"builder_id" => 1,
"extras" => $extras
),
//ios的自定义
"ios" => array(
"alert" => $push_data['title'],
"sound" => "default",
"badge" => "+1",
"content-available" => true,
"mutable-content" => true,
"extras" => $extras
)
);
// 苹果自定义---为了弹出值方便调测
$data['message'] = array(
"msg_content" => $push_data['content'],
'title' => $push_data['title'],
'content_type' => 'text',
"extras" => $extras
);
//附加选项
$data['options'] = array(
"sendno" => time(),
"time_to_live" => $m_time, // 保存离线时间的秒数默认为一天
"apns_production" => false, // APNS 通知发送环境:0开发环境,1生产环境。或者传递false和true
);
$param = json_encode($data);
$res = $this->push_curl($param, $header);
if ($res) {
return $res;
} else {
return false;
}
}
// 推送的Curl方法
public function push_curl($param = "", $header = "")
{
if (empty($param)) {
return false;
}
$postUrl = $this->url;
$curlPost = $param;
$ch = curl_init(); //初始化curl
curl_setopt($ch, CURLOPT_URL, $postUrl); //抓取指定网页
curl_setopt($ch, CURLOPT_HEADER, 0); //设置header
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_POST, 1); //post提交方式
curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header); // 增加 HTTP Header(头)里的字段
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // 终止从服务端进行验证
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
$data = curl_exec($ch); //运行curl
curl_close($ch);
return $data;
}
}