WordPress WP_Http方式微信小程序内容安全检测 errcode:47001 data format error

目前各平台小程序都要求接入内容安全检测机制,以微信小程序为例,检测文本。

官方文档:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/sec-center/sec-check/msgSecCheck.html

本文以WordPress WP_Http方式进行访问,参考写法:

<?php

// url 参数
$token = ''; // 自行获取access_token
$url = 'https://api.weixin.qq.com/wxa/msg_sec_check'. '?access_token=' . $token;

// body 参数
$openid = ''; // 目前为必选参数了
$scene = 1;
$version = 2;
$content = 'hello world';

// 切记: 要用json_encode转为字符串!!!
$contentbody = json_encode(array('openid' => $openid, 'scene' => $scene, 'version' => $version, 'content' => $content), JSON_UNESCAPED_UNICODE);

$wp_http = new WP_Http;
$result = $wp_http->request( $url, array( 'method' => 'POST', 'body' => $contentbody  )  );
$body = json_decode($result['body']);

print_r($body);

返回结果很容易出现47001错误,官方解释:解析 JSON/XML 内容错误;post 数据中参数缺失;检查修正后重试。

{
    "code": 0, 
    "data": {
        "headers": { }, 
        "body": "{\"errcode\":47001,\"errmsg\":\"data format error rid: xxxxxx\"}", 
        "response": {
            "code": 200, 
            "message": "OK"
        }, 
        "cookies": [ ], 
        "filename": null, 
        "http_response": {
            "data": null, 
            "headers": null, 
            "status": null
        }
    }
}

列举笔者排查出的原因:

  1. access_token是URL参数,不能放在body,确定是不能!即使URL和body都放也不行,仅仅只能放在URL中!
  2. 检查post参数个数、有效性(比如token是否过期等)以及变量拼写,避免低级错误。
  3. post参数是json字符串格式。

注意json_encode的第二个参数JSON_UNESCAPED_UNICODE,禁止中文转码,否则检测不出敏感词。

(版权归cpury.com所有,转载请注明出处。)