返回介绍

通过 App 调用授权(QQ 小程序)

发布于 2023-04-06 17:51:15 字数 5309 浏览 0 评论 0 收藏 0

通过 App 调用授权(QQ 小程序)

第三方 App 可接入 QQ 互联 SDK,实现跳转腾讯文档 QQ 小程序,调用腾讯文档开放平台授权能力,获得用于换取 access_token 的授权码。

目前拉起腾讯文档 QQ 小程序授权为试运行能力,如接入中遇到问题,可向我们反馈 (opens new window)

请先参考 QQ 互联平台移动应用接入指南(下载 (opens new window)/iOS (opens new window)/Android (opens new window)),接入 QQ 互联 SDK,并根据应用在 QQ 互联平台上注册的信息,完成 SDK 的初始化操作;iOS 应用还需要按照说明文档 (opens new window)要求,配置好应用的 Universal Link。

跳转腾讯文档 QQ 小程序开放平台授权的 path 为 URL 编码格式,其中路径名为 packages/miniapp-open/open-auth/open-auth,并需拼接 4 个(iOS)/5 个(Android)参数,具体参数的规则如下:

  • client_id:在腾讯文档开放平台申请的 Client ID;
  • state:值可以为空,如果应用需要在授权时传入一些状态信息,以便于授权完成后,继续执行特定的业务逻辑,可以自拟 state 的值,授权完成后会将该 state 值原样返回给应用;
  • package_name:接入应用的包名(Android)/ Bundle ID(iOS),这是为了在授权完成后,能正常回跳到应用;
  • connect_id:应用在 QQ 互联申请的 APPID;
  • intent_uri:仅 Android 需要填写,自拟一个 URI,作为接收回调的 Intent。

请注意所有的参数值都需要先做一次 URL Encode,然后拼接到授权页路径上。第一个参数名前面使用 ? 号,其余的参数名前面使用 & 号。

代码示例(Android)(参考 QQ 互联文档 (opens new window)):

String appId = "填写应用在 QQ 互联平台的 APPID";
String clientId = "填写您在腾讯文档开放平台的 ClientID";
String state = "填写您自定义的状态参数,可留空";
String packageName = "填写应用的包名";
String intentUri = "填写回调 Activity 监听的 Intent";

String path = "packages/miniapp-open/open-auth/open-auth?client_id=" + URLEncoder.encode(clientId)
    + "&state=" + URLEncoder.encode(state)
    + "&package_name=" + URLEncoder.encode(packageName)
    + "&connect_id=" + URLEncoder.encode(appId)
    + "&intent_uri=" + URLEncoder.encode(intentUri);

mTencent.startMiniApp("1108338344", path, "release");

// 在能收到上述 Intent 的 Activity 中获取授权完成的 code 和 state
public void onCreate(Bundle savedInstanceState) {
    // ...
    String extraData = getIntent().getData().getQueryParameter("param");
    JSONObject respObj = new JSONObject(extraData);
    String code = respObj.getString("code");
    String state = respObj.getString("state");
}

代码示例(iOS)(参考 QQ 互联文档 (opens new window)):

NSString *appId = @"填写应用在 QQ 互联平台的 APPID";
NSString *clientId = @"填写您在腾讯文档开放平台的 ClientID";
NSString *state = @"填写您自定义的状态参数,可留空";
NSString *bundleId = @"填写应用的 Bundle ID";
NSString *escapedClientId = [clientId stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]];
NSString *escapedState = [state stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]];

QQApiLaunchMiniProgramObject* launchMiniApp = [QQApiLaunchMiniProgramObject new];
launchMiniApp.miniAppID = @"1108338344";
launchMiniApp.miniPath = [NSString stringWithFormat:@"packages/miniapp-open/open-auth/open-auth?client_id=%@&state=%@&package_name=%@&connect_id=%@", escapedClientId, escapedState, bundleId, appId];
launchMiniApp.miniprogramType = 3;
SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:launchMiniApp];
QQApiSendResultCode ret = [QQApiInterface sendReq:req];

// 在 UIApplicationDelegate 的 openURL 生命周期中获取授权完成的 code 和 state
- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
    if ([url.host isEqualToString:@"maLaunchApp"]) {
        NSURLComponents *components = [[NSURLComponents alloc] initWithString:url.absoluteString];
        [components.queryItems enumerateObjectsUsingBlock:^(NSURLQueryItem * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            if ([obj.name isEqualToString:@"appParameter"]) {
                NSString *extraData = obj.value;
                NSError *jsonError;
                NSDictionary *respObj = [NSJSONSerialization JSONObjectWithData:[extraData dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:&jsonError];
                NSString *code = [respObj valueForKey:@"code"];
                NSString *state = [respObj valueForKey:@"state"];
            }
        }];
    }
    return YES;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文