想问问Salesforceios11好用吗吗?

您正在使用IE低版浏览器,为了您的雷锋网账号安全和更好的产品体验,强烈建议使用更快更安全的浏览器
发私信给刘伟
导语:人工智能发展到这个阶段,让更多人能够使用基础的AI工具,比从算法中再压榨出几个百分点的效率提升要重要的多。
同步到新浪微博
关注AI+零售、物流。
当月热门文章
为了您的账户安全,请
您的邮箱还未验证,完成可获20积分哟!
您的账号已经绑定,现在您可以以方便用邮箱登录
请填写申请人资料本篇参考Trail教程:
有的时候我们需要在salesforce中引入外部的方法或者数据,这样就需要访问外部的Services,目前常用的访问方式有两种:
1.SOAP方式:Web Service通过XML方式调用SOAP Web服务器;
2.REST方式:Http通过JSON使用REST方式调用服务器。
&这两种Callouts使用原理类似,简单的可以理解像服务器发送一个请求,然后服务器返回一个响应。基于WSDL的callouts适用于SOAP方式,HTTP方式可以使用任何的HTTP service,SOAP或者REST都可以。
这两种方式能选择Http方式尽量选择Http方式。
下面来了解一下REST方式获取外部Service数据以及其他Service访问Salesforce数据操作。
一.REST方式获取外部Service数据
REST方式主要原理如下图所示。使用REST方式主要步骤如下:
salesforce通过REST方式访问外界站点步骤如下:
1.将Web Service的授权端点地址添加到Remote Site中:setup-&Administer-&Security Site Settings-&Remote Site Settings。
salesforce提供了两个测试URL,将两个测试的URL添加到Remote Site中。两个URL分别为:
2.代码进行访问
通过HTTP方式可以使用以下方法进行相关操作的访问
远程站点JSON内容如下{"animals":["majestic badger","fluffy bunny","scary bear","chicken"]}在Eclipse中使用匿名块编写代码实现访问:window-&show view-&Other-&Execute Anonymous即可打开匿名块。
GET方式获取数据:
Http http = new Http();
HttpRequest request = new HttpRequest();
request.setEndpoint('https://th-apex-http-/animals');
request.setMethod('GET');
HttpResponse response = http.send(request);
// If the request is successful, parse the JSON response.
if (response.getStatusCode() == 200) {
// Deserialize the JSON string into collections of primitive data types.
Map&String, Object& results = (Map&String, Object&) JSON.deserializeUntyped(response.getBody());
// Cast the values in the 'animals' key as a list
List&Object& animals = (List&Object&) results.get('animals');
System.debug('Received the following animals:');
for (Object animal: animals) {
System.debug(animal);
输出的结果如下:
其他方式自行测试。
二.Salesforce作为REST Service供java访问(可以供其它语言访问,这里只对java展示,因为我只会java)
&有的时候我们需要在其他平台上获取sfdc端的数据,比如做android项目需要访问sfdc数据,那样就需要Salesforce作为Service,java端通过http获取并对数据进行相关操作。步骤如下:
1)新建一个App,然后创建Connected App:
setup-&Build-&Create-&Apps.先new一个app,正常new完以后new一个Connected App,设置Enable OAuth Settings为true,截图如下所示:
java访问sfdc 的Service的时候需要用到Consumer Key以及Consumer Secret这两项。
2)sfdc端rest service构建:这里我们以Goods__c进行操作,主要方法有添加一条Goods,通过Id获取Goods,通过PageNumber获取指定条数开始的Goods数据,修改一条Goods以及删除一条Goods。
这里对常用的注解进行解释:
  1.@RestResource:曝光此类作为REST资源;
  2.@HttpGet:曝光方法作为REST资源,当有Http get请求发送时,此注解对应的方法会被执行;
  3.@HttpPost:Http post 请求发送时,此注解对应的方法会被执行;
  4.@HttpDelete:当有Http delete请求发送时,此注解对应的方法会被执行;
  5.@HttpPut:当有Http put请求发送时,此注解对应的方法会被执行;
  6.@HttpPatch:当有Http patch请求发送时,此注解对应的方法会被执行。
因为http有请求时按照请求方式来对应相关方法,所以一个类中上述标签只能存在一个,即不能存在两个方法标注@HttpRequest等。
2 * 使用salesforce通过REST方式作为webservice,需要以下几点:
3 * 1.类和方法需要global,方法需要静态
4 * 2.类需要通过RestResource(UrlMapping='/page/*')注解声明
5 * 3.@HttpGet和@HttpDelete不能有形参,可以通过URL?param或者URL/param方式传过来参数
7 @RestResource(UrlMapping='/Goods/*')
8 global class GoodsRESTController {
global static final Integer PAGE_SIZE = 20;
global static List&Goods__c& getGoodsByIdOrGoodsList() {
RestRequest request = RestContext.
// grab the goodsId from the end of the URL
String currentPage = request.params.get('currentPage') != null ? request.params.get('currentPage') : '0';
Integer offsetNumber = Integer.valueOf(currentPage) * PAGE_SIZE;
String goodsId = request.params.get('goodsId');
String fetchS
if(goodsId != null) {
fetchSql = 'SELECT CreatedById, CreatedDate, IsDeleted, Name,' +
' GoodsBrand__c, GoodsCostPrice__c, GoodsDescribe__c, GoodsName__c,' +
' GoodsPrice__c, GoodsProfit__c, LastActivityDate, LastModifiedById,' +
' LastModifiedDate, No__c, OwnerId, Id FROM Goods__c' +
' where Id = :goodsId';
fetchSql = 'SELECT CreatedById, CreatedDate, IsDeleted, Name,' +
' GoodsBrand__c, GoodsCostPrice__c, GoodsDescribe__c, GoodsName__c,' +
' GoodsPrice__c, GoodsProfit__c, LastActivityDate, LastModifiedById,' +
' LastModifiedDate, No__c, OwnerId, Id FROM Goods__c limit :PAGE_SIZE offset :offsetNumber';
List&Goods__c& goodsList = Database.query(fetchSql);
return goodsL
global static Id insertGoods(String goodsName,String goodsBrand,String goodsPrice,String goodsCostPrice,String goodsDescribe) {
System.debug('---------goodsName-------------' + goodsName);
Goods__c goods = new Goods__c();
if(goodsPrice != null && goodsPrice.isNumeric()) {
goods.GoodsPrice__c = Double.valueOf(goodsPrice);
if(goodsCostPrice != null && goodsCostPrice.isNumeric()) {
goods.GoodsCostPrice__c = Double.valueOf(goodsCostPrice);
goods.GoodsName__c = goodsN
goods.GoodsDescribe__c = goodsD
return goods.Id;
@HttpDelete
global static void deleteGoods() {
RestRequest request = RestContext.
String goodsId = request.requestURI.substring(
request.requestURI.lastIndexOf('/')+1);
Goods__c needDeleteGoods = [select Id from Goods__c where Id = :goodsId];
if(needDeleteGoods != null) {
delete needDeleteG
global static ID upsertGoods(String id,String goodsName,String goodsBrand,String goodsPrice,String goodsCostPrice,String goodsDescribe) {
Goods__c goods = new Goods__c();
goods.Id =
goods.GoodsName__c = goodsN
goods.GoodsBrand__c = goodsB
goods.GoodsDescribe__c = goodsD
if(goodsPrice != null && goodsPrice.isNumeric()) {
goods.GoodsPrice__c = Double.valueOf(goodsPrice);
if(goodsCostPrice != null && goodsCostPrice.isNumeric()) {
goods.GoodsCostPrice__c = Double.valueOf(goodsCostPrice);
return goods.Id;
@HttpPatch
global static ID updateGoods() {
RestRequest request = RestContext.
String goodsId = request.requestURI.substring(
request.requestURI.lastIndexOf('/')+1);
Goods__c goods = [select Id from Goods__c where Id= :goodsId];
// Deserialize the JSON string into name-value pairs
Map&String, Object& params = (Map&String, Object&)JSON.deserializeUntyped(request.requestbody.tostring());
// Iterate through each parameter field and value
goods.GoodsName__c = String.valueOf(params.get('GoodsName__c'));
goods.GoodsPrice__c = Double.valueOf(params.get('GoodsPrice__c'));
goods.GoodsCostPrice__c = Double.valueOf(params.get('GoodsCostPrice__c'));
return goods.Id;
测试自己写的方法可以在workbench中查看,使用salesforce账号登录workbench,.在这里可以测试一下getGoodsByIdOrGoodsList方法,想要测试其他方法可以参看最上面的链接自行测试。如下图所示:
3)java端访问sfdc的REST Service
java端访问sfdc的REST Service之前需要做两部分,第一部分是下载Http client的jar包,第二部分是下载json的jar包。
1.Http client jar包下载:访问&选择最新的jar包进行下载,下载后解压,在lib目录下位所需要的http client的jar包。
2.下载json的jar包:。可以选择下载最新的json下载后将json的jar和http client的jar放在一个文件夹下,比如我们现在放在桌面的jars文件夹下。
接下来打开eclipse,jars目录下的jar包全都放在java项目里,然后开始代码访问阶段。
2 import java.io.IOE
3 import java.util.ArrayL
4 import java.util.L
5 import org.apache.http.H
6 import org.apache.http.HttpR
7 import org.apache.http.HttpS
8 import org.apache.http.client.ClientProtocolE
9 import org.apache.http.client.HttpC
10 import org.apache.http.client.methods.HttpD
11 import org.apache.http.client.methods.HttpG
12 import org.apache.http.client.methods.HttpP
13 import org.apache.http.entity.StringE
14 import org.apache.http.impl.client.HttpClientB
15 import org.apache.http.message.BasicH
16 import org.apache.http.util.EntityU
17 import org.json.JSONA
18 import org.json.JSONE
19 import org.json.JSONO
20 import org.json.JSONT
22 public class InvokeGoodsByRestViaSFDC {
static final String USERNAME
= "你的salesforce账号";
static final String PASSWORD
= "你的salesforce密码+security token(如果有security token)";
static final String LOGINURL
static final String GRANTSERVICE = "/services/oauth2/token?grant_type=password";
static final String CLIENTID
= "3MVG9ZL0ppGP5UrBiKUS3jtHfmfz4eBCBEnuY0tIDByXVdtBJWeY6olTn1iLDNvP68EmfVtWE3IDzHOsMuDww";//上图中Consumer Key
static final String CLIENTSECRET = "987848";//上图中的Consumer Secret
private static String REST_ENDPOINT = "/services/apexrest" ;
private static String baseU
private static Header oauthH
private static Header prettyPrintHeader = new BasicHeader("X-PrettyPrint", "1");
* 判断是否可以访问sfdc
* return:可以访问sfdc的rest则返回true,否则返回false
private static boolean isAccessable() {
HttpClient httpclient = HttpClientBuilder.create().build();
// Assemble the login request URL
String loginURL = LOGINURL +
GRANTSERVICE +
"&client_id=" + CLIENTID +
"&client_secret=" + CLIENTSECRET +
"&username=" + USERNAME +
"&password=" + PASSWORD;
// Login requests must be POSTs
HttpPost httpPost = new HttpPost(loginURL);
HttpResponse response = null;
// Execute the login POST request
response = httpclient.execute(httpPost);
} catch (ClientProtocolException cpException) {
cpException.printStackTrace();
} catch (IOException ioException) {
ioException.printStackTrace();
// verify response is HTTP OK
final int statusCode = response.getStatusLine().getStatusCode();
if (statusCode != HttpStatus.SC_OK) {
System.out.println("Error authenticating : "+statusCode);
return false;
String getResult = null;
getResult = EntityUtils.toString(response.getEntity());
} catch (IOException ioException) {
ioException.printStackTrace();
JSONObject jsonObject = null;
String loginAccessToken = null;
String loginInstanceUrl = null;
jsonObject = (JSONObject) new JSONTokener(getResult).nextValue();
loginAccessToken = jsonObject.getString("access_token");
loginInstanceUrl = jsonObject.getString("instance_url");
} catch (JSONException jsonException) {
jsonException.printStackTrace();
baseUri = loginInstanceUrl + REST_ENDPOINT + "/Goods";
oauthHeader = new BasicHeader("Authorization", "OAuth " + loginAccessToken) ;
System.out.println("oauthHeader1: " + oauthHeader);
System.out.println(response.getStatusLine());
System.out.println("Successful login");
System.out.println("instance URL: "+loginInstanceUrl);
System.out.println("access token/session ID: "+loginAccessToken);
System.out.println("baseUri: "+ baseUri);
return true;
public static void main(String[] args) {
createGoods("小米4","小米","2500","2000","测试商品描述信息:小米");
//deleteGoods("amlAAA");
Goods getGoods = getGoodsById("a1qAAA");
if(getGoods != null) {
System.out.println("goods Name :" + getGoods.getGoodsName());
System.out.println("goods Price : " + getGoods.getGoodsPrice());
System.out.println("goods cost price :" +getGoods.getGoodsCostPrice());
System.out.println("goods brand : " + getGoods.getGoodsBrand());
List&Goods& goodsList = getGoodsList(0);
System.out.println(goodsList.toString());
Goods updateGoods = new Goods();
updateGoods.setGoodsId("a1qAAA");
updateGoods.setGoodsName("test goods Name");
updateGoods.setGoodsPrice("10000");
updateGoods.setGoodsCostPrice("8000");
updateGoods(updateGoods);
// Create Goods using REST HttpPost
public static void createGoods(String goodsName,String goodsBrand,String goodsPrice,String goodsCostPrice,String goodsDescribe) {
if(isAccessable()) {
String uri = baseUri + "/createGoods";
JSONObject goods = new JSONObject();
goods.put("goodsName", goodsName);
goods.put("goodsBrand", goodsBrand);
goods.put("goodsPrice", goodsPrice);
goods.put("goodsCostPrice",goodsCostPrice);
goods.put("goodsDescribe", goodsDescribe);
System.out.println("JSON for goods record to be inserted:\n" + goods.toString(1));
//Construct the objects needed for the request
HttpClient httpClient = HttpClientBuilder.create().build();
System.out.println("oauthHeader" + oauthHeader);
HttpPost httpPost = new HttpPost(uri);
httpPost.addHeader(oauthHeader);
httpPost.addHeader(prettyPrintHeader);
httpPost.addHeader("encoding", "UTF-8");
// The message we are going to post
StringEntity body = new StringEntity(goods.toString(1));
body.setContentType("application/json");
httpPost.setEntity(body);
//Make the request
HttpResponse response = httpClient.execute(httpPost);
System.out.print("response : " + response.toString());
//Process the results
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("status code : " + statusCode);
if (statusCode == HttpStatus.SC_OK) {
String response_string = EntityUtils.toString(response.getEntity());
if(response_string != null ) {
System.out.println("New Goods id from response: " + response_string);
System.out.println("Insertion unsuccessful. Status code returned is " + statusCode);
httpPost.releaseConnection();
} catch (JSONException e) {
System.out.println("Issue creating JSON or processing results");
e.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (NullPointerException npe) {
npe.printStackTrace();
public static void deleteGoods(String goodsId) {
if(isAccessable()) {
String uri = baseUri + "/deleteGoods" + "/" + goodsId;
HttpClient httpClient = HttpClientBuilder.create().build();
HttpDelete httpDelete = new HttpDelete(uri);
httpDelete.addHeader(oauthHeader);
httpDelete.addHeader(prettyPrintHeader);
//Make the request
HttpResponse response = httpClient.execute(httpDelete);
//Process the response
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == HttpStatus.SC_OK) {
System.out.println("Deleted the goods successfully.");
System.out.println("goods delete NOT successful. Status code is " + statusCode);
httpDelete.releaseConnection();
} catch (JSONException e) {
System.out.println("Issue creating JSON or processing results");
e.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (NullPointerException npe) {
npe.printStackTrace();
public static List&Goods& getGoodsList(Integer pageNumber) {
if(isAccessable()) {
String uri = baseUri + "/getGoodsByIdOrGoodsList" + "?currentPage=" + pageN
HttpClient httpClient = HttpClientBuilder.create().build();
HttpGet httpGet = new HttpGet(uri);
httpGet.addHeader(oauthHeader);
httpGet.addHeader(prettyPrintHeader);
//Make the request
HttpResponse response = httpClient.execute(httpGet);
//Process the response
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == HttpStatus.SC_OK) {
List&Goods& goodsList = new ArrayList&Goods&();
String response_string = EntityUtils.toString(response.getEntity());
System.out.println("response_string : " + response_string);
JSONArray jsonArray = new JSONArray(response_string);
JSONObject jsonObject = null;
for(int i=0;i&jsonArray.length();i++) {
jsonObject = jsonArray.getJSONObject(i);
Goods goods = new Goods();
if(jsonObject != null) {
goods.setGoodsName(jsonObject.getString("GoodsName__c"));
goods.setGoodsPrice(String.valueOf(jsonObject.getDouble("GoodsPrice__c")));
goods.setGoodsCostPrice(String.valueOf(jsonObject.getDouble("GoodsCostPrice__c")));
goods.setGoodsDescribe(jsonObject.getString("GoodsDescribe__c"));
goodsList.add(goods);
return goodsL
return null;
}catch (JSONException e) {
System.out.println("Issue creating JSON or processing results");
e.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (NullPointerException npe) {
npe.printStackTrace();
return null;
public static Goods
getGoodsById(String goodsId) {
if(isAccessable()) {
String uri = baseUri + "/getGoodsByIdOrGoodsList" + "?goodsId=" + goodsId;
HttpClient httpClient = HttpClientBuilder.create().build();
HttpGet httpGet = new HttpGet(uri);
httpGet.addHeader(oauthHeader);
httpGet.addHeader(prettyPrintHeader);
//Make the request
HttpResponse response = httpClient.execute(httpGet);
//Process the response
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == HttpStatus.SC_OK) {
String response_string = EntityUtils.toString(response.getEntity());
System.out.println("response_string : " + response_string);
JSONArray jsonArray = new JSONArray(response_string);
JSONObject jsonObject = null;
if(jsonArray.length() & 0) {
jsonObject = jsonArray.getJSONObject(0);
Goods goods = new Goods();
if(jsonObject != null) {
goods.setGoodsName(jsonObject.getString("GoodsName__c"));
goods.setGoodsPrice(String.valueOf(jsonObject.getDouble("GoodsPrice__c")));
goods.setGoodsCostPrice(String.valueOf(jsonObject.getDouble("GoodsCostPrice__c")));
goods.setGoodsDescribe(jsonObject.getString("GoodsDescribe__c"));
//goods.setGoodsBrand(jsonObject.getString("GoodsBrand__c"));
return null;
} catch (JSONException e) {
System.out.println("Issue creating JSON or processing results");
e.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (NullPointerException npe) {
npe.printStackTrace();
return null;
public static void updateGoods(Goods updateGoods) {
if(isAccessable()) {
String uri = baseUri + "/updateGoods/"+updateGoods.getGoodsId();
JSONObject goods = new JSONObject();
goods.put("GoodsName__c", updateGoods.getGoodsName());
goods.put("GoodsPrice__c", updateGoods.getGoodsPrice());
goods.put("GoodsCostPrice__c", updateGoods.getGoodsCostPrice());
org.apache.http.client.methods.HttpPatch httpPatch = new org.apache.http.client.methods.HttpPatch(uri);
HttpClient httpClient = HttpClientBuilder.create().build();
httpPatch.addHeader(oauthHeader);
httpPatch.addHeader(prettyPrintHeader);
StringEntity body = new StringEntity(goods.toString(1));
body.setContentType("application/json");
httpPatch.setEntity(body);
//Make the request
HttpResponse response = httpClient.execute(httpPatch);
//Process the response
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == HttpStatus.SC_OK) {
System.out.println("Updated the goods successfully.");
System.out.println("Goods update NOT successfully. Status code is " + statusCode);
}catch (JSONException e) {
System.out.println("Issue creating JSON or processing results");
e.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (NullPointerException npe) {
npe.printStackTrace();
我们只对getGoodsById方法进行测试,下图为显示结果。
java访问sfdc的rest service需要OAuth身份认证,通过用户名密码,以及custom key 和custom password以及访问的apexrest链接即可以访问相应的rest service资源。
总结:本篇描述的主要是sfdc如何通过rest方式获取外部平台的资源以及sfdc如何作为rest service供外部平台调用,每个人的账号密码,以及custom key 和custom password不相同,copy代码后修改这几处地方,如果restResource以及相应注解对应的方法不同,也需要修改相应的方法。此篇文章的缺点为没有考虑中文内容的问题,通过insert等方法存储到服务器会导致中文乱码现象,有需要的可以自行对数据进行编码解码处理。
阅读(...) 评论()五个问题解答Salesforce的SaaS模式
我的图书馆
五个问题解答Salesforce的SaaS模式
以下内容是对知乎用户关于Salesforce的问答和讨论综合整理。问题1、Salesforce 为什么可以同时威胁到 SAP、Oracle 和 Microsoft?Peter W(软件工程师)答:首先Salesforce一开始就是SaaS,后及时推出PaaS 平台,抓住了社交机遇,又在移动推出Salesforce1;同时对API很大推动。加之公司文化好,鼓励创新。郑军(知乎用户)答:1、与其说salesforce威胁这三家厂商,还不如说这三家发展到了天花板。CRM、ERP要换到另一块战场了,而这个战场又与其原有利基竞争。2、Salesforce起点更高成长之路更宽;一来创始人是一个深刻了解管理软件,另一方面随着摸索之后发现所谓“拥有才能控制”这样的歪论已经随着越来越多的用户加入不攻自破,形成正向反馈良性循环。3、形成的生态圈带来更好的服务、更快响应、更好的控制权;生态圈是真正杀伤了其他厂商,用户从来都是挑剔的,当你不能达到要求,抛弃你是必然的。石庆年(移动互联网约会、婚恋平台“爱吧”创始人)答:1、他们面对相同的市场,只是不同的技术实现手段。传统软件思路PK SAAS路线。2、如果走市场边缘化,比如纯粹做SaaS市场,这是小额市场,但是Salesforce可以通过这些市场慢慢形成“农村包围城市”,入侵竞争兜售的大中型企业客户。问题2、Salesforce 为何亏损?戴斌(上海六禾投资)答:Salesforce一直都亏钱的,只有极少数年份是财务报表是挣钱的。主要因为过去ERP类型软件是一槌子买卖,收取“软件费 实施费”,外加每年*%不同比例的维护费。SaaS经济强调的是免Licence费用和轻实施,月租模式。所以研发开支和市场推广费用较高, 因为没有高额的licence费用摊费用。所以市场对于SaaS经济有自己的判断方法,对于SaaS公司大家关注的指标有:注册用户增长、付费客户增长、MRR和CAC、一级市场对于留存现金关注度也比较高,决定了你可以坚持烧钱多久。熊飞(经纬创投副总裁)答:SaaS公司和传统公司不同的是客户价值的计算模式。大多数公司的收入是传统买卖,但是Saas公司的高续约率使得公司不止考虑当年的收入(美国Saas公司的平均续约率是92%,金额续约率是100%。做得好的如Box、Zendesk等,续约率可以做到130%)。换句话说,今年这个客户给你付100块,明年它有可能付130块(包括续约和坐席的增加),如果再考虑4~6年甚至更长的平均在约时间,每个用户的价值应该是当年收入的5-7倍甚至更高。所以华尔街对于Saas公司的估值是按照每个用户价值来计算折现的。100%以上而且高续约率的话,可以到13~14倍,比如Zendesk。增长很快但续约率还不错,华尔街几乎不接受80%以下的用户续约率,和100%以下的金额续约率。Peter W(软件工程师)答:Salesforce的员工人数扩张,而且买入好多公司,加上ExactTarget都上$25亿了。问题3、针对国内的小微企业市场,什么方向的企业级产品能最先获取大量的用户,成为国内的Salesforce?Allan Shi(销售易创始人)答:PC时代的CRM有几大问题:1)为管理人员管控需求而设计, 2)大而全,复杂难用, 不考虑销售人员需求。3) 不符合销售人员在外工作的特点。这几大问题,导致传统PC时代CRM的实施率居高不下。而移动应用可以很好弥补或解决PC时代CRM的问题。 1)原生移动应用符合销售人员工作特点,2)手机端的设计必须以用户需求为出发点 3) 只有销售人员用起来后,管理人员的管控和分析需求才最终能够实现。许维(明道副总裁)答:CRM这个市场的需求最强,最好做。黄金(易企秀负责人)答:可以从两个层面来分析这个问题:一是企业级的什么方向的产品,先来对企业级产品分类,我愿意分为内部管理型,外部营销型,以及联系内部和外部的客户管理型。先说内部管理型,核心命题是提升内部管理效率,无论是HR的,财物、知识管理的等等,这些都是解决企业的办公效率问题。再说外部营销型,核心命题是能够给中小企业带来客户的问题,这应该是中小微企业最紧迫的问题了,这个是生死问题。如果说内部管理型产品对中小微企业来说是锦上添花,那么营销型产品是雪中送炭。最后来说中间的客户管理型产品是介于内部和外部之间,如果这个客户管理工具是员工上传客户,管理客户,提升效率的话,我认为这样的产品适合于中大型企业,而不是小微企业,如果这客户管理能帮助企业带来客户,并管理客户,那么我认为这样的产品才是中小微企业所急需的。所以,对于中国的中小微企业,解决客户拉新是第一问题,管理提升效率是第二问题。如果对salesforce有研究的话,可以发现,其实他的营销自动化功能是很强的,也就是解决了帮助企业找新客户的需求。二是企业级产品应该怎么才能吸引人用,现在有企业级产品新IT转型趋势,包含三个层面:1、从桌面转向移动 桌面;2、从企业级应用软件转向SaaS服务; 3、企业网络从传统数据中心架构转向可弹性扩展的云服务架构。我认为核心意思就是企业级产品消费化,做企业级产品要做到简单易用,零学习成本,用户凭借消费级产品使用经验就能轻松玩转。购买决策方式简单,购买简单方便,用户通过互联网即可购买使用,且因产品的足够简单、可自助使用、无需地面服务团队支持。最后廉价的租用成本,最好是基础版免费降低使用门槛如果能具备这些特点的产品,想获取大量的用户,让产品普及起来,应该是很有潜质的。Tommy Qi(专注于小微企业的SaaS微应用)答:我觉得中小微企业的核心诉求是生存下来,为此,凡是能够帮助其获取生存机会的事情都是企业首先要解决的问题,一是CRM主要是用来管理客户的,所以会成为普遍的需求;二是进销存,其实就是管钱和物,过去的标准化的进销存是走了两个极端,要么做的非常简单,无法满足企业的个性化需求,要么做的非常负责,大而全,给企业很大的成本压力,通过采用Saas模式的进销存,企业可以自助开通基本的进销存服务,无需买硬件,无需买软件,投入小见效快,即用即付费,不用不付费。 同时在基础进销存的服务基础上,企业可以根据自身的特殊需求,自主开通不同的应用模块,比如电商管理,比如POS,比如手机客户端,比如生产模块等等,这样就可以将企业的个性化需求以贴身的、可支付的方式应用起来。所以越是小微企业,越要关注如何帮助对方获取更多生存机会的时候采用最小的成本。CRM 进销存。肯定是最大的两个市场。由于不可避免的需要结合移动互联网,因此产品本身不能无限扩展,我觉得未来属于垂直行业领域的机会更大一些。王玮(知乎用户)答:CRM确实是一个大的类别。针对小微企业,我定义规模为100人以下,大多十几号人。这部分群体,存在一个较强的特征:有梦想,但是当下的主要关注是生存。他们需要的,是卖得更多,而不是管理得更多。也许未来两个纬度,每个纬度不同的方向。纬度:中小型企业,小微企业。方向:按行业细分,通用解决,按工具细分,按模式细分。问题4、Salesforce为什么能够在CRM市场获得成功?万菁(在Salesforce做CRM)答:并不能简单的把salesforce的成功归纳为云计算的多租户模式,这不过是短期内便宜的问题。都知道你要是租个20年,当然还是买便宜。这是一个优势,并且企业去尝试salesforce的试错成本低,一旦不适合自己,可以很快抽身,购买产品的方式不行。一旦开始使用salesforce,最重要的变成了能够让用户愿意长年累月用下去。首先就是确保了足够的可用性,提高了自身平台的建设,到现在每年3个版本的重要更新,越来越多的功能实现在系统中。还有重要的一点是salesforce扩充了自己的产品线:sales cloud,service ,,heroku等等延伸到企业的更多方便,从市场的营销到后期的售后服务的一整条流程都完成了。一方面是salesforce从创业型企业到大型企业都可以使用,扩大了他的受众面,另一方面是整个crm领域产品线的完善,用户不断的扩大他们在salesforce上所购买的服务。就不用说为什么他会有现在的成就了。技术方面的话,salesforce是一个非常不错的平台,他现在都单独卖他的平台用于自行开发。可塑性非常非常强。问题5、Salesforce 收购 Heroku 中有什么故事?李楠(知乎用户)答:相对于 500 强,中小企业的在线应用更适合 Rails 。他们的预算,时间,团队都更受限制。而 Rails 很适合快速开发,反复迭代。在小圈子的密集交往中赢得倾慕?更是她的拿手好戏。如果 Heroku 对 Rails 在企业中的境遇心有不甘的话,携手 Salesforce 再合适不过了。1 Salesforce 拥有大量已经接受云应用的中小企业客户。2 Salesforce 能为 Rails 带来企业应用开发者。日本是 Ruby 的发源地,而 Salesforce 在日本风头正劲。据他们的人讲,要求 Salesforce 的云平台支持 Rails 的呼声很高。3 Salesforce 能为 Rails 带来商业声誉。Salesforce 自己的云平台已经在跑了很多企业应用。在讲究应用实绩的企业市场,这种声誉对 Rails 是一种帮助。4 Heroku 的资源供给和计价的设计实现有利于 Rails ,甚至可能帮助 Salesforce 改进整个
。陈青(知乎用户):Heroku 的财务状况很好,刚获得一笔融资,一切都很顺利,作为一个有趣味的小公司活下去没有问题。他们接受 Saleforce 的收购只是因为 PaaS 市场火的太快,他们想要尽早的扩张,现有的资本支撑不了这样的扩张。有一票大公司向 Heroku 抛媚眼,很多只是想把 Heroku 作为旗下的一个战略部门,最后他们选择了其中最小的 Saleforce,理由是志趣相投,Heroku 的创始人林登堡说他们更认可服务而不是只卖平台。
TA的最新馆藏[转]&[转]&[转]&[转]&
喜欢该文的人也喜欢}

我要回帖

更多关于 dhc好用吗 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信