微信 H5 页面唤起 APP(uniapp)

最近使用uniapp开发app,其中有一个功能是从app分享内容到微信,再从微信唤起app,跳转到指定页面。第一次接触这个功能,看了很多文章和官网的说明,终于搞懂了,特此来总结一下。

首先需要在微信公众平台申请一个服务号必须是服务号,接下来在公众号管理平台需要配置JS安全接口域名和的IP白名单。并且将MP_verify_f4VWFoFpHgzmqFbo.txt文件下载并放到项目的根目录下(域名的根目录下)

请添加图片描述

请添加图片描述

接下来需要在微信开放平台上申请移动应用,所有的资料填写完成之后,将你申请的服务号绑定到本开放平台,在绑定完成公众号之后,需要在微信开放平台 - 管理中心 - 公众号详情 - 接口信息 - 关联设置将移动应用的APPID与之前配置的JS安全域名进行绑定。

在这里插入图片描述
关于JS接口安全域名进行说明,具体配置请参考微信H5拉起APP相关要求,开放平台关联设置里的JS安全域名要与公众平台的域名保持一致。

在这里插入图片描述

都设置完,我们就可以开始在页面写代码了,微信打开的 h5 想要跳转 app 时,需要接入微信JS-SDK

方式一:sdk–http://res2.wx.qq.com/open/js/jweixin-1.6.0.js
方式二:npm install weixin-js-sdk --save

我使用的是方式npm install weixin-js-sdk --save,在页面进行引入import wx from 'weixin-js-sdk'
跳转页面还需要使用到微信提供的开放标签 wx-open-launch-app,请参考微信唤起APP相关标签

注意:
Android平台通过开放标签跳转App,App必须接入微信OpenSDK(uniapp这些sdk都是内置好的 不用配置)
在 ios 中,只要你接入了 Universal Link,那么在微信环境下你是可以直接唤起 app, 而不需要接入微信sdk触发这个弹框,如果你想和 android 保持一致的用户体验和代码逻辑,那就需要接入sdk
补充说明:
1、必须真机才能渲染该标签(开发时可以使用微信开发者工具的公众号网页项目模式调试);
2、文字链无法拉起该标签

唤起App还需要获取签名,获取签名可以后台来生成,具体如何生成参考JS-SDK使用权限签名算法,timestamp,nonceStr,signature都是从后台来获取的。这些都准备完成就可以开始写代码了

附相关代码如下:

<template>
  <div id="shareWrap">
    <div>你的展示内容...</div>
    <div>
      <wx-open-launch-app 
        id="launch-btn" 
        appid="移动应用Id"
        :extinfo="向App传递的参数"
        @error="onListenLaunchError"
        >
        <component :is="'script'" type="text/wxtag-template">
          <button
            style="
            padding: 10px 55px;
            font-size: 14px;
            color: #fff;
            font-family: 'Sora';
            background-color: #7c7957;
            border: none;
            border-radius: 4px;"
          >App 内打开</button>
        </component>
      </wx-open-launch-app>
    </div>
  </div>
</template>
<script setup>
import wx from 'weixin-js-sdk';
import axios from 'axios'; 

onMounted(() => {
  initwxlaunch()
})

// 没有app 跳转至应用商店
function onListenLaunchError() {
  window.location.replace('应用商店地址');
}

async function initwxlaunch() {
 axios({
   method: 'get',
   url: `https://dev.test.net/api/v1/wx/getSDKConfig?url=${encodeURIComponent(location.href.split('#')[0])}`
 }).then((res) => {
    wx.config({
      debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
      appId: res.data.appId,  // 必填,公众号的唯一标识
      timestamp: res.data.data.timestamp, // 必填,生成签名的时间戳
      nonceStr: res.data.data.nonceStr, // 必填,生成签名的随机串
      signature: res.data.data.signature, // 必填,签名,// 必填,签名
      jsApiList: ['wx-open-launch-app'], // 必填,需要使用的JS接口列表
      openTagList: ['wx-open-launch-app']// 可选,需要使用的开放标签列表
    });

    wx.checkJsApi({
      jsApiList: ['wx-open-launch-app'], // 校验跳转APP的标签是否可用
      success: function (res) {
          console.log('可用')
      },
      fail: (err) => {
          console.log(err, '不可用')
      }             
    })
  })
}

</script>

注意:

  1. 以上代码内容为Vue3.0的写法,使用vue2写法的话可以把<component :is="'script'" type="text/wxtag-template"></component>换成<script type="text/wxtag-template"><script>
  2. vue编译过程中无法识别标签wx-open-launch-app,可以在main.js中设置:
    createApp(App).config.compilerOptions.isCustomElement = (tag) => (tag.includes(‘wx-open-launch-app’));
  3. 获取签名传给后台的url,前台如果进行编码了 url=${encodeURIComponent(location.href.split('#')[0]),后台一定要进行解码,否则会报签名无效

所有的准备完成之后,可以使用微信开发者工具的公众号网页项目进行测试,开启调试时,要设置debug为true

请添加图片描述

若出现 wx.config:config:fail,invalid signature提示内容

  1. 检查签名算法,使用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 页面工具进行校验
  2. 确认 config 中的 appid 与用来获取 jsapi_ticket 的 appid 一致,并且为服务号appid
  3. 检查传给后台的url,若使用 encodeURIComponent(location.href.split('#')[0]) 进行传参,确认后台是否进行解码操作

出现以下内容就是成功了

请添加图片描述

成功之后,使用真机运行就可以进行跳转啦,在App接收微信跳转传过来的参数,并跳转到指定页面。
uniapp中在app.vue页面使用 plus.runtime.arguments 可以拿到从微信网页跳转来的参数,具体内容参考uniapp文档中的内容

onShow: async function() {
  await new Promise((resolve, reject) => {
	setTimeout(() => {
	  let id = plus.runtime.arguments;  //获取app从分享过来的参数
	  console.log('id', id)
	  if(!id) return;
	  uni.navigateTo({
		url: `/pages/canvasPlay/index?bookId=${id}`
	  })
	});
  });
},
// 退出app删除参数,否则每次进来都会进行跳转
onHide: function() {
  plus.runtime.arguments = null;
  plus.runtime.arguments = "";
}

以上就是微信唤起app的全部内容啦~

### UniApp 中实现微信 H5 支付 #### 配置环境与准备工作 为了在 UniApp 应用程序中集成微信 H5 支付功能,开发者需先完成必要的配置工作。这包括但不限于获取应用的 AppID 和商户平台上的密钥等信息[^1]。 #### 创建订单并发起支付请求 当用户确认购买商品或服务时,在前端通过调用微信提供的 JSAPI 接口来创建预支付交易单,并获得此次交易所需的参数集合(prepay_id),这些操作通常由服务器端负责执行。之后再把这些参数传递给客户端用于唤起支付界面。 ```javascript // 前台 JavaScript 代码片段 const payParams = { appId: 'wx8ed2d7f0b9c3a4e',// 小程序唯一标识符 timeStamp: String(Math.floor(new Date().getTime() / 1000)), // 时间戳 nonceStr: createNonceStr(), //随机字符串 package: `prepay_id=${result.prepayId}`, // 统一下单接口返回的 prepay_id 参数值 signType: "MD5", //签名方式,默认为'SHA1',使用新版支付需传入'MD5' }; function createNonceStr(){ return Math.random().toString(36).substr(2, 15); } ``` 接着利用上述准备好的参数集合作为输入项去初始化 WeixinJSBridge 对象下的 invoke 方法中的 jsapi_ticket 字段以启动实际付款流程: ```javascript WeixinJSBridge.invoke( 'getBrandWCPayRequest', {...payParams}, function(res){ if (res.err_msg === 'get_brand_wcpay_request:ok') { console.log('支付成功'); } else{ console.error(`支付失败:${JSON.stringify(res)}`); } }); ``` 需要注意的是,以上提到的部分逻辑应该放置于页面加载完成后立即运行的位置;另外对于某些特定场景下可能还需要额外考虑网络状态等因素的影响[^2]。 #### 后端处理 后端部分主要涉及接收来自 uni-app 的请求以及同微信官方服务器之间的通信过程。这里采用 Spring Boot 框架作为例子说明如何构建相应的业务逻辑和服务接口。具体来说就是编写控制器类用来解析从前端接收到的数据包、验证签名合法性、组装下单所需的信息并向微信提交申请从而拿到最终可以被使用的预支付 ID 返回给前端继续后续的操作。 ```java @RestController @RequestMapping("/wechat/pay") public class PayController { @PostMapping("/createOrder") public ResponseEntity<String> createOrder(@RequestBody Map<String,Object> param){ try { // 解析参数 & 校验签名 // 调用微信统一下单 API 获取 prepay_id JSONObject jsonResult = new JSONObject(); jsonResult.put("return_code","SUCCESS"); jsonResult.put("prepay_id","your_prepair_id_here"); return ResponseEntity.ok(jsonResult.toJSONString()); } catch (Exception e) { logger.error(e.getMessage(), e); throw new RuntimeException("Create order failed."); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值