지난 9월 WeChat이 Enterprise Account를 출시한 후 업계에서 많은 반응을 얻었습니다. 이 기사에서는 WeChat 기업 계정 개발과 관련된 지식을 자세히 설명하고 더 높은 보안 메커니즘의 2차 검증을 달성하는 방법에 중점을 둘 것입니다.
기업 체험 계정 신청:
기업 계정은 이름 그대로 기업이 신청할 때 서비스 계정을 신청하는 것과 마찬가지로 신청하는 계정입니다. , 다양한 조직 인증 문서를 제공해야 하며 개발자가 운영하기가 어렵습니다. 다행스럽게도 Tencent는 서비스 계정과 마찬가지로 경험 계정에 대한 애플리케이션을 개설했습니다. 유효 기간은 90일로 매우 짧습니다. (서비스 계정 테스트 계정의 유효 기간은 1년입니다.) 엔터프라이즈 경험 계정을 장기간 사용하지 않는 경우 Tencent로부터 조기 만료 알림 이메일을 받게 됩니다. 기업 체험 계정 신청 링크는 다음과 같습니다. 개발자는 Tencent의 지침에 따라 등록 단계를 완료하고 즉시 체험 계정을 얻으면 됩니다.
http://qydev.weixin.qq.com/try ?t= experience
주소록에 회원 추가:
공용 계정과 달리 내부 기업용이기 때문에 Tencent에서는 기업이 적극적으로 팬을 추가할 수 있습니다. 구체적인 조작은 주소록 입력 후 + 버튼을 눌러 신규 회원을 추가하는 것입니다. 참고로 유일한 개인 식별 정보로는 위챗 아이디, 휴대폰 번호, 이메일 주소가 하나 이상 있어야 하는 것이 일반적입니다. WeChat ID를 직접 수집하려면 일반적으로 회사의 HR 데이터베이스에 있는 휴대폰 번호와 이메일 주소를 사용할 수 있으며, 수동으로 추가할 수도 있고 Excel 템플릿 가져오기 및 Tencent Enterprise Account WeChat API를 통해 추가할 수도 있습니다. 사용자를 추가하는 방법은 이후 장에서 소개됩니다.
> 입력이 완료된 후, 기업 WeChat ID의 QR 코드를 직원에게 전송할 수 있습니다. 직원이 이를 스캔하면 시스템의 기본 기업 ID 도우미가 자동으로 이메일을 통해 직원에게 안내하거나 휴대폰 인증 코드를 사용하여 완료합니다. 이는 직원 신원 확인 과정입니다. 기업은 주소록에 있는 직원 데이터의 정확성을 자체적으로 보장합니다. 이후 직원 확인을 통과하면 물음표가 표시됩니다. 주소록 상태 열에 하나의 확인이 통과되었음을 나타냅니다.
이에 대해서는 Enterprise Account의 공식 인터페이스 문서 http://qydev.weixin.qq.com/wiki/index.phptitle=를 참조할 수 있습니다. %E5%85%B3%E6%B3%A8% E4%B8%8E%E5%8F%96%E6%B6%88%E5%85%B3%E6%B3%A8은 Force.com에서 해당 페이지를 개발합니다. 플랫폼. 2차 확인을 위한 페이지 개발:
마찬가지로 페이지는 두 부분으로 나뉘며, 한 부분은 사용자 이름과 비밀번호를 입력하는 데 사용되는 표시 부분입니다. , 페이지 다이어그램은 다음과 같습니다. user 사용자 이름 user 및 비밀번호 123을 입력하고 바인딩 버튼을 클릭하여 바인딩을 완료합니다.
다음과 같은 창이 뜨는데, 회사의 2차 인증페이지 주소를 입력해야 합니다:
이에 대해서는 Enterprise Account 공식 인터페이스 문서인 http://qydev.weixin을 참조할 수 있습니다. .qq.com/wiki/index.phptitle=%E5 %85%B3%E6%B3%A8%E4%B8%8E%E5%8F%96%E6%B6%88%E5%85%B3%E6% B3%A8은 Force.com 플랫폼에서 해당 페이지를 개발합니다.
2차 검증을 위한 페이지 개발:
마찬가지로 페이지는 두 부분으로 나누어져 있습니다. 한 부분은 사용자 이름과 비밀번호를 입력하는 부분입니다. 페이지 구성은 다음과 같습니다. 사용자는 user 이름과 비밀번호 123을 입력합니다. 바인딩 버튼을 눌러 바인딩을 완료하세요.
페이지 이름 EmployeeAuth이고 페이지 코드는 다음과 같습니다. 일부 태그는 apex 코드에 고유하므로 심층적인 이해가 필요하지 않습니다. 중요한 것은 13행에 있는 버튼의 작업 속성이 버튼을 클릭할 때 바인딩 방법을 지정한다는 것입니다. , 컨트롤러 클래스 EmployeeAuthController의 바인딩 메서드가 호출됩니다.
<apex:page standardstylesheets="false" showHeader="false" sidebar="false" controller="EmployeeAuthController"> <font size="50"> <h1>Please input your user name and password</h1> </font> <font size="30"> UserName: user<br /> Password: 123<br /><br /> <hr/> <apex:form > UserName: <apex:inputText size="100" style="height:100px" value="{!strUsername}" id="strUsername"/><br /><br /> Password: <apex:inputText size="100" style="height:100px" value="{!strPassword}" id="strPassword"/><br /><br /> <center> <apex:commandButton value="Bind" style="width:600px; height:100px;font-size:50px" action="{!bind}" id="bind" /> </center> </apex:form> {!msg} </font> </apex:page>
EmployeeAuthController 컨트롤러 클래스의 코드를 해석하기 전에 먼저 WeChat의 단계를 살펴보겠습니다. 2차 인증.
2차 검증 단계 및 메커니즘:
1. 먼저, 위챗 기본 인증(또는 이메일이나 휴대폰 번호 인증)이 완료되면 위챗은 사용자에게 아래와 같은 메시지를 보냅니다:
2. 페이지 이동:
사용자가 이 이미지와 텍스트를 클릭하면 실제로 웹이 열립니다. open.weixin.qq.com 웹사이트 아래에 위치한 페이지는 일부 처리를 한 후 우리가 개발 중인 페이지인 2차 검증에서 이전에 설정한 URL로 점프할 때 code=CODE&state=STATE 매개변수를 추가합니다. 예를 들어, 이 예에서 두 번째 확인을 위해 구성된 URL은 http://johnson0001-developer-edition.ap1.force.com/EmployeeAuth이며 Tencent openweixin.qq에서 시작됩니다. com 점프 후는 http://johnson0001-developer-edition.ap1.force.com/EmployeeAuth?code=CODE&state=STATE입니다. Tencent는 여기서 상태 매개변수가 무엇인지 설명하지 않았으며 현재로서는 중요하지 않습니다. 중요한 것은 code 매개변수입니다. 이 매개변수를 사용하면 직원의 userid를 대신하여 Tencent의 oauth2 인터페이스를 호출할 수 있습니다. userid는 매우 중요한 개념입니다. 기업 계정에는 userid만 사용됩니다. 이 사용자 ID는 실제로 주소록을 관리할 때의 계정 필드 값입니다.
3. 직원 사용자 ID를 대신하여 코드를 통해 Tencent oauth2 인터페이스를 호출합니다.
이 인터페이스에 대한 지침은 Tencent 설명서 http를 참조하세요. ://qydev.weixin.qq.com/wiki/ index.phptitle=%E6%A0%B9%E6%8D%AEcode%E8%8E%B7%E5%8F%96%E6%88%90%E5% 91%98%E4%BF%A1%E6%81 %AF, 아래 지침에도 참여할 수 있습니다. 여기서 특별한 설명이 필요한 것은 액세스 토큰과 에이전트 ID입니다:
WeChat 공용 계정 개발을 해본 적이 있거나 이전 관련 개발 기사를 읽어본 독자라면 익숙할 것입니다. Tencent의 API를 적극적으로 호출하는 경우 액세스의 정당성을 보장하기 위해 액세스 토큰이 필요하며, 액세스 토큰을 얻기 위한 특별한 인터페이스도 있습니다. 자세한 내용은 Tencent 회사 문서(http://qydev.weixin)를 참조하세요. qq.com/wiki/index.php?title=%E4%B8%BB%E5%8A %A8%E8%B0%83%E7%94%A8 간단히 말해서 액세스 토큰을 얻는 것은 실제로 다음을 통해 이루어집니다. 다음 인터페이스:
https://qyapi.weixin.qq.com/cgi-bin/gettoken ?corpid=id&corpsecret=secret
Corpid는 이 인터페이스에서 쉽게 찾을 수 있습니다. 아래와 같이 설정을 열어서 확인하세요.
不过corpsecret就没那么好找,实际是需要系统管理员在后台创建管理组,创建管理组后就可以拥有相应的Secret,而这个Secret所拥有的访问权限就是系统管理员创建的管理组所拥有的权限,腾讯文章http://qydev.weixin.qq.com/wiki/index.php?title=Secret也有提到:
再回过头来说agentid腾讯文档里提到指的是“跳转链接时所在的企业应用ID”,在本例里其实指的就是发送“身份验证”图文消息的那个应用也就是“企业小助手”的应用ID,当然在不同的用户场景里可能会是不同的应用在调用换取userid接口,如何查看“企业小助手”的应用ID呢?进到应用中心,第一个就是企业小助手,点击进入就可以看到如下图所示的企业应用ID了:
4. 二次验证
拿到userid后实际就可以进行二次验证了,二次验证的方式有很多种,例如如果公司已经建立起良好的通讯录管理机制(userid等和企业人力资源数据库同步,入职离职员工均能和企业号通讯录同步),拿到userid后只要判断这个userid是一位在职员工就可以自动判断为二次验证通过,或者再保险点如本例演示的,要求员工输入公司的员工用户名和密码进行验证。留意,输入用户名和密码验证的页面也就是我们前面提到的二次验证页面是属于企业拥有也是企业开发的,这样就确保了企业对安全的控制,具体操作上,用户输入用户名和密码后企业可以调用已有的接口进行验证,如果验证成功则将员工的userid等信息保存在业务系统数据库中一遍后续操作。
5.通知腾讯关注成功
现在最后一步等企业在自己的网页里完成了用户验证后只剩下通知腾讯该用户已经验证成功让相应员工关注成功,此时应该调用如下接口,可以看到接口需要的第二个参数即是我们前面换回来的userid:
https://qyapi.weixin.qq.com/cgi-bin/user/authsucc?access_token=ACCESS_TOKEN&userid=USERID
此接口的详细说明如下:
二次验证的代码实现:
按照前面的思路,我们首先获取从腾讯跳转过来的code,并通过code换取用户的userid,换取的这个过程在页面加载中完成,为此主要代码应放在类构造器里。下面的代码里设置了五个变量,其中strPassword和strUsername和用户在页面里输入的用户名和密码相对应,userID用来存储换回来的userid信息,msg用来调试帮助在页面里显示中间信息,accessToken则用来存储access token:
public class EmployeeAuthController { public String strPassword { get; set; } public String strUsername { get; set; } public String msg { get; set; } public String userID { get; set; } public String accessToken { get; set; } public EmployeeAuthController (){ accessToken = obtainAccessToken(); String code = ApexPages.currentPage().getParameters().get('code'); //Obtain user ID Http h = new Http(); HttpRequest req = new HttpRequest(); req.setMethod('GET'); req.setHeader('Accept-Encoding','gzip,deflate'); req.setHeader('Content-Type','text/xml;charset=UTF-8'); req.setHeader('User-Agent','Jakarta Commons-HttpClient/3.1'); req.setEndpoint('https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=' + accessToken + '&code=' + code + '&agentid=0'); String bodyRes = ''; try{ HttpResponse res = h.send(req); bodyRes = res.getBody(); } catch(System.CalloutException e) { System.debug('Callout error: '+ e); ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.FATAL, e.getMessage())); } msg = bodyRes ; //String operation to obtain userID: JSONParser parser = JSON.createParser(bodyRes); while(parser.nextToken() != null){ if((parser.getCurrentToken() == JSONToken.FIELD_NAME)){ String fieldName = parser.getText(); parser.nextToken(); if(fieldName == 'UserId'){ userID = parser.getText(); } } } msg = userID; } }
上述代码第9行调用obtainAccessToken方法获取accessToken,后续会介绍该方法的详情,accessToken两个小时内会失效,所以这里采取实时获取的方式,当然可以设计的再巧妙些以省却每次实时获取accessToken的网络开销。第10行获得了从腾讯跳转过来时带的code参数,从第11行通过HttpRequest方法来调用换取接口获得userid,留意第18行指定了agentid为0,这是因为验证消息是从企业小助手应用发起的,而企业小助手应用id是0。第29行开始解析返回来的JSON数据获取userid。
下面是obtainAccessToken方法,方法内容也比较直接,主要通过调用gettoken接口来获取accessToken,并通过JSONParser类来解析返回的JSON数据以获得accessToken:
private String obtainAccessToken(){ String token; Http h = new Http(); HttpRequest req = new HttpRequest(); req.setMethod('GET'); req.setHeader('Accept-Encoding','gzip,deflate'); req.setHeader('Content-Type','text/xml;charset=UTF-8'); req.setHeader('User-Agent','Jakarta Commons-HttpClient/3.1'); req.setEndpoint('https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=wx548178d7f347f582&corpsecret=9pwWy0AVoT6V65hnwZLYdi4jnLLx65ofBRb_Ds0mAozysQoywDaqbqYCqglm2vhr'); String bodyRes = ''; try{ HttpResponse res = h.send(req); bodyRes = res.getBody(); } catch(System.CalloutException e) { System.debug('Callout error: '+ e); ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.FATAL, e.getMessage())); } msg = bodyRes; JSONParser parser = JSON.createParser(bodyRes); while(parser.nextToken() != null){ if((parser.getCurrentToken() == JSONToken.FIELD_NAME)){ String fieldName = parser.getText(); parser.nextToken(); if(fieldName == 'access_token'){ token= parser.getText(); } } } msg = token; return token; }
接下来最重要的方法是bind方法,该方法将负责用户身份验证以及通知腾讯用户关注成功,可以看到下面代码里第2行到第6行只做了很简单的用户名密码校验,真实场景里可以根据企业的具体认证机制进行替换,从第9行开始也即企业内部用户认证通过后开始调用authsucc接口通知腾讯用户关注成功。
public PageReference bind() { if(!strUsername.equals('user')){ msg = 'Please input correct user name'; } else if(!strPassword.equals('123')){ msg = 'Please input correct password'; } else{ msg = 'Bind successfully!'; //Notify tencent to add user Http h = new Http(); HttpRequest req = new HttpRequest(); req.setMethod('GET'); req.setHeader('Accept-Encoding','gzip,deflate'); req.setHeader('Content-Type','text/xml;charset=UTF-8'); req.setHeader('User-Agent','Jakarta Commons-HttpClient/3.1'); req.setEndpoint('https://qyapi.weixin.qq.com/cgi-bin/user/authsucc?access_token=' + accessToken + '&userid=' + userID); String bodyRes = ''; try{ HttpResponse res = h.send(req); bodyRes = res.getBody(); } catch(System.CalloutException e) { System.debug('Callout error: '+ e); ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.FATAL, e.getMessage())); } msg = bodyRes ; } }
更多Force.com微信企业号开发系列- 启用二次验证相关文章请关注PHP中文网!