服务热线:

+86 0000 88888

超市货架、各种展架、仓储展柜 等生产销售商

可根据客户不同的需要,进行个性化设计制造

新闻动态

支付宝小程序开发:实现模板消息功能的全流程指南

作者:小编 点击: 发布时间:2026-03-21 04:11

用于触达支付宝小程序用户的既最直接又具效力的方式是模板消息,然而好多的开发者于接入期间老是在授权环节、生活号绑定环节或者formId收集环节受阻,致使消息没法发送出去。此文结合项目实战情况,将涵盖从前期配置直至最终调通的整个流程予以拆解开来,助力你避开那些容易踩中的坑。

前期准备六件事少一件都不行

别急着立刻去写代码,支付宝的模板消息有着严格的权限以及配置方面的要求,第一步是要确认小程序是否已绑定生活号,因为所有的模板消息都是借助生活号来进行分发的,如果没有绑定那接口调用直接会报错。第二步是在小程序后台的那个 “模板消息” 之中添加消息模板,把模板编号拿到手,要注意模板的关键词以及顺序和内容要跟后续代码里填充进去的参数逐个实现对应。

于开发之前,务必要审慎地去阅读官方所给出的模板消息指引以及接口文档,尤其要关注.open.app.mini..send此接口的入参结构。form 组件乃是收集 formId 的关键所在,这就要求在页面当之中妥善地埋下表单,与此同时,在小程序项目配置里开启模板消息权限。要是对于用户授权流程并不熟悉的情况之下,建议先行去查看我所撰写的《PHP 实现支付宝小程序用户授权的工具类》,进而把授权基础给夯实筑牢。

formId收集要广撒网

formId乃是发送模板消息的凭证,每回提交仅能生成一个,其有效期仅有7天。诸多开发者仅于表单提交按钮处放置form组件,致使formId数量不足。正确之法是尽力多地进行埋点,像按钮点击、tab切换、页面跳转这些用户频繁操作的地方,均可套上一层form组件用以收集formId。

被收集起来的formId可不单单只能存在于前端,得专门去写一个后端接口,通过POST请求将formId以及与之对应的用户openId一同保存至数据库。保存之际要把创建时间记录妥当,以便后续能够清理过期的formId。提议构建一张消息队列表,其字段涵盖id、open_id、form_id、create_time、status,每次调用发送接口之前都要先去查询可用的formId。

生活号绑定是发送前提

发送支付宝模板消息的路径是,从小程序开始,经由生活号,最终到达用户,因此倘若在应该进行生活号绑定这一环节出现遗漏,那么后续开展的所有工作均会付诸东流。就怎样开展绑定操作加以表明,需要在小程序后台提供给我们的“设置”之处,寻找到“生活号管理”选项,随后键入生活号的appId方可完成绑定事宜。需留意,一个生活号能够绑定多个小程序,然而一个小程序仅仅能够绑定一个生活号。

进行绑定时,务必要确认生活号以及小程序是属于同一主体,不然的话将会绑定失败。要是属于企业开发的情况,生活号一般是由运营部门进行管理的,这种情况下需要提前展开沟通从而获取到绑定权限。在绑定成功以后,生活号后台能够看到与之关联的小程序列表,这也就意味着通道已然打通了。除此之外,生活号需要达成认证,未曾认证的生活号是没有办法发送模板消息的。

接口调用参数别传错

//模板消息的接口方法名称
const API_METHOD_SEND_TPL_MSG = 'alipay.open.app.mini.templatemessage.send';
//模板消息的结果返回节点名称
const RESPONSE_OUTER_NODE_SEND_TPL_MSG = 'alipay_open_app_mini_templatemessage_send_response';
    
    

施行发送模板消息的接口乃是.open.app.mini.template.message.send,于调用之前需预先筹备好三个主要参数,分别为:用户的openId,以及模板编号,还有formId。openId借助用户授权以此获取,模板编号乃是配置于后台的那么一串字符而形成,formId从数据库当中提取最早未曾使用的那一条记录。

组装参数之际,要留意对于模板消息的数据部分,应采用数组格式,其键名务必与模板内所设置的关键词相对应,例如,若模板里的首个关键词为“订单号”,那么在代码里就得写成 'keyword1' => ['value' => '具体订单号'],除此之外,还得传输跳转页面路径,目的是当用户点击消息后能够直接进入小程序指定页面,且此路径需完整书写,不带问号参数。

/**
     * 发送小程序模板消息
     * @param $formId
     * @param $to 发送给用户的编号
     * @param $tplId 模板编号
     * @param $tplContent 模板内容
     * @param $page 要跳转的页面
     * @return array
     */
    public static function sendAmpTplMsg($formId,$to,$tplId,$tplContent,$page = ''){
        $param = self::getTplMsgBaseParam($formId,$to,$tplId,$tplContent,$page = '');
        $url = self::buildRequestUrl($param);
        $response = self::getResponse($url,self::RESPONSE_OUTER_NODE_SEND_TPL_MSG);
        return $response;
    }

返回结果判断要仔细

在接口进行调用之后,会返回一组呈现为JSON结构的数据,而判断发送成功的关键所在,是查看返回节点当中的code是不是10000。当code为10000的时候,这意味着消息已经进入到发送队列,可这并不表明用户肯定能够收到,要是用户拒收了生活号消息或者账号存在异常情况,那么实际送达将会出现延迟。

/**
     * 获取发送模板消息的接口参数
     */
    protected static function getTplMsgBaseParam($formId,$to,$tplId,$tplContent,$page = ''){
        $baseParam = [
            'to_user_id' => $to,
            'form_id' => $formId,
            'user_template_id' => $tplId,
            'page' => $page,
            'data' => $tplContent,
        ];
        $bizContent = json_encode($baseParam,JSON_UNESCAPED_UNICODE);
        $busiParam = [
            'biz_content' => $bizContent
        ];
        $param = self::buildApiBuisinessParam($busiParam,self::API_METHOD_SEND_TPL_MSG);
        return $param;
    }
    
    /**
     * 构建业务参数
     */
    protected static function buildApiBuisinessParam($businessParam,$apiMethod){
        $pubParam = self::getApiPubParam($apiMethod);
        $businessParam = array_merge($pubParam,$businessParam);
        $signContent = self::getSignContent($businessParam);
        error_log('sign_content ===========>'.$signContent);
        $rsaHelper = new RsaHelper();
        $sign = $rsaHelper->createSign($signContent);
        error_log('sign ===========>'.$sign);
        $businessParam['sign'] = $sign;
        return $businessParam;
    }
    
    /**
     * 公共参数
     *
     */
    protected static function getApiPubParam($apiMethod){
        $ampBaseInfo = BusinessHelper::getAmpBaseInfo();
        $param = [
            'timestamp' => date('Y-m-d H:i:s') ,
            'method' => $apiMethod,
            'app_id' => formatArrValue($ampBaseInfo,'appid',config('param.amp.appid')),
            'sign_type' =>self::SIGN_TYPE_RSA2,
            'charset' =>self::FILE_CHARSET_UTF8,
            'version' =>self::VERSION,
        ];
        return $param;
    }
    
    /**
     * 获取签名的内容
     */
    protected static function getSignContent($params) {
        ksort($params);
        $stringToBeSigned = "";
        $i = 0;
        foreach ($params as $k => $v) {
            if (!empty($v) && "@" != substr($v, 0, 1)) {
                if ($i == 0) {
                    $stringToBeSigned .= "$k" . "=" . "$v";
                } else {
                    $stringToBeSigned .= "&" . "$k" . "=" . "$v";
                }
                $i++;
            }
        }
        unset ($k, $v);
        return $stringToBeSigned;
    }
    
    /**
     * 构建请求链接
     */
    protected static function buildRequestUrl($param){
        $paramStr = http_build_query($param);
        return self::API_DOMAIN . $paramStr;
    }

如若返回结果之中,code并非10000,那么得依据sub_code以及sub_msg去排查错误。常见的出错代码涵盖下述之类:formId无效,模板编号存在错误、生活号未曾绑定、用户未被授权等等状况。提议于代码里面将返回结果完完全全记录至日志内,以便后续之时能够回溯问题。在发送成功之后,要即刻把用过的formId标记作已使用,以此防止重复消费。

效果测试注意用户体验

于开发环境开展测试之际,选用真机调试为佳,鉴于模拟器大概没法充分模拟模板消息之接收进程。测试之时,先是借由小程序触发formId收集,接着调用发送接口,查看支付宝消息盒子有无呈现模板消息。点击消息需能够正常跳转至指定页面,跳转参数亦要传递无误。

/**
     * 获取返回的数据,对返回的结果做进一步的封装和解析
     */
    protected static function getResponse($url,$responseNode){
        $json = curlRequest($url);
        error_log("result is =========>".$json);
        $response = json_decode($json,true);
        $responseContent = formatArrValue($response,$responseNode,[]);
        $errResponse = formatArrValue($response,self::RESPONSE_OUTER_NODE_ERROR_RESPONSE,[]);
        if($errResponse){
            return $errResponse;
        }
        return $responseContent;
    }

需留意测试频率,同一用户在一天之中所收下的模板消息数量存在限制,若频繁予以发送则有可能会被限流。于上线之前还得检查消息模板的内容是否合乎规范,有关营销推广的内容极易被拦截。建议率先在灰度环境当中借助小范围用户予以验证,在确认毫无差错之后再进行全量发布。此外formId过期机制务必要处理妥善,借助定时任务清理7天之前的数据,防止发送之际拿到无效凭证。

是不是在搞支付宝模板消息开发过程中,碰到最多麻烦的情况是处于授权那个环节,还是formId收集这块,又抑或是生活号绑定方面?快快在评论区域分享一下踩坑的经历,顺便点一下赞收藏这篇文章,等到下次开发的时候直接运用这不就是一套现成流程。

{
    "alipay_open_app_mini_templatemessage_send_response":{
        "code":"10000",
        "msg":"Success"
      }
    ,"sign":"ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE"
}

相关新闻
最新产品
在线客服
联系方式

热线电话

+86 0000 88888

上班时间

周一到周五

公司电话

13988888888

二维码
线