微信公众平台sdkphp
A. 微信公众平台如何通过php代码给会员发送被动响应消息
明确在哪接收消息
从微信公众平台接口消息指南中可以了解到,当用户向公众帐号发消息时,微信服务器会将消息通过POST方式提交给我们在接口配置信息中填写的URL,而我们就需要在URL所指向的请求处理类CoreServlet的doPost方法中接收消息、处理消息和响应消息。
接收、处理、响应消息
下面先来看我已经写好的CoreServlet的完整代码:
package org.liufeng.course.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.liufeng.course.service.CoreService;
import org.liufeng.course.util.SignUtil;
/**
* 核心请求处理类
*
* @author liufeng
* @date 2013-05-18
*/
public class CoreServlet extends HttpServlet {
private static final long serialVersionUID = 4440739483644821986L;
/**
* 确认请求来自微信服务器
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 微信加密签名
String signature = request.getParameter("signature");
// 时间戳
String timestamp = request.getParameter("timestamp");
// 随机数
String nonce = request.getParameter("nonce");
// 随机字符串
String echostr = request.getParameter("echostr");
PrintWriter out = response.getWriter();
// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
if (SignUtil.checkSignature(signature, timestamp, nonce)) {
out.print(echostr);
}
out.close();
out = null;
}
/**
* 处理微信服务器发来的消息
*/
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 将请求、响应的编码均设置为UTF-8(防止中文乱码)
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
// 调用核心业务类接收消息、处理消息
String respMessage = CoreService.processRequest(request);
// 响应消息
PrintWriter out = response.getWriter();
out.print(respMessage);
out.close();
}
}
代码说明:
1)第51行代码:微信服务器POST消息时用的是UTF-8编码,在接收时也要用同样的编码,否则中文会乱码;
2)第52行代码:在响应消息(回复消息给用户)时,也将编码方式设置为UTF-8,原理同上;
3)第54行代码:调用CoreService类的processRequest方法接收、处理消息,并得到处理结果;
4)第57~59行:调用response.getWriter().write()方法将消息的处理结果返回给用户
从doPost方法的实现可以看到,它是通过调用CoreService类的processRequest方法接收、处理消息的,这样做的目的是为了解耦,即业务相关的操作都不在Servlet里处理,而是完全交由业务核心类CoreService去做。下面来看CoreService类的代码实现:
package org.liufeng.course.service;
import java.util.Date;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.liufeng.course.message.resp.TextMessage;
import org.liufeng.course.util.MessageUtil;
/**
* 核心服务类
*
* @author liufeng
* @date 2013-05-20
*/
public class CoreService {
/**
* 处理微信发来的请求
*
* @param request
* @return
*/
public static String processRequest(HttpServletRequest request) {
String respMessage = null;
try {
// 默认返回的文本消息内容
String respContent = "请求处理异常,请稍候尝试!";
// xml请求解析
Map<String, String> requestMap = MessageUtil.parseXml(request);
// 发送方帐号(open_id)
String fromUserName = requestMap.get("FromUserName");
// 公众帐号
String toUserName = requestMap.get("ToUserName");
// 消息类型
String msgType = requestMap.get("MsgType");
// 回复文本消息
TextMessage textMessage = new TextMessage();
textMessage.setToUserName(fromUserName);
textMessage.setFromUserName(toUserName);
textMessage.setCreateTime(new Date().getTime());
textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
textMessage.setFuncFlag(0);
// 文本消息
if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
respContent = "您发送的是文本消息!";
}
// 图片消息
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) {
respContent = "您发送的是图片消息!";
}
// 地理位置消息
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) {
respContent = "您发送的是地理位置消息!";
}
// 链接消息
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) {
respContent = "您发送的是链接消息!";
}
// 音频消息
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) {
respContent = "您发送的是音频消息!";
}
// 事件推送
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
// 事件类型
String eventType = requestMap.get("Event");
// 订阅
if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
respContent = "谢谢您的关注!";
}
// 取消订阅
else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
// TODO 取消订阅后用户再收不到公众号发送的消息,因此不需要回复消息
}
// 自定义菜单点击事件
else if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) {
// TODO 自定义菜单权没有开放,暂不处理该类消息
}
}
textMessage.setContent(respContent);
respMessage = MessageUtil.textMessageToXml(textMessage);
} catch (Exception e) {
e.printStackTrace();
}
return respMessage;
}
}
代码说明:
1)第29行:调用消息工具类MessageUtil解析微信发来的xml格式的消息,解析的结果放在HashMap里;
2)32~36行:从HashMap中取出消息中的字段;
3)39-44、84行:组装要返回的文本消息对象;
4)47~82行:演示了如何接收微信发送的各类型的消息,根据MsgType判断属于哪种类型的消息;
5)85行:调用消息工具类MessageUtil将要返回的文本消息对象TextMessage转化成xml格式的字符串;
关于事件推送(关注、取消关注、菜单点击)
对于消息类型的判断,像文本消息、图片消息、地理位置消息、链接消息和语音消息都比较好理解,有很多刚接触的朋友搞不懂事件推送消息有什么用,或者不清楚该如何判断用户关注的消息。那我们就专门来看下事件推送,下图是官方消息接口文档中关于事件推送的说明:
B. php如何编写一个微信公众平台的消息推送
给你个代码样例不可以直接复制使用
/**
*发送模板消息
*@param$tmpId模板ID
*@param$openId用户openID
*@param$param模板参数
*@param$url
*@returnmixed
*@authorfjlhuman
*/
publicfunctionsendTmpMessage($tmpId,$openId,$param,$url){
$postUrl="https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".$this->accessToken;
$arrData['touser']=$openId;
$arrData['template_id']=$tmpId;//'6OT8DDNF-CbiadTsbEKKSCZVHe_9hnhxOBT7EvURNcE';
$arrData['url']=$url;
$arrData['data']=$param;
$json=json_encode($arrData);
$result=Curl::post($postUrl,$json);
$result=json_decode($result,true);
$rData['isTure']=false;
$rData['msg']="";
if($result['errcode']==0){
$rData['isTure']=true;
$rData['msg']="发送成功";
}else{
$rData['msg']=$result['errcode'];
}
return$rData;
}
详情请参考微信公众平台技术文档->模板消息接口
C. 在sae上发布thinkphp架构的微信平台代码,总是提示token验证失败
这样一试吧
public function auth(){
if($_GET ['timestamp'] !=''&&$_GET ['nonce']!='' &&$_GET ['signature']!='' && $_GET["echostr"]!=''){
echo $_GET["echostr"];exit;
}
}
这样验证应该是可以的呀
D. 求微信公众号接口 给客户发送信息的 PHP代码
你好,可以用客服消息接口或模板消息接口实现。但是需要认证公众号才能有权限。
认证服务号可以发送客服接口消息[需要对应openid24小时内有互动]和模板消息,订阅号则没有模板消息权限。
发送文字消息示例:
$postdata='{"touser":"o5BkRs_vRwfPqAb1ceXHfJDzmQ5o","msgtype":"text","text":{"content":"HelloWorld"}}';
$opts=array(
'http'=>array(
'method'=>'POST',
'Content-Length'=>strlen($postdata),
'Host'=>'api.weixin.qq.com',
'Content-Type'=>'application/json',
'content'=>$postdata
)
);
$context=stream_context_create($opts);
$result=file_get_contents('https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=你的access_token',true,$context);
echo$result;
E. 简单几步成为微信公众平台开发者
1.设置公众账号被关注时的回复消息。
2.消息自动回复设置。
3.关键词自动回复。
这三点大家应该都知道什么意思,简单介绍一下吧。
1.就是当有普通用户关注微信公众账号时,微信公众账号回复的一条消息,内容可以设置为欢迎信息等等。
2.就是当有用户向公众账号发送消息时,公众账号的自动回复消息内容。不知道什么意思? QQ离开状态的自动回复大家应该明白吧?
3.关键词自动回复,就是当微信公众账号接收到用户发送来的一些消息,比如
你好。微信公众账号对用户的回复内容,当然也可以设置全匹配也可以取消全匹配。
然后,给大家介绍下微信公众账号的开发者模式,开发者模式就是通过微信公众平台的接口来开发一套自己的回复程序。
开发者模式基本可以完成以上3点的任何功能,而且可以更完美、更人性化的实现。
开启开发模式之后,需要设置一个Token值,来验证接口的URL,下载微信公众平台的开发sdk。 找到
define("TOKEN", "weixin");
[color=#336699 !important]复制代码
后面的weixin就是Token值,内容任意,然后去微信公众平台开发模式下去设置URL和Token值,Token值要跟php文件中设置的一致,URL的地址就是填写你微信API的接口地址。
提交验证通过之后。就可以简单的测试一下了。
打开接口文件,可以看到sdk里已经写好了一个类,类里封装的几个函数大概给大家介绍下。
valid 主要负责验证接口使用,其他时候貌似没什么用途,反正我暂时没发现。
responseMsg 回复消息的函数,也是大家用的最多的一个函数。
checkSignature 这个就不用说了吧?顾名思义,验证用的。
找到
$wechatObj->valid();
[color=#336699 !important]复制代码
修改为
$wechatObj->responseMsg();
[color=#336699 !important]复制代码
就可以使用接口的自动回复功能了,那么现在微信会返回上面内容呢?如果你是按照我说的这个流程去操作的,现在你向公众账号发送一条消息,应该会返回一句welcome
to wechat world!为什么呢?请您继续往下看..
微信接口的原理其实就是当用户发送一条微信到微信公众账号的时候,微信服务器会检测你是否启用的开发平台的一些功能,假如启用了开发模式,会像你开发模式发送一段xml,这段xml的内容其实就是微信用户发送的消息,然后经过程序处理,服务器再向微信公众平台的接口返回一条xml信息,也是向用户回复的内容,当然要保证你程序的效率,如果5秒内微信公众平台接口没有接收到返回的xml,就会放弃了。我们看下responseMsg这个函数就知道了。
public function responseMsg()
{
//get post data, May be e to the different environments
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
//extract post data
if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement',
LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim($postObj->Content);
$time = time();
$textTpl = "
%s
0
";
if(!empty( $keyword ))
{
$msgType = "text";
$contentStr = "Welcome to wechat world!";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType,
$contentStr);
echo $resultStr;
}else{
echo "Input something...";
}
}else {
echo "";
exit;
}
}
[color=#336699 !important]复制代码
从上面的这函数里可以看到,当$keyword值存在,$keyword其实就是用户发送的消息内容,就会输出welcome to wechat
world这句话了。
想到这里大家可能就明白了,只要对$keyword的内容加以判断,就可以开发各式各样的接口了!
F. 微信公众平台是用什么语言开发的
微信公众平台一般的话都是使用php来进行开发的,
这个直接从前台是看不出问题的,要从后台的代码文件看。
G. 如何使用pagekite搭建微信网络服务器
微信公众平台
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,点击随机生成就行。好了点击“提交”。
完成后,点击“启用”。开启服务器,就可以了。
测试向微信公众号发送消息
关注后发送信息测试下。可以查看代码,对应的返回消息设置都在代码里。
这样,我们就可以通过修改应用中的相关代码,来开发这个公众号的一些其它功能。
H. 如何申请开通微信官方平台
网络搜索进入微信公众平台官网,点击【立即注册】。
输入邮箱地址,登录密码,点击【注册】。
微信类型个人只有一个可以选的,选好就可以了,现在一般只能申请到订阅号。
公众号信息中的账号名称设置了就不能更改的,想好了再输名称。其它的都根据个人的需求输入,最后【确定】,就完成公众号注册了。