在当今移动互联网时代,微信已经成为了一个不可或缺的沟通和营销工具。而微信模板消息在很多业务场景中具有重要的作用,它可以实现系统通知、订单提醒、活动通知等多样化的功能。今天我们就来深入聊一聊如何用PHP来实现微信模板消息,结合我自己开发的一个小型电商项目进行阐述,希望能给大家提供一些实在的技术干货。
应用场景
就拿我的这个小型电商项目来说。当用户下订单之后,我们希望能够及时以及有针对性地告知用户订单的状态,像订单已接收、已发货、商品到货等情况。这时候微信模板消息就大显身手了。又或者当有商品促销活动时,我们也可以通过微信模板消息推送活动详情给那些关注我们公众号并且曾经购买过商品的用户,提高活动的参与度。这只是其中比较典型的两个应用场景,实际上在更多的用户交互和企业运营场景中,微信模板消息都是提高用户体验和服务效率的好帮手。
前期准备工作
在开始用PHP开发微信模板消息功能之前,我们需要做好一些准备工作。
1. 首先要有一个微信公众号并且具有相应的权限。如果是服务号的话,需要通过微信认证才能具备使用模板消息的权限。
2. 了解微信公众平台的接口文档。特别是关于模板消息的部分,接口文档提供了非常重要的参数和调用规则等信息,网址:https://mp.weixin.qq.com/。这就像是我们的操作指南,我们必须清楚每个参数的意义和要求才能正确使用模板消息接口。这可比我们开发项目的时候不看文档就瞎搞要靠谱多了。
获取微信接口的访问令牌(access_token)
1. 对于微信开发来说,access_token那可是相当重要的一个东西。这是我们访问微信服务器的一个通行证,就像是你要进一个高级会所,没有会员卡(access_token)可不行。大致的代码如下:
function getAccessToken() {
$appId = 'YOUR_APPID'; //在这里填写您的微信公众号appId
$url = "https://api.weixin.qq.com/cgi - bin/token?grant_type = client_credential&appid = ".$appId."&secret = ".$appSecret;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($ch);
curl_close($ch); $json_result = json_decode($result, true); if (isset($json_result['access_token'])) { return $json_result['access_token']; } else { return false; } }
这里容易出现的问题就是当网络不太稳定的时候,可能会出现curl请求失败的情况。比如说,如果服务器设置了比较严格的SSL验证,那么我们上面代码中的 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
这一行可能就需要根据实际情况进行调整。如果不调整可能会收到警告或者导致请求直接失败。还有如果 $appId
和 $appSecret
填写错误的话,也无法正确获取到access_token。所以大家在这个地方可得小心仔细咯。
2. 另外,需要注意access_token是有有效期的,有效期是7200秒。所以在实际使用中,我们需要有机制去缓存这个access_token,避免频繁获取。我在我们小电商项目中是这样做的: 建立一个专门的缓存文件或者利用数据库中的一个字段来存储access_token和它的过期时间。每次要使用的时候首先检查是否过期,如果没过期就直接使用,过期了就重新获取。
创建微信模板消息
1. 在微信公众平台上创建自己的模板消息。这一步相当重要,基本上就是设计你的通知模板。你可以自己定义模板中的各种变量,例如在订单通知模板中,你可以定义像订单号、订单金额、订单状态等变量。这就像是在做填空题,你先把空给挖好。
2. 代码中使用模板id。一旦你创建好模板并且获取到了模板id(就像每个模板的身份证号一样重要),就可以在PHP代码中使用这个模板id来发送这个模板对应的消息了。这里我们假设模板id是 TEMPLATE_ID
。
构建和发送微信模板消息的PHP代码
1. 首先要构建消息的数据结构,就像是按照之前挖好的空(也就是模板中定义的变量)来填写完整的通知内容。
$templateData = array(
"touser" => "USER_OPENID", //接收者的openid,这是指向具体某个用户的标识。这里要获取到正确的openid,如果获取错误就导致消息发错人了 "template_id" => "TEMPLATE_ID", "url" => "http://www.ucaiyun.com/", //点击模板消息要跳转的网址 "data" => array( "first" => array( "value" => "您的订单状态有更新", //这里就可以根据实际需求填写有意义的提醒文字,例如对于订单消息可以写订单相关的开头语 "color" => "#173177" //可以设置字体颜色哦 ), "keyword1" => array( "value" => "20210501001", //这里就是对应模板变量的值,假设这是订单号 "color" => "#173177" "value" => "已发货", "remark" => array( "value" => "感谢您的支持,如有疑问请联系客服。", ) );
这里可能出现的问题有几个方面。一个就是如果 touser
也就是用户的openid获取错误,那么这个消息就会发送到错误的用户那里,这在实际业务场景中可就乱套了。所以在获取openid的过程中要严格按照微信的规则来进行,比如说通过网页授权登录时获取,或者根据用户的数据库记录来获取准确的openid。
另外就是关于 template_id
,如果这个模板id填写错误,微信会直接提示找不到对应的模板,导致消息发送失败。还有在填写 data
里面的各个值的时候,如果值的格式不符合预期,也可能会导致消息发送异常。比如说,对于一些数字类型的值,如果你不小心写了一些字母进去,那肯定是不行的。
2. 发送模板消息的函数。
function sendTemplateMessage($templateData) {
$accessToken = getAccessToken();
$url = "https://api.weixin.qq.com/cgi - bin/message/template/send?access_token = ".$accessToken;
$data = json_encode($templateData);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
if ($json_result['errcode'] == 0) {
return true;
//这里可以添加一些错误日志记录功能,方便排查后续可能出现的问题
}
}
这里在执行curl请求的时候,和之前获取access_token类似,如果网络或者服务器配置等原因,可能会导致curl请求失败。而且在对 $templateData
进行 json_encode
的时候,如果数据结构有问题,可能就会导致编码失败。比如说如果少了某个必须的字段,像 touser
或者 template_id
,那整个数据结构就是不完整的,encode就会出错。另外,如果微信接口返回的 errcode
不为0,那就说明发送有问题。这时候就要根据返回的errcode去详细查看微信公众平台的接口文档,找出具体是什么原因导致的错误,常见的错误可能是上面提到的模板id错误、用户openid错误、数据结构中的值格式错误等。
数据的处理和存储
1. 在我们的小电商项目中,每一次发送模板消息我们都会记录相关的数据。