Force.com微信支付系列(四)申请Access Token与打定义菜单的创建菜单

当微信接口开发被,许多劳务之以都离不上马Access
Token,Access
Token相当给开拓这些劳动之钥匙,正常状态下会在7200秒内失效,重复获取将致上次到手的Token失效,本文将率先介绍如何获得Access
Token,再介绍如何通过Access
Token来在微信内补充加于定义菜单(注意,开发者需要报名测试账号来测试于定义菜单,如何申请请参见前文)。

 

申请Access Token

得到Access
Token接口的网址如下:

https://api.weixin.qq.com/cgi-bin/token?grant\_type=client\_credential&appid=\[*APPID*\]&secret=\[*APPSECRET*\]

方括号内之参数可以在测试账号首页找到,被上抹处即是:

ACCESS 1

 

实际请求的实例如下:

ACCESS 2

 

推行上述呼吁后,接口返回的内容如下:

ACCESS 3

 

此间我们就拿到了连片下去需要采取的access_token:

ZiBTYeRMEMeCEM-Ol9ny_NE-XkgRbsP4snOqTRLh_nfp_UzFsYXVDtguf7jbZt70IQRkmEwU1n0cbxdWmJTdNg

,该Token将于7200秒,也不怕是2独小时内失效,之后需要再次请前面的URL获取新的Token。

 

缔造于定义菜单即服务号和透过验证的订阅号都只是报名于定义菜单,成功创办于定义菜单后,微信公众账号界面如下图所示:

脚下起定义菜单最多包三独一级菜单,每个一级菜单最多包含五单二级菜单。一级菜单最多4独汉字,二级菜单最多7个字,多下的部分会以“…”代替。请小心,创建于定义菜单后,由于微信客户端缓存,需要自然时间才以微信客户端表现出,最快捷的法门是再次关注微信公众账号,这样就就可知收看由定义菜单。

时自从定义菜单接口可实现两种类型的按钮:

click:用户点击click类型按钮后,微信服务器会由此信息接口推送类型也event的布局给开发者,并且带动达按钮中开发者填写的key值,开发者可以经由定义的key值与用户进行互动。

view:用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填入的url值(网页链接),达到打开网页的目的。建议与网页授权获取用户基本信息接口结合,获得用户之登入个人信息。

创造菜单的接口如下:

https://api.weixin.qq.com/cgi-bin/menu/create?access\_token=\[*ACCESS\_TOKEN*\]

个中中括号内的变量ACCESS_TOKEN即为我们前获得的Token值。接下来我们开发一个简的Apex网页,我们拿由此之网页来创造于定义菜单。

WeChatUtilityPage:网页,负责提交创建于定义菜单的申请,并显示创建成功吗的结果;

WechatUtilityController:
控制器类,负责网页背后的求实事务逻辑处理。

WeChatUtilityPage的源代码如下:

1 <apex:page standardstylesheets="false" showHeader="false" sidebar="false" controller="WechatUtilityController">
2   <apex:form >
3       <font face="微软雅黑"><strong>菜单服务系列:</strong><br /><br />
4       <apex:commandButton value="注册微信菜单"  action="{!register}" id="register"  />
5         </apex:form>
6   {!msg}
7   <apex:pageMessages />
8 </apex:page>

 

画面非常简单,只出相同截文字显示与一个“注册微信菜单”按钮,点击按钮将重罚WechatUtilityController里的register方法,返回消息经msg对象来显示,该目标的概念也当WechatUtilityController里,如果出系统格外,则将通过<apex:
pageMessage/>来展示大堆栈信息。下面我们看来看代码:

 1 public class WechatUtilityController {
 2     public static String msg{get;set;}
 3 
 4     public String accessToken{get;set;}
 5     public WechatUtilityController (){
 6         accessToken = ‘ZiBTYeRMEMeCEM-Ol9ny_NE-XkgRbsP4snOqTRLh_nfp_UzFsYXVDtguf7jbZt70IQRkmEwU1n0cbxdWmJTdNg’;
 7     }
 8     
 9     public void register(){
10         Http h = new Http();
11         HttpRequest req = new HttpRequest();
12         req.setMethod('POST');
13         req.setHeader('Accept-Encoding','gzip,deflate');
14         req.setHeader('Content-Type','text/xml;charset=UTF-8');
15         req.setHeader('User-Agent','Jakarta Commons-HttpClient/3.1');
16         
17         String xml = '{"button":[{"name":"关于我们","sub_button":[{"type":"click","name":"公司简介","key":"公司简介"},{"type":"click","name":"社会责任","key":"社会责任"},{"type":"click","name":"联系我们","key":"联系我们"}]},{"name":"产品服务","sub_button":[{"type":"click","name":"微信平台","key":"微信平台"},{"type":"click","name":"微博应用","key":"微博应用"},{"type":"click","name":"手机网站","key":"手机网站"}]},{"name":"技术支持","sub_button":[{"type":"click","name":"文档下载","key":"文档下载"},{"type":"click","name":"技术社区","key":"技术社区"},{"type":"click","name":"服务热线","key":"服务热线"}]}]}';
18         
19         req.setBody(xml);
20         req.setEndpoint('https://api.weixin.qq.com/cgi-bin/menu/create?access_token=‘ + accessToken);
21         String bodyRes = ‘’;
22 
23    try{
24             HttpResponse res = h.send(req);
25             bodyRes = res.getBody();
26         }
27         catch(System.CalloutException e) {
28             System.debug('Callout error: '+ e);
29             ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.FATAL, e.getMessage()));
30         }
31         msg = bodyRes;
32     }
33 
34 }

 

地方的代码构造了同样段落XML文,并以是XML问Post到req.setEnpoint方法里制定的URL。XML里即使蕴涵了针对性由定义菜单内容的实际定义,该XML的接口要求如下:

ACCESS 4

 

完后保存代码即可见到前面微信截图所著的机能。

 

始建菜单点击事件处理方法

眼前的菜谱中我们定义的且是click类型的菜系,但欠种ACCESS菜单被点击的时,微信将过腾讯服务器向开发者指定的URL发送一段落XML文,该XML的布局说明如下:

ACCESS 5

 

旋即与我们面前处理用户发送信息的道实在是一样的,我们可以于前文准备的措施架构基础及长处理代码,找到前文的如下代码段:

1 if(msgType.equals('text')){
2     rtnMsg = handleText(inMsg);
3 }

 

以该代码段的根底及点击else处理分支:

1 if(msgType.equals('text')){
2 
3         rtnMsg = handleText(inMsg);
4 
5 }
6 else if(msgType.equals('event')){
7         rtnMsg = handleEvent(inMsg);
8 }

 

面的代码else分支判断如果用户发送来的信类型是event类型则调用handleEvent方法来拍卖,此时用户或是关注了微信账号,可能是吊销了关注,也恐怕是点击了菜单…,在handleEvent方法里如果逾判断,留意方法里之eventKey是前面XML里用户从定义的:

 1 private static String handleEvent(IncomingMsg msg){
 2         String event = msg.event;
 3         String strTmp = '';
 4         if(event.equals('subscribe')){
 5             strTmp = '欢迎关注本账号!';
 6         }
 7         else if(event.equals('unsubscribe')){
 8             strTmp = '';
 9         }
10         else if(event.equals('CLICK')){
11             strTmp = '您点击了' + msg.eventKey;
12         }
13         String result = composeTextReply(msg, strTmp);
14         return result;
15 }

 

里头composeTextReply方法的定义如下:

1  private static String composeTextReply(IncomingMsg msg, String content){
2         String strTmp = '<xml><ToUserName><![CDATA[{0}]]></ToUserName><FromUserName><![CDATA[{1}]]></FromUserName><CreateTime>12345678</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[{2}]]></Content></xml>';
3         String[] arguments = new String[]{msg.fromUserName, msg.toUserName, content};
4         String strReply = String.format(strTmp, arguments);
5         return strReply;
6 }

 

办法运行效果如下,当用户点击了微信菜单后,系统会活动将eventKey里含的消息发送给用户,这里是以演示效果进行的简化,真实情景里可因要求进行实际职能订制:

 

 

相关文章