用户管理员帐号登录,打开管理后台,进入应用管理,添加应用。

当用户打开应用的时候,应用需要知道这个用户是否为合法用户,这里个时候就需要验证用户。

第一步、引用 JS API

在您的网站html代码底部里面插入一段JS

<script src="http://[您的云团队服务器地址]:[端口]/cdn/api.js"></script>

如果是您应用是https应用

<script src="http://[您的云团队服务器地址]:[SSL端口]/cdn/api.js"></script>

第二步、获取验证信息

通过JS代码获取用户的openid和签名

<script>
Bridge.tryLogin(function (data)
{
    //判断是否成功获取了用户验证信息
    if(data == null)
    {
        alert("无法获取用户验证信息");
        return;
    }
    var openid = data.openid;
    var timestamp = data.timestamp;
    var signature = data.signature;
    //openid:               当前用户的开放平台用户ID
    //timestamp:            时间戳
    //signature:            对openid进行签名后得到的字符串
    //signature签名算法为:   md5(openid+timestamp+app_id+app_secret)
    //提交这些验证信息后,将这些信息提交到您的应用服务器进行验证。
    location.href = "验证地址?" + "openid=" + openid + "×tamp=" + timestamp + "&signature=" + signature
});
</script>

第三步、在您的应用服务器上进行验证

算出验证签名,md5(opened+timestamp+app_id+app_secret)

算出来的签名和 “signature” 进行对比,如果相等,表示openid是合法的。

以下是C#编写的验证代码

//设置为您应用app_id和app_secret
string app_id = "";
string app_secret = "";
var openid = Request.QueryString["openid"];
var timestamp = Request.QueryString["timestamp"];
var signature = Request.QueryString["signature"];
var str = string.Concat(openid, timestamp, app_id, app_secret);
//获取md5值
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
var buffer = UTF8Encoding.UTF8.GetBytes(str);
var md5Bytes = md5.ComputeHash(buffer, 0, buffer.Length);
StringBuilder hashValue = new StringBuilder();
for (int i = 0; i < md5Bytes.Length; i++)
{
    if (md5Bytes[i] <= 15)
    {
        hashValue.Append("0");
    }
    hashValue.Append(md5Bytes[i].ToString("x"));
}
if (signature != hashValue.ToString()) throw new Exception("验证失败");

第四步、找到openid在您系统绑定的用户

这步openid已经合法,在您的应用用户系统,找这个openid对应的用户

如果用户存在,则让这个用户登录您的应用,如果用户不存在,需要在您的用户系统里新建一个用户和openid绑定有个对应关系。然后完成登录

可以通过API 为用户推送消息

第一步、org_id, app_id和app_secret

在管理后台中的应用管理中查看app_id、app_secret

如果应用是全局应用,则不需要org_id

第二步、调用接口获取授权

调用 /oauth2/app_token 获取的授权

第三步、调用接口推送消息

调用 /app/push_msg_to_users 推送消息

以下是C#编写的Demo代码

//调用https必须加上这句
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

//设置为您应用app_id和app_secret
string app_id = "";
string app_secret = "";

var webClient = new WebClient();
//设置根据您服务器的地址来设置API地址。
var apiUrl = "https://服务器地址:SSL端口/openapi/oauth2/app_token";

//Post参数
var postData = new NameValueCollection();
//grant_type必须是固定值“client_credential”
postData["grant_type"] = "client_credential";
postData["app_id"] = app_id;
postData["app_secret"] = app_secret;

//从接口获取数据,请求方式为“POST”
var buffer = webClient.UploadValues(apiUrl, "POST", postData);
var result = System.Text.Encoding.UTF8.GetString(buffer);
if (string.IsNullOrEmpty(result)) return;

//应用fasjson.dll,可以在https://github.com/mgholam/fastJSON 中找到
var json = (Dictionary<string, object>)fastJSON.JSON.Parse(result);

int ret;
if (!json.ContainsKey("ret")) return;
ret = Convert.ToInt32(json["ret"]);
//如果ret!=0,说明有错误
if (ret != 0)
{
    //获取错误说明
    string msg;
    if (!json.ContainsKey("msg")) return;
    msg = (string)json["msg"];
    return;
}
var data = (Dictionary<string, object>)json["data"];
//成功了获取授权Key,access_token可以不必每次都取,在不过期的情况下可重复使用
var access_token = (string)data["access_token"];


//推送消息
apiUrl = "https://服务器地址:SSL端口/openapi/app/push_msg_to_users ";
postData = new NameValueCollection();
postData["access_token"] = access_token;
postData["app_id"] = app_id;

//如果是全局应用不用填写
var org_id = "";
postData["org_id"] = org_id;

//消息唯一ID(限制100个字符),当用户点击消息上的按钮,会将该参数回传给设置了回调事件地址
postData["msg_id"] = Guid.NewGuid().ToString();

//填写用户对应的openid,可以多个逗号分隔
postData["open_ids"] = "";

postData["title"] = "请假申请!";
postData["content"] = "某某某向你提交了一份请假申请!";
//为消息添加了接送和拒绝2个按钮 
postData["buttons"] = "[{\"name\":\"接收\", \"key\":\"receive\", \"color\":\"#ff0000\"},{\"name\":\"拒绝\", \"key\":\"refusal\", \"color\":\"#ff0000\"}] ";

//调用接口
buffer = webClient.UploadValues(apiUrl, "POST", postData);
result = System.Text.Encoding.UTF8.GetString(buffer);
if (string.IsNullOrEmpty(result)) return;
ret = 0;
if (!json.ContainsKey("ret")) return;
ret = Convert.ToInt32(json["ret"]);
//如果ret!=0,说明有错误
if (ret != 0)
{
    //获取错误说明
    string msg;
    if (!json.ContainsKey("msg")) return;
    msg = (string)json["msg"];
    return;
}

当您为用户推送消息,并设置消息按钮,当用户点击消息上的按钮时,会将按钮设置的参数值传给您的应用事件地址 “event_url”,您再根据参数做业务处理。

如何处理消息事件回调

如果有事件回调,“event_url”会接收到事件的POST参数,参数如下。

参数名 说明
app_id 应用的ID
open_id 事件发起人的open_id
timestamp 时间戳
event_type MenuClick、ButtonClick
event_data 事件数据
signature 签名

如何验证参数的合法性

接收的到的参数不一定是合法的,就需要对参数进行验证,通过参数“signature”来对参数进行验证

第一步、 除“signature”参数外,将获得的Post参数按照以key进行排序,并以key1=value&key2=value….等方式将参数拼接起来得到一个字符串。

第二步、 将第一步得来的字符串和app_id对应 app_secret 进行拼接,然后进行md5运算得到一个字符串

第三步、 将第二步得到来的字符串和“signature”参数进行对比,如果相等表示合法

以下是C#编写的Demo代码

var data = Request.Form;
var app_id = data["app_id"];
var open_id = data["open_id"];
var timestamp = data["timestamp"];
var event_type = data["event_type"];
var event_data = data["event_data"];
var signature = data["signature"];
//对参数排序,拼接字符串
var sortData = new SortedDictionary<string, string>();
sortData.Add("app_id", app_id);
sortData.Add("open_id", open_id);
sortData.Add("timestamp", timestamp);
sortData.Add("event_type", event_type);
sortData.Add("event_data", event_data);
var _sign = new StringBuilder();
foreach (var o in sortData)
{
    if (_sign.Length > 0) _sign.Append("&");
    _sign.AppendFormat("{0}={1}", o.Key, o.Value);
}
//设置为您应用app_id和app_secret
var app_secret = "";
_sign.Append(app_secret);
//计算MD5
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
var buffer = UTF8Encoding.UTF8.GetBytes(_sign.ToString());
var md5Bytes = md5.ComputeHash(buffer, 0, buffer.Length);
StringBuilder hashValue = new StringBuilder();
for (int i = 0; i < md5Bytes.Length; i++)
{
    if (md5Bytes[i] <= 15)hashValue.Append("0");
    hashValue.Append(md5Bytes[i].ToString("x"));
}
if (signature != hashValue.ToString()) throw new Exception("验证失败");

当您为用户推送消息,并设置消息按钮,当用户点击消息上的按钮时,会将按钮设置的参数值传给您的应用事件地址 “event_url”,您再根据参数做业务处理。

如何处理消息事件回调

如果有事件回调,“event_url”会接收到事件的POST参数,参数如下。

参数名 说明
app_id 应用的ID
open_id 事件发起人的open_id
timestamp 时间戳
event_type MenuClick、ButtonClick
event_data 事件数据
signature 签名

如何验证参数的合法性

接收的到的参数不一定是合法的,就需要对参数进行验证,通过参数“signature”来对参数进行验证

第一步、 除“signature”参数外,将获得的Post参数按照以key进行排序,并以key1=value&key2=value….等方式将参数拼接起来得到一个字符串。

第二步、 将第一步得来的字符串和app_id对应 app_secret 进行拼接,然后进行md5运算得到一个字符串

第三步、 将第二步得到来的字符串和“signature”参数进行对比,如果相等表示合法

以下是C#编写的Demo代码

var data = Request.Form;
var app_id = data["app_id"];
var open_id = data["open_id"];
var timestamp = data["timestamp"];
var event_type = data["event_type"];
var event_data = data["event_data"];
var signature = data["signature"];
//对参数排序,拼接字符串
var sortData = new SortedDictionary<string, string>();
sortData.Add("app_id", app_id);
sortData.Add("open_id", open_id);
sortData.Add("timestamp", timestamp);
sortData.Add("event_type", event_type);
sortData.Add("event_data", event_data);
var _sign = new StringBuilder();
foreach (var o in sortData)
{
    if (_sign.Length > 0) _sign.Append("&");
    _sign.AppendFormat("{0}={1}", o.Key, o.Value);
}
//设置为您应用app_id和app_secret
var app_secret = "";
_sign.Append(app_secret);
//计算MD5
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
var buffer = UTF8Encoding.UTF8.GetBytes(_sign.ToString());
var md5Bytes = md5.ComputeHash(buffer, 0, buffer.Length);
StringBuilder hashValue = new StringBuilder();
for (int i = 0; i < md5Bytes.Length; i++)
{
    if (md5Bytes[i] <= 15)hashValue.Append("0");
    hashValue.Append(md5Bytes[i].ToString("x"));
}
if (signature != hashValue.ToString()) throw new Exception("验证失败");

开发者可借鉴应用Demo,能更快的提高开发效率。

C#版DEMO应用