小米推送(MiPush)是小米公司为开发者提供的消息推送服务,通过在云端和客户端之间建立一条稳定、可靠的长连接,为开发者提供向客户端应用推送实时消息的服务,帮助开发者有效地拉动用户活跃。
使用场景:现在我们在做一个购物App的产品有用户端和商户端,用户端购买了一件商品并且完成了在线支付,这个时候服务器会收到这个订单,也应该在这个时候第一时间通知到这件商品的商户(商户端)有人购买了店里的东西。我们使用小米推送,即这个过程为:
用户 -> 下单并付款 -> 服务器收到订单 -> 通知到推送服务器(小米推送) -> 推送到商户 -> 商户处理此订单
没有注册的首先可以去小米开发者平台注册,注册申请什么的这里就不赘述了,网上教程也很多,当你注册好了账号,拿到AppID,AppKey,AppSecret之后下载好Android SDK&PHP SDK的时候我们就可以正式进入今天的话题了。
需要注意修改的地方:
Android SDK:(由于目标是商户端收到推送消息,即只需要配置商户端、而不需要配置用户端)
①使用你自己的 appid,需要修改几个地方:DemoApplication.java 中的 APP_ID,APP_KEY,和权限 permission.MIPUSH_RECEIVE 的前缀为你的 packagename。
②在application标签下将name属性和DemoApplication关联起来
<application
android:name="com.你的应用包名.DemoApplication"
③DemoMessageReceiver在Application中注册的时候注意包名不要搞错了
<receiver
android:name="com.你的应用包名.DemoMessageReceiver"
android:exported="true">
相信这都东西大家都不成问题
PHP SDK:
①android_example.php中需要修改的
$secret = '你的AppSecret';
$package = 'com.你的包名';
准备工作完成后,可以使用小米的推送工具测试一下是否都已经配置好了。确认配置好了之后,我们需要在用户端购买一件东西了,这里的请求使用的是OkHttp的开源框架
OkHttpUtils.post().url("http://你的一个处理下单付款的程序.php")
.addParams("subject", subject)
.addParams("oid", orderId)
<span style="white-space:pre"> </span>.addParams("bid", bid)
.build()
.execute(new Callback<String>() {
@Override
public void onError(Call arg0, Exception arg1) {
}
@Override
public void onResponse(String arg0) {
Message msg = Message.obtain();
msg.what = 100;
msg.obj= arg0;
mHandler.sendMessage(msg);
}
@Override
public String parseNetworkResponse(Response arg0) throws Exception {
return arg0.body().string();
}
});
服务端的处理下单付款的程序
<?php
header('content-type:text/html;charset=utf-8');
use xmpush\Builder;
use xmpush\HttpBase;
use xmpush\Sender;
use xmpush\Constants;
use xmpush\Stats;
use xmpush\Tracer;
use xmpush\Feedback;
use xmpush\DevTools;
use xmpush\Subscription;
use xmpush\TargetedMessage;
include_once(dirname(__FILE__).'/autoload.php');
$secret = '你的AppSecret';
$package = 'com.你的包名';
$bid = $_REQUEST['bid'];
// 常量设置必须在new Sender()方法之前调用
Constants::setPackage($package);
Constants::setSecret($secret);
$title = '你有新的订单';
$desc = '请尽快处理你的未处理订单';
$payload = '{"test":1,"ok":"It\'s a string"}';
$sender = new Sender();
$res = 验证订单的方法();
if($res and $succes == '"true"'){
//需要做的事情更新销量、更新支付状态、支付时间
try {
// 开启事务
// 提交事务
$PdoMySQL::$link->commit();
$reqCode = '0';
$reqMessage = '订单提交成功';
} catch (PDOException $e) {
// 回滚事务
$PdoMySQL::$link->rollBack();
$reqCode = '-24';
$reqMessage = $e->getMessage();
echo $e->getMessage();
return false;
}
//推送消息给商家
$message = new Builder();
$message->title($title);
$message->description($desc);
$message->passThrough(0);
$message->payload($payload); // 对于预定义点击行为,payload会通过点击进入的界面的intent中的extra字段获取,而不会调用到onReceiveMessage方法。
$message->extra(Builder::notifyEffect, 1); // 此处设置预定义点击行为,1为打开app
$message->extra(Builder::notifyForeground,1);
$message->notifyId(0);
$message->build();
$targetMessage2 = new TargetedMessage();
$targetMessage2->setTarget($bid, TargetedMessage::TARGET_TYPE_ALIAS);
$targetMessage2->setMessage($message);
$targetMessageList = array($targetMessage2);
$sender->multiSend($targetMessageList,TargetedMessage::TARGET_TYPE_ALIAS);
echo 'succes';
}else{
echo 'fail';
}
?>
这个时候消息只是发出去了,要保证我们的商户端收到消息我们需要给每一个商户配置上他独一无二的身份标示,即一个唯一的,我们这里以商户Id为例,给每一个商户的设备配置上别名或账号使用我们的唯一Id作为值。
DemoApplication.setMainActivity(this);
String bid = this.getSharedPreferences("data",MODE_PRIVATE).getString("BusinessId", "-1");
//设置别名
MiPushClient.setAlias(MainActivity.this, bid, null);