PHP实现微信模板消息开发指南:电商订单通知与营销推送实战
当今处于移动互联网时代,微信已然成为不可或缺的沟通与营销工具。微信模板消息在诸多业务场景中起着重要作用,能够实现系统通知、订单提醒、活动通知等多样功能。今日我们深入探讨如何用 PHP 实现微信模板消息,以我自己开发的一个小型电商项目为例进行阐述,期望能给大家提供一些实用的技术干货。

应用场景
以我的这个小型电商项目为例。用户下订单后,我们期望能及时且有针对性地向用户告知订单状态,比如订单已接收、已发货、商品到货等情况。在此情况下,微信模板消息能发挥重要作用。或者当有商品促销活动时,我们可以借助微信模板消息,将活动详情推送给关注我们公众号且曾经购买过商品的用户,以提升活动的参与度。这只是两个比较典型的应用场景。实际上,在众多用户交互场景以及企业运营场景里,微信模板消息都能成为提高用户体验和服务效率的好帮手。
前期准备工作
在开始以 PHP 为工具开发微信模板消息功能之前,我们要先做好相应的准备工作。
要有一个微信公众号,同时具备相应权限。若为服务号,需通过微信认证,方可具备使用模板消息的权限。
了解微信公众平台的接口文档,尤其是关于模板消息的部分。接口文档提供了诸如重要参数以及调用规则等信息,其网址为:。此接口文档就如同我们的操作指南,只有清楚每个参数的意义和要求,我们才能正确使用模板消息接口。这与我们在开发项目时不看文档就盲目进行操作相比,要靠谱得多。
获取微信接口的访问令牌(access_token)
对于微信开发而言,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 选项,将选项 $ch 的 CURLOPT_URL 设置为 $url 。
设置 curl 的选项,将 $ch 的 CURLOPT_RETURNTRANSFER 选项设置为 true 。
设置 curl 的选项,将 $ch 对应的选项 CURLOPT_SSL_VERIFYPEER 设置为 false 。
$result = curl_exec($ch);
curl 关闭 $ch;将 $result 进行 json 解码并赋值给 $json_result;判断是否存在 $json_result 中的 'access_token';如果存在则返回 $json_result 中的 'access_token';如果不存在则返回 false。
当网络不太稳定时,这里容易出现问题,可能会导致 curl 请求失败。例如,若服务器设置了较为严格的 SSL 验证,那么我们上述代码中的 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);这一行或许就需要依据实际情况进行调整。如果不进行调整,那么可能会收到警告,甚至会导致请求直接失败。另外,如果 $appId 和 $appSecret 填写有误,也无法正确获取到 access_token。因此,大家在这个地方一定要小心仔细。
另外,要注意 access_token 是有有效期的,其有效期为 7200 秒。因此在实际使用时,我们得有相应机制来缓存这个 access_token,以防频繁获取。在我们的小电商项目中,我是这样做的:构建一个专门的缓存文件或者借助数据库中的一个字段来存储 access_token 及其过期时间。每次使用前需先检查是否已过期。若未过期,便可直接使用;若已过期,就需要重新获取。
创建微信模板消息
在微信公众平台创建自己的模板消息,此步极为重要,大致就是设计通知模板。能够自己定义模板里的各种变量,比如在订单通知模板中,可定义订单号、订单金额、订单状态等变量。这就如同在做填空题,先把空挖好。
代码会使用模板 id。当你创建好模板并且获取到模板 id 后(此模板 id 如同每个模板的身份证号般重要),便可以在 PHP 代码中运用这个模板 id 来发送该模板对应的消息。在此,我们假设模板 id 为 TEMPLATE_ID。
构建和发送微信模板消息的PHP代码
首先要构建消息的数据结构,需要依据之前挖好的空(即模板中定义的变量)来将通知内容填写完整。
$templateData = array(
接收者的 openid 为 "USER_OPENID","touser" 即指向具体某个用户的标识。这里需要获取到正确的 openid,若获取错误,就会致使消息发错人。“template_id”为“TEMPLATE_ID”,“url”为“http://www.ucaiyun.com/”,这是点击模板消息要跳转的网址。“data”数组包含以下内容:“first”数组,其“value”为“您的订单状态有更新”(可根据实际需求填写有意义的提醒文字,如对于订单消息可写订单相关开头语),“color”为“#173177”;“keyword1”数组,“value”为“20210501001”(假设这是订单号),“color”为“#173177”;“remark”数组,“value”为“感谢您的支持,如有疑问请联系客服”。", ) );
这里可能出现的问题包含几个方面。其一,如果 touser 即用户的 openid 获取有误,那么此消息将会发送至错误的用户处,在实际业务场景中这会造成混乱。其二,在获取 openid 的过程中,务必严格依照微信的规则来进行,例如通过网页授权登录来获取,或者依据用户的数据库记录来获取准确的 openid。
另外,关于 template_id 方面,如果填写的模板 id 有误,微信会直接提示找不到对应的模板,从而致使消息发送失败。同时,在填写 data 里面的各个值时,如果值的格式不符合预期,也有可能导致消息发送出现异常。例如,对于一些数字类型的值,倘若不小心写入了一些字母,那肯定是不可以的。
2. 发送模板消息的函数。
这样就能根据具体需求发送相应的模板消息了。
获取访问令牌的操作被赋值给了变量 $accessToken ,即通过调用 getAccessToken() 函数获取到了访问令牌并将其赋值给了 $accessToken 。
$url 等于 "https://api.weixin.qq.com/cgi-bin/message/template/send?" 并且后面接着 "access_token = " 再加上 $accessToken
将 $templateData 进行 json 编码,得到的结果赋值给 $data 。
curl 把 CURLOPT_POSTFIELDS 这个选项设置为 $data ,设置的对象是 $ch 。
如果 $json_result 中 'errcode' 的值等于 0 ,那么
return true;
可以在这里添加一些用于记录错误日志的功能,这样便于排查后续有可能出现的问题。
}
}
在执行 curl 请求时,与之前获取 access_token 的情况类似。若因网络或服务器配置等原因,可能会致使 curl 请求失败。并且在对 $templateData 进行 json_encode 操作时,倘若数据结构存在问题,就有可能导致编码失败。比如说某个必须的字段缺失了,比如 touser 或者 template_id ,那么整个数据结构就不完整,此时 encode 就会出错。另外,如果微信接口返回的 errcode 不是 0 ,那就意味着发送存在问题。这时候需依据返回的 errcode 来仔细查看微信公众平台的接口文档,以找出导致错误的具体原因,常见的错误包含上面提及的模板 id 错误、用户 openid 错误以及数据结构中值的格式错误等。
数据的处理和存储
在我们的小电商项目里,每一次发送模板消息的时候,我们都会对相关的数据进行记录。