WeChat は 9 月にエンタープライズ アカウントを開始し、業界で大きな話題を呼びました。この記事から、WeChat の関連知識について詳しく説明します。エンタープライズ アカウントの開発、この記事では、より高度なセキュリティ メカニズムの二次検証を実装する方法に焦点を当てます。
エンタープライズ エクスペリエンス アカウントの申請:
名前が示すように、エンタープライズ アカウントは、企業が申請するアカウントです。申請の際は、サービス アカウントを申請するのと同じように、さまざまな組織認証書類を提出する必要があります。幸いなことに、Tencent はサービス アカウントのようなエクスペリエンス アカウントのアプリケーションも公開しています。エンタープライズ エクスペリエンス アカウントの有効期間はわずか 90 日であることに注意してください (サービス アカウントのテスト アカウントには有効期間があります)。期間は 1 年)、エンタープライズ エクスペリエンス アカウントが長期間使用されなかった場合でも、Tencent は会社から早期有効期限のリマインダー電子メールを受け取ります。エンタープライズ エクスペリエンス アカウントのアプリケーション リンクは次のとおりです。開発者は Tencent のガイダンスに従って登録手順を完了し、エクスペリエンス アカウントをすぐに取得するだけです:
http://qydev.weixin.qq.com/try?t= experience
アドレス帳にメンバーを追加:
一般アカウントとは異なり、企業の内部使用のため、Tencent では企業が積極的にファンを追加することができます。具体的な操作は、アドレス帳に入力し、[+] ボタンをクリックして追加することです。新規会員の場合は、少なくとも 1 つの WeChat ID、携帯電話番号、または電子メール アドレスが必要であることに注意してください。通常、携帯電話番号とメールアドレスを使用することができます。特定の操作については、手動で追加するだけでなく、Excel テンプレートを使用してインポートし、Tencent Enterprise Account WeChat API を使用してユーザーを追加することもできます。ユーザーを追加する API は後で紹介します。章。入力後、従業員が会社の WeChat ID の QR コードをスキャンすると、システムのデフォルトの会社 ID アシスタントが従業員に送信できます。が自動的に表示され、アシスタントは従業員に、電子メールまたは携帯電話の確認コードを使用して従業員 ID のバインドのプロセスを完了するよう自動的に指示します。これは、企業自体がアドレス帳内の従業員データの正確性を保証するものです。その後、従業員認証を Tencent に依存し、認証に合格すると、アドレス帳のステータス列の疑問符が消え、認証に合格したことが示されます。
これについては、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 つの部分に分かれており、1 つの部分はユーザー名とパスワードを入力するために使用されます。ユーザー名 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 つの部分に分かれており、1 つの部分はユーザー名とパスワードを入力するために使用されます。ページの図は次のとおりです。ユーザーはユーザー名 user とパスワード 123 を入力し、バインドをクリックします。ボタンをクリックしてバインドを完了します:
ページのコードは次のとおりです。一部のタグは apex コードに固有のものであり、詳しく理解する必要はありません。重要なのは、13 行目のボタンの action 属性が、ボタンがクリックされたときに呼び出されるバインド メソッドを指定していることです。このバインド メソッドは、コントローラー クラス 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 の二次認証の手順を見てみましょう。
二次認証の手順と仕組み:
1. まず、WeChatの一次認証(またはメールアドレスや携帯電話番号など)が完了すると、WeChatは次のようなメッセージを送信します。以下の図に示すメッセージがユーザーに表示されます:
2. ページジャンプ:
ユーザーがこの画像とテキストをクリックすると、実際には以下にある Web サイトが開きます。 open.weixin.qq.com このページは何らかの処理を行った後、開発中のページである二次検証で以前に設定した URL にジャンプします。ジャンプすると、設定した URL の後にパラメーター code=CODE&state が追加されます。 =STATE、たとえば、この例では、2 番目の検証用に構成された URL は http://johnson0001-developer-edition.ap1.force.com/EmployeeAuth であり、URL は Tencent openweixin.qq からジャンプした後に実際に開かれます。 com は http://johnson0001-developer-edition.ap1.force.com/EmployeeAuth?code=CODE&state=STATE です。 Tencent は、ここでの状態パラメータが何のためにあるのかについては説明しておらず、現時点では重要ではありません。重要なのは、このパラメータを使用して、従業員のユーザー ID と引き換えに Tencent の oauth2 インターフェイスを呼び出すことができることです。エンタープライズ アカウントには、WeChat OpenId のみが使用されることに注意してください。このユーザー ID は実際には、アドレス帳を管理するときのアカウント フィールドの値です:
3. Tencent oauth2 インターフェイスを呼び出して、従業員ユーザー ID
このインターフェイスの手順については、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=secrect
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中文网!