小程序之开放能力

260 阅读9分钟

用户信息

1. 小程序登陆

小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系
登录流程时序:

第一步:调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器

wx.login():调用接口获取登录凭证(code)。通过凭证进而换取用户登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥(session_key)等。用户数据的加解密通讯需要依赖会话密钥完成

wx.login({
  success (res) {
    if (res.code) {
      //发起网络请求
      wx.request({
        url: 'https://test.com/onLogin',
        data: {
          code: res.code
        }
      })
    } else {
      console.log('登录失败!' + res.errMsg)
    }
  }
})

第二步:调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 和 会话密钥 session_key

会话密钥 session_key 是对用户数据进行 加密签名 的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥

临时登录凭证 code 只能使用一次

2. UnionID 机制说明

如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的 UnionID 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的

2.1 UnionID获取途径

绑定了开发者帐号的小程序,可以通过以下途径获取 UnionID

    1. 调用接口 wx.getUserInfo,从解密数据中获取 UnionID
    1. 如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号。开发者可以直接通过 wx.login + code2Session 获取到该用户 UnionID,无须用户再次授权
    1. 如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用。开发者也可以直接通过 wx.login + code2Session 获取到该用户 UnionID ,无须用户再次授权
    1. 用户在小程序(暂不支持小游戏)中支付完成后,开发者可以直接通过getPaidUnionId接口获取该用户的 UnionID,无需用户授权
    1. 小程序端调用云函数时,如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号,可在云函数中通过 cloud.getWXContext 获取 UnionID
    1. 小程序端调用云函数时,如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用,也可在云函数中通过 cloud.getWXContext 获取 UnionID

2.2 微信开放平台绑定小程序流程

登录微信开放平台 — 管理中心 — 小程序 — 绑定小程序

3. 授权

部分接口需要经过用户授权同意才能调用。我们把这些接口按使用范围分成多个 scope ,用户选择对 scope 来进行授权,当授权给一个 scope 之后,其对应的所有接口都可以直接使用

此类接口调用时:

  • 如果用户未接受或拒绝过此权限,会弹窗询问用户,用户点击同意后方可调用接口;
  • 如果用户已授权,可以直接调用接口;
  • 如果用户已拒绝授权,则不会出现弹窗,而是直接进入接口 fail 回调。请开发者兼容用户拒绝授权的场景

3.1 获取用户授权设置

开发者可以使用 wx.getSetting 获取用户当前的授权状态

wx.getSetting:获取用户的当前设置。返回值中只会出现小程序已经向用户请求过的权限

wx.getSetting({
  success (res) {
    console.log(res.authSetting)
    // res.authSetting = {
    //   "scope.userInfo": true,
    //   "scope.userLocation": true
    // }
  }
})

3.2 打开设置界面

用户可以在小程序设置界面(「右上角」 - 「关于」 - 「右上角」 - 「设置」)中控制对该小程序的授权状态

开发者可以调用 wx.openSetting 打开设置界面,引导用户开启授权

3.3 提前发起授权请求

开发者可以使用 wx.authorize 在调用需授权 API 之前,提前向用户发起授权请求

3.4 scope 列表

3.5 授权有效期

一旦用户明确同意或拒绝过授权,其授权关系会记录在后台,直到用户主动删除小程序

3.6 最佳实践

在真正需要使用授权接口时,才向用户发起授权申请,并在授权申请中说明清楚要使用该功能的理由

wx.authorize({scope: "scope.userInfo"}),不会弹出授权窗口,请使用 <button open-type="getUserInfo"/>

要授权 scope.userLocation、scope.userLocationBackground 时必须配置地理位置用途说明

3.7 后台定位

与其它类型授权不同的是,scope.userLocationBackground 不会弹窗提醒用户。需要用户在设置页中,主动将“位置信息”选项设置为“使用小程序期间和离开小程序后”。开发者可以通过调用wx.openSetting,打开设置页

4. 开放数据校验与解密

参考这里吧

5. 获取手机号

获取微信用户绑定的手机号,需先调用wx.login接口
因为需要用户主动触发才能发起获取手机号接口,所以该功能不由 API 来调用,需用 button 组件的点击来触发

注意:目前该接口针对非个人开发者,且完成了认证的小程序开放(不包含海外主体)。需谨慎使用,若用户举报较多或被发现在不必要场景下使用,微信有权永久回收该小程序的该接口权限

5.1 使用方法

需要将 button 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,可以通过 bindgetphonenumber 事件回调获取到微信服务器返回的加密数据, 然后在第三方服务端结合 session_key 以及 app_id 进行解密获取手机号

在回调中调用 wx.login 登录,可能会刷新登录态。此时服务器使用 code 换取的 sessionKey 不是加密时使用的 sessionKey,导致解密失败。建议开发者提前进行 login;或者在回调中先使用 checkSession 进行登录态检查,避免 login 刷新登录态

<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>


Page({
  getPhoneNumber (e) {
    console.log(e.detail.errMsg)
    console.log(e.detail.iv)
    console.log(e.detail.encryptedData)
  }
})

6. 生物认证

参考这里吧

转发

1. 转发

1.1 获取更多转发信息

通常开发者希望转发出去的小程序被二次打开的时候能够获取到一些信息,例如群的标识

在通过调用 [wx.showShareMenu](https://developers.weixin.qq.com/miniprogram/dev/api/share/wx.showShareMenu.html) 并且设置 ```withShareTicket``` 为 ```true``` ,当用户将小程序转发到任一群聊之后,此转发卡片在群聊中被其他用户打开时,可以在 ```App.onLaunch``` 或 ```App.onShow ``` 获取到一个 ```shareTicket``` 。通过调用 [wx.getShareInfo](https://developers.weixin.qq.com/miniprogram/dev/api/share/wx.getShareInfo.html) 接口传入此 ```shareTicket``` 可以获取到转发的详细信息

wx.showShareMenu: 显示当前页面的转发按钮
wx.showShareMenu({
  withShareTicket: true
})

1.2 页面内发起转发

通过给 button 组件设置属性 open-type="share" ,可以在用户点击按钮后触发 Page.onShareAppMessage 事件

1.3 使用指引

转发按钮,旨在帮助用户更流畅地与好友分享内容和服务
转发,应是用户自发的行为,且在需要时触手可及
开发者在使用时若遵从以下指引,会得到更佳的用户体验

1.4 注意事项

  • 不自定义转发图片的情况下,默认会取当前页面,从顶部开始,高度为 80% 屏幕宽度的图像作为转发图片。
  • 转发的调试支持请查看 普通转发的调试支持 和 带 shareTicket 的转发
  • 只有转发到群聊中打开才可以获取到 shareTickets 返回值,单聊没有 shareTickets
  • shareTicket 仅在当前小程序生命周期内有效
  • 由于策略变动,小程序群相关能力进行调整,开发者可先使用 wx.getShareInfo 接口中的群 ID 进行功能开发

2. 动态信息

2.1 介绍

从基础库 2.4.0 开始,支持转发动态消息。动态消息对比普通消息,有以下特点:

  • 消息发出去之后,开发者可以通过后台接口修改部分消息内容。
  • 消息有对应的提醒按钮,用户点击提醒按钮可以订阅提醒,开发者可以通过后台修改消息状态并推送一次提醒消息给订阅了提醒的用户

2.2 消息属性

动态消息有状态、文字内容、文字颜色

2.3 状态

消息有两个状态,分别有其对应的文字内容和颜色。其中状态 0 可以转移到状态 0 和 1,状态 1 无法再转移

2.4 状态参数

2.5 使用方法

第一步:创建 activity_id

每条动态消息可以理解为一个活动,活动发起前需要通过 updatableMessage.createActivityId 接口创建 activity_id。后续转发动态消息以及更新动态消息都需要传入这个 activity_id

活动的默认有效期是 24 小时。活动结束后,消息内容会变成统一的样式:

  • 文字内容:“已结束”
  • 文字颜色:#00ff00

第二步:在转发之前声明消息类型为动态消息

通过调用 wx.updateShareMenu 接口,传入 isUpdatableMessage: true,以及 templateInfo、activityId 参数。其中 activityId 从步骤一中获得

wx.updateShareMenu({
  withShareTicket: true,
  isUpdatableMessage: true,
  activityId: '', // 活动 ID
  templateInfo: {
    parameterList: [{
      name: 'member_count',
      value: '1'
    }, {
      name: 'room_limit',
      value: '3'
    }]
  }
})

第三步:修改动态消息内容

动态消息发出去之后,可以通过 updatableMessage.setUpdatableMsg 修改消息内容

2.6 低版本兼容

对于不支持动态消息的客户端版本,收到动态消息后会展示成普通消息

获取小程序码

通过后台接口可以获取小程序任意页面的小程序码,扫描该小程序码可以直接进入小程序对应的页面,所有生成的小程序码永久有效,可放心使用。

我们推荐生成并使用小程序码,它具有更好的辨识度,且拥有展示“公众号关注组件”等高级能力。 生成的小程序码如下所示

1. 为满足不同需求和场景,这里提供了两个接口,开发者可挑选适合自己的接口

接口A:适用于需要的码数量较少的业务场景

生成小程序码,可接受 path 参数较长,生成个数受限

接口B:适用于需要的码数量极多的业务场景

生成小程序码,可接受页面参数较短,生成个数不受限

接口C:适用于需要的码数量较少的业务场景

生成二维码(不推荐使用),可接受 path 参数较长,生成个数受限