微信公众号开发(入门级)
程序员文章站
2024-01-24 08:59:40
...
微信公众平台提供了,订阅号,服务号,企业号,小程序供开发者选择。(具体看官方文档)
注册时使用邮箱,一个邮箱注册一个公众号,注册成功后可更改。
客户端(用户) 向微信服务器发送消息,我们希望获取到这个消息,就需要自己的服务器和微信服务器建立联系。
以新浪云为例。
创建应用后,得到一个域名
建立联系:使用Token
index.php
<?php
/** * wechat php test */
//define your token
define("TOKEN", "在微信公众平台设置的token");
$wechatObj = new wechatCallbackapiTest();
//调用对象下的一个成员方法
$wechatObj->valid();
//$wechatObj->responseMsg();
class wechatCallbackapiTest{
public function valid() {
//获得get方式 传过来的 echostr
$echoStr = $_GET["echostr"];
//valid signature , option
//调用了类里面的成员方法 checkSignature
if($this->checkSignature()){
echo $echoStr;
exit;
}
}
private function checkSignature(){
//检测Token 是否定义,若没,抛出一个异常
if(!defined("TOKEN")){
throw new Exception('TOKEN is not defined!');
}
//签名,微信的服务器端,发过来的签名
//重点就是对比,我们产生的签名和微信传过来的是否一致
$signature = $_GET["signature"];
//unix时间戳 time() 得到服务器端穿过来的unix时间戳
$timestamp = $_GET["timestamp"];
//随机的字符串
$nonce = $_GET["nonce"];
//将常量TOKEN 赋值给 $token
$token = TOKEN;
//将常量TOKEN 放入到以个数组
$tmpArr = array($token, $timestamp, $nonce);
//将 $tmpArr这个数组的值,视为字符串进行排序
sort($tmpArr,SORT_STRING);
//implode 将数组里的值 按照指定的 字符串连接起来
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true; }
else{return false; }
}
public function responseMsg() {
//get post data, May be due 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 = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag> </xml>";
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;
}
}
}
?>
若验证成功,会提示token配置成功。
检验:将
$wechatObj->valid();
注释
$wechatObj->responseMsg();
向公众号发送消息。
回复
Welcome to wechat world!
即证明成功
2.使用微信公众平台提供的接口
使用接口之前,需要access_token 这个凭证。该凭证根据appid 和appsecret 生成。
每个凭证有效时间为7200s,每天获取有次数限制,需要我们保存。
两种方式,存入txt文件;使用memocache(SAE提供了该服务)
注:更换公众号时,需要清空memocache。
mem.php
<?php
//header("Content-type: text/html; charset=utf-8");
define('APP_ID','你的APPId');
define('APP_SECRET','你的secret');
function mem_token(){
$mmc = new Memcached(); //使用本应用Memcache
$token = $mmc ->get('token');
//empty 如果为nul 返回真,
//如果token 存在为 false ,进行一次非操作 true == 输出token
// true
if(!empty($token)){
//输出token
//echo '存在'.$token;
return $token;
} else {
$token = get_token();
$mmc ->set('token',$token,7000);
}
return $token;
}
function get_token(){
$ch = curl_init();
$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.APP_ID.'&secret='.APP_SECRET;
//基于CURL, 定义请求地址
curl_setopt($ch,CURLOPT_URL,$url);
//将请求的结果,在之后赋给 $output
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
//header 头不可见,不给用户看
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch,CURLOPT_TIMEOUT,10);
$output = curl_exec($ch);
curl_close($ch);
$obj = json_decode($output,true);
//json_decode
//打印输出并且显示对应的类型和长度
//var_dump($obj['access_token']);
//返回access_token
//return $token;
return $obj['access_token'];
}
?>
需要获得当前access_token,在当前php文件中加
include 'mem.php';
mem_token();
第一次写,可能有误。
上一篇: 单例模式如何防止反射攻击