可解决了,我也出现了这个问题
求助,如何解决统一服务消息报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; } // 往下就不写了。。。。。 }
2020-09-06