企业微信自建应用获取用户信息

一.前言

开发企业微信自建应用的时候难免会有获取企微个人信息的业务需求,这篇博客将详细说明企微自建应用获取userId的具体流程.

二.基本概念介绍

2.1 corpid

每个企业都拥有唯一的corpid,获取此信息可在管理后台“我的企业”-“企业信息”下查看“企业ID”(需要有管理员权限)

在这里插入图片描述

2.2 userid

每个成员都有唯一的userid,即所谓“账号”。在管理后台->“通讯录”->点进某个成员的详情页,可以看到

在这里插入图片描述

2.3 部门id

每个部门都有唯一的id,在管理后台->“通讯录”->“组织架构”->点击某个部门右边的小圆点可以看到

在这里插入图片描述

2.4 agentid

每个应用都有唯一的agentid。在管理后台->“应用管理”->“应用”,点进某个应用,即可看到agentid

在这里插入图片描述

2.5 secret

secret是企业应用里面用于保障数据安全的“钥匙”,每一个应用都有一个独立的访问密钥,为了保证数据的安全,secret务必不能泄漏

在这里插入图片描述

2.6 access_token

access_token是企业后台去企业微信的后台获取信息时的重要票据,由corpid和secret产生。所有接口在通信时都需要携带此信息用于验证接口的访问权限

接口调用流程:

在这里插入图片描述

三.获取access_token

获取access_token是调用企业微信API接口的第一步,相当于创建了一个登录凭证,其它的业务API接口,都需要依赖于access_token来鉴权调用者身份。因此开发者,在使用业务接口前,要明确access_token的颁发来源,使用正确的access_token。

此处标注大写的单词 ID 和 SECRET,为需要替换的变量,根据实际获取值更新。其它接口也采用相同的标注,不再说明

3.1 请求参数说明:

参数必须说明
corpid企业ID
corpsecret应用的凭证密钥,注意应用需要是启用状态(secret)

权限说明:

每个应用有独立的secret,获取到的access_token只能本应用使用,所以每个应用的access_token应该分开来获取

3.2 返回结果:

{
   "errcode": 0,
   "errmsg": "ok",
   "access_token": "accesstoken000001",
   "expires_in": 7200
}

响应参数说明:

参数说明
errcode出错返回码,为0表示成功,非0表示调用失败
errmsg返回码提示语
access_token获取到的凭证,最长为512字节
expires_in凭证的有效时间(秒)

3.3 注意事项:

  • 开发者需要缓存access_token,用于后续接口的调用(注意:不能频繁调用gettoken接口,否则会受到频率拦截)。当access_token失效或过期时,需要重新获取。

  • access_token的有效期通过返回的expires_in来传达,正常情况下为7200秒(2小时),有效期内重复获取返回相同结果,过期后获取会返回新的access_token。

  • 由于企业微信每个应用的access_token是彼此独立的,所以进行缓存时需要区分应用来进行存储。

  • access_token至少保留512字节的存储空间。

  • 企业微信可能会出于运营需要,提前使access_token失效,开发者应实现access_token失效时重新获取的逻辑。

四.获取访问用户身份

该接口用于根据code获取成员信息,适用于自建应用与代开发应用

4.1 请求参数说明:

参数必须说明
access_token调用接口凭证
code通过成员授权获取到的code,最大为512字节。每次成员授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期

权限说明:

跳转的域名须完全匹配access_token对应应用的可信域名,否则会返回50001错误

在这里插入图片描述

4.2 返回结果:

{
   "errcode": 0,
   "errmsg": "ok",
   "userid":"USERID",
   "user_ticket": "USER_TICKET"
}

响应参数说明:

参数说明
errcode返回码
errmsg对返回码的文本描述内容
userid成员UserID。若需要获得用户详情信息,可调用通讯录接口:读取成员。如果是互联企业/企业互联/上下游,则返回的UserId格式如:CorpId/userid
user_tickett 成员票据,最大为512字节,有效期为1800s。scope为snsapi_privateinfo,且用户在应用可见范围之内时返回此参数。后续利用该参数可以获取用户信息或敏感信息,参见"获取访问用户敏感信息"。暂时不支持上下游或/企业互联场景

五.代码编写

本次业务需求我只要获取userId即可,所以在后端采用静态变量存储access_token,如不满足你的业务需求可采用redis进行存储

5.1 前端

created() {
	this.getUserIdByCode()
}

methods: {
// 获取userID
getUserIdByCode() {
	console.log('钩子函数执行了')
	const code = this.GetQueryString('code')
	if (code) {
	// 通过code获取用户信息
	this.getUserId(code)
}
},
// 获取code
GetQueryString(name) {
	var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)')
	var r = window.location.search.substr(1).match(reg)
	if (r != null) return unescape(r[2]);
	return null
},
getUserId(code) {
	uni.request({
		url: 'http://localhost:13889/wechat/getUserId/' + code,
		method: 'POST',
		success: (res) => {
			this.userId = res.data.data
			console.log("员工工号:" + this.userId);
		}
	})
}
}

5.2 后端

5.2.1 企微常量参数
/**
 * 描述:企微常量参数
 * 创建人: 黎明
 * 创建时间: 2023/10/19
 * 版本: 1.0.0
 */
public interface WeChatConstant {

    // 企业ID
    public final static String CORP_ID = "企业ID";
    // 应用的凭证密钥
    public final static String SOD_SECRET = "应用的凭证密钥";
    // 获取access_token
    public final static String ACCESS_TOKEN_URL = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET";
    // 获取访问用户身份
    public final static String CODE_URL = "https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo?access_token=ACCESS_TOKEN&code=CODE";

}
5.2.2 工具类
/**
 * 描述:http工具类
 * 创建人: 黎明
 * 创建时间: 2023/12/25
 * 版本: 1.0.0
 */
@Slf4j
public class HttpUtils {

    /**
     * 获取企业微信的access_token
     *
     * @param corpid     企业ID
     * @param corpsecret 应用的凭证密钥
     * @return AccessToken对象,包含access_token等信息
     */
    public static AccessToken getAccessToken(String corpid, String corpsecret) {

        AccessToken accessToken = null;

        // 构造请求URL,将其中的ID和SECRET替换为实际参数
        String requestUrl = WeChatConstant.ACCESS_TOKEN_URL.replace("ID", corpid).replace("SECRET", corpsecret);
        // 发送HTTP GET请求,获取响应结果
        String resResult = HttpUtil.get(requestUrl);
        // 将响应结果转换为JSON对象
        JSONObject obj = new JSONObject(resResult);
        // 如果请求成功
        if (null != obj) {
            accessToken = new AccessToken();
            if (obj.getInt("errcode").equals(0)) {
                // 设置AccessToken对象的属性值
                accessToken.setErrcode(obj.getInt("errcode"));
                accessToken.setErrmsg(obj.getStr("errmsg"));
                accessToken.setAccessToken(obj.getStr("access_token"));
                accessToken.setExpiresIn(obj.getInt("expires_in"));
                accessToken.setTokenTime(DateUtil.date());
            } else {
                // 如果错误码不为0,表示请求失败,将accessToken设置为null
                accessToken = null;
                // 记录错误日志
                log.error("获取token失败 errcode:{} errmsg:{}", obj.getInt("errcode"), obj.getStr("errmsg"));
            }
        }
        // 返回AccessToken对象
        return accessToken;
    }
}
/**
 * 描述:日期工具类
 * 创建人: 黎明
 * 创建时间: 2023/12/25
 * 版本: 1.0.0
 */
public class DateUtils {

    /**
     * 根据date转换成localDateTime
     *
     * @param date 日期
     * @return {@link LocalDateTime}
     */
    public static LocalDateTime dateConvertLocalDateTime(Date date) {
        // 将Date对象转换为Instant对象,然后根据系统默认时区转换为LocalDateTime对象
        LocalDateTime localDateTime = Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime();
        return localDateTime;
    }

    /**
     * 根据localDateTime转换成date
     *
     * @param localDateTime 本地日期时间
     * @return Date对象
     */
    public static Date localDateTimeConvertDate(LocalDateTime localDateTime) {
        // 调用getZonedDateTimeByLocalDateTime方法将LocalDateTime对象转换为ZonedDateTime对象,然后将ZonedDateTime对象转换为Instant对象,最后将Instant对象转换为Date对象
        return Date.from(getZonedDateTimeByLocalDateTime(localDateTime).toInstant());
    }

    /**
     * 根据localDateTime转换成ZonedDateTime对象,用于把localDatTime转成Date
     *
     * @param localDateTime 本地日期时间
     * @return ZonedDateTime对象
     */
    public static ZonedDateTime getZonedDateTimeByLocalDateTime(LocalDateTime localDateTime) {
        // 获取系统默认时区
        ZoneId zoneId = ZoneId.systemDefault();
        // 将LocalDateTime对象转换为ZonedDateTime对象
        ZonedDateTime zonedDateTime = localDateTime.atZone(zoneId);
        return zonedDateTime;
    }

}
5.2.3 封装access_token返回结果
@Data
public class AccessToken implements Serializable {
    /**
     * 返回码
     */
    private Integer errcode;
    /**
     * 返回消息
     */
    private String errmsg;
    /**
     * token
     */
    private String accessToken;
    /**
     * 凭证有效时间,单位:秒
     */
    private Integer expiresIn;
    /**
     * 获取token的时间
     */
    private Date tokenTime;
}
5.2.4 定义接口
 * 描述:获取企微人员信息
 * 创建人: 黎明
 * 创建时间: 2023/12/25
 * 版本: 1.0.0
 */
@RestController
@RequiredArgsConstructor
@RequestMapping("/wechat")
public class UserInfoController {

    private final WeChatServiceImpl weChatService;

    /**
     * 获取用户id
     *
     * @return 员工工号
     */
    @PostMapping ("/getUserId/{code}")
    public Result<String> getUserId(@PathVariable String code){
        String userId = weChatService.getUserIdByCode(code);
        return Result.success(userId);
    }
}
5.2.5 编写业务层代码
@Service
@Slf4j
public class WeChatServiceImpl {

    // 定义access_token静态变量,用于存储获取到的access_token
    private static String ACCESS_TOKEN = "";
    // 定义获取access_token的时间
    private static Date ACCESS_TOKEN_TIMR = DateUtil.date();

    /**
     * 根据微信授权码获取用户ID
     *
     * @param code 微信授权码
     * @return 用户ID
     */
    public String getUserIdByCode(String code) {
        // 初始化成员变量userId为空字符串
        String userId = "";
        // 如果ACCESS_TOKEN为空或者过期,则重新获取access_token
        if (StrUtil.hasEmpty(ACCESS_TOKEN)) {
            ACCESS_TOKEN = getUserInfo();
        }
        boolean flag = checkAccessToken(ACCESS_TOKEN_TIMR);
        // 如果access_token已过期,则重新获取access_token
        if (!flag) {
            ACCESS_TOKEN = getUserInfo();
        }
        // 构造请求URL,替换其中的ACCESS_TOKEN和CODE
        String userUrl = WeChatConstant.CODE_URL.replace("ACCESS_TOKEN", ACCESS_TOKEN).replaceAll("CODE", code);
        // 发送HTTP请求,获取响应结果
        String res = HttpUtil.get(userUrl);
        // 将响应结果转换为JSON对象
        JSONObject response = new JSONObject(res);
        // 如果响应中的错误编码为0,表示成功获取到用户信息,将用户ID赋值给userId
        if (response.getStr("errcode").equals("0")) {
            userId = response.getStr("userid");
        } else {
            // 如果错误编码不为0,记录日志,输出错误编码和错误信息
            log.info("未获取到人员信息,错误编码:{},错误信息:{}", response.getStr("errcode"), response.getStr("errmsg"));
        }
        // 返回用户ID
        return userId;
    }

    /**
     * 获取access_token
     *
     * @return access_token字符串
     */
    private static String getUserInfo() {
        // 调用HttpUtils工具类的getAccessToken方法,传入企业ID和应用密钥,获取access_token
        return HttpUtils.getAccessToken(WeChatConstant.CORP_ID, WeChatConstant.SOD_SECRET).getAccessToken();
    }

    /**
     * 检查access_token是否过期
     *
     * @param date 时间
     * @return 如果access_token未过期,返回true;否则返回false
     */
    private static boolean checkAccessToken(Date date) {
        // 将时间转换为LocalDateTime对象
        LocalDateTime localDateTimeNow = DateUtils.dateConvertLocalDateTime(date);
        // 将LocalDateTime对象转换为时间戳(毫秒)
        Long milliSecond = getTimestampOfDateTime(localDateTimeNow);
        // 将时间戳加上7200秒(2小时),得到新的过期时间
        milliSecond = milliSecond + (7200L * 1000L);
        // 将新的过期时间转换为LocalDateTime对象
        LocalDateTime dateTime = getDateTimeOfTimestamp(milliSecond);
        // 获取当前时间
        LocalDateTime now = LocalDateTime.now();
        // 如果当前时间在新的过期时间之前,说明access_token未过期,返回true;否则返回false
        if (now.isBefore(dateTime)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 将LocalDateTime对象转换为时间戳(毫秒)
     *
     * @param localDateTime 要转换的LocalDateTime对象
     * @return 对应的时间戳(毫秒)
     */
    private static long getTimestampOfDateTime(LocalDateTime localDateTime) {
        // 获取系统默认时区
        ZoneId zone = ZoneId.systemDefault();
        // 将LocalDateTime对象转换为Instant对象
        Instant instant = localDateTime.atZone(zone).toInstant();
        // 将Instant对象转换为时间戳(毫秒)并返回
        return instant.toEpochMilli();
    }

    /**
     * 将时间戳(毫秒)转换为LocalDateTime对象
     *
     * @param timestamp 要转换的时间戳(毫秒)
     * @return 对应的LocalDateTime对象
     */
    private static LocalDateTime getDateTimeOfTimestamp(long timestamp) {
        // 将时间戳(毫秒)转换为Instant对象
        Instant instant = Instant.ofEpochMilli(timestamp);
        // 获取系统默认时区
        ZoneId zone = ZoneId.systemDefault();
        // 将Instant对象转换为LocalDateTime对象并返回
        return LocalDateTime.ofInstant(instant, zone);
    }
}

六.构造网页授权链接

https://open.weixin.qq.com/connect/oauth2/authorize?appid=CORPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&state=STATE&agentid=AGENTID#wechat_redirect

在这里插入图片描述

七.测试

在这里插入图片描述

  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
千博企业网站管理系统无使用时间限制、无域名限制,支持电脑版、手机版、绑定到微信微信小程序,HTML5响应式内核,高效且优秀。 为什么选择千博企业网站管理系统? 一、0费用,完全免费无限制。 免费下载、免费使用、内置一套精美企业网站模板,模板界面、网站数据都可以自主管理和维护。本版本将于近期开源,提供全部开发源码,您可以登录官网关注千博公众号,第一时间获取最新开源动态、下载源码。 二、稳健、高负载 千博企业网站管理系统是基于微软 .Net4.0企业平台 + Microsoft SQL Server 2008/2012/2014/2016(SQL存储过程) 进行开发的新型网站管理系统。.Net4.0平台的稳定性、安全性以及各种特殊性能一直被业界所公认,被视为微软在企业开发领域的骄傲,也是千博企业网站管理系统保持持久稳定的核心条件。 不仅如此,千博企业网站管理系统的 N 层架构设计,为系统提供了充分的可伸缩的特性,使千博企业网站管理系统扩展性能够适应各种信息化网站平台的规模和应用需求。 千博企业网站管理系统出色的数据处理能力,体现在它对业界公认的海量数据库类型 Microsoft SQL Server 的支持上。系统优秀的数据处理和管理能力为企业用户不同发展阶段提供了完美、领先的数据存储方案。 三、简单、好用,新手也能轻松上手。 千博企业网站管理系统,真正从用户的使用习惯出发,操作简单方便,可视化编辑所见即所得,只要会打字就可以轻松管理和维护网站所有内容。 三、响应式布局,流畅专业的企业网站前端界面设计,获得优越的用户体验! 什么是响应式布局? Responsive design,意在实现不同屏幕分辨率的终端上浏览网页的不同展示方式。通过响应式设计能使网站在手机和平板电脑上有更好的浏览阅读体验。 千博企业网站管理系统的界面设计遵循最新的 W3C 国际网页设计标准,网站无论运行在 IE、Opera、Netscape 甚至挑剔的 Firefox 浏览器上,都能流畅、完整、真实地展示出您的网站。千博企业网站管理系统遵循多浏览器、高速度的 W3C 标准核心思想,以尽量避免在各个浏览器中的差异性,不会因为浏览器的不同而系统功能受到限制。千博企业网站管理系统流畅的设计不仅提升用户体验,而且以视觉的美感提高网站亲和力。 出色的模板设计,特别是千博原创设计团队制作的网站模板必须具备以下特点: 1、前端代码清爽规范标准,方便以后维护; 2、前端模板代码编写细致并经过严谨的测试,兼容各大浏览器:针对时下流行浏览器进行优化,IE、Chrome、Safari、FireFox、360,Opera一个也不落下。 3、响应式布局,自适应电脑、手机、平板等访问终端; 4、前端模板界面都可以自定义修改或根据需要全新制作自己的网站前台美工样式,点点鼠标就能完成修改,并不需要学习特定的程序语言代码基础; 6、支持图片上传自动水印功能,可以方便地设置每页信息条数、时间格式、展示方式、排序方式、标题字数等属性。 7、栏目分类支持无限级别,图文排版支持可视化,文章内容分页、视频播放、文件下载等功能,所有操作所见即所得,让新手也能轻松上手; 8、内容管理支持批量审核、批量设置、批量移动、批量删除、推荐、置顶等操作,设置回收站功能,用户误删除的数据可以轻松找回; 8、支持全站检索,用户输入一个词,搜新闻、搜产品、搜一切数据,就是这么方便; 9、全站文字、系统栏目、信息内容和全站图片、CSS样式表、JS文件支持用户自定义; 10、内置统计模块,用户也可以接入第三方统计接口,轻松监控网站浏览及来访者详情; 11、支持电脑版、手机版、绑定到微信微信小程序:是指在保持同一域名、同一后台、同一数据库、同一套系统的基础上,不同设备(PC/手机/PAD)来访问网站前台时,网站都会针对此类设备显示与之最相适应和专为此类设备的用户使用习惯优化的前台界面,从而在不同设备访问时都能提供最佳用户体验。 四、功能更强大、扩展更方便! 千博企业网站管理系统提供了灵活、强大的自定义模型功能,借助此功能您可以根据自身需求搭建成内容丰富、类型各样的网站平台。 比如,您需要为网站增加一个在线视频点播的功能?首先设计视频栏目所需要的项目(即字段,如视频名称、视频存放地址、视频图片、视频介绍等),接下来只需要使用千博企业网站管理系统的自定义模型功能,逐步添加所需的各种表单,如:文本框类字段、在线上传图片类字段、下拉选项类字段、多项选择类字段等…而且这些功能的实现,只需要您像操作 Word 软件一样点击鼠标即可实现。 千博企业网站管理系统除了内置企业网站常用的企业文化、关于我们、新闻动态、公司产品展示、图文排版、文件下载、视频播放、在线客服、联系我们、友情链接等功能,用户还可以方便地扩展或开发自己所需要的功能。自定义
商淘云B2B2C多用户商城系统是一款基于国内大众化框架打造的B2B2C电商平台,是目前完善度领先的电商管理平台标准化产品,系统主要功能采用高内聚,辅助功能插件式实现,全系统拥有PC、手机H5、微商城、买家安卓端APP、买家苹果端APP、卖家安卓端APP、卖家苹果端APP、微信小程序,支持可视化装修,另有无缝对接的商淘源码IM客服系统,极其适合中小型企业快速上线商务平台。 商淘云B2B2C多用户商城系统代码清晰易懂,大量的可视化报表便于运营者决策,丰富的营销功能让系统的应用场景广阔,良好的插件机制使系统更加易于扩展。系统操作简单,安全稳定,更新迭代快速,是广大用户直接使用和二次开发的最佳选择。 商淘云B2B2C多用户商城系统支持: (一) 系统管理:菜单权限、前台菜单、角色管理、职员管理、登录日志、操作日志、图片空间、商城消息、风格设置、计划任务 (二) 基础设置:商城配置、导航管理、广告管理、广告位置、银行管理、支付管理、地区管理、友情链接、快递管理、消息模板 (三) 会员管理:会员等级、会员管理、账号管理 (四) 文章管理:文章管理、文章分类 (五) 运营管理:推荐管理、商品推荐、店铺推荐、品牌推荐、财务管理、资金管理、提现申请、结算管理、商家结算、充值送 (六) 订单管理:订单管理、投诉管理、退款管理 (七) 店铺管理:店铺认证、开店申请、店铺管理、停用店铺 (八) 商品管理:商品管理、已上架商品、待审核商品、违规商品、商品分类、商品属性、品牌管理、商品规格、评价管理、商品采集 (九) 虚拟物品自动发货:虚拟商品上架、卡密管理、自动发货 (十) 扩展管理:插件管理、钩子管理 (十一) 分销管理:分销管理菜单、分销商家列表、分销商品列表、佣金分成列表、推广用户列表 (十二) 数据分析:商品销售排行、店铺销售统计、销售额统计、销售订单统计、新增会员统计、会员登录统计 (十三) 营销管理:三级分销、限时秒杀、商品团购,限时拍卖、微砍价、优惠券、满减、满送、满包邮、签到送积分、积分商城、拼团 (十四) 微信管理:公众号设置、自定义菜单、用户管理、主动回复文本信息、主动回复图文信息微信消息模板 (十五) 支付管理:支付宝支付,微信支付、银联支付、货到付款、积分支付、余额支付 (十六) 短信接口:中国网建、阿里大于、阿里云-云通信、短信宝 (十七) 登录接口:QQ登录、微信登录、微博登录 (十八) 物流接口:快递100接口 (十九) 其他接口:LBS定位、UCenter通信接口(可与社区论坛等同步登录退出) 商淘云WSTMart电子商务系统是基于THINKPHP 5.1开发的B2B2C综合电子商务系统。 安装此程序请确保PHP版本高于5.6(支持PHP7) 商淘云B2B2C多用户商城系统 v3.6.6更新日志 本次升级主要升级以下功能: 【新增】商家/供货商佣金费率可以针对商家/供货商进行设置。 系统支持系统分类收取佣金、商家/供货商约定佣金、商家/供货商年费等。 【新增】用户APP端新增版本更新及下载功能。 【新增】商家端APP资金流水功能。 【新增】客服系统新增快捷回复(由商家后台新增,客服双击之后直接发送(手机上是单击发送))。 【新增】小程序加上强制版本更新功能。 【修改】优化用户端图片缓存。 【修改】移动端结算页的发票选择样式修改。 【修改】单独商家端APP配置支付宝支付。 【修改】商品列表默认排序方式可由后台定义、增加“综合排序”选项。 【修改】客服系统断线重连。 【修改】监听网络状态切换,从无网络切换到开启网络之后自动重新请求。 【修改】直播插件-商家上架商品流程优化。 【修改】会员营销插件配置优化。 【修复】修复ios端分享到微信时缩略图偶尔无法显示bug。 【修复】ios端app微信登录之后无法正确返回到app。 【修复】用户APP端未记录广告点击数的bug。 【修复】修复app端余额支付页提示“未设置支付密码”的bug。 【修复】修复没有设置经销商推广提示语,生成二维码报错。 商淘云B2B2C多用户商城系统 v3.6.5更新日志 本次版本主要更新以下功能: 【新增】商家端APP端增加扫码登录。 【新增】商家端APP端增加售后单处理。 【新增】商家端APP端新增快到期提示。 【新增】用户APP端文章列表增加底部导航按钮。 【修改】待自提的订单中“发货”改成核销,点击之后跳去核销的界面。 【修改】统一卖家/买家为商家/用户名称。 【修改】移动端商品分类取移动端名称。 【修改】店铺街主营查询项改成查行业。 【修改】优化商家入驻/供货商入驻提示。 【修改】商家入驻(供货商入驻)的开始日期和截止日期应该以管理员审核通过之后的日期为准。 【修改】修改小程序获取用户信息接口。 【修改】调整销售额统计规则,只要下单的订单都计入销
易思ESPCMS-P8企业建站管理系统由ESPCSM多个版本发展而来,可以适应目前流行的各类型企业网站的搭建及管理,它具备管理不同类型的信息,支持在线订购、支付、手机短信、微信公众号管理等常见功能。新一代的ESPCMS-P8平台,内置一套响应式的模板,具备开发方便,可以通过二次开发,扩展出常见的系统功能。 易思ESPCMS企业建站管理系统特点: 一、自定义组件应用:ESPCMS-P8采用了自定义组件安装的方式,可以在线自主安装最新的应用组件,ESPCMS将以组件市场为基础,打造强大实用的组件模式,供用户选择安装使用。 二、全的移动终端网站体验:结合目前流行的智能手机及其它移动平台,打造功能实全的移动终端网站应用,并可以在移动终端上面实行留言、订购、会员、表单等常见企业营销功能; 三、微信应用:完全支持微信信息推送、加入欢迎词、微信菜单设置、微网站设置,配合移动终端还可以实现微商城及微行业网站的应用; 四、二维码应用:可以实现微信二维码、手机二唯码、产品订单条形码的显示; 五、智能化的内容关键字生成:通过智能化的关键字生成,可以提高网站的SEO效果。 六、无限分类显示:支持内容无限分类,并可以在同页面实现无限分类的输出及展示,大大满足产品多分类的需求; 七、国内外主流支付组件:支持国内各大主流支付包括支付宝、财付通、快钱、银联,国际包括:Moneybookers、PayPal,实现企业国内外支付的需要; 八、人性化的图片文件上传组件:可以自定义图片文件上传、可以批量图片文件上传、可以相册分组、相册输出等文件管理功能; 九、邮件提醒模块:支持会员注册邮件通知、会员密码找回邮件通知、会员激活邮件通知、订单下单成功邮件通知、支付成功邮件通知、订单取消邮件通知、新订单管理员提醒通知、订单确认邮件通知、询价确认通知、询价管理员提醒通知、自助表单自定义管理员邮件知通知、自助表单回复通知、表单提交感谢信通知、新留言自定义管理员邮件知通知、新留言回复通知、内容留言管理员提醒通知。 十、手机短信提醒模块:支持手机短信注册提醒、手机密码找回、订单管理员提醒、密码修改提醒等手机短信功能; 十一、多站点集群管理:支持多站点相互通信管理,为集团企业建站增加便利管理功能; 十二、强大的SEO功能:支持内链、外链、TAG关键字、百度地图、Google地图等流行SEO元素,还支持静态页面生成、伪静态、动态等多种不同的模式; 易思ESPCMS企业建站管理系统升级日志: [新增]:支持PHP7所有系列版本; [修复]:手机网站产品在筛选时候的运行错误; [修复]:加密串过长,导致信息加密失败; [修复]:系统目录设置生成根目的时候,浏览英文版会出错; [修复]:上传文件的时候,文件夹指示出错,导致根目录出现过多的图片; [修复]:文件夹管理中,文件搜索出错 [修复]:在PHP7中,邮件发送失败 [修复]:在分辨率过低的时候,部分下拉菜单被遮挡; [修复]:当网站生成根目录,且生成目录设置为空,会导致根目录获取失败
如果你想在Java实习中实现企业微信自建应用授权登录获取用户信息,可以按照以下步骤进行: 1. 获取应用ID和应用Secret,可以在企业微信管理后台创建自建应用时获得。 2. 配置可信域名、回调URL、授权回调域名和网页授权域名,确保域名的正确性和安全性。 3. 在Java项目中使用企业微信提供的OAuth2.0接口或者开源的Java SDK,实现授权登录功能。 4. 引导用户跳转到企业微信授权页面进行授权,授权成功后,企业微信会回调预设的回调URL,返回授权码。 5. 通过授权码获取access_token和用户信息,可以使用企业微信提供的OAuth2.0接口或者开源的Java SDK完成。 以下是一个使用Java SDK实现企业微信自建应用授权登录获取用户信息的示例代码: ```java // 1. 获取应用ID和应用Secret String appId = "your_app_id"; String appSecret = "your_app_secret"; // 2. 配置可信域名、回调URL、授权回调域名和网页授权域名 // 3. 使用Java SDK实现授权登录功能 WxCpService wxCpService = WxCpConfiguration.getCpService(appId); String redirectUrl = "https://your_callback_url"; String state = "your_state"; String authorizeUrl = wxCpService.getOauth2Service().buildAuthorizationUrl(redirectUrl, state); // 4. 引导用户跳转到企业微信授权页面进行授权 // 5. 企业微信回调预设的回调URL,返回授权码 String code = request.getParameter("code"); // 6. 通过授权码获取access_token和用户信息 WxCpOAuth2AccessToken wxCpOAuth2AccessToken = wxCpService.getOauth2Service().getAccessToken(code); String accessToken = wxCpOAuth2AccessToken.getAccessToken(); String userId = wxCpOAuth2AccessToken.getUserId(); WxCpUser wxCpUser = wxCpService.getUserService().getById(userId); ``` 注意事项: 1. 在开发过程中,需要保证应用ID、应用Secret、回调URL等参数的正确性。 2. 在获取access_token和用户信息时,需要保证请求的准确性和安全性。 3. 在获取用户信息时,需要保证授权作用域的正确性和权限的足够性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小钟不想敲代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值