一、 功能需求说明

  1. APP启动小程序,同时将参数传入小程序中。
  2. 小程序启动APP,同时将参数传入到APP中。

二、 功能可行性调研结果

  1. APP和小程序在满足以下条件时可在APP中启动小程序,并能将参数传入小程序

    1) APP在“微信开放平台”进行了注册,且审核通过,拥有自己的APPID。
    2) 必须在“微信开放平台”中将“微信小程序”和APP绑定。
    3) 微信小程序必须是“体验版”或者“正式版”,拥有原始ID。
    4) 如果微信小程序是“体验版”,则必须在“微信公众平台”将手机微信用户绑定成该小程序的“体验用户”。

  2. 小程序不能直接启动APP,而只能在满足以上1的所有条件的情况下并同时满足以下条件之一时具有返回APP的能力,并能将参数传入APP

    1) 小程序是被APP启动的(场景值1069)。
    2) 小程序时被APP分享到微信之后,在分享卡片中打开的(场景值1069)。
    3) 小程序时被1)、2)两种情况打开的情况下,又从其他小程序返回该小程序(场景值1038)(微信基础库2.2.4及以上版本支持)。
    4) 小程序时被1)2)两种情况打开的情况下,又从聊天顶部场景中的【最近使用】中打开(场景值1038)。
    5) 小程序时被1)2)两种情况打开的情况下,又从长按小程序右上角菜单唤出最近使用历史中打开(场景值1038)。

    注:1.以上条件2)、3)、4)、5)都需要APP具有“分享小程序”功能的情况下才能完整认证,而APP具有“分享小程序”功能需要在“微信开放平台”中使用“企业开发账号”进行“开发者资质认证”。

三、 方案实施(Android)

  1. 准备工作

    1) APP和小程序按照要求在“微信开放平台”和“微信公众平台”完成相应的注册和认证。
    2) Android开发工具“AndroidStudio”,小程序开发工具“微信开发者工具”(微信公众平台下载)。

  2. APP端代码实施

    1) 配置微信SDK,添加以下依赖:(版本号可根据实际情况变化)
    implementation ‘com.tencent.mm.opensdk:wechat-sdk-android-with-mta:5.1.6’

    2) 在清单配置文件中添加网络权限

    3) 初始化微信接口实例:(以下代码见附件中的工具类ShareUtil.java)
    initWechatShare(mAppContext, WX_APPLY_ID);

      参数说明:
          1>mAppContext:传入Application对象.
          2>WX_APPLY_ID:传入在APP在“微信开放平台”申请的APPID。

    4) APP启动小程序并传入参数

    拼接路径和参数:

      String path = "/pages/index/index?usrName=" + usrName +"&zabCount=" + zabCount + "&mxqCount=" + mxqCount;
    
      参数说明:
          1>usrName、zabCount、mxqCount:传入小程序的三个参数。(参数的数目不限,与APP端约定好即可)
          2>传入小程序的参数只能用以上的格式拼接到path变量中。

    启动小程序(以下代码见附件中的工具类ShareUtil.java):
    pullMiniPro(GlobalConstant.Wechat_SP_OR_ID, path, WXLaunchMiniProgram.Req.MINIPROGRAM_TYPE_PREVIEW);

      参数说明:
          1>GlobalConstant.Wechat_SP_OR_ID:传入小程序在“微信公众平台”申请的原始ID。
          2>path:启动小程序的路径及参数字符串
          3>WXLaunchMiniProgram.Req.MINIPROGRAM_TYPE_PREVIEW:小程序的版本,此处是“体验版本”,还可以选择“正式版本”:“WXLaunchMiniProgram.Req.MINIPTOGRAM_TYPE_RELEASE”。

    5) APP接收小程序传入的参数

      1>在项目中创建WXEntryActivity类,并在清单配置文件中进行以下配置: 
          android:exported="true"
          android:launchMode="singleTask"
    
          参数说明:
          launchMode还可以去“singleTop”值。
    
      2>WXEntryActivity类继承IWXAPIEventHandler接口,实现其“public void onResp(BaseResp baseResp)”方法,对baseResp进行解析即可得到小程序传入的参数。(具体解析过程按照APP和小程序约定好的数据格式即可)
    
      3>注册微信回调接口:(以下代码见附件中的工具类ShareUtil.java)
          getIwxapi(getApplicationContext(), GlobalConstant.WX_APPLY_ID) .handleIntent(getIntent(), this);
    
          参数说明:
    
              a.getApplicationContext():获取当前项目的Application对象。
              b.GlobalConstant.WX_APPLY_ID:传入在APP在“微信开放平台”申请的APPID。
              c.this:WXEntryActivity的实例对象。
  3. 小程序端代码实施

    1) 小程序接收APP传入的参数

      1>app.js文件中
      App({
        appData: '',
    
        onShow(options) {
          this.appData = options
          console.log('App Show',  options)
        },
      }
    
      参数说明:
    
          a.options:小程序接收到的外部参数对象,其中包含有APP传入的参数字段。
          b.appData:全部变量,用来保存options对象,供其它页面使用。
    
      2>展示数据的页面对应的.js文件中处理数据
      onShow: function () {
      var usrName = app.appData.query.usrName
      var zabCount = app.appData.query.zabCount
      var mxqCount = app.appData.query.mxqCount
      }
    
      参数说明:
    
          usrName、zabCount、mxqCount即APP传入的三个参数。(参数的数目不限,与APP端约定好即可)

    2) 小程序返回APP并传入参数

    注:2. 小程序不能自动返回APP,需要用户手动触发返回动作。

      1>触发返回APP动作的页面对应的.wxml中
      <button open-type="launchApp" 
           app-parameter="{'key1': {{fd_input1}},'key2':{{fd_input2}}}" 
           binderror="launchAppError">
              打开APP
      </button>
    
      参数说明:
    
          a.必须有这样一个button用于触发“返回APP”的操作。
          b.必须声明“open-type="launchApp"”。
          c.app-parameter用于存放传递给APP的参数,此处实例中与APP约定的是JSON字符串,包含有“'key1'”和“'key2'”两个参数。(参数也不限于两个,与APP端约定好即可)
          d.fd_input1和fd_input2是该页面的两个字符输入控件,也可以使用其他控件来进行参数输入。
          e.binderror="launchAppError"声明“返回APP错误时的处理”。