- 目的
我们是提供分销服务的,一般的供销平台提供了代销和经销两种线上经营模式
代销:分销商无需拿货就可以直接销售并赚取差价,由供应商一件代发
经销:分销商直接从供应商处批量采购并囤货销售,享受更多折扣
1) 代销基本业务流程
2) 经销基本业务流程
而我们的系统是提供代销服务。就是分销商在其他的平台例如淘宝销售商品,生成订单反馈给我们系统,我们系统需要把外部订单转换成我们自己的订单,
生成和他对应的供应商订单,然后进入我们的系统的订单流程,最终由我们的仓储平台发货。因此,我们需要获取不同渠道的订单, 转换成我们系统的的订单。
- 条件
1. 要获取不同渠道的订单,就要涉及到对方的开放平台(API) 。因此,首先要解决如何对接开放平台?对接开放平台一般都需要用户授权,授权流程遵循oauth2.0协议。
例如,如果您的应用和淘宝开放平台对接后,需要获取用户隐私信息(如:商品、订单、收藏夹等),为保证用户数据的安全性与隐私性,您的应用需要取得用户的授权。在这种情况下,您的应用需要引导用户完成“使用淘宝帐号登录并授权”的流程。 淘宝的Taobao ID(淘帐号)产品,采用国际通用的OAuth2.0标准协议,作为用户身份验证与授 权协议,支持网站、手机客户端、桌面客户端。
淘宝的授权流程需要您有自己的web服务器,能够保存应用本身的密钥以及状态,可以通过https直接访问淘宝的授权服务器。
授权过程分为两个步骤:
上面的淘宝的授权流程就遵循oauth2.0协议。
2. 授权成功后,还需要通过调用api获取所属信息。api调用需要遵循对方的要求。例如淘宝的api调用方式
TOP 作为淘宝数据插槽,只要用户按照TOP的规范拼装一个正确的URL,通过HTTP请求到TOP,就能够拿到用户自己需要的数据。调用原理示意图如下(注: 淘宝 API <接口>采用 REST 风格,只需将所需参数拼装成http请求,即可调用。故支持 http 协议请求的程序语言,均可调用淘宝API,例如php、C#、asp、java、delphi 等。)
3. 获取了数据,还需要把数据转换成我们的自己的数据。
总的大体流程如下:
- 实现
针对上面的分析,我们需要实现oauth授权,api调用,csv导入和导出。
1.oauth授权
我们仅仅是oauth的web的client实现,虽然目前有很多流行的框架.例如oauth官方推荐的
调查了spring social,实现的方式很好,代理拦截+template模块化获取资源, 只是目前还不支持top,虽然已支持facebook, twitter,github等,如果自己实现工作量有点大。
spring security,还需要引入spring security这个框架,虽然先前我使用过,有点杀鸡焉用牛刀的感觉
Restlet是一个rest框架,和spring的实现有重叠。
最终选择了apache的实现,参照demo很容易实现,授权的流程。
@RequestMapping ("/authorize/{providerId}" ) public ModelAndView authorize( @PathVariable String providerId, Model model) throws OAuthSystemException, IOException { try { OauthTemplate oauth = getTemplate(providerId); OauthProviderConfig appOauth = oauth.getProviderConfig(); OAuthClientRequest request = OAuthClientRequest.authorizationLocation(appOauth.getAuthzEndpoint()).setClientId(appOauth.getClientId()).setRedirectURI(appOauth.getRedirectUri()) .setResponseType(ResponseType.CODE .toString()).setScope(appOauth.getScope()).setState(appOauth.getState()).buildQueryMessage(); return new ModelAndView(new RedirectView(request.getLocationUri())); } catch (Exception e) { model.addAttribute( "errorMsg" , "授权失败" ); logger.info( "authorize" , e); return new ModelAndView("redirect:/oauthClient/list.htm"); } } @RequestMapping (value = "/token/{providerId}" , method = RequestMethod.GET) public ModelAndView handleRedirect( @PathVariable String providerId, Model model, HttpServletRequest req) throws OAuthSystemException { try { OauthTemplate oauth = getTemplate(providerId); OauthProviderConfig appOauth = oauth.getProviderConfig(); // Create the response wrapper OAuthAuthzResponse oar = null ; oar = OAuthAuthzResponse. oauthCodeAuthzResponse(req); // Get Authorization Code String code = oar.getCode(); OAuthClientRequest request = OAuthClientRequest.tokenLocation(appOauth.getTokenEndpoint()).setClientId(appOauth.getClientId()).setClientSecret(appOauth.getClientSecret()) .setRedirectURI(appOauth.getRedirectUri()).setCode(code).setGrantType(GrantType.AUTHORIZATION_CODE).buildBodyMessage(); OAuthClient client = new OAuthClient(SSL_CLIENT); OAuthJSONAccessTokenResponse oauthResponse = client.accessToken(request, OAuthJSONAccessTokenResponse.class); Boolean oauthResult = channelService .saveInfo(oauth.convertResponse(oauthResponse)); model.addAttribute( "successFlag" , oauthResult); } catch (OAuthProblemException e) { logger.info( "oauth" , e); model.addAttribute( "errorMsg" , "授权失败" ); } return new ModelAndView("redirect:/oauthClient/list.htm"); }
2. 授权完成了,需要api调用,选择了top官方推荐的sdk模式,针对以后可能不同的渠道,例如还需要支持paipai,采用了模板模式
获取模板如
private OauthTemplate getTemplate(String appId) throws OAuthSystemException { OauthTemplate oauth = null ; for (OauthTemplate template : oauthTemplates ) { if (template.isProvider(appId)) { oauth = template; break ; } } if (oauth == null) { throw new OAuthSystemException("无效的用户请求" ); } return oauth; }
针对获取不同的资源,采取了命令模式,同时可以实现session token的拦截验证,目前,由于授权的限制,仅仅简单判定一下是否报错就可了。
public Map<String, Object> doAuthInfo(Integer cid, AuthInfo authInfo) throws OAuthSystemException { ChannelInfo info = channelService .getInfo(cid); if (info == null) { throw new OAuthSystemException("无效的请求 "); } Map<String, Object> resultMap = new HashMap<String, Object>(); resultMap.put( "flag" , Boolean.TRUE); try { OauthTemplate oauth = getTemplate(info.getProviderId()); authInfo.doExecute(info, oauth, resultMap); } catch (OAuthProblemException e) { logger.info( "授权错误" , e); resultMap.put( "flag" , Boolean.FALSE); resultMap.put( "redirect" , MessageFormat.format( "authorize/{0}.htm" , info.getProviderId())); } catch (Exception e) { logger.info( "请求资源错误" , e); resultMap.put( "flag" , Boolean.FALSE); } return resultMap; }
3.csv实现
采用第三方opencsv实现的。
- 结论
总的原则,还是面向对象的思想,解耦。
相关推荐
【全渠道订单管理系统OMS】全渠道订单管理系统OMS是实现线上线下库存共享的关键工具。它允许线上订单由线下门店履行,提高发货速度,同时在门店缺货时能借助其他门店或仓库资源发货。OMS通过实时统一在线,无缝对接...
2. **订单同步**:处理来自不同渠道的订单,确保订单信息的一致性。 3. **价格同步**:根据策略调整不同渠道的商品价格。 4. **用户同步**:同步用户信息,提供一致的购物体验。 5. **促销同步**:跨平台推广活动的...
一站式的中台系统包括订单管理系统OMS/ERP、库存WMS统一管理系统和SAP财务管理系统等,实现快速部署,并帮助企业后续自主进行开发迭代,来帮助企业实现数字化转型,并有多个经典案例。系统包括:通用业务中台、强大...
该项目是一款基于Java开发的全渠道订单管理系统(OMS)源码,集成了淘宝、天猫、京东、抖音、拼多多、快手、1688、有赞和小红书等多个第三方平台的对接。系统文件共80个,其中包含67个Java源文件、6个PNG图片文件、4...
【销售渠道设计】是商业运作中的重要环节,尤其对于大型集团如红塔山集团而言,合理的销售渠道设计能够帮助企业更好地适应市场变化,提升竞争力。销售渠道设计不仅仅是简单的渠道选择,它需要综合考虑多个因素,包括...
【基于Java的订单管理系统设计与实现】 在设计与实现一个基于Java的订单管理系统时,我们需要考虑以下几个关键知识点: 1. **订单管理**:系统的核心功能之一是订单管理,包括历史订单查询和订单执行状态跟踪。这...
具体而言,渠道通的设计目标涵盖了以下几点: 1. "渠道为王,得渠道者得天下":强调渠道管理的重要性,指出在当前的市场环境下,拥有有效的渠道管理体系,是企业能够在市场竞争中占据优势的关键。 2. "渠道通,...
在家具行业中,销售渠道的设计与经销商管理是至关重要的环节,它们直接影响到企业的市场覆盖率、销售效率以及品牌形象。销售渠道涉及市场营销组合的4Ps,即产品(Product)、价格(Price)、渠道(Place)和促销(Promotion...
该系统集成了多个管理模块,包括经销商及客户管理、商品及价格管理、自助订货及订单追踪、订单及内部流控管理、通知公告及网站管理、在线提问及回答管理、支付宝接口以及数据备份与恢复等功能。系统的设计旨在为企业...
搜索区域应提供常用的筛选条件,如订单编号、状态、支付渠道等,以提高工作效率。操作区域则包括确认、审核、锁单、跟进和退款等关键操作,需根据用户权限设定相应的操作权限。 总结来说,订单管理涉及订单状态跟踪...
定价和分销渠道设计是商业策略的核心组成部分,直接影响到企业的盈利能力和市场竞争力。在这个过程中,价值而非价格本身成为了关键。定价不仅决定了企业的收入,也塑造了消费者对产品或服务的认知。以下将深入探讨...
金蝶云星空V7.3是一款专为全渠道BBC(Business to Business to Consumer)营销管理设计的产品,旨在构建一个统一的平台,以适应共享经济下的互联网+全渠道营销新环境。该产品具备全面的渠道订货管理功能,覆盖了直接...
设计师渠道部门的销售目标通常设定为每个业务主管每月完成一定数量的订单,每单平均销售金额预设为一定的数值。例如,每个业务主管每月平均销售4单,每单金额6万元,全年11个月的销售目标可预估为3168万元。此外,...
- 客户交付:建立一致的交付流程,以确保跨渠道客户订单交付体验的一致性。 综上所述,OTD转型解决方案的实施涉及到企业战略层面的决策,同时也需要在运营流程、数据分析能力、IT系统集成等多方面进行配套改进。...
在线订单管理系统是电子商务和互联网企业不可或缺的重要组成部分,它主要用于处理来自不同渠道的客户订单,确保订单数据的准确性和及时性。本系统以PHP语言为基础,结合MySQL数据库进行开发,为FOLKSZJU(假设这是一...
1. 订单管理:系统应能处理来自不同渠道的订单,包括在线下单、邮件订单等。同时,需支持订单的创建、修改、跟踪和取消,以及订单状态的实时更新,确保信息的准确性和及时性。 2. 客户管理:系统应维护客户数据库,...
这个模块允许销售人员或客户通过各种渠道(如网页、电话、电子邮件或移动应用)创建和提交销售订单。系统会自动验证订单信息的准确性,如产品库存、价格、客户信用等,确保订单的有效性。 其次,订单处理模块是系统...