PHP接入微信公众号
前言:对公众号进行基本的连接后,我们就可以开始对公众号进行开发了。这其中,就有很多的事可以做了
还没有了解如何接入微信公众号的同学们
,请查看上一遍博客PHP接入微信公众号(一)- 微信公众号文档地址 微信公众号文档
- 源码仓库地址(仅做学习开源)微信接口源码
获取access_token
- 说明:access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token
- 请求方式:HTTP GET
- 请求域名:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
- 参数说明:
|:–|:–|:–|
|参数|是否必须|说明|
|grant_type|是|获取access_token填写client_credential(固定即可
)|
|appid|是|第三方用户唯一凭证,公众号后台有|
|secret|是|第三方用户唯一凭证密钥,即appsecret| - 正常返回数据:{“access_token”:“ACCESS_TOKEN”,“expires_in”:7200}
- 错误返回数据:{“errcode”:40013,“errmsg”:“invalid appid”}
- 请求代码实现
/**
* 获取微信access_token
* 正确返回 {"access_token":"ACCESS_TOKEN","expires_in":7200}
* 错误返回 {"errcode":40013,"errmsg":"invalid appid"}
* @param $appID
* @param $secret
* @return mixed
* @throws Exception
*/
public function getAccessToken($appID, $secret)
{
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={
$appID}&secret={
$secret}";
Yii::warning("call wei_xin access_token", CATEGORIES_INFO);
try {
$response = (new Client())->get($url);
} catch (RequestException $e) {
Yii::error("cannot request to api.weixin.qq.com!", CATEGORIES_ERROR);
return false;
}
$content = $response->getBody()->getContents();
Yii::warning('request content:'.$content, CATEGORIES_WARN);
$jsonContent = \GuzzleHttp\json_decode($content, true);
if (isset($jsonContent['errcode'])) {
Yii::error("get access token error;msg:".$content, CATEGORIES_ERROR);
return false;
}
return $jsonContent;
}
- 业务逻辑:微信文档建议
统一获取access_token
,所以建议在请求完成后存于session或者其他缓存中,失效后再重新获取。
接收消息
- 说明:用户在公众号下留言后并已启用了服务器配置,那么微信公众平台就会将消息发送到所配置的服务器地址。如果不能正确处理并回复消息,用户将会收到公众号服务异常的消息。
- 消息类型:消息分加密和非加密,对于重要的消息可以采用加密模式。(但微信文档中的
加解密已经过时
,无法支持PHP7以上的版本,目前我还在调试中。。),非加密消息直接处理XML消息即可。由于加密模式示例代码已过时,这里暂时就只提非加密模式了 - 消息发送方式:HTTP POST 传送XML数据包
- 数据包格式:
<xml>
<ToUserName>< ![CDATA[toUser] ]></ToUserName>
<FromUserName>< ![CDATA[fromUser] ]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType>< ![CDATA[text] ]></MsgType>
<Content>< ![CDATA[this is a test] ]></Content>
<MsgId>1234567890123456</MsgId>
</xml>
- 代码处理数据包: