"prepay_id" 只有进行了支付行为才能获得,并且必须支付成功!
当用户在小程序内完成过支付行为,可允许开发者向用户在7天内推送有限条数的模板消息(1次支付可下发3条,多次支付下发条数独立,互相不影响)
相对适合的通知业务有 —— 后台发货提醒、审核通知、课程开班提醒、拼团成功通知等主动推送的信息...
使用 "<form/>" 组件
当用户在小程序内发生过提交表单行为且该表单声明为要发模板消息的,开发者需要向用户提供服务时,可允许开发者向用户在7天内推送有限条数的模板消息(1次提交表单可下发1条,多次提交下发条数独立,相互不影响)
相对适合的通知业务 —— 支付成功或失败后,充值成功、 续费成功、挂号成功等被动响应的信息...
<?php

/**
 * 小程序助手
 */
class XcxHelper
{
    /**
     * 发送模板消息
     * @param $accessToken
     * @param $template_id 模板id
     * @param $touser 接收人的openid
     * @param $data   模板参数
     * @param string $form_id 表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的 prepay_id
     * @param string $page 小程序中的跳转页面,没有可不填,支持参数
     * @param string $emphasis_keyword 模板需要放大的关键词,不填则默认无放大 keyword1.DATA
     * @return bool|mixed|string
     */
    public static function sendTemplateMsg($accessToken,$template_id,$touser,$data,$form_id,$page = '',$emphasis_keyword='') {
        $baseUrl = 'https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token='.$accessToken;
        vendor('Func.Http');
        $params = [
           'template_id' => $template_id,
           'touser' => $touser,
           'data' => $data,
           'form_id' => $form_id,
           'page' => $page,
           'emphasis_keyword' => $emphasis_keyword,
        ];
        $res = Http::doPostJson($baseUrl,$params);
        $res = json_decode($res,true);
        return $res;
    }

    /**
     * 获取小程序 accessToken
     * @return mixed
     */
    public static function getXcxAccessToken() {
        vendor('Func.Red');
        $redis = Red::create();
        $accessKey = C('APPID').':accessToken';
        $accessData = $redis->get($accessKey);
        if ($accessData) {
            return $accessData;
        }

        // 获取
        $accessUrl = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.C('APPID').'&secret='.C('APP_SECRET');
        vendor('Func.Http');
        $res = Http::doGet($accessUrl);
        $res = json_decode($res,true);
        if (array_key_exists('errcode',$res)) {
            return false;
        } else {
            // 存入redis
            $accessData = $res['access_token'];
            $redis->set($accessKey,$accessData,6500); // 7200秒
            return $accessData;
        }
    }
}

测试

<?php

/**
 * 测试Demo可以这么写
 */
class XcxTestAction extends CommonAction
{
    public function _initialize()
    {
        parent::_initialize();
        vendor('Api.XcxHelper');
    }

    public function getXcxAccessToken()
    {
        $result = XcxHelper::getXcxAccessToken();
        $this->json->S($result);
    }

    public function sendTemplateMsg()
    {
        $accessToken = XcxHelper::getXcxAccessToken();
        $template_id = 'YcYXDlaqCE-oLNCnnYJjUMuHzxFAxqfeyiA4_sACQPE';
        $touser      = 'o_cJH46FwrP1WQ6ZDG8qhAKyCr3A';
        $data        = [
            'keyword1' => [
                'value' => date('Y-m-d H:i')
            ],
            'keyword2' => [
                'value' => '10元'
            ]
        ];
        $form_id     = 'wx101541335732568ec4d653601244425700'; // 如果是prepay_id,必须支付成功后才有效;且必须是非开发者工具生成的prepay_id;只能通知本人;

        $result = XcxHelper::sendTemplateMsg($accessToken, $template_id, $touser, $data, $form_id, $page = '');
        $this->json->S($result);
    }

    public function test()
    {
        $opt = $_POST['opt'];
        switch ($opt) {
            case 'sendTemplateMsg':
                $this->sendTemplateMsg();
                break;
            default:
                $this->getXcxAccessToken();
                break;
        }

    }
}

小结:用户可以收到支付成功消息,发货消息。需要记录成功支付的prepay_id。但是想发给别人,就没那么容易了。