1、使用极光推送()向安卓手机推送消息【服务端向客户端主送推送】 ,C#语言在 VisualStudio2010 中新建网站 JPushAndroid。添加引用 json 帮助类库Newtonsoft.Json.dll。在 web.config 增加 appkey 和 mastersecret,可以在极光官网 申请。web.config 源码:添加类JPushV3,会弹出保存类在App_code文件夹下,确定。JpushV3代码如下:using System;using System.Collections.Generic;using System.Linq;using System.Web;u
2、sing System.Net;using System.Text;using System.IO;using System.Configuration;using System.Collections;/* 参考文档:http:/ 选择里面的:服务器端 API,Push-API-V3* * 极光推送的网站的网址是:https:/ 旧版本V2 http:/ 最新版本V3 http:/ * 其中服务端的接口以及示例代码都在这里:http:/ / 极光推送的最新版:PUSH-API-V3/ 参考地址 http:/ POST https:/ public class JPushV3/ / 应用标识:
3、极光推送的用户名/ private readonly string AppKey = ConfigurationManager.AppSettings“AppKey“;/ / 极光推送的密码/ private readonly string MasterSecret = ConfigurationManager.AppSettings“MasterSecret“;/ / 极光推送请求的url地址/ private readonly string RequestUrl = “https:/ / 查询推送结果请求的Url地址 / private readonly string ReceivedUr
4、l = “https:/ / 发送推送请求到JPush,使用HttpWebRequest/ / 传入POST或GET/ 固定地址/ 用户名AppKey和密码MasterSecret形成的Base64字符串/ 请求的json参数,一般由Platform(平台)、Audience(设备对象标识)、Notification(通知)、Message(自定义消息)、Options(推送可选项)组成/ public string SendRequest(String method, String url, String auth, String reqParams)string resultJson =
5、“;HttpWebRequest myReq = null;HttpWebResponse response = null;trymyReq = (HttpWebRequest)WebRequest.Create(url);myReq.Method = method;myReq.ContentType = “application/json“;if (!String.IsNullOrEmpty(auth)myReq.Headers.Add(“Authorization“, “Basic “ + auth);if (method = “POST“)byte bs = UTF8Encoding.U
6、TF8.GetBytes(reqParams);myReq.ContentLength = bs.Length;using (Stream reqStream = myReq.GetRequestStream()reqStream.Write(bs, 0, bs.Length);reqStream.Close();response = (HttpWebResponse)myReq.GetResponse();HttpStatusCode statusCode = response.StatusCode;if (Equals(response.StatusCode, HttpStatusCode
7、.OK)using (StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8)resultJson = reader.ReadToEnd();tryobject json = Newtonsoft.Json.JsonConvert.DeserializeObject(resultJson);catch resultJson = string.Format(“error“: “message“: “0“, “code“: 10086“, “响应的结果不是正确的js
8、on格式“); catch (WebException ex)if (ex.Status = WebExceptionStatus.ProtocolError)HttpStatusCode errorCode = (HttpWebResponse)ex.Response).StatusCode;string statusDescription = (HttpWebResponse)ex.Response).StatusDescription;using (StreamReader sr = new StreamReader(HttpWebResponse)ex.Response).GetRes
9、ponseStream(), System.Text.Encoding.UTF8)resultJson = sr.ReadToEnd();/“errcode“:404,“errmsg“:“request api doesnt exist“Dictionary dict = JsonToDictionary(resultJson);string errCode = “10086“;string errMsg = “发送推送的请求地址不存在或无法连接“;if (dict.ContainsKey(“errcode“) errCode = dict“errcode“.ToString();if (di
10、ct.ContainsKey(“errmsg“) errMsg = dict“errmsg“.ToString();resultJson = string.Format(“error“: “message“: “0“, “code“: 1“, errMsg, errCode);else/这里一定是error作为键名(自定义错误号10086),和极光推送失败时的json格式保持一致 如 “error“: “message“: “Missing parameter“, “code“: 1002resultJson = string.Format(“error“: “message“: “0“, “
11、code“: 10086“, ex.Message.Replace(“, “ “).Replace(“, “ “);catch (System.Exception ex)resultJson = string.Format(“error“: “message“: “0“, “code“: 10086“, ex.Message.Replace(“, “ “).Replace(“, “ “);finallyif (response != null)response.Close();if (myReq != null)myReq.Abort();return resultJson;/ / 通过用户名
12、AppKey和密码获取验证码/ / private string GetBase64Auth() string str = this.AppKey + “:“ + this.MasterSecret;byte bytes = Encoding.Default.GetBytes(str);return Convert.ToBase64String(bytes);/ / 发送推送请求到JPush/ / POST或GET/ 请求的json参数,一般由Platform(平台)、Audience(设备对象标识)、Notification(通知)、Message(自定义消息)、Options(推送可选项)
13、组成/ public string SendRequest(String method, String reqParams) string auth = GetBase64Auth();return SendRequest(method, this.RequestUrl, auth, reqParams);/ / 发送Post请求/ / 请求的json参数,一般由Platform(平台)、Audience(设备对象标识)、Notification(通知)、Message(自定义消息)、Options(推送可选项)组成/ public string SendPostRequest(String
14、reqParams)string auth = GetBase64Auth();return SendRequest(“POST“, this.RequestUrl, auth, reqParams);/ / 发送Get请求/ / 请求的json参数,一般由Platform(平台)、Audience(设备对象标识)、Notification(通知)、Message(自定义消息)、Options(推送可选项)组成/ public string SendGetRequest(String reqParams)string auth = GetBase64Auth();return SendRequ
15、est(“GET“, this.RequestUrl, auth, reqParams);/* 生成唯一的sendNo的方法: 取序列号* 查看返回结果的方法*/ / 查询推送的结果/ / 生成的json信息唯一id/ public string GetReceivedResult(String msg_ids) string url = this.ReceivedUrl + “?msg_ids=“ + msg_ids;String auth = GetBase64Auth();return SendRequest(“GET“, url, auth, null); ;/* 1.正确时返回结果“
16、sendno“:“123456“,“msg_id“:“1799597405“* 或者 “sendno“:“0“,“msg_id“:“351403900“ * 2.入参json完全正确,但找不到要到达的设备。错误时:返回 * “msg_id“: 3125719446, “error“: “message“: “cannot find user by this audience“, “code“: 1011* 3.传入空字符串 或者 非json格式,或者没有必须的选项:“error“: “message“: “Missing parameter“, “code“: 1002* 传入的键(键区分大小
17、写)、值不符合要求 “error“: “message“: “Audience value must be JSON Array format!“, “code“: 1003 */ / 将返回的json转换为Hashtable对象/ / / public Hashtable JsonToHashtable(string jsonString) /* 正确时返回结果“sendno“:“123456“,“msg_id“:“1799597405“* “sendno“:“0“,“msg_id“:“351403900“ * 入参json完全正确,但找不到要到达的设备。错误时:返回 “msg_id“: 3
18、125719446, “error“: “message“: “cannot find user by this audience“, “code“: 1011* 传入空字符串 或者 非json格式,或者没有必须的选项:“error“: “message“: “Missing parameter“, “code“: 1002* 传入的键值不符合要求 “error“: “message“: “Audience value must be JSON Array format!“, “code“: 1003 键区分大小写*/Hashtable ht = new Hashtable();object
19、json = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonString);/返回的结果一定是一个json对象Newtonsoft.Json.Linq.JObject jsonObject = json as Newtonsoft.Json.Linq.JObject;if (jsonObject = null) return ht;foreach (Newtonsoft.Json.Linq.JProperty jProperty in jsonObject.Properties()Newtonsoft.Json.Linq.JToken jT
20、oken = jProperty.Value;string value = “;if (jToken != null) value = jToken.ToString();ht.Add(jProperty.Name, value);return ht;/ / 根据json返回的结果判断是否推送成功/ / 响应的json/ 错误信息/ 错误号/ public bool IsSuccess(string jsonString, out string errorMessage, out string errorCode) Hashtable ht = JsonToHashtable(jsonStri
21、ng);errorMessage = “;errorCode = “;foreach (string key in ht.Keys)/如果存在error键,说明推送出错if (key = “error“) string errJson = htkey.ToString();Hashtable htError = JsonToHashtable(errJson);errorMessage = htError“message“.ToString();errorCode = htError“code“.ToString();return false;return true;/ / 根据返回的响应js
22、on来判断推送是否成功,成功时记录sendno与msg_id。/ 失败时记录错误信息errorMessage、错误号errCode等/ / 响应的json/ 错误信息/ 错误号/ 用户自定义的推送编号(从序列号中获取),不设置则为0,成功后返回该编号/ 极光服务器处理后返回的信息编号/ public bool IsSuccess(string jsonString, out string errorMessage, out string errorCode, out string sendno, out string msg_id) bool result = IsSuccess(jsonSt
23、ring, out errorMessage, out errorCode);Hashtable ht = JsonToHashtable(jsonString);sendno = “;msg_id = “;if (result) /推送成功时,只有键sendno、msg_idsendno = ht“sendno“.ToString();msg_id = ht“msg_id“.ToString();else /如果失败时存在msg_id键,则记录msg_id的值if (ht.ContainsKey(“msg_id“) msg_id = ht“msg_id“.ToString();return
24、result;/ / 将返回的json转换为字典Dictionary对象/ / / public Dictionary JsonToDictionary(string jsonString)Dictionary ht = new Dictionary();object json = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonString);/返回的结果一定是一个json对象Newtonsoft.Json.Linq.JObject jsonObject = json as Newtonsoft.Json.Linq.JObject;if (
25、jsonObject = null)return ht;foreach (Newtonsoft.Json.Linq.JProperty jProperty in jsonObject.Properties()Newtonsoft.Json.Linq.JToken jToken = jProperty.Value;string value = “;if (jToken != null)value = jToken.ToString();ht.Add(jProperty.Name, value);return ht;JPushV2类代码using System;using System.Colle
26、ctions.Generic;using System.Linq;using System.Web;using System.Configuration;using System.Text;using System.Net;using System.IO;using System.Security.Cryptography;/* 参考文档:http:/ 选择里面的:服务器端 API,Push-API-V3* * 极光推送的网站的网址是:https:/ 旧版本V2 http:/ 最新版本V3 http:/ * 其中服务端的接口以及示例代码都在这里:http:/ / 这个版本是Push-API-v
27、2版本,只能用到2015-12-31,建议直接使用最新版v3/ post处理地址 http:/:8800/v2/push/ public class JPushV2/ / Android ApiKey/ private readonly string AppKey = ConfigurationManager.AppSettings“AppKey“;/ / Android密码/ private readonly string APIMasterSecret = ConfigurationManager.AppSettings“MasterSecret“;/ / Android极光推送:开始推送方法/ / 设备号 RV1D41L5F1Tpublic void PushAndroid(string RegistrationID)try