• 1
  • 2
  • 3
  • 4
  • 5
阿里云应用开发 首 页  »  帮助中心  »  云服务器  »  阿里云应用开发
阿里软件平台HelloWorld开发实例
发布日期:2016-7-19 22:7:29

  "SaaS时代的软件开发"系列专题受到广大开发人员的关注。在了解SaaS的基本概念、商业模式与开发方式等知识后,你也许想亲自动手开发一个SaaS应用,胆识又不知该如何开始。所以特别邀请了阿里软件的工程师李战老师撰写此文,从阿里软件的商业模式开始,逐步深入,手把手教大家开发一个基于阿里SaaS平台的Hello World程序。

  1、阿里软件的商业模式

  阿里软件有一个旺旺软件平台,将自己开发的在线软件接入,就可让阿里巴巴的电子商务客户使用。阿里巴巴是全球最大的电子商务网络公司,旗下阿里云、阿里软件等,拥有超过1亿的注册用户数。若能将自己开发的软件推销给这个庞大的客户群,将会获得巨大的回报。而阿里软件的旺旺平台就是这样一个集软件开发、接入、销售与服务一体的在线软件运营平台。

  在阿里旺旺软件平台之上,只要你的软件做得好,吸引大量用户来订购,哪怕你的软件每月只收一元钱,每月都能够获得相当数量的销售收入。这正是阿里旺旺软件平台最吸引人的独特商业模式!

  但要想在阿里旺旺软件平台上赚钱,先要搞清旺旺平台是怎样运作的。如图1所示,展示了阿里旺旺软件平台的基本商业模式:


  图1 阿里旺旺软件平台的基本商业模式

  实际上阿里旺旺软件平台是阿里巴巴旗下所有用户的软件桌面。任何一个阿里巴巴的用户,包括阿里云、B2B、淘宝、支付宝、雅虎、阿里妈妈与口碑网的用户,都可随时进入到旺旺软件的桌面来,使用各种在线软件。当然,在阿里巴巴旗下的各个网站中,也有众多的快捷启动方式,直接将用户引至相关的软件应用中。

  另一方面,阿里旺旺软件平台也是ISV(独立软件提供商)的软件营销平台,任何一个软件开发商都可将自己的软件放到这个营销平台上。当有用户订购并使用你的软件之后,每月都能软件使用费,且是直接打入你的支付宝帐号。

  2、阿里软件平台的开发和接入

  阿里旺旺软件平台的开发和接入流程大致如图2所示:


  图2 阿里旺旺软件平台的开发和接入流程

  要在阿里旺旺软件平台进行开发,首先要注册成为阿里软件的ISV(独立软件提供商)。先进入http://www.alisoft.com/,然后找到其中的“开发者加盟”页面。若你已经有阿里巴巴中国站或者淘宝网的帐号,可直接登录进入。若没有,需要注册一个帐号并登陆。登录之后,你将有一个工作平台。第一次进入工作平台的时候,需要填写两三项最基本的内容,后面就即可以开始使用工作平台。

  在ISV工作平台,你可注册一个新的软件,开始阿里旺旺软件平台的软件营销之旅。阿里旺旺软件平台目前支持B/S与C/S两类软件。B/S类软件可给用户更多的方式来进入你的软件,从阿里巴巴的所有网站或旺旺客户端都行。而C/S类软件则只能够从旺旺客户端进入,由于旺旺客户端是安装在客户电脑中的即时通讯软件,只有旺旺客户端才能接入C/S软件。

  3、Hello World 起步

  我们来注册一个名叫HelloWorld的软件,输入相关的软件基本信息之后,在ISV工作平台的软件列表中,将有一个HelloWorld的软件项目。其中,我们会得到两个代码,一个是APP ID(应用程序标识),另一个是CERT CODE(授权码)。这两个东西会在随后与平台的WEB API调用中经常用到。

  当然,一个B/S结构的SaaS软件,一定有一个URL入口。所以在注册完HelloWorld软件之后,还需要补充编辑更多的软件信息,包括测试入口和使用入口的URL。这里,我们将HelloWorld程序的入口指定为http://helloworld.leadzen.cn/。当最终用户从阿里软件网站或旺旺客户端,以及阿里巴巴其他网站进入我们的HelloWorld时,就会将浏览器引导到我们设置的URL,当然后面会跟上一大堆调用参数。

  我们的HelloWorld程序是在自己的服务器上运行的,并非运行在阿里软件的服务器上。因此,我们可以简单地这样理解,阿里旺旺软件平台是阿里巴巴用户使用软件的一个集中的启动入口,但软件一旦运行起来,就是主要是在ISV自己的服务上运行了。尽管将来阿里软件会提供有*.aliapp.com域名的应用程序宿主环境,但是这也是属于与平台不同的服务器。

  阿里旺旺软件平台与ISV应用服务器之间的交互关系如图3所示:


  图3 阿里平台与ISV服务器之间的交互关系

  当最终用户在阿里旺旺软件平台上使用我们的HelloWorld软件时,我们的helloworld.leadzen.cn服务器会收到类似于下面的调用请求:

  http://helloworld.leadzen.cn/?user_id=12176230&app_id=22875&app_instance_id=USERFB4B11067FC25455E32AC4F039B2CD38&token=

  A2842BC81AE060C067017336B894F1B6E9AA7A8ED137A91903D1&target=

  在这个请求中会带上一系列参数,各个参数的解释如下所示:

  (1)user_id 用于识别阿里巴巴用户的标识信息

  (2)app_id 要使用的应用程序标识,也就是注册软件时的APP_ID

  (3)app_instance_id 应用程序实例标识,一个实例服务于一个人或一个公司

  (4)token 身份认证令牌,只有10秒生存期并一次有效

  当我们的服务器收到这样的请求之后,首先应该识别访问用户的身份是否合法,然后才能为其提供相关的服务。要验证用户的身份,这就需要调用阿里旺旺软件平台提供的validateUser服务。

  目前,阿里旺旺软件平台采用的是REST风格的API调用格式。说白了就是从ISV的服务器发起一个HTTP请求到阿里旺旺软件平台,并得到以XML表示的返回结果。阿里旺旺软件平台提供了专门的API调用地址,开发测试的调用地址为:

  http://sipdev.alisoft.com/sip/rest

  当软件开发测试完成并上线使用之后,必须使用正式的API调用地址:

  http://sipdev.alisoft.com/sip/rest

  例如,开发测试中的validateUser服务调用形式可能如下所示:

  http://sipdev.alisoft.com/sip/rest?sip_appkey=22875

  &sip_apiname=alisoft.validateUser

  &sip_timestamp=2008-10-28 20:00:00

  &sip_sign=23ed99f1a0a1eac5f3787d522afde1c4

  &userId=12176230

  &appId=22875

  &appInstanceId=USERFB4B11067FC25455E32AC4F039B2CD38

  &token= A2842BC81AE060C067017336B894F1B6E9AA7A8ED137A91903D1

  其中的参数分为系统级参数和应用级参数,以sip_开头的是系统级参数,而其他的是应用级参数。

  系统级参数说明如下:

  (1)sip_appkey ISV应用的唯一编号,即APP_ID

  (2)sip_apiname 服务名,这里是alisoft.validateUser,其他服务有各自的名称

  (3)sip_timestamp 发出请求时间戳(yyyy-mm-dd hh:mm:ss.xxx),支持毫秒

  (4)sip_sign 请求数据的签名,系统级参数和应用参数按顺序拼接后签名

  应用级参数说明如下:

  (1)userId 用户ID,也是客户端传过来的那个user_id

  (2)appId 应用标识,即APP_ID

  (3)appInstanceId 应用实例ID,也是客户端传过来的app_instance_id

  (4)token 身份验证令牌,也是客户端传过来的token

  其中的sip_sign参数,是一个签名数据。为了防止非法的调用或调用数据被中途篡改,旺旺平台要求每一个WEB API调用必须进行签名。签名过程中会用到注册新软件时得到的CERT_CODE,这是每个ISV必须保密的重要数据,旺旺平台据此来识别ISV的真实身份。

  ISV每个应用的CERT_CODE是放在待签名数据的最前面。接下来是本次调用的所用到的参数按名称的字母顺排列,依次将参数名及参数值填充到待签名数据中。待签名的数据是用UTF8编码的字节串。准备好待签名数据之后,要进行一次标准的MD5散列运算,得到签名结果。签名的结果要求是用十六进制字节码表示的字符串。

  当调用旺旺平台的各个参数准备好之后,即可创建一个HTTP请求到阿里旺旺软件平台的服务器。而调用参数可以直接拼接在 http://sipdev.alisoft.com/sip/rest 这一URL的最后,也可以作为POST数据来传递。

  而阿里旺旺软件平台会在收到调用请求后,对调用参数的签名进行比对,以确认ISV的身份。同事,还要核对token是否超期或失效,当然还要检查timestamp是否在合理的范围之内。

  调用完成后,旺旺平台会返回响应的HTTP报文。在这个报文的头部信息中,有一个sip_status项目,是用来表示调用状态的。而HTTP报文的内容,是以XML形式返回的结果。因此我们还需要从XML中解析出结果的内容。例如,validateUser返回的结果可能是下列形式:

  ﹤?xml version="1.0" encoding="utf-8" ?﹥

  ﹤String﹥1﹤/String﹥

  不同WEB API接口所返回的数据格式是不同的,具体可以参阅阿里旺旺软件平台的在线文档。地址:http://isp.alisoft.com/apidoc/api/apiIndex.html

  HelloWorld源代码

  我们的HelloWorld程序实现了一个识别和验证阿里巴巴用户,并在页面上输出不同的结果。下面是HelloWorld的源程序。

  Default.aspx

  ﹤%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %﹥

  ﹤!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"﹥

  ﹤html xmlns="http://www.w3.org/1999/xhtml"﹥

  ﹤head runat="server"﹥

  ﹤title﹥阿里旺旺软件平台HelloWorld示例﹤/title﹥

  ﹤/head﹥

  ﹤body﹥

  ﹤asp:Label ID="helloText" runat="server"﹥﹤/asp:Label﹥

  ﹤/body﹥

  ﹤/html﹥

  Default.aspx.cs

  using System;

  using System.Web;

  using System.Security.Cryptography;

  using System.Text;

  using System.Net;

  using System.Xml;

  public partial class _Default : System.Web.UI.Page

  {

  protected void Page_Load(object sender, EventArgs e)

  {

  //准备调用参数:

  string userId = Request.Params["user_id"];

  string appId = Request.Params["app_id"];

  string appInstanceId = Request.Params["app_instance_id"];

  string token = Request.Params["token"];

  string sip_appkey = appId;

  string sip_apiname = "alisoft.validateUser";

  string sip_timestamp = DateTime.Now.ToString();

  string data = "9c4fb3400ed711de80b8836e34b2dea8"; //CERT_CODE(注册软件时获得的)

  //在CERT_CODE之后,按参数名字母顺序将参数名及其值拼接起来,用以对所有参数签名:

  data += "appId" + appId;

  data += "appInstanceId" + appInstanceId;

  data += "sip_apiname" + sip_apiname;

  data += "sip_appkey" + sip_appkey;

  data += "sip_timestamp" + sip_timestamp;

  data += "token" + token;

  data += "userId" + userId;

  //用MD5算法对调用参数进行签名:

  MD5CryptoServiceProvider MD5 = new MD5CryptoServiceProvider();

  string sip_sign = BitConverter.ToString(MD5.ComputeHash(Encoding.UTF8.GetBytes(data)));

  sip_sign = sip_sign.Replace("-", ""); //一定要去除结果中的“-”!

  //拼装调用参数:

  string api_params = "sip_appkey=" + sip_appkey + "&sip_apiname=" + sip_apiname + "&sip_timestamp=" + sip_timestamp + "&sip_sign=" + sip_sign + "&userId=" + userId +"&appId=" + appId + "&appInstanceId=" + appInstanceId + "&token=" + token;

  //发出对阿里旺旺软件平台的WEB调用:

  WebRequest request = WebRequest.Create("http://sipdev.alisoft.com/sip/rest?" + api_params);

  request.Method = "POST";

  request.ContentType = "application/x-www-form-urlencoded";

  WebResponse response = request.GetResponse();

  //根据返回结果进行相应处理

  if (response.Headers.Get("sip_status") == "9999") //调用平台成功

  {

  XmlDocument xml = new XmlDocument();

  xml.Load(response.GetResponseStream());

  switch (int.Parse(xml.SelectSingleNode("String").InnerText))

  {

  case 0: say("HelloWorld,欢迎合法使用者!"); break;

  case 1: say(sip_sign + "HelloWorld,欢迎合法订购者!"); break;

  case -1: say("尚未订购或被授权使用本软件!"); break;

  case -2: say("非法使用,拒绝提供软件服务!"); break;

  default: say("调用参数可能出现错误!"); break;

  };

  }

  else

  say("调用阿里旺旺软件平台失败!");

  }

  private void say(string text)

  {

  helloText.Text = text; //helloText是一个ASP.NET的Label控件

  }

  }

  本程序是用Visual Studio 2008编写,并在ASP.NET 2.0环境下测试通过。如果你在测试本程序时遇到“服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF”的错误,请在你的web.config中的 ﹤configuration﹥ 中加入以下内容:

  ﹤system.net﹥

  ﹤settings﹥

  ﹤httpWebRequest useUnsafeHeaderParsing="true"/﹥

  ﹤/settings﹥

  ﹤/system.net﹥

  阿里旺旺软件平台开放了许多的WEB API调用接口。使用这些WEB API 你可以完成对阿里巴巴用户的验证,可以实现软件的收费,可以调用实现支付宝的收付,可以获取淘宝的商品及交易信息,可以实现物流的下单,等等。阿里软件是阿里巴巴电子商务资源的服务调用中心,将会有越来越多的WEB API功能开放出来。

  要了解阿里旺旺软件平台更多的开发细节,请查看阿里旺旺软件平台的文档中心。网址是:http://wiki.isv.alisoft.com/index.php?tracelog=doc_from_home