广告位 后台主题配置管理 |
广告位 后台主题配置管理 |
今天给各位分享微信服务器设计的知识,其中也会对微服务技术架构方案进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
您好!很高兴能为您解答,
第一层次:通信处理
微信的服务主要是基于HTTP协议,安全通过访问令牌(access_token)保证;少数业务场景使用HTTPS加密协议,甚至涉及安全证书,例如微信商户的支付接口。
Tiny微信框架的通讯处理由WeiXinConnector总调度,接口定义如下:
public interface WeiXinConnector {
/**
* 默认的bean配置名称
*/
public static final String DEFAULT_BEAN_NAME="weiXinConnector";
public static final String ACCESS_TOKEN="ACCESS_TOKEN";
/**
* 获取当前的管理号客户端信息
* @return
*/
Client getClient();
/**
* 获得微信消息发送者,负责往微信服务器发送消息
* @return
*/
WeiXinSender getWeiXinSender();
/**
* 获得微信消息接收者,负责解析微信服务器推送过来的消息
* @return
*/
WeiXinReceiver getWeiXinReceiver();
/**
* 获取微信的会话管理者
* @return
*/
WeiXinSessionManager getWeiXinSessionManager();
/**
* 获取微信验证令牌
* @return
*/
AccessToken getAccessToken();
/**
* 获得微信的JS访问票据
* @return
*/
JsApiTicket getJsApiTicket();
/**
* 发送微信消息
* @param message
*/
void send(ToServerMessage message);
/**
* 上传微信文件
* @param upload
*/
void upload(WeiXinHttpUpload upload);
/**
* 接收微信消息
* @param request
* @param response
*/
void receive(HttpServletRequest request,HttpServletResponse response);
}
具体到底层的HTTP和HTTPS协议通讯,org.tinygroup.weixinhttp工程提供了业务接口WeiXinHttpConnector实现具体的协议通讯。
public interface WeiXinHttpConnector {
/**
* 默认的bean配置名称
*/
public static final String DEFAULT_BEAN_NAME="weiXinHttpConnector";
/**
* 用get方式访问微信URL
*
* @param url 要访问的微信URL
* @return 请求结果
*/
String getUrl(String url);
/**
* 用post方式访问微信URL
*
* @param url 要访问的微信URL
* @param content
* @param cert
* @return 请求结果
*/
String postUrl(String url, String content,WeiXinCert cert);
/**
* 上传文件
* @param url
* @param upload
* @return
*/
String upload(String url,WeiXinHttpUpload upload);
}
目前微信框架实现了HttpClient3.1和HttpClient4.5.1两个版本的底层通讯方案,对开发人员而言只需要配置不同的依赖,而无需关心具体通讯代码。
第二层次:报文解析
本人一直对微信的报文设计颇有微词,从整体上看微信报文缺乏统一规范,XML、JSON格式混用,字段命名也不规范。Tiny微信提供WeiXinConvert接口负责报文与对象之间的转换,目前XML报文通过Xsteam转换,JSON报文通过fastjson转换。接口定义如下:
public interface WeiXinConvert extends ComparableWeiXinConvert {
/**
* 获得优先级
* @return
*/
int getPriority();
/**
* 设置优先级
* @param priority
*/
void setPriority(int priority);
/**
* 获得报文的状态
* @return
*/
WeiXinConvertMode getWeiXinConvertMode();
/**
* 获得结果类型
* @return
*/
Class? getCalssType();
/**
* 判断转换接口能否处理输入信息(微信报文会出现不同类型报文字段一致的情况,需要根据上下文判断)
* @param INPUT
* @param input
* @param context
* @return
*/
INPUT boolean isMatch(INPUT input,WeiXinContext context);
/**
* 转换消息(微信报文会出现不同类型报文字段一致的情况,需要根据上下文判断)
* @param input
* @return
*/
OUTPUT,INPUT OUTPUT convert(INPUT input,WeiXinContext context);
}
对开发人员而言,无需思考如何构建复杂的报文,只需依赖对应微信业务模块的子工程,构建不同的消息对象,而底层的报文解析与转换甚至通讯都由tiny框架处理。
第三层次:报文模拟发送
微信发送报文调试最麻烦的地方就是访问令牌(access_token),这个是根据用户应用动态生成的,而且只保持两个小时有效。Tiny微信框架提供了模拟测试页面,只需要bean配置页面设置相关appId和APP秘钥等参数,开发人员在页面就无需手动输入访问令牌。测试页面如下:
第四层次:报文模拟接收
接收报文通常是用来模拟手机端的发送消息,特别是一些复杂交互场景:如命令行菜单,如果每次都通过手机端调试。效率非常低。而通过本测试页面,直接输入模拟的手机报文直接就可以得到报文结果,准确并且快速。模拟页面如图:
第五层次:报文处理框架
前面在介绍微信核心接口时提到过WeiXinReceiver和WeiXinSender,分别处理微信推送消息与主动发送消息。但是用户的业务是复杂多变的,Tiny是如何保证微信框架的可扩展性呢?其实WeiXinReceiver和WeiXinSender是由一组有序WeiXinHandler组成,而每一个WeiXinHandler都可以处理一类消息,接口定义如下:
public interface WeiXinHandler extends ComparableWeiXinHandler {
int getPriority();
void setPriority(int priority);
WeiXinHandlerMode getWeiXinHandlerMode();
/**
* 是否匹配对象和上下文
* @param T
* @param message
* @return
*/
T boolean isMatch(T message,WeiXinContext context);
/**
* 处理对象
* @param T
* @param message
* @param context
*/
T void process(T message,WeiXinContext context);
}
简单举个例子,比如开发一个图片消息处理器ImageMessageHandler,用来处理微信客户端的图片类消息,代码如下:
public class ImageMessageHandler extends AbstractWeiXinHandler{
public WeiXinHandlerMode getWeiXinHandlerMode() {
return WeiXinHandlerMode.RECEIVE;
}
public T boolean isMatch(T message, WeiXinContext context) {
return message instanceof ImageMessage;
}
//具体业务处理
public T void process(T message, WeiXinContext context) {
ImageMessage mess = (ImageMessage) message;
//逻辑处理
TextReplyMessage replyMessage= new TextReplyMessage();
replyMessage.setContent("回复图片消息["+mess.getPicUrl()+"]");
replyMessage.setToUserName(mess.getFromUserName());
replyMessage.setFromUserName(mess.getToUserName());
replyMessage.setCreateTime((int)(System.currentTimeMillis()/1000));
context.setOutput(replyMessage);
}
}
用户主要是编写isMatch和process这两个函数,前者决定这个业务类能处理哪些微信消息和事件,后者是真正的业务处理类。微信消息的包装和转换由微信框架提供,用户应该关心业务处理逻辑,原则上一个Handler只建议处理一类消息。编写完毕后,需要将Handler配置成bean文件,微信框架就能调用了。
ImageMessageHandler的作用是接收微信客户端发送的图片类消息,并返回图片地址给用户,效果如下:
第六层次:上下文保持
微信是有上下文概念的,比如微信应用的小游戏:猜数字。用户输入一个数字,而服务器告诉用户比目标值偏大还是偏小,直到用户猜中为止。游戏很简单,但是这就涉及到上下文会话,Tiny微信框架提供WeiXinSession接口作为上下文统一接口,而WeiXinSessionManager作为上下文的管理接口存在。
WeiXinSession接口定义如下:
public interface WeiXinSession extends Serializable{
/**
* 会话Id
* @return
*/
String getSessionId();
/**
* 是否包含某元素
* @param name
* @return
*/
boolean contains(String name);
/**
* 返回指定name的序列化对象
* @param T
* @param name
* @return
*/
T extends Serializable T getParameter(String name);
/**
* 设置序列化的参数对象
* @param T
* @param name
* @param value
*/
T extends Serializable void setParameter(String name,T value);
/**
* 取得session的创建时间。
*
* @return 创建时间戮
*/
long getCreationTime();
/**
* 取得最近访问时间。
*
* @return 最近访问时间戮
*/
long getLastAccessedTime();
/**
* 取得session的最大不活动期限,超过此时间,session就会失效。
*
* @return 不活动期限的秒数,0表示永不过期
*/
int getMaxInactiveInterval();
/**
* 设置session的最大不活动期限,单位秒
* @param maxInactiveInterval
*/
void setMaxInactiveInterval(int maxInactiveInterval);
/**
* 判断session有没有过期。
*
* @return 如果过期了,则返回codetrue/code
*/
boolean isExpired();
/**
* 更新session
*/
void update();
}
WeiXinSessionManager管理接口主要提供创建、删除、查询上下文会话的操作API,接口定义如下:
public interface WeiXinSessionManager {
/**
* 默认的bean配置名称
*/
public static final String DEFAULT_BEAN_NAME="weiXinSessionManager";
/**
* 创建会话
* @param sessionId
* @return
*/
WeiXinSession createWeiXinSession(String sessionId);
/**
* 查询会话
* @param sessionId
* @return
*/
WeiXinSession getWeiXinSession(String sessionId);
/**
* 添加会话
* @param session
*/
void addWeiXinSession(WeiXinSession session);
/**
* 手动删除会话
* @param sessionId
* @return
*/
void removeWeiXinSession(String sessionId);
/**
* 遍历会话
* @return
*/
WeiXinSession[] getWeiXinSessions();
/**
* 清理会话过期的Session
*/
void expireWeiXinSessions();
/**
* 清理全部Session
*/
void clear();
/**
* Session最大过期时间设置,单位s,默认0
* @return
*/
int getMaxInactiveInterval();
/**
* Session清理线程首次延迟时间,单位s,默认值60
* @return
*/
int getExpireTimerDelay();
/**
* Session清理线程运行周期,单位s,默认值300
* @return
*/
int getExpireTimePeriod();
}
当然Tiny微信框架提供了上下文相关接口,不代表每一类消息强制进行会话管理,比如简单文本消息,微信客户端的位置消息,完全可以请求-响应这种模式进行处理。
第七层次:处理的水平扩展能力
前文讲过Tiny微信框架的具体业务是由WeiXinHandler接口完成的,而WeiXinHandler接口是不依赖WeiXinConnector等委托对象,因此通过扩展WeiXinHandler接口完全可以实现处理能力的水平扩展,比如Tiny框架本身有服务中心,支持分布式服务,那么我们可以在WeiXinHandler接口包装服务中心,从而实现分布式服务。
第八层次:命令处理框架
实际上一个微信公众号,许多的时候都是通过使用者用文字(语音识别也归到用文字)的方式与平台进行交互,这个时候,其实就是一个命令行的处理。Tiny微信框架通过org.tinygroup.menucommand实现相关需求,开发人员只需要配置XML就可完成复杂的命令行处理。目前支持两种模式:
简单模式。用户不需要动态数据,仅需要配置即可。类似电话黄页,支持逐级递归,针对这种模式,Tiny支持配置方式,用户无需编码。
动态模式。用户除了静态数据,还涉及动态交互,无法通过配置解决。Tiny框架提供了MenuCommandHandler接口,然后在配置中指定具体类或bean,框架就能解决。
第九层次:模板语言的引入
第十层次:模块化
微信公众平台
1).注册微信公众平台
首先你要注册自己的一个订阅号,实名,需要审核期的。
2).登录公众平台
注册完成后,可以登录到公众平台。
3).基础功能
默认已经提供了两个基础的功能,在非开发者模式下可以使用。
要添加其它的功能插件的时候,其实是需要微信认证的,所以没认证也用不了。
SAE创建应用
创建应用的时候,在下面选择“微信公众平台PHP SDK”,创建应用就可以了。注意右侧的说明,需要用到。
微信公众平台 PHP SDK使用说明
简单的微信公众平台 PHP SDK ,通过调用相应的接口,使你可以轻松地开发微信 App 。
测试方法如下:
1). Clone 或下载项目源码,上传至服务器。
2).进入微信公众平台,高级功能,开启开发模式,并设置接口配置信息。
修改 URL 为example目录下server.php 的实际位置,
修改 Token 为 weixin (可自行在 example目录下server.php 中更改)。
3).发送消息测试。
下载应用源码到本地
1).复制应用SVN地址
创建完成后,进入应用页面,选择“代码管理”,把页面最下面的该应用的SVN仓库地址复制出来。
2).下载代码
用TortoiseSVN软件中的“Check out…”把代码全部下载到本地。使用SVN的时候,需要输入用户名和密码就是SAE注册时候的安全邮箱和安全密码。
设置公众平台接口配置信息
1).查看token
打开example目录下的server.php文件,翻到文件最下面的这个,就是Token了。
2).在公众平台上填写配置信息
点击“开发者中心”-“修改配置”,
填写URL为你的源码中server.php文件的路径,Token,这个是用来验证的,当然,你可以修改一个自己的,英文或数字,3-32字符。
EncodingAESKey,点击随机生成就行。好了点击“提交”。
完成后,点击“启用”。开启服务器,就可以了。
测试向微信公众号发送消息
关注后发送信息测试下。可以查看代码,对应的返回消息设置都在代码里。
这样,我们就可以通过修改应用中的相关代码,来开发这个公众号的一些其它功能。
1、
启用消息接口
登陆微信公众平台,选择:高级功能,
可以看到页面上有‘编辑模式’和‘开发模式’两个选择。默认开启‘编辑模式’。
进入编辑模式并关闭。
进入开发模式,点击成为开发者进入页面:
特别注意是URL是你在‘2准备服务器’中自己服务器的访问路径(即接收微信服务器发送信息的url地址),必须以http://开头,且为80端口。
Token
可以自定义。
填好后点击提交,这会有下面这些结果
(1)你的服务器没有正确响应Token验证,请阅读消息接口使用指南
这样回头检查一下各项配置是否正确。如果确定配置没有问题,请按下面的方法检查
(2)请求URL超时(超过5s)
你的服务器在国外,或者服务器网速不给力,一般多试几次就可以了。
如果经常这样,就需要考虑更换服务器
(3)提交成功
1、
功能测试:
(1)
使用普通账号关注我们的公众账号。
(2)
发送消息‘1’给公众账号。
(3)
如果公众账号返回‘1你好’。
则测试成功。
第一步:申请帐号
1创建新浪云计算应用
我们使用SAE新浪云计算平台作为服务器资源,并且申请PHP环境+MySQL数据库作为程序运行环境。使用新浪微博账号可以直接登录SAE,登录后SAE将赠送500个免费云豆。
第二步:创建新应用22
1登录后点击顶部【我的首页】
2点击下侧的创建新应用,这时会弹出提示, 禁止放置违法违规内容,点击继续创建,弹出如下窗口。
3选择一个未使用的appid,如果老是已经被使用不知道该什么好,就填写你的QQ号或者手机号吧。
填写二级域名AppID、应用名称、验证码,开发语言选择PHP,应用类型选择web应用。然后点击创建应用
4应用创建成功。并自动跳转到应用列表中,可以看到已经有刚才创建的CCTV-7
第三步:创建新版本33
1选择CCTV-7右侧的应用管理下面的代码管理,
2跳转到代码管理
3点击右侧的“创建一个新版本”
4版本号默认为1,点击创建,成功后如下图所示:
5到这里,就成功创建了一个域名应用了
第四步:上传代码44
将以下代码复制下来,另存为index.php。必须使用专业的开发编辑软件操作,例如Notepad++,不要使用Windows自带的记事本等。
然后将index.php文件压缩成ZIP格式,注意不能用RAR格式
这样会生成一个index.zip的文件。
在代码管理界面中,选择操作按钮。
选择上传代码包。
点击上传文件,选择刚才压缩好的index.zip文件,点击上传,上传成功后如下所示,如果上传有问题,请在Chrome浏览器下重试一下。
点击操作按钮下的代码编辑,
有时候需要输入自己的安全密码,如果不记得了就点击“找回密码”。
安全验证成功后继续之前的操作。
我们可以看到index.php已经上传成功,双击可以查看编辑里面的代码
8新浪云应用的创建就成功了。
参考资料:
微信服务器设计的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于微服务技术架构方案、微信服务器设计的信息别忘了在本站进行查找喔。
广告位 后台主题配置管理 |
广告位 后台主题配置管理 |