在使用微信小程序调用模板消息时,感觉自己的数据格式应该没错,但一直提示 data format error hint (数据格式错误)
然后仔细看了下 官方手册 ,找到 请求示例
{ "touser": "OPENID", "template_id": "TEMPLATE_ID", "page": "index", "form_id": "FORMID", "data": { "keyword1": { "value": "339208499" }, "keyword2": { "value": "2015年01月05日 12:30" }, "keyword3": { "value": "腾讯微信总部" }, "keyword4": { "value": "广州市海珠区新港中路397号" } }, "emphasis_keyword": "keyword1.DATA" }
再看看自己写的请求数据跟代码发现了几个问题
一、代码提交格式
官方给的示例中,提交的代码格式是 json 格式的,而我却用了 http_build_query 函数格式了数据,所以提交 post 前要把代码格式改成 json 类型
$data = [ 'touser' => $openId, 'template_id' => $tempId, 'page' => '/pages/index/index?param=XXX', 'form_id' => $formId, 'data' => [ 'keyword1' => $voucher['items']['name'], 'keyword2' => $this->code, 'keyword3' => 1, 'keyword4' => date('Y年m月d日 H:i:s', $now), ] ];
$data = json_encode($data, JSON_UNESCAPED_UNICODE); // json_encode 第二个参数需要 php5.4 以后的版本
转完格式后再次提交数据,发现小程序还是报错 data format error hint,打印出上面的 $data 后比较官方示例,发现了第二个问题
二、传输数据字段中的 data 是二维数组
官方的示例节选
{ "data": { "keyword1": { "value": "339208499" } }
data 下的 keyword1 字段并不是直接复制,而是一个一维数组,所以修改数据
$data = [ 'touser' => $openId, 'template_id' => $tempId, 'page' => '/pages/index/index?param=XXX', 'form_id' => $formId, 'data' => [ 'keyword1' => ['value' => $voucher['items']['name']], 'keyword2' => ['value' => $this->code], 'keyword3' => ['value' => 1], 'keyword4' => ['value' => date('Y年m月d日 H:i:s', $now)], ] ]; $data = json_encode($data, JSON_UNESCAPED_UNICODE);
这样格式提交的参数就可以正常通过消息模板验证了