求助,如何解决统一服务消息报api unauthorized?
-----------------以下问题已解决,下面给出解决方案------------------ 使用的是统一服务消息: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;
}
// 往下就不写了。。。。。
}