1.OAuth 2.0:对接 Keycloak 设备码授权流程
2.阿里Spring Security OAuth2.0认证授权笔记震撼开源!原理+实战+源码三飞!
3.OAuth2.0实战:认证、资源服务异常自定义!
4.OAuth2å®ç°åç¹ç»å½SSO
5.一体化开源商城系统哪家做的好?
6.OAuth2.0实战!使用JWT令牌认证!C 保卫萝卜源码
OAuth 2.0:对接 Keycloak 设备码授权流程
OAuth 2.0 是一种开放授权协议,被广泛应用于第三方软件(客户端)获取用户访问令牌,以便访问资源服务器上的用户信息。访问令牌以 jwt 格式呈现,具有内检机制,能节省服务器端存储,但服务器端仍可存储相关信息以进行更复杂的控制。访问令牌的获取方式多样,统称为授权许可类型,常见的包括授权码、密码、客户端等。
本文以一个 nodejs 编写的命令行程序为例,展示了如何对接 Keycloak 的设备码授权流程。要体验此过程,需在安装了 nodejs 的环境中执行特定命令。按照提示,打开浏览器输入授权码,点击同意授权,关闭浏览器后回到命令行,即进入登录状态。
实现这一流程的关键是 OAuth 2.0 的设备码授权许可类型。它允许第三方应用在非浏览器环境下,通过命令行、API 等方式获取用户的访问令牌。文章中详细介绍了配置步骤和关键代码,包括发送 HTTP 请求到 Keycloak 授权服务器以获取设备码和用户码、跳转到浏览器页面进行用户授权、在命令行中轮询获取令牌等。
在 Keycloak 实例中,配置了一个 demoapp 客户端并写了一个 demo 工程,源代码位于 GitHub。文章中展示了如何将 Keycloak 的k线图实心源码登录功能集成到命令行工具中,通过输入 k8ss login 命令自动打开浏览器,用户登录后返回命令行,从而实现登录状态。由于需要千人千面,确保不同用户的登录状态隔离,只能使用设备码授权许可类型,以便为命令行工具提供用户级别的访问令牌。
为了简化实现过程,文章中使用 Postman 编写 HTTP 请求,以生成对应的开发语言代码。对于非 nodejs 的应用,同样可以使用此方法对接其他服务。通过这种方式,开发人员可以快速集成 Keycloak 的授权功能,而无需从头构建授权服务器。
综上所述,通过对接 Keycloak 的设备码授权流程,开发者能够实现非浏览器环境下对用户的授权管理,简化了第三方应用的集成过程,同时也保证了用户授权的灵活性和安全性。
阿里Spring Security OAuth2.0认证授权笔记震撼开源!原理+实战+源码三飞!
Spring Security是一款强大的企业级安全框架,它作为Spring生态系统的组成部分,为Spring应用提供声明式安全访问控制。在Spring Boot项目中,集成Spring Security能够简化安全控制代码编写,减少重复工作。 在移动互联网时代,微信等应用的认证过程是用户身份验证的典型例子。认证是指确认用户身份是否合法,例如通过账号密码、二维码或指纹等方式。OAuth2.0作为OAuth协议的升级版本,允许用户授权第三方应用访问其存储信息,无需分享用户名和密码,提供了一种安全的授权协议。 针对Spring Security的风景网页设计源码学习资料相对较少,本文档将提供两部分深入讲解:首先,通过XML配置在SSM环境中,从源码解析,详解Spring Security的认证、授权(包括“记住我”和CSRF拦截)功能。其次,在Spring Boot中,深入探讨分布式环境下的认证与授权实现。第一份笔记:
基本概念
基于Session的认证
快速上手Spring Security
应用详解
分布式系统认证方案
OAuth2.0介绍
分布式系统授权实现
企业开发首选的Spring Security笔记:
初识Spring Security
授权操作
集中式Spring Security与SpringBoot整合
OAuth2.0实战案例
需要完整文档和源码的朋友,可通过此链接获取:[点击获取链接]OAuth2.0实战:认证、资源服务异常自定义!
本文主要探讨了在实际工作中使用Spring Security时,如何定制认证服务和资源服务中的异常信息,以实现更符合前后端交互需求的错误反馈。
首先,本文以已经搭建的认证服务oauth2-auth-server-jwt 和资源服务oauth2-auth-resource-jwt为例,进行了详细的异常处理案例分析。
在认证服务中,文章列举了三种常见的异常场景:用户名或密码错误、授权类型错误以及客户端ID或秘钥错误。对于这些异常,文章提出了通过自定义提示信息、响应码以及异常翻译器的解决方案。
针对用户名、密码错误异常及授权类型错误异常,文章提出了自定义异常信息的处理方式,涉及提示信息和响应码的定制,以及自定义WebResponseExceptionTranslator的实现。通过配置文件将自定义的异常翻译器应用到认证服务中,并进行测试验证。
文章进一步从源码角度解析了为什么采用上述解决方案,指出在TokenEndpoint类中,通过异常翻译器处理OAuth2Exception异常,实现了异常信息的定制化输出。
对于客户端ID和秘钥错误异常,文章提出了通过自定义AuthenticationEntryPoint和改造ClientCredentialsTokenEndpointFilter实现异常处理。同样,通过配置文件将自定义的有机菜溯源码过滤器应用到资源服务中,并进行测试验证。
在资源服务中,文章分别针对令牌失效和权限不足异常提供了定制异常信息的解决方案。对于令牌失效异常,通过自定义AuthenticationEntryPoint实现异常处理;对于权限不足异常,通过自定义AccessDeniedHandler实现处理。
文章最后总结了整个异常处理流程,并强调了在配置文件中应用自定义异常处理组件的重要性。同时,通过源码追踪进一步解析了异常处理机制的工作原理。
OAuth2å®ç°åç¹ç»å½SSO
1. åè¨
ææ¯è¿ä¸è¥¿å§ï¼çå«äººåç好åå¾ç®åä¼¼çï¼å°èªå·±å»åçæ¶åå°±åç§é®é¢ï¼âä¸çå°±ä¼ï¼ä¸åå°±éâãç½ä¸å ³äºå®ç°SSOçæç« ä¸å¤§å ï¼ä½æ¯å½ä½ ççç §çåçæ¶åå°±ä¼åç°æ ¹æ¬ä¸æ¯é£ä¹åäºå¿ï¼ç®ç´è®©äººæçï¼å°¤å ¶æ¯å¯¹äºæè¿æ ·çèé¸ãå ç»æ²æï¼ç»äºæå®äºï¼å³å®è®°å½ä¸æ¥ï¼ä»¥ä¾¿åç»æ¥çãå æ¥çä¸ä¸ææ
2. åå¤
2.1. åç¹ç»å½
æ常è§çä¾åæ¯ï¼æ们æå¼æ·å®APPï¼é¦é¡µå°±ä¼æ天ç«ãèåç®çæå¡çé¾æ¥ï¼å½ä½ ç¹å»ä»¥åå°±ç´æ¥è·³è¿å»äºï¼å¹¶æ²¡æè®©ä½ åç»å½ä¸æ¬¡
ä¸é¢è¿ä¸ªå¾æ¯æåç½ä¸æ¾çï¼æè§å¾ç»å¾æ¯è¾æç½ï¼
å¯ææç¹å¿ä¸æ¸ æ°ï¼äºæ¯æåç»äºä¸ªç®ççï¼
éè¦çæ¯ç解ï¼
2.2. OAuth2
æ¨è以ä¸å ç¯å客
ã OAuth 2.0 ã
ã Spring Security对OAuth2çæ¯æ ã
3. å©ç¨OAuth2å®ç°åç¹ç»å½
æ¥ä¸æ¥ï¼åªè®²è·æ¬ä¾ç¸å ³çä¸äºé ç½®ï¼ä¸è®²åçï¼ä¸è®²ä¸ºä»ä¹
ä¼æå¨ç¥ï¼å¨OAuth2å¨ææææå¡å¨ãèµæºæå¡å¨ã客æ·ç«¯è¿æ ·å 个è§è²ï¼å½æ们ç¨å®æ¥å®ç°SSOçæ¶åæ¯ä¸éè¦èµæºæå¡å¨è¿ä¸ªè§è²çï¼ææææå¡å¨å客æ·ç«¯å°±å¤äºã
æææå¡å¨å½ç¶æ¯ç¨æ¥å认è¯çï¼å®¢æ·ç«¯å°±æ¯å个åºç¨ç³»ç»ï¼æ们åªéè¦ç»å½æååæ¿å°ç¨æ·ä¿¡æ¯ä»¥åç¨æ·ææ¥æçæéå³å¯
ä¹åæä¸ç´è®¤ä¸ºæé£äºéè¦æéæ§å¶çèµæºæ¾å°èµæºæå¡å¨éä¿æ¤èµ·æ¥å°±å¯ä»¥å®ç°æéæ§å¶ï¼å ¶å®æ¯ææ³éäºï¼æéæ§å¶è¿å¾éè¿Spring Securityæè èªå®ä¹æ¦æªå¨æ¥å
3.1. Spring Security ãOAuth2ãJWTãSSO
å¨æ¬ä¾ä¸ï¼ä¸å®è¦åæ¸ æ¥è¿å 个çä½ç¨
é¦å ï¼SSOæ¯ä¸ç§ææ³ï¼æè 说æ¯ä¸ç§è§£å³æ¹æ¡ï¼æ¯æ½è±¡çï¼æ们è¦åçå°±æ¯æç §å®çè¿ç§ææ³å»å®ç°å®
å ¶æ¬¡ï¼OAuth2æ¯ç¨æ¥å 许ç¨æ·ææ第ä¸æ¹åºç¨è®¿é®ä»å¨å¦ä¸ä¸ªæå¡å¨ä¸çèµæºçä¸ç§åè®®ï¼å®ä¸æ¯ç¨æ¥ååç¹ç»å½çï¼ä½æ们å¯ä»¥å©ç¨å®æ¥å®ç°åç¹ç»å½ãå¨æ¬ä¾å®ç°SSOçè¿ç¨ä¸ï¼åä¿æ¤çèµæºå°±æ¯ç¨æ·çä¿¡æ¯ï¼å æ¬ï¼ç¨æ·çåºæ¬ä¿¡æ¯ï¼ä»¥åç¨æ·æå ·æçæéï¼ï¼èæ们æ³è¦è®¿é®è¿è¿ä¸èµæºå°±éè¦ç¨æ·ç»å½å¹¶ææï¼OAuth2æå¡ç«¯è´è´£ä»¤ççåæ¾çæä½ï¼è¿ä»¤çççææ们éç¨JWTï¼ä¹å°±æ¯è¯´JWTæ¯ç¨æ¥æ¿è½½ç¨æ·çAccess_Tokenç
æåï¼Spring Securityæ¯ç¨äºå®å ¨è®¿é®çï¼è¿éæ们æ们ç¨æ¥å访é®æéæ§å¶
4. 认è¯æå¡å¨é ç½®
4.1. Mavenä¾èµ
è¿éé¢æéè¦çä¾èµæ¯ï¼spring-security-oauth2-autoconfigure
4.2. application.yml
4.3. AuthorizationServerConfigï¼éè¦ï¼
说æï¼
4.4. WebSecurityConfigï¼éè¦ï¼
4.5. èªå®ä¹ç»å½é¡µé¢ï¼ä¸è¬æ¥è®²é½æ¯è¦èªå®ä¹çï¼
èªå®ä¹ç»å½é¡µé¢çæ¶åï¼åªéè¦åå¤ä¸ä¸ªç»å½é¡µé¢ï¼ç¶åå个Controllerä»¤å ¶å¯ä»¥è®¿é®å°å³å¯ï¼ç»å½é¡µé¢è¡¨åæ交çæ¶åmethodä¸å®è¦æ¯postï¼æéè¦çæ¶åactionè¦è·è®¿é®ç»å½é¡µé¢çurlä¸æ ·
åä¸è®°ä½äºï¼è®¿é®ç»å½é¡µé¢çæ¶åæ¯GET请æ±ï¼è¡¨åæ交çæ¶åæ¯POST请æ±ï¼å ¶å®çå°±ä¸ç¨ç®¡äº
4.6. å®ä¹å®¢æ·ç«¯
4.7. å è½½ç¨æ·
ç»å½è´¦æ·
å è½½ç»å½è´¦æ·
4.8. éªè¯
å½æ们çå°è¿ä¸ªçé¢çæ¶åï¼è¡¨ç¤ºè®¤è¯æå¡å¨é ç½®å®æãã
5. 两个客æ·ç«¯
5.1. Mavenä¾èµ
5.2. application.yml
è¿écontext-pathä¸è¦è®¾æ/ï¼ä¸ç¶éå®åè·åcodeçæ¶åå被æ¦æª
5.3. WebSecurityConfig
说æï¼
5.4. MemberController
5.5. Order项ç®è·å®æ¯ä¸æ ·ç
5.6. å ³äºéåº
éåºå°±æ¯æ¸ 空ç¨äºä¸SSO客æ·ç«¯å»ºç«çææçä¼è¯ï¼ç®åçæ¥è¯´å°±æ¯ä½¿ææ端ç¹çSession失æï¼å¦ææ³åå¾æ´å¥½çè¯å¯ä»¥ä»¤Token失æï¼ä½æ¯ç±äºæ们ç¨çJWTï¼æ èæ¤éTokenå°±ä¸æ¯é£ä¹å®¹æï¼å ³äºè¿ä¸ç¹ï¼å¨å®ç½ä¸ä¹ææå°ï¼
æ¬ä¾ä¸éç¨çæ¹å¼æ¯å¨éåºçæ¶åå éåºä¸å¡æå¡å¨ï¼æå以åååè°è®¤è¯æå¡å¨ï¼ä½æ¯è¿æ ·æä¸ä¸ªé®é¢ï¼å°±æ¯éè¦ä¸»å¨ä¾æ¬¡è°ç¨å个ä¸å¡æå¡å¨çlogout
6. å·¥ç¨ç»æ
éä¸æºç ï¼ blogs.com/cjsblog/p/.html
blogs.com/cjsblog/p/.html
blogs.com/cjsblog/p/.html
blogs.com/cjsblog/p/.html
blogs.com/lihaoyang/p/.html
blogs.com/charlypage/p/.html
/t/.html
9. ææ¡£
blogs.com/cjsblog/p/.html
一体化开源商城系统哪家做的好?
漫商汇是一家专注于为企业提供全场景解决方案的服务商,其一体化开源商城系统备受认可。漫商汇依托强大的资源中台,系统设计灵活,具有模块化的架构以及丰富的功能,其特点在于全场景覆盖、高度可定制、全方位服务、高效稳定、强大的技术支撑,企业如果在寻找一体化开源商城系统,可以将漫商汇作为备选方案之一。
OAuth2.0实战!使用JWT令牌认证!
本文介绍OAuth2.0集成JWT颁发令牌的实践,这是企业中应用广泛的令牌形式。
OAuth2.0中的令牌分为透明和不透明两种类型。不透明令牌是仅包含随机字符串,如UUID,资源服务需调用认证授权服务的接口进行校验,导致高并发下性能低下。相比之下,透明令牌如JWT,直接存储用户信息,资源服务可自行解析,无需额外调用校验接口。
JWT由三部分构成:头部、载荷和签名。关键要素指标源码头部定义令牌基本信息,如类型和加密算法。载荷包含用户信息等元数据。签名部分使用头部定义的算法结合密钥生成,确保数据完整性和安全性。
在OAuth2.0认证授权服务搭建中,JWT作为透明令牌,简化了令牌验证过程。首先,创建oauth2-auth-server-jwt模块,继承并修改上文关于OAuth2.0的代码。配置JWT相关的类,包括令牌增强类、令牌存储策略和签名密钥。使用JwtAccessTokenConverter进行JWT和OAuth身份转换,配置TokenStore为JWT生成方式,同时注意在实际应用中应使用非对称加密以增强安全性。
接下来,为授权服务配置令牌管理,使用DefaultTokenServices实现,设置令牌过期时间,并通过JWT方式生成访问令牌。在AuthorizationServerEndpointsConfigurer中添加令牌服务。至此,认证中心JWT令牌生成方式配置完成。
资源服务方面,构建oauth2-auth-resource-jwt模块,复用授权服务的配置,注意JWT加密密钥需与认证中心一致。配置令牌服务,生成ResourceServerTokenServices对象,结合JWT增强。将资源ID和令牌服务配置到ResourceServerSecurityConfigurer中,以实现资源访问。
测试阶段,通过获取令牌并调用资源服务接口验证逻辑是否正确。使用POSTMAN请求获取访问令牌,并使用获取的访问令牌调用资源服务接口进行测试。JWT令牌验证成功。
源码追踪环节,解析获取令牌和校验令牌的过程。获取令牌主要在TokenEndpoint处理,通过ClientDetailsService加载客户端信息,使用DefaultTokenServices生成并返回OAuth2AccessToken。校验令牌则在OAuth2AuthenticationProcessingFilter中完成,调用OAuth2AuthenticationManager的authenticate()方法实现令牌验证。
微信OAuth2.0授权回调页面域名设置问题
当下的解决方案是引入一个新的非常简单的应用来作为微信授权的代理服务,可以这么做:1. 把公众号的网页授权接口域名设置成另外一个子域名,如proxy.your.com;
2. 然后把php_weixin_proxy里面的index.php部署到proxy.your.com
php_weixin_proxy下的index.php是一个很简单的php文件,你可以直接查看源码了解它的实现方式。因为当前项目的环境,我采用php来完成这个代理服务实现,实际上,你完全可以用任意平台语言来完成类似的功能。
当其它业务需要发起微信授权时,将授权请求先发到proxy.your.com,然后proxy.your.com会把这个请求转发到微信;
当用户同意授权后,proxy.your.com会收到微信的授权回调,并把回调结果(code、state参数)原封不动地再返回给最开始发起授权的业务。
唯一的区别在于,在不使用proxy.your.com的时候,你从应用发起微信授权的链接应该是这样的:
/connect/qrconnect?appid=xxxxx&redirect_uri=%2F&response_type=code&scope=snsapi_login&state=bceff#wechat_redirect
用了proxy.your.com之后,这个授权链接就应该是这样的:
/?appid=xxxxx&redirect_uri=%2Flogin%2Fnotify&response_type=code&scope=snsapi_base&state=bceff&device=pc
后面这个链接跟上面的比:
1. 后面的链接中的host变成了proxy.your.com,也就是代理的授权回调域名;
2. 后面的多了一个device参数,这个是必要的。因为微信pc端跟移动端的授权地址是不一样的,而后面的链接是发送个proxy.your.com的,所以需要多加个参数告诉它在转发给授权申请给微信的时候,是用PC端还是移动端的授权地址。
1. 用户从我们的应用触发需要授权的操作,比如点击微信登录;
2. 应用收到这种用户请求后,将用户重定向到微信提供的一个授权页面:
或
3. 用户通过微信扫码(PC端授权,上边左图)或者点击确认按钮(移动端授权,上边右图)告知微信,授权应用访问自己的微信账号信息;
4. 微信收到用户的授权许可后,生成授权码,并把它作为参数回调至应用的某个页面;
5. 应用的回调页面在接收到微信的回调请求后,拿到其中的授权码,并通过微信官方提供的access token api接口获取access token;
6. 最后通过access token以及微信官方提供的另一个userinfo api接口就能获取到用户的微信账号信息。
为了实现这个过程,首先要为应用申请一个微信公众号,并将应用最终部署的域名设置到微信公众号设置里面的授权回调页面域名这个选项里面。微信官方对这个选项的说明如下:
关于网页授权回调域名的说明
1、在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 ,配置以后此域名下面的页面/music.html 、 /login.html 都可以进行OAuth2.0鉴权。但 、 、 无法进行OAuth2.0鉴权
3、如果公众号登录授权给了第三方开发者来进行管理,则不必做任何设置,由第三方代替公众号实现网页授权即可
由此可见,这个规则极其严格。如果说我们的应用最终部署的时候只有一个域名,那么这种规则不会有什么问题;但是考虑到将来应用的复杂性,我们可能在应用设计之初就会对应用做拆分,然后不同的业务采用不同的二级域名来部署。比如一个带有交易的应用,你可能会把登录注册,交易管理和常规业务都独立出来,然后采用以下的方式来部署它们:
www.your.com 部署常规业务;
trade.your.com 部署交易管理的业务;
passport.your.com 部署登录注册的业务;
在这种模式下,如果集成微信登录和微信支付,前面说的授权回调页面域名的规则就会给应用带来问题。在这里:至少可以确认trade.your.com和passport.your.com都需要前面的介绍的用户微信授权,但是它们是两个不同的子域名,而且我们只有一个公众号;根据授权回调页面域名的原则,它只能用一个域名,并且只有回调地址的域名与该设置完全相同,才能成功发起微信授权,否则就会提示rediret_uri参数错误或者引发无法回调的问题。
那么这种情况该如何处理?
当下的解决方案是引入一个新的非常简单的应用来作为微信授权的代理服务,可以这么做:
1. 把公众号的网页授权接口域名设置成另外一个子域名,如proxy.your.com;
2. 然后把php_weixin_proxy里面的index.php部署到proxy.your.com
php_weixin_proxy下的index.php是一个很简单的php文件,你可以直接查看源码了解它的实现方式。因为当前项目的环境,我采用php来完成这个代理服务实现,实际上,你完全可以用任意平台语言来完成类似的功能。
当其它业务需要发起微信授权时,将授权请求先发到proxy.your.com,然后proxy.your.com会把这个请求转发到微信;
当用户同意授权后,proxy.your.com会收到微信的授权回调,并把回调结果(code、state参数)原封不动地再返回给最开始发起授权的业务。
唯一的区别在于,在不使用proxy.your.com的时候,你从应用发起微信授权的链接应该是这样的:
/connect/qrconnect?appid=xxxxx&redirect_uri=%2F&response_type=code&scope=snsapi_login&state=bceff#wechat_redirect
用了proxy.your.com之后,这个授权链接就应该是这样的:
/?appid=xxxxx&redirect_uri=%2Flogin%2Fnotify&response_type=code&scope=snsapi_base&state=bceff&device=pc
后面这个链接跟上面的比:
1. 后面的链接中的host变成了proxy.your.com,也就是代理的授权回调域名;
2. 后面的多了一个device参数,这个是必要的。因为微信pc端跟移动端的授权地址是不一样的,而后面的链接是发送个proxy.your.com的,所以需要多加个参数告诉它在转发给授权申请给微信的时候,是用PC端还是移动端的授权地址。
整体方案思路:
小结:
这个方案我测试过,是行的通的。虽然说引入了代理服务,增加了一次重定向操作,不过由于这个授权请求并不是所有请求都需要,所以实际上也不会对用户体验产生多大的影响,但是从架构上来说,它的好处很明显,能够配合着应用的拆分逻辑,集成同一个公众号的登录及支付功能,不必为每个子应用都单独申请一个公众号来开发了(这种方式从业务上来说也不合理,一个公司哪需要运营那么多公众号)。
国内有哪些好的java开源电子商城系统?
国内知名的开源电子商城系统丰富多样,其中几个颇受欢迎的有: 1. 分布式B2C商城 xbin-store 这是一个模仿国内知名B2C网站设计的分布式商城系统,基于Spring Boot、Dubbo、MVC、MyBatis、Druid、Solr、Redis等技术构建,旨在提供一个高效、稳定、功能丰富的B2C电商解决方案。 2. Zscat-me 该项目是一个基于Spring Boot和Dubbo的全栈商城项目,集成了SSO登录、API网关、流量控制、自动CRUD、自动缓存、读写分离、分布式缓存、分布式定时任务、分布式锁、消息队列、事件机制、OAuth2.0登录、全文搜索、Qiniu文件服务、Dubbo集成等功能,提供了一个功能全面的电商平台。 3. 猫宁Morning公益商城 猫宁Morning公益商城是中国首个将传统公益商城互联网化的平台,具备B2C模式下的商城功能,包括注册、登录、商品浏览、购物车、订单管理、支付、评价、论坛等功能,同时后台提供用户管理、商品管理、订单管理、公告资讯管理等服务。 4. BDShop商城系统 BDShop是基于Spring Boot和Node.js的B2C电子商城系统,采用了前后端分离架构,旨在实现高效、灵活的电商解决方案。 5. Javashop-B2C 单店商城 Javashop-B2C基于Java技术构建,采用EOP(Enation Open Platform)框架,提供库存管理、订单流程、统计功能、支付方式等功能,易于扩展和定制,适合搭建稳定高效的B2C电商平台。 6. 小V铺微信开源商城 小V铺是完全免费的开源商城项目,支持HTML5+CSS3技术,提供商城源码、API和前端组件库,用户可以轻松定制和扩展,支持微信公众号、手机浏览器和朋友圈购物,功能全面,适用于一站式电商解决方案。