、交互,也就是说这个模板消息,必须由⽤户⼿动来触发,你想后台定时给⽤户推个消息,洗洗睡吧你。
这个重点你们⾃⼰划吧,发模板消息必须满⾜这两种情况中的⼀种,⽀付就不说了,⽤户付款后可以推送⼏条消息,重点是这个表单提交
意思就是我想给⽤户发个模板消息,第⼀要搞个表单,第⼆要让⽤户来提交这个表单(获取formId),⽽且这个模板消息还只能发给提交表单的⽤户本⼈,你想发给别的⽤户,呵呵。
3. 原理
徐若瑄 电影好了,说多了都是⽓,既然这样设计,也是有⼀定道理,但是道理都是讲给守规矩的⼈听的,⾄于不守规矩的,喂!说的就是你。
通过上⾯的分析我们知道,想发送⼀个基本的模板消息需要以下步骤:
1. 构建⼀个form表单
2. 设置表单的report-submit属性为true(⽤来获取formId发送模板消息)
南瓜饼的做法家常做法3. ⽤户提交表单,把openid和formId⼀块提交给后台(其实真正开发中⼀般不会提交openid,因为在⽤户登录或者访
问⼩程序时候通常会把openid和当前⽤户在数据库中做个同步)
4. 后台调⽤POST api.weixin.qq/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN来发送模板消息
其中touser(openid)和form_id是重点,这两个参数的结合是⽤来确认和效验模板接收者的,因为⽤户提交表单会⽣成⼀个专属的formId,这个formId标识着⽤户的⼀个操作。所以可以这样来理解,要想发送⼀个模板消息给特定⽤户,那么必须要有该⽤户的有效formId(7天内有效)和openid,⼀旦我们有了⽤户⼤量的formId,你说我发个模板消息那还不跟玩的⼀样。阿娇陈冠希无处理照
所以问题就来了
1. 我如何来收集⽤户的formId?
这个还没有什么特别有效的办法,因为不会给提供相关api,⽽且只有提交表单才能得到formId,所以只能让⽤户去主动的触发表单来⽣成formId,我们要做的就是修改原有的页⾯,把页⾯上⾼强度的交互都⽤form和button组件来替
像这些交互元素都可以外层套上form组件,⽤户点击后触发表单提交事件,得到formId,我们把formId和⽤户openid
{
$this->openid = $openid;
$this->config = $config;
$this->cache = Cache::store('redis');  // ⽤redis作为缓存驱动,记得要配置redis环境奥        $this->cacheKey = $this->getCacheKey(); // 每个openid对应⼀个key
}
/**
* 获取缓存key
*
*/
public function getCacheKey()考公务员需要什么条件
{
return 'mini_program_form_id_'.$this->openid;
}
/**
* 发送模板消息
*
* @param $data 模板消息参数
*/
public function send($data)
{
$mina = Factory::miniProgram([
'app_id' => $this->config['app_id'],
化学专业就业前景'secret' => $this->config['secret'],
]);
// 获取⼀个可⽤的formId,然后删除掉
$formId = $this->get(true);
if (!$formId) {
throw new \Exception('no formId');
} else {
$data['touser'] = $this->openid;
$data['form_id'] = $formId;
// ⽤overtrue/wechat包来发送模板消息
$res = $mina->template_message->send($data);
return $res;
}
}
/**
* 存储formId
*
* @param $formId
*/
public function save($formId)
{
$formIds = $this->gets();
$formIds->push([
'form_id' => $formId,
'expire' => time() + 60 * 7 * 24 // formId过期时间
]);
// 存储到redis缓存中
$this->cache->forever($this->cacheKey, $formIds->toArray());
}
/**
* 获取某个未过期的formId
*
* @param $delete 获取之后是否⽴即删除
*/
public function get($delete = false)
{
$formIds = $this->gets();
if (!$formIds->count()) {
return false;
}
// 筛选⼀个有效的formId,优先获取快过期的杨幂耍大牌
$formId = $formIds->where('expire', '>=', time())->sortBy('expire')->first()['form_id'];
if ($delete && $formId) {
$this->delete($formId);
}