12下一页
返回列表 发帖
查看: 2164|回复: 13

[已解决] Discuz! 3.5 的 UCenter 接口返回 Access denied for operation changed

5

主题

17

回帖

24

积分

初学乍练

贡献
0 点
金币
1 个
发表于 2023-3-26 23:14:20 | 查看全部 |阅读模式
3.4 的接口可以正常返回,3.5 同样的代码就出现了 Access denied for operation changed。


另外有没有比较清晰的 UCenter 的接口文档,我是 Java 开发者,用的是别人比较老的调用接口的代码,很不好调试。

感谢知道的朋友们的回复!
1 贡献+1 金币

最佳答案

如果你手头已经有能用的老代码那就好办了,否则光是接口参数的加密就够你头疼一阵子的。
这接口大概是这么个编码流程:
1. 先对参数做url编码,大致就是变成a=b&c=d这种格式
2. (出于安全考虑新增的,x3.4可能没有)参数后面追加&m=module&a=action&appid=UC_APPID,比方说登录环节,module就是user action就是login
3. 后面再追加&agent=UA的MD5,&time=时间戳
4. 用Discuz自家的authcode加密算法(通常是一个函数实现,如果你原本有代码这里应该有这个东西)对上述字符串加密,密钥为UC_KEY,加密完了用urlencode编码
5. 将加密以后的东西嵌入这串参数里面 m=module&a=action&inajax=2&release=UC_CLIENT_RELEASE&input=上一步的内容&appid=UC_APPID
6. 上述参数即为最终POST到接口的东西,记得Content-Type: application/x-www-form-urlencoded。因为已经encode过了所以直接发就行了。

你对照着这套逻辑看看你已有的原版代码,看懂以后把缺少的部分补上应该就能用了。
回复

使用道具 举报

5

主题

17

回帖

24

积分

初学乍练

贡献
0 点
金币
1 个
 楼主| 发表于 2023-3-26 23:17:11 | 查看全部
补充:我找到了接口文档的地址:https://help.v2my.com/UCenter/api/api_index.htm。

但是我是 Java 开发者,我想知道调用什么接口,什么请求方式,传递哪些参数,哪些参数应该怎么编码,PHP 的示例代码看不懂。哪里有比较清晰的文档,告诉我调用的规则。谢谢知道的朋友!

回复

使用道具 举报

12

主题

1655

回帖

2814

积分

Giter

贡献
151 点
金币
362 个
发表于 2023-3-27 00:40:31 | 查看全部
如果你手头已经有能用的老代码那就好办了,否则光是接口参数的加密就够你头疼一阵子的。
这接口大概是这么个编码流程:
1. 先对参数做url编码,大致就是变成a=b&c=d这种格式
2. (出于安全考虑新增的,x3.4可能没有)参数后面追加&m=module&a=action&appid=UC_APPID,比方说登录环节,module就是user action就是login
3. 后面再追加&agent=UA的MD5,&time=时间戳
4. 用Discuz自家的authcode加密算法(通常是一个函数实现,如果你原本有代码这里应该有这个东西)对上述字符串加密,密钥为UC_KEY,加密完了用urlencode编码
5. 将加密以后的东西嵌入这串参数里面 m=module&a=action&inajax=2&release=UC_CLIENT_RELEASE&input=上一步的内容&appid=UC_APPID
6. 上述参数即为最终POST到接口的东西,记得Content-Type: application/x-www-form-urlencoded。因为已经encode过了所以直接发就行了。

你对照着这套逻辑看看你已有的原版代码,看懂以后把缺少的部分补上应该就能用了。
回复 1

使用道具 举报

5

主题

17

回帖

24

积分

初学乍练

贡献
0 点
金币
1 个
 楼主| 发表于 2023-3-27 09:54:39 | 查看全部
专家 发表于 2023-3-27 00:40
如果你手头已经有能用的老代码那就好办了,否则光是接口参数的加密就够你头疼一阵子的。
这接口大概是这么 ...

感谢专家这么快速的回复,我试一下。如果可以的话,我会给您的回复「设置为最佳答案」。如果还有问题,我会在这里描述清楚,再次表示感谢。
回复

使用道具 举报

5

主题

17

回帖

24

积分

初学乍练

贡献
0 点
金币
1 个
 楼主| 发表于 2023-3-27 10:16:11 | 查看全部
秋天的诉说 发表于 2023-3-27 09:54
感谢专家这么快速的回复,我试一下。如果可以的话,我会给您的回复「设置为最佳答案」。如果还有问题,我 ...

「如果可以」的意思是「如果按照您的方法最后调通(可以)」。我本来想点「设置为最佳答案」的,点了以后弹窗提示我,需要验证成功以后再点。
回复

使用道具 举报

5

主题

17

回帖

24

积分

初学乍练

贡献
0 点
金币
1 个
 楼主| 发表于 2023-3-29 14:41:47 | 查看全部
只需要按照「专家」说的第 2 点就可以了。
回复

使用道具 举报

0

主题

6

回帖

14

积分

初学乍练

贡献
0 点
金币
7 个
发表于 2023-6-23 09:18:02 | 查看全部
专家 发表于 2023-3-27 00:40
如果你手头已经有能用的老代码那就好办了,否则光是接口参数的加密就够你头疼一阵子的。
这接口大概是这么 ...

请问加密参数应该怎么操作?已经让我头疼一整子了
回复

使用道具 举报

12

主题

1655

回帖

2814

积分

Giter

贡献
151 点
金币
362 个
发表于 2023-6-23 22:08:17 | 查看全部
D布丁233 发表于 2023-6-23 09:18
请问加密参数应该怎么操作?已经让我头疼一整子了

如果你用的是php,那么直接在Discuz里寻找authcode这个函数使用即可。
但如果你用的是别的语言,那么你必须用对应的语言重新实现一遍这个函数。
当然了,由于Discuz的运用非常广泛,这个重新实现的事情有较大概率有人曾经做过,如果你能找到,那就不用自己做了。
回复

使用道具 举报

0

主题

1

回帖

6

积分

初学乍练

贡献
0 点
金币
5 个
发表于 2023-6-27 10:54:12 | 查看全部
秋天的诉说 发表于 2023-3-29 14:41
只需要按照「专家」说的第 2 点就可以了。

您好,请问一下是如何解决的?我在3.5版本也遇到同样的问题。期待您的回答,谢谢
回复

使用道具 举报

0

主题

5

回帖

10

积分

初学乍练

贡献
0 点
金币
5 个
发表于 2025-5-12 15:52:53 | 查看全部
  1. public String ucApiPost(String module, String action, Map<String, Object> arg) {
  2.         StringBuffer s = new StringBuffer();
  3.         String sep = "";
  4.         //foreach(arg as k => v) {
  5.         for (String k : arg.keySet()) {
  6.             //k = (k);
  7.             Object v = arg.get(k);
  8.             k = urlencode(k);

  9.             if (v.getClass().isAssignableFrom(Map.class)) {
  10.                 String s2 = "";
  11.                 String sep2 = "";
  12.                 //foreach(v as k2 => v2) {
  13.                 for (String k2 : ((Map<String, Object>) v).keySet()) {
  14.                     Object v2 = ((Map<String, Object>) v).get(k2);
  15.                     k2 = urlencode(k2);
  16.                     s2 += sep2 + "{" + k + "}[" + k2 + "]=" + urlencode(ucStripslashes(String.valueOf(v2)));
  17.                     sep2 = "&";
  18.                 }
  19.                 s.append(sep).append(s2);
  20.             } else {
  21.                 s.append(sep).append(k).append("=").append(urlencode(ucStripslashes(String.valueOf(v))));
  22.             }
  23.             sep = "&";
  24.         }
  25.         String postdata = ucApiRequestdata(module, action, s.toString(), "");
  26.         return ucFopen2(UC_API + "/index.php", 500000, postdata, "", true, UC_IP, 20, true);
  27. //        return ucFopen2(UC_API, 500000, postdata, "", true, UC_IP, 20, true);
  28.     }


  29.     /**
  30.      * 构造发送给用户中心的请求数据
  31.      *
  32.      * @param module 请求的模块
  33.      * @param action 请求的动作
  34.      * @param arg    参数(会加密的方式传送)
  35.      * @param extra  附加参数(传送时不加密)
  36.      * @return string
  37.      */
  38.     protected String ucApiRequestdata(String module, String action, String arg, String extra) {
  39.         String input = ucApiInput(arg, module, action);
  40.         String post = "m=" + module + "&a=" + action + "&inajax=2&release=" + UC_CLIENT_RELEASE + "&input=" + input + "&appid=" + UC_APPID + extra;
  41.         return post;
  42.     }

  43.     protected String ucApiUrl(String module, String action, String arg, String extra) {
  44.         String url = UC_API + "/index.php?" + ucApiRequestdata(module, action, arg, extra);
  45.         return url;
  46.     }

  47.     public String ucApiInput(String data, String module, String action) {
  48.         data = data + "&m="+ module + "&a=" + action + "&appid=" + UC_APPID;
  49.         //String s = data;
  50.         //String s = urlencode(uc_authcode(data+"&agent="+md5(_SERVER["HTTP_USER_AGENT"])+"&time="+time(), "ENCODE", UC_KEY));
  51.         String s = urlencode(ucAuthcode(data + "&agent=" + md5(HTTP_USER_AGENT) + "&time=" + time(), "ENCODE", UC_KEY));
  52.         //String s = urlencode(ucAuthcode(data + "&agent=" + md5("") + "&time=" + time(), "ENCODE", UC_KEY));
  53.         return s;
  54.     }
复制代码

我的版本是3.5的discuz,ucenter2.0,也不报这个错,client代码中,也都按照“专家”的步骤实现了。搞不懂哪里的问题了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 关注公众号
  • 有偿服务微信
  • 有偿服务QQ

手机版|小黑屋|Discuz! 官方交流社区 ( 皖ICP备16010102号 |皖公网安备34010302002376号 )|网站地图|star

GMT+8, 2025-8-4 23:37 , Processed in 0.092999 second(s), 29 queries .

Powered by Discuz! W1.0 Licensed

Copyright © 2001-2025 Discuz! Team.

关灯 在本版发帖
有偿服务QQ
有偿服务微信
返回顶部
快速回复 返回顶部 返回列表