Android 腾讯AI 鉴权+闲聊功能实现

 

闲聊接口文档 : https://ai.qq.com/doc/nlpchat.shtml

 

鉴权接口文档 : https://ai.qq.com/doc/auth.shtml

 

步骤 : 

  1. 通过闲聊接口参数鉴权获取签名(sign)

  2. 调用闲聊接口

 

鉴权 : 

 

Android 腾讯AI 鉴权+闲聊功能实现

 

....具体看官方文档

 

现在埋坑

1. 将<key, value>请求参数对按key进行字典升序排序,得到有序的参数对列表N

先组合参数,然后按照字典顺序排序key

Map<String, Object> params = new HashMap<>();
                    int APP_ID = 2111114017;
                    params.put("app_id", APP_ID);
                    params.put("time_stamp", currTime);
                    params.put("nonce_str", randomStr);
                    params.put("session", randomSession);
                    params.put("question", ques);
Map<String, Object> resultMap = sortMapByKey(params);





    /**
     * 使用 Map按key进行排序
     *
     * @param map x
     * @return x
     */
    public Map<String, Object> sortMapByKey(Map<String, Object> map) {
        if (map == null || map.isEmpty()) {
            return null;
        }

        Map<String, Object> sortMap = new TreeMap<>(
                new MapKeyComparator());

        sortMap.putAll(map);

        return sortMap;
    }

 

2和3其实是一个操作,就是拼接URL

 

2. 列表N中的参数对按URL键值对的格式拼接成字符串,得到字符串T(如:key1=value1&key2=value2),

3. 将应用**以app_key为键名,组成URL键值拼接到字符串T末尾,得到字符串S(如:key1=value1&key2=value2&app_key=**)

Set<String> keySet = resultMap.keySet();
                    StringBuilder sb = new StringBuilder();
                    for (String key : keySet) {
                        Object value = resultMap.get(key);
                        sb.append("&").append(key).append("=").append(URLEncoder.encode(value + "", "UTF-8"));
                    }
                    sb.deleteCharAt(0);
                    String APP_KEY = "A2m9UfqFv30JnM2W";
                    sb.append("&app_key=").append(APP_KEY);
                    LogUtils.iTag("RedWolf md5运算之前", sb);

4. MD5运算

String md5Sign = EncryptUtils.encryptMD5ToString(sb.toString());

 

最后拿所有的参数做一个HTTPS请求就罢了


 

OkGo.<String>get(URL)
                            .tag(this)
                            .params("app_id", APP_ID)
                            .params("nonce_str", randomStr)
                            .params("question", ques)
                            .params("session", randomSession)
                            .params("time_stamp", currTime)
                            .params("sign", md5Sign)
                            .execute(new StringCallback() {
                                @Override
                                public void onSuccess(final Response<String> response) {
                                    LogUtils.iTag("RedWolfR", response.body());
                                    runOnUiThread(new Runnable() {
                                        @Override
                                        public void run() {
                                            FUCK fuck = new Gson().fromJson(response.body(), FUCK.class);
                                            mTv.append("ans : " + fuck.getData().getAnswer());
                                            mTv.append("session : " + fuck.getData().getSession() + "\n");
                                        }
                                    });

                                }

                                @Override
                                public void onError(Response<String> response) {
                                    super.onError(response);
                                    LogUtils.iTag("RedWolfR", response.body());
                                }
                            });
                            
                } catch (Exception e) {
                    e.printStackTrace();

                }
            }
        }).start();

Android 腾讯AI 鉴权+闲聊功能实现

 

 

源代码地址 : https://github.com/RedWolfChao/QQAIDemo