PDO统一接口开发规范1.0 事例

原创 2011年01月19日 19:46:00

这个星期做了一个API接口整合的程序大家还是看程序把!

PDO统一接口开发规范1.0 加密方式

密码加密是MD5  32位加密

syskey 加密是32位安全码

功能描述:

     1: 从A网站登录到B网站(A网站也同时登录)

     2: 从B网站登录到A网站(B网站也同时登录)

注意:

    1:俩个站点的syskey要一样。

    2:俩个站点的用户名和密码要一样。

    3:俩个站点是用XML传输的 编码是gb2312

使用说明:
   1:在项目登录页中添加如下代码:
   #region 动易,动网,Oblog 整合 编写人:JONE 编写时间:2011年1月13日 16:54:30
    if (PDOAction.Instance().Enabled){
        PDOAction.Instance().Login(Username.Text, hashPassword, 1);
    }
    #endregion

  请求

     格式:

POST HTTP/1.1 Content-Type: text/xml; charset=gb2312
<?xml version="1.0" encoding="gb2312"?>
<root>
<appid>程序标识</appid>
<action>操作类型</action>
<syskey>安全码</syskey>
<username>用户名</username>
<可选元素列表 />
</root>

       提供 API 请求类  (PDOAction类)   

代码
/// <summary>
/// 是否开启整合
/// </summary>
/// <returns>true|false</returns>
public bool Enabled
{
get{
string enable = APIConfigs.GetConfigParam("API_Enable");
SysLog.WriterLog(
"PDOAction.Enabled(是否开启整合) " + enable);
if (enable.ToLower() == "true"){
return true;
}
return false;
}
}
/// <summary>
/// 整合登录
/// </summary>
/// <param name="username">用户名</param>
/// <param name="password">用户密码(未加密)</param>
/// <param name="saveDays">保存Cookie的天数</param>
public void Login(string username, string password, int saveDays)
{
try{
string LoginString = "";
Login(username, password, saveDays,
ref LoginString);
Fetch.Trace(LoginString);
SysLog.WriterLog(
"PDOAction.Login.LoginString=" + LoginString);
}
catch(Exception ex){
SysLog.WriterLog(
"PDOAction.Login.LoginString 错误:=" + ex.Message);
}
}
public void Login(string username, string password, int saveDays, ref string LoginString)
{
PDOData pdo
= new PDOData();
pdo.SetValue(
"action", "login", 0);
pdo.SetValue(
"username", username, 1);
pdo.SetValue(
"password", password, 0);
pdo.SetValue(
"userstatus", "1", 0);
pdo.SetValue(
"status", "1", 0);
string pwdkey = APIConfigs.GetConfigParam("API_Key");
pwdkey
= Text.MD5(username + pwdkey);
pdo.SetValue(
"syskey", pwdkey, 0);

int savecookie = 0;
if (saveDays >= 7) savecookie = 1;
if (saveDays >= 30) savecookie = 2;
if (saveDays >= 365) savecookie = 3;

pdo.SetValue(
"savecookie", savecookie.ToString(), 0);
pdo.SendHttpData();
if (pdo.Status == "1")
{
SysLog.WriterLog(
"PDOAction.Login() " + pdo.Message);
//HttpContext.Current.Response.Write(pdo.Message);
//HttpContext.Current.Response.End();
}
HttpContext.Current.Response.Buffer
= true;
LoginString
= pdo.SetCookie(username, password, savecookie.ToString());
}

 

 

 

  响应

      格式:

HTTP/1.1 200 OK Content-Type: text/xml; charset=gb2312 Content-Length: length
<?xml version="1.0" encoding="gb2312"?>
<root>
<appid>程序标识</appid>
<status>操作结果</status>
<body>
  <message>操作不成功时返回的错误描述</message>
 <可选元素列表 />
</body>
</root>

          提供 API 响应的类( pdo 类)

 

代码
private void Pdo_Load(object sender, EventArgs e)
{
#region 初始化操作
// 设置 HTTP 头
Response.ContentType = "text/xml";
Response.ContentEncoding
= System.Text.Encoding.GetEncoding("gb2312");

if (Get("syskey") == "" || Get("username") == ""){
try
{
XmlTextReader reader
= new XmlTextReader(Request.InputStream);
reader.WhitespaceHandling
= WhitespaceHandling.None; xmlDoc.Load(reader);
}
catch (XmlException xmle){
//this.__Finish(1, "获取xmlDoc失败=" + xmle.Message, true);
}
}
if (!PDOAction.Instance().Enabled){
this.__Finish(1, "整合没有开启", true);
}
//分析请求中的数据并将它们加载到 DNTParam[] 中
parameters = GetParamsFromRequest(Request);
// 验证安全码 syskey
if (!CheckSysKey()){
this.__Finish(1, "安全密钥错误!", true);
}
#endregion
#region 提交数据
if (CheckPost())
{
string action = Get("action");
switch (action.ToLower())
{
case "checkname":{
CheckName();
break;
}
case "reguser":{
//RegUser();
break;
}
case "login":
{
UserLogin();
break;
}
case "logout":
{
Logout();
break;
}
case "update":
{
//UpdateUser();
break;
}
case "delete":
{
//DeleteUser();
break;
}
case "lock":
{
//LockUser();
break;
}
case "getinfo":
{
GetInfo();
break;
}
case "checkemail":
{
//CheckEmail();
break;
}
default:{
SaveUserCookie();
this.__Finish(1, "未指定操作类型", true);
break;
}
}
}
#endregion
}
private void __Finish(int status, string message,bool flg)
{
#region API提示信息
XmlTextWriter writer
= null;
try
{
writer
= new XmlTextWriter(Response.Output);
writer.Formatting
= Formatting.Indented;
writer.WriteStartDocument();
writer.WriteStartElement(
"root");
writer.WriteStartElement(
"appid");
writer.WriteString(
"JXXYCMOA");
writer.WriteEndElement();
writer.WriteStartElement(
"status");
writer.WriteString(status.ToString());
writer.WriteEndElement();
writer.WriteStartElement(
"needcookie");
if (null != parameters)
{
writer.WriteString(
"1" == Request.QueryString["needcookie"] ? "1" : "0");
}
writer.WriteEndElement();
writer.WriteStartElement(
"body");
writer.WriteStartElement(
"message");
writer.WriteString(message);
writer.WriteEndElement();

// 将可选的列表追加进来
if (null != parameters && parameters.Length > 0){
foreach (DNTParam param in parameters){
if (param.Name != null && param.Name.Length > 0){
writer.WriteStartElement(param.Name);
writer.WriteString(param.Value);
writer.WriteEndElement();
}
}
}
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndDocument();
}
finally
{
if (null != writer)
{
writer.Close();
writer
= null;
}
}
#endregion
if (flg == true){
Response.End();
}
}

private string Get(string key)
{
string tp = "";
if (string.IsNullOrEmpty(Request.QueryString[key])){
if (xmlDoc != null)
tp
= xmlDoc.DocumentElement.SelectSingleNode(key).InnerText.ToString();
}
else{
tp
= Request.QueryString[key].ToString();
}
if (tp.Length > 0)
return tp;
else
return "";
}

private bool CheckPost()
{
string appid = Get("appid");
string syskey = Get("syskey");
string action = Get("action");
string username = Get("username");
string userTrueIP = Get("userip");

if (appid == null || syskey == null || username == null){
this.__Finish(1, "提交数据非法,操作中止!", true);
return false;
}
if (syskey != Text.MD5(username + APIConfigs.GetConfigParam("API_Key"))){
this.__Finish(1, "所提交的api_key未关联到任何设定程序。" + syskey, true);
return false;
}
return true;
}

 

 

事例代码下载

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

EvaOAuth : 基于php/ZF2支持OAuth1.0与OAuth2.0的第三方Oauth登录统一接口模块

EvaOAuth是一个统一接口设计,兼容OAuth1.0与OAuth2.0规范的php oauth登录模块,目前支持超过20个主流网站的OAuth登录,包括: 国外 Facebook OA...

开放平台统一接口规范

  • 2016年02月26日 09:29
  • 175KB
  • 下载

Cocos2d-x游戏引擎开发[2]----工厂方法,统一接口 (以helloworld类为基础)

学习cocos2d-x首先得具备这个构架 之后的学习主要是以这个分层来构造类写一个一个事件 CCApplicationprotocol定义了接口 CCApplication各个平台是不同的 ...

计划统一播放接口(thinkvd开发日志)

  技术解决方案swf2video, ppt2video基本完成,但要与原来的视频播放接口保持一至,这样就不用处理大量的类似的逻辑问题,具体的有差异逻辑处理再作针对性处理,目前还在构想中。  以前工作...
  • notton
  • notton
  • 2011年04月19日 10:26
  • 549

Windows 9信息曝光:统一开发接口、整合Cortana到任务栏

摘要:2014年微软全球合作伙伴大会在美国华盛顿正式拉开序幕,会上,微软首席运营商Kevin Turner透露了微软下一代操作系统Windows 9的一些信息:统一开发接口、语音助手Cortana将被...

容器技术标准化大统一,首个开放容器标准 OCI 1.0 正式发布

在2015年,由Docker、IBM、微软、红帽及Google等厂商所组成的OCI联盟成立,并于2016年4月推出了第一个开放容器标准。除推出OCI Runtime标准,让开发者打包、部署应用程序,并...

服务器端提供下载图片接口事例

/** * 将二进制转换为图片 * @param base64String */ public static File base64StringToImage(String base64...

NC65接口事例

package nc.bs.gl.ds; import java.io.BufferedReader; import java.io.InputStreamReader; import ...
  • zbluey
  • zbluey
  • 2016年12月26日 14:41
  • 649

RestFul接口的安全验证事例

这次要写一些restful的接口,在访问安全这一块最开始我想到用redis存储模拟session,客户端访问会带token过来模拟jsessionid,然后比对,但是这样会让token暴露在网络中,很...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PDO统一接口开发规范1.0 事例
举报原因:
原因补充:

(最多只允许输入30个字)