Force.com微信支付系列(4)申请Access Token及自定菊花菜单之创立菜单

view:用户点击view类型开关后,微信客户端将会展开开发者在按键中填入的url值(网页链接),达到张开网页的目标。提出与网页授权获取用户宗旨消息接口结合,获得用户的登录个人音讯。

ACCESS, 

 

里头中括号内的变量ACCESS_TOKEN即为大家前边获得的Token值。接下来大家开采3个简易的Apex网页,大家将透过那些网页来成立自定蓬蒿单。

眼下的菜单中大家定义的都是click类型的菜系,但该项目菜单被点击的时候,微信将经过腾讯服务器向开采者钦赐的UHummerH二L发送壹段XML文,该XML的组织表明如下:

那和我们眼下处理用户发送音信的不二法门实际上是均等的,大家得以在前文准备的格局架构基础上充分处理代码,找到前文的如下代码段:

创立菜单的接口如下:

 

 

在微信接口开辟中,诸多劳动的利用都离不开Access
Token,Access
Token相当于开发这个劳务的钥匙,不荒谬状态下会在7200秒内失效,重复获取将导致上次获取的Token失效,本文将率先介绍怎么样获得Access
Token,再介绍怎样通过Access
Token来在微信内增加自定菊花菜单(注意,开荒者须求申请测试账号来测试自定蒿菜单,如何申请请参见前文)。

WeChatUtilityPage的源代码如下:

 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 }

 

WechatUtilityController:
调整器类,负责网页背后的切实可行作业逻辑处理。

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

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

ACCESS 1

制造菜单点击事件处理方法

实打实请求的实例如下:

ACCESS 2

 

 

 

申请Access Token

收获Access
Token接口的网站如下:

,该Token将要7200秒,也正是1个钟头内失效,之后必要再度请求前面包车型大巴U帕杰罗L获取新的Token。

ACCESS 3

主意运转效果如下,当用户点击了微信菜单后,系统会自动将eventKey里含有的音信发送给用户,那里是为着演示效果开展的简化,真实风貌里能够依照要求举办实效订制:

方括号内的参数能够在测试账号首页找到,被涂抹处就是:

画面相当简单,唯有一段文字展现以及3个“注册微信菜单”开关,点击开关将重罚WechatUtilityController里的register方法,再次回到音讯通过msg对象来显示,该对象的定义也在WechatUtilityController里,倘使有种类丰硕,则将由此<apex:
pageMessage/>来呈现分外货仓消息。上面我们看来看代码:

在该代码段的基本功上点击else处理分支:

进行上述呼吁后,接口再次来到的内容如下:

成就后保存代码就能够知到前边微信截图所彰显的成效。

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 }

ACCESS 4

 

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>

 

地方的代码else分支判别假诺用户发送来的音信类型是event类型则调用handle伊夫nt方法来处理,此时用户大概是关心了微信账号,可能是吊销了关注,也说不定是点击了菜单…,在handle伊夫nt方法里要更为认清,留意方法里的eventKey是前方XML里用户自定义的:

里头composeTextReply方法的定义如下:

那里大家就得到了接下去必要采纳的access_token:

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

 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 }

上面的代码构造了一段XML文,并将此XML问Post到req.setEnpoint方法里制定的UXC90L。XML里即含有了对自定菊花菜单内容的现实定义,该XML的接口须要如下:

脚下自定义菜单接口可落成二种档次的按键:

当前自定菊花菜单最多包括多个超级菜单,各类一流菜单最多带有三个二级菜单。顶尖菜单最多八个汉字,二级菜单最多7个汉字,多出去的部分会以“…”代替。请留意,创造自定蒿子单后,由于微信客户端缓存,须求确定时期才在微信客户端表现出来,最便捷的诀要是重恢复关贸总协定缔约国地位切微信公众账号,那样立刻就能看出自定蓬蒿单。

click:用户点击click类型按键后,微信服务器会由此消息接口推送类型为event的结构给开拓者,并且带上按键中开垦者填写的key值,开辟者能够经过自定义的key值与用户实行互相。

 

 

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

 

 

 

WeChatUtilityPage:网页,负责提交创立自定蒿菜单的报名,并展现创立成功与否的结果;

ACCESS 5

ZiBTYeRMEMeCEM-Ol9ny_NE-XkgRbsP4snOqTRLh_nfp_UzFsYXVDtguf7jbZt70IQRkmEwU1n0cbxdWmJTdNg

 

成立自定蒿子单近期服务号和因此验证的订阅号均可申请自定蒿子单,成功成立自定菊花菜单后,微信公众账号分界面如下图所示:

相关文章