收藏
回答

求助,如何解决统一服务消息报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;
  }
    // 往下就不写了。。。。。
}





最后一次编辑于  2021-03-12
回答关注问题邀请回答
收藏

6 个回答

  • vv
    vv
    2023-06-27

    你好,请问一直报这个错误是为什么,已经检查了所有注意项都没问题

    {
        "errcode": 40037,
        "errmsg": "invalid template_id rid: 649ab466-0fbd8cf4-75bda1b2"
    }
    
    2023-06-27
    有用
    回复
  • 梓晟
    梓晟
    发表于移动端
    2021-07-14
    8
    2021-07-14
    有用
    回复
  • Petrichor
    Petrichor
    2021-02-07

    请问下 我用的小程序的appid和secret获取的access_token ,然后去请求报错,无效的 openid,这个openid是通过小程序授权获取的,统一模板消息不是不区别小程序的openid和公众号的openid吗?


    2021-02-07
    有用
    回复
  • Mountain
    Mountain
    2020-09-06

    可解决了,我也出现了这个问题

    2020-09-06
    有用
    回复
  • 老张
    老张
    2020-08-29

    48001有可能是AccessToken不正确。这里会不会有可能需要公众号的AccessToken。所以,既然是从小程序端触发,为什么不用云调用呢?省去了AccessToken这一环节。

    反正我用云调用是秒过的。

    2020-08-29
    有用
    回复 2
    • XBSS丶
      XBSS丶
      2020-08-29
      好的,我试试服务号的access试试。还有我是用php开发接口的,云调用没用过,可以和php混合么?
      2020-08-29
      回复
    • 老张
      老张
      2020-08-29回复XBSS丶
      云调用不需要后台,用云函数,是nodejs.
      2020-08-29
      回复
  • 拾忆
    拾忆
    2020-08-28

    小程序已经没有统一模板消息这个API了,现在只有一次性订阅消息。

    2020-08-28
    有用
    回复 10
    • XBSS丶
      XBSS丶
      2020-08-29
      小程序模板消息废弃了,但是统一服务消息还在呀
      2020-08-29
      回复
    • 拾忆
      拾忆
      2020-08-29回复XBSS丶
      不在了,也废弃了
      2020-08-29
      回复
    • XBSS丶
      XBSS丶
      2020-09-02回复拾忆
      统一的公众号模板可以用,我亲测。
      2020-09-02
      回复
    • 拾忆
      拾忆
      2020-09-02回复XBSS丶
      是的,公众号的可以用,小程序的不行。
      2020-09-02
      回复
    • XBSS丶
      XBSS丶
      2020-09-02回复拾忆
      但是报错了,注释miniprogram就没问题。是什么原因呢?
      2020-09-02
      回复
    查看更多(5)
登录 后发表内容
问题标签