小程序发送服务通知

本文介绍了一个小程序服务通知的测试流程,包括通过用户身份临时凭证获取openid、获取接口调用凭证access_token、组装消息数据并发送模板消息等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<?php
/**
*小程序发送服务通知
*这里只做单纯的功能测试,没有涉及任何业务逻辑
1 前台传post参数code(用户身份临时凭证)和formid(表单提交场景submit事件带上的formId,支付场景没有测试)
2 通过code获取openid
3 获取接口调用凭证access_token,调用发消息模板接口需要用到
4 获取模板id,组装消息数据,调用发消息接口发送
官方文档地址:https://developers.weixin.qq.com/miniprogram/dev/api/notice.html#%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E
*/
//获取openid
function getOpenid(){
    $appid='wxd204fed0cf926fe6';
    $appsecret='4e77e491b757dbadbfcc94652d42c0f4';
    $code=$_POST['code'];
    $url="https://api.weixin.qq.com/sns/jscode2session?appid=$appid&secret=$appsecret&js_code=$code&grant_type=authorization_code";
    $request=file_get_contents($url);
    return json_decode($request)->openid;
}
//获取接口调用凭证access_token 
function getAccessToken(){
    $appid='wxd204fed0cf926fe6';
    $secret='4e77e491b757dbadbfcc94652d42c0f4';
    $url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$secret";
    $access_token = file_get_contents($url);
    return json_decode($access_token)->access_token;
}
//发送模板消息
function sendMsg($data,$access_token){//这个方法里面的代码来源于百度复制,能否用于生产有待考究
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=".$access_token);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $tmpInfo = curl_exec($ch);
    if (curl_errno($ch)) {
      return curl_error($ch);
    }

    curl_close($ch);
    return $tmpInfo;
}
//formid
$formid=$_POST['formid'];
//获取openid
$openid=getOpenid();
//获取access_token
$access_token=getAccessToken();
//模板数据,微信要的是json数据,我这里先构建数组再转成json
$data=array(
         'touser'=>''.$openid,//要发送的用户
         'template_id'=>'w0oU8HEJL3uuwxB5zYEcWpnRkOYuKjN9zzIwu7nQVz8',//模板id,从模板库中获取,可通过接口获取或直接从小程序后台复制
         "page"=>"index",//跳转小程序的页面
         'form_id'=>''.$formid,//表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的 prepay_id
         'data'=>array(
             'keyword1'=>array(
                 'value'=>'产品名称',
             ),
             'keyword2'=>array(
                 'value'=>'订单号',
             ),
             'keyword3'=>array(
                 'value'=>'订单价格',
             ),
             'keyword4'=>array(
                 'value'=>'订购时间',
             ),

            ),
          'emphasis_keyword'=>'keyword1.DATA'    //需要放大显示的关键词
     );
//发送模板消息
$result=sendMsg(json_encode($data),$access_token);
var_dump($result);
?>

### 实现微信小程序订阅消息服务通知的方法 #### 小程序后台申请模板并获取模板 ID 为了能够发送订阅消息,在小程序管理后台需要先申请相应的消息模板,并从中获得模板 ID。这一步骤对于确保后续的消息推送合法性至关重要[^2]。 #### 用户端订阅操作处理 当用户首次访问涉及订阅功能的小程序页面时,应展示订阅窗口让用户确认是否接收特定类型的通知。此过程通常通过调用微信 API `requestSubscribeMessage` 来实现,该接口允许请求用户授权同意接受来自指定模板的一次性或长期性的订阅消息[^3]。 ```javascript wx.requestSubscribeMessage({ tmplIds: ['your_template_id'], // 替换成实际取得的模板ID success(res) { console.log('User agreed:', res); }, fail(err) { console.error('Failed to subscribe', err); } }); ``` #### 后台服务器配置与云函数编写 利用微信提供的云开发能力,可以在云端创建一个负责处理订阅逻辑以及真正执行消息发送动作的云函数。这个过程中涉及到验证用户的订阅状态、准备要传递的数据包等内容。具体来说: - **检查订阅权限**:每次尝试发送之前都要核实目标用户确实已经给予了相应类型的订阅许可; - **构建数据体**:按照官方文档定义好的格式组装好待发送的信息内容; - **发起 POST 请求至 WeChat Server**:最终借助 HTTP 客户端工具像 axios 或者 fetch 这样的库去触达微信公众平台所提供的 RESTful 接口完成消息投递工作[^1]。 ```javascript // 假设这是位于 cloudfunctions/send-subscribe-message/index.js 中的部分代码片段 const axios = require('axios'); exports.main = async(event, context) => { const { OPENID, FORM_ID, TEMPLATE_ID } = event; try { let response = await axios.post(`https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=${process.env.ACCESS_TOKEN}`, { touser: OPENID, template_id: TEMPLATE_ID, page: 'pages/index/index', data: { thing1: { value: "您的订单已发货" }, phrase2: { value: "感谢您购买我们的产品!" } } }); return response.data; } catch(error){ throw new Error(JSON.stringify(error)); } }; ``` #### 调试与发布上线 在整个流程搭建完毕之后,建议采用真实环境下的手机终端来进行完整的测试周期,包括但不限于模拟不同场景下触发条件的变化情况,观察预期之外的行为表现等。只有经过充分检验无误后才考虑正式对外提供此项特性给广大的使用者群体体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值