-----------------以下问题已解决,下面给出解决方案------------------
使用的是统一服务消息:uniformMessage.send
因为我开发的是小程序,没有拿到用户在服务号的openid。
所以想使用这个接口,通过使用在小程序的openid来推送消息到服务号模板上,但一直提示api unauthorized rid: 5f491c90-4f68c550-15bd7ef1。
^ array:2 [
"errcode" => 48001
"errmsg" => "api unauthorized rid: 5f491c90-4f68c550-xxx"
]
接口权限已获得
模板消息已添加
服务号已认证
小程序已关联
我是用小程序的appid和AppSecret获取的AccessToken,可以获取到,也能发送一次性订阅消息,但就是不能发送统一服务消息。
接收用户已经关注服务号了。
另外请求的地址也没错:https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=
代码如下
// 发送统一服务消息
public function sendMsg2() {
// 获取AccessToken
$acc = new AccessToken();
$accessToken = $acc->get();
// 组装请求地址
$url = Config::get('util.form_msg_url') . $accessToken;
$postData = [
'touser' => 'xxx', // 接受用户小程序端的openid
'mp_template_msg' => [
'appid' => 'xxx', // 公众号appid
'template_id' => 'xxx', // 模板id
'url' => '',
'miniprogram' => [
'appid' => 'xxx', // 跳转小程序appid
'pagepath' => 'pages/index/index'
],
'data' => [
'first' => ['value' => '有新的养殖户申请', 'color' => '#f44'],
'keyword1' => ['value' => 'xxx', 'color' => '#173177'],
'keyword2' => ['value' => '养殖户', 'color' => '#173177'],
'keyword3' => ['value' => date('Y-m-d H:i:s'), 'color' => '#173177'],
'remark' => ['value' => '请尽快审核相关资料是否真实有效', 'color' => '#173177']
]
]
];
$resultStr = curl_post($url, $postData);
$resultArr = json_decode($resultStr, true);
dump($resultArr);
}
求回复,万分感激。
--------------------------解决方案-----------------------------
发现很多人也遇到过此类问题,希望帮助到初学者或者刚接触微信开发的开发者们。
注意点:
1、accesstoken是用小程序的appid和secret获取的。 2、接受用的openid为小程序端的。 3、mp_template_msg.appid为公众号的appid。 4、mp_template_msg.url不能为空,那么怕写个xxx。 5、如果要小程序,则miniprogram下填充小程序的appid和page。 6、统一服务消息的发送位置为公众号。 7、公众号的小程序一定要关联以下哦(不需要开放平台关联)。
先上完整代码:
<?php
namespace app\service;
use think\facade\Config;
// 发送统一服务消息
class TemplateMsg
{
/**
* 发送服务消息
* @return mixed
* @throws \think\Exception
*/
public function send() {
// 获取全局唯一调用凭证
$accessTokenModel = new AccessToken();
$accessToken = $accessTokenModel->get();
// 请求地址(这个地址要检查下哦)
$sendUrl = 'https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token='.$accessToken;
$postData = [
'touser' => ‘接受用户小程序端的openid’,
'mp_template_msg' => [
'appid' => ‘公众号appid’,
'template_id' => '公众号模板id',
'url' => '模板消息跳转路径,如果要跳转小程序,那么下面的miniprogram字段要填充,且该字段也要填充',
'miniprogram' => [
'appid' => ‘小程序appid’,
'page' => ‘小程序跳转路径’
],
'data' => [
'first' => ['value' => ‘xx’, 'color' => '#ff4444'],
'keyword1' => ['value' => ‘xx’, 'color' => '#173177'],
]
];
// 发送服务消息
$resultStr = curl_post($sendUrl, json_encode($postData));
$resultArr = json_decode($resultStr, true);
if (empty($resultArr)) {
// 微信内部错误
}
if ($resultArr['errcode'] !== 0) {
// 其他错误
}
return $resultArr;
}
}
获取accessToken
<?php
namespace app\service;
use think\Exception;
use think\facade\Cache;
use think\facade\Config;
// 获取access_token(全局唯一接口调用凭据)
class AccessToken
{
protected $wxTokenUrl; // 请求地址
const TOKEN_CACHED_KEY = 'access'; // 缓存键
const TOKEN_EXPIRE_IN = 7000; // 缓存有效期
/**
* 组装请求地址
* AccessToken constructor.
*/
public function __construct(){
// access_token_url长这样:"https://api.weixin.qq.com/cgi-bin/token?" . "grant_type=client_credential&appid=%s&secret=%s"
// 注意:we_app_id是小程序appid,we_app_secret时小程序密钥
$this->wxTokenUrl = sprintf(
Config::get('util.access_token_url'),
Config::get('util.we_app_id'),
Config::get('util.we_app_secret')
);
}
/**
* 获取AccessToken
* @return mixed|string
* @throws Exception
*/
public function get() {
// 先从缓存获取
$accessToken = $this->getFromCache();
// 缓存不存在 微信服务器获取
if (!$accessToken) {
return $this->getFromWxServer();
}
return $accessToken;
}
// 往下就不写了。。。。。
}
你好,请问一直报这个错误是为什么,已经检查了所有注意项都没问题
{ "errcode": 40037, "errmsg": "invalid template_id rid: 649ab466-0fbd8cf4-75bda1b2" }
可解决了,我也出现了这个问题
48001有可能是AccessToken不正确。这里会不会有可能需要公众号的AccessToken。所以,既然是从小程序端触发,为什么不用云调用呢?省去了AccessToken这一环节。
反正我用云调用是秒过的。
小程序已经没有统一模板消息这个API了,现在只有一次性订阅消息。