likes
comments
collection
share

微信小程序wx.onAppShow的一个使用场景(微信小程序实名认证)

作者站长头像
站长
· 阅读数 25
本篇文章适用于新手阅读,写的不好的地方希望大家多多指正补充。

最近一直在写微信小程序,前不久对接了一个跳转微信实名认证小程序的需求,这里需要用到微信支付文档中的实名认证的这个API:

文档链接:实名验证(小程序)

一、跳转目标小程序

第一步当然是跳至目标小程序,这里跳转的是微信实名认证,官方文档:打开另一个小程序

wx.navigateToMiniProgram({
  appId: 'wx88736d7d39e2eda6', // 要打开的小程序 appId
  path: 'pages/oauth/authindex', // 打开的页面路径,如果为空则打开首页。
  extraData: extraData, // 需要传递给目标小程序的数据
  envVersion: 'release', // 要打开的小程序版本。仅在当前小程序为开发版或体验版时此参数有效。如果当前小程序是正式版,则打开的小程序必定是正式版。
  success(res) {},
  fail(res) {}
})

extraData:

变量名类型必填示例值描述

api_version

string

1.0

API接口版本号 ,取固定值 “1.0”

mch_id

string(32)

1230000109

微信支付分配的商户号

appid

string(32)

wx88736d7d39e2eda6

发起授权小程序的appid

response_type

string(32)

code

值只能为“code”

scope

string

pay_identity

应用授权作用域,

pay_identity 是 实名验证 - 校验姓名和身份证是否匹配

openid

string(128)

oUpF8uMuAJO_M2pxb1Q9zNjWeS6o

此参数为微信用户在商户对应appid下的唯一标识

sign

String(128)

029B52F67573D7E3BE74904BF9AEA2F48656AEBCBB93FA48D9B70F98D2E23D09

通过签名算法计算得出的签名值,详见签名生成算法

nonce_str

String(32)

ibuaiVcKdpRxkhJA

随机字符串,长度要求在32位以内。推荐随机数生成算法

sign_type

String(128)

HMAC-SHA256

签名类型,仅支持HMAC-SHA256

{  "api_version": "1.0",  "mch_id": "1230000109",  "appid": "wx88736d7d39e2eda6",  "scope": "pay_identity",  "response_type": "code",  "openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o",  "sign_type": "HMAC-SHA256",  "sign": "DBB47C037C812B29E0E7B4C5F62972B92E61CF05DE14FA958D9054B2",  "nonce_str": "190703203728315382",}

二、小程序接收参数

当从目标小程序返回到小程序时会触发小程序的切前台事件,所以需要拿到目标小程序返回的值时,则需要在wx.onAppShow这个API中的回调参数中取。

文档链接:监听小程序切前台事件

正确时返回的JSON数据包如下:

成功时返回(auth_code用于换取访问令牌,有效期600秒)

{
  "auth_code" : "EYJV9lz4yHrepHG5ye8Cp0bMORiob11lGgDUGFi26vEX-sirjL5652SFxs9WP-zD6TcrbSArk_laGU6A08pgfHxX_tZWdPiP-Cu2a68d-3Q="
}

失败时返回

{
  "err_code" : "SYSTEMERROR",
  "err_code" : "系统错误"
}

比如写在onLoad中:

wx.onAppShow((res) => {
  let auth_code = res.referrerInfo.extraData.auth_code;
});

这样写理论上是没问题的,但是有一点需要注意

部分版本在无referrerInfo的时候会返回 undefined,建议使用 options.referrerInfo && options.referrerInfo.appId 进行判断。

所以修改之后是这样的

wx.onAppShow((res) => {
  if (res.referrerInfo && res.referrerInfo.extraData && res.referrerInfo.extraData.auth_code) {
    let auth_code = res.referrerInfo.extraData.auth_code;
  }
});

一般场景到这里已经OK了,但是我在开发过程中遇到了一个小插曲,在返回我们自己的小程序时onAppShow会执行两次,导致其中一次的代码执行异常,需要解决。

首先定义一个全局变量appShow来保存场景值,在onLoad以及跳转到实名认证小程序的方法中将该值初始化。然后当触发了onAppShow事件时,将appShow置为true,则在第二次触发onAppShow也不会执行之后的代码了。

let appShow = false; // 定义一个全局变量,页面初始化时
...
wx.navigateToMiniProgram({
  appId: 'wx88736d7d39e2eda6', // 要打开的小程序 appId
  path: 'pages/oauth/authindex', // 打开的页面路径,如果为空则打开首页。
  extraData: extraData, // 需要传递给目标小程序的数据
  envVersion: 'release', // 要打开的小程序版本。仅在当前小程序为开发版或体验版时此参数有效。如果当前小程序是正式版,则打开的小程序必定是正式版。
  success(res) {
    appShow = false; // 将页面值置为false
  },
  fail(res) {}
})
...
// onLoad函数中
// 小程序切前台场景
appShow = false;
// 将页面值置为false
wx.onAppShow((res) => {
  if (!appShow) {
    appShow = !appShow;
    if (res.referrerInfo && res.referrerInfo.extraData && res.referrerInfo.extraData.auth_code) {
      // other methods
    }
  }
})

文章写得杂乱无章,还望读者海涵,多多批评指正。

转载自:https://juejin.cn/post/6883370905460965390
评论
请登录