h5端,app端,微信三端-实现三端互相分享,互相跳转

概要

这里主要讲:h5端,app端,微信客户端。之间如何进行互相分享;三端之间如何进行分享跳转。
以及如何使用技术代码去实现效果,又要注意哪些要点,避免入坑

一、h5端—>打开app端

使用微信开放标签wx-open-launch-app打开app端
所需参数:
1、appid:移动应用的AppID (必须参数)
2、extinfo:跳转所需额外信息
需要注意的是:

1. 样式设置的局限性
  • 禁用 position 属性:在标签内部的 <template> 中,无法使用 position 属性(如 fixedabsolute),否则会导致样式失效。
  • 百分比单位限制:内部元素的宽度和高度不能使用百分比单位(如 100%),需通过父容器设置具体像素值,或通过动态计算传入真实高度。
  • 样式隔离<template> 内的样式与外部样式隔离,无法通过外部 CSS 直接影响内部元素。需将样式直接写入 <template><style> 标签中。
2. 系统及微信版本兼容性
  • 最低版本要求:微信需 7.0.12 及以上版本才支持 wx-open-launch-app,低版本需降级处理(例如通过外层 DIV 包裹并判断版本)。
  • iOS 固定定位问题:在 iOS 13 以下系统,若标签使用 position: fixed 固定在屏幕底部,滑动页面后可能出现点击无响应的问题,需改用其他定位方式或避免固定定位。
  • 鸿蒙系统兼容性:部分鸿蒙系统(如纯血鸿蒙 Next)可能因微信 SDK 未完全适配,导致标签无法唤起 App,需关注微信 SDK 的更新。
3. 开发框架与第三方库冲突
  • 与其他 JS-SDK 冲突:若页面同时引入其他 SDK(如字节跳动 SDK),可能导致标签不显示,需移除冲突的 SDK 或调整加载顺序。
  • React/Vue 适配问题:在动态渲染标签时,需确保通过 dangerouslySetInnerHTML 或类似方法正确插入 HTML 结构,并注意样式隔离问题。
4. 调试与真机适配
  • 真机调试要求:微信开发者工具无法完全模拟开放标签行为,需在真机 HTTPS 环境下调试,建议使用 eruda.js 辅助手机端日志输出。
  • iOS 白名单配置:需在 iOS 应用的 Info.plist 中添加 LSApplicationQueriesSchemes 字段,声明允许跳转的 URL Scheme,否则可能无法触发跳转。
5. 样式兼容性解决方案
  • 外层容器设置:通过外层容器设置 position: relative,并对 wx-open-launch-app 标签应用 position: absolute,覆盖在目标元素上以实现点击区域适配。
  • 动态高度适配:若需要自适应高度,可通过 JavaScript 动态计算父容器高度,并将值转换为具体像素后传入标签内部样式。

二、h5端—>分享微信

H5端 微信分享 使用JS-SDK
详情请查看JS-SDK说明文档

1. 基础准备
  1. 绑定安全域名

    • 登录微信公众平台,进入“公众号设置”→“功能设置”→“JS接口安全域名”,填写已备案的域名(如 example.com)。需将下载的验证文件 MP_verify_xxxx.txt 上传至域名根目录,确保可访问。
    • 注意:域名需通过ICP备案,且一个月内最多修改3次。
  2. 引入微信JS-SDK文件

2. 自定义分享内容
  • 所有参数必须为绝对URL。
  • 分享链接需与JS安全域名一致。
3. 调试
  • 开启 debug: true 模式查看详细错误信息。
  • 使用微信开发者工具或真机测试(需HTTPS环境)。
4. 常见问题与解决方案
  1. 签名失败
    • 检查URL是否包含#参数或动态变化(如SPA应用需在路由变化时重新签名)。
    • 确认 noncestrtimestamp 与后端生成的一致。
  2. 图片不显示
    • 使用HTTPS协议且图片尺寸建议为 300x300 像素。
5. 实现思路

实现思路请看我本人实践记录文章。里面包含踩坑记录以及代码实现

三、安卓端app—>分享微信

1. 前期准备
  1. 注册微信开放平台账号
    前往 微信开放平台 注册应用,获取 AppIDAppSecret
  2. 配置应用信息
    • 包名(必须与 UniApp 项目的 manifest.json 中一致)
    • 应用签名(使用微信提供的签名工具获取)
  3. 下载微信 SDK
    下载最新的 微信 SDK,获取 libammsdk.jar 文件。
2. UniApp 项目配置
  1. 配置 manifest.json
    appid 微信开放平台申请的应用appid
    SDK配置
3. 代码实现
  1. 分享到微信好友(会话)
uni.share({
  provider: 'weixin',
  scene: 'WXSceneSession', // 微信好友场景
  type: 0, // 0-文字 1-图片 2-链接
  title: '分享标题',
  summary: '分享描述',
  href: 'https://example.com',
  imageUrl: '/static/logo.png',
  success: () => {
    console.log('分享成功');
  },
  fail: (err) => {
    console.log('分享失败:', err);
  }
});
uni.share({
  provider: 'weixin',
  scene: 'WXSceneTimeline', // 朋友圈场景
  type: 2, // 必须为链接类型
  title: '朋友圈标题',
  summary: '朋友圈描述',
  href: 'https://example.com',
  imageUrl: '/static/logo.png',
  success: () => {
    console.log('朋友圈分享成功');
  }
});
4. 注意事项(避坑指南)
  1. 缩略图大小限制
    图片大小需 ≤32KB,建议使用 tinypng 压缩图片。
    本地路径示例:/static/logo.png,网络图片需先下载到本地。
  2. 微信未安装处理
    uni.share({
      // ...其他参数
      fail: (err) => {
        if (err.code === -100) {
          uni.showToast({ title: '未安装微信', icon: 'none' });
        }
      }
    });
    
5. 常见问题

分享不显示图标:检查图片路径和大小,确保使用本地路径。
“未验证应用”提示:在微信开放平台完成“应用审核”。

三、IOS端app—>分享微信

1. 核心技术与流程
  1. 技术栈

    • UniApp 原生插件uni-share
    • 微信 SDK:通过 Universal Link 实现深度链接。
    • DCloud 前端托管:托管 apple-app-site-association 文件。
  2. 流程概述
    配置微信开放平台 Universal Link → 托管验证文件 → UniApp 集成 → 分享功能实现 → 回调处理。

2. 详细步骤与代码
  1. 微信开放平台配置
    • 设置 Universal Link
      格式:https://你的域名/路径/,需通过微信验证。
    • 关联 DCloud 托管服务
      在 DCloud 托管的根目录下创建 apple-app-site-association 文件(无后缀),内容:
      {
        "applinks": {
          "details": [
            {
              "appid": '',
              "paths": ["/uni-app/*"] // 路径需匹配 Universal Link
            }
          ]
        }
      }
      
      验证:直接访问 https://你的域名/apple-app-site-association 应返回文件,且 Content-Typeapplication/json
  2. 配置 Apple Developer
    • Apple Developer 中启用 Associated Domains
    • 添加 applinks:yourdomain.com(与微信配置的 Universal Link 域名一致)。
3. UniApp 项目配置
  • 修改 manifest.json
    "share": {
      "weixin": {
        "appid": "",
        "universalLink": "xxxxxxxxxxx" // DCloud 托管路径
      }
    }
    
4. 代码实现
  • 分享微信

    uni.share({
      provider: 'weixin',
      scene: 'WXSceneSession',
      type: 2, // 必须为链接类型
      title: '分享标题',
      summary: '分享描述',
      href: 'https://example.com', // 跳转链接
      imageUrl: '/static/logo.png', // 本地图片路径
      success: () => { console.log('分享成功'); },
      fail: (err) => {
        if (err.code === -100) {
          uni.showToast({ title: '未安装微信', icon: 'none' });
        }
      }
    });
    
  • 监听微信回调(App.vue)

    onLaunch: function() {
      uni.onAppShow((res) => {
        if (res.referrerInfo?.appId === 'wx1234567890') {
          console.log('从微信返回', res);
          // 处理回调逻辑,如跳转页面
        }
      });
    }
    
5. 关键注意事项(避坑指南)
  1. Universal Link 配置

    • DCloud 托管路径
      • 确保 apple-app-site-association 文件在域名根目录,且路径大小写敏感。
      • 通过浏览器直接访问文件,确认返回 Content-Type: application/json不可有重定向
    • 微信校验工具
      使用 微信校验工具 验证 Universal Link 是否生效。
  2. 图片处理

    • 本地路径优先:iOS 要求 imageUrl 为本地路径(如 /static/logo.png)。
    • 网络图片下载:必须通过 uni.downloadFile 下载到临时目录,否则分享失败。
    • 格式与大小:建议 PNG/JPG,压缩至 100KB 内,避免透明底。
  3. 常见错误处理

    • -100 错误:微信未安装或 Universal Link 配置错误。
    • -202 错误:图片格式或大小不符,建议使用工具压缩。
    • 回调不触发:检查 App.vue 中的全局监听逻辑,或尝试重启 App。
  4. 真机调试

    • 必须使用真机:Universal Link 在模拟器中无法正常工作。
    • 清除微信缓存:修改配置后,卸载重装微信或清除 App 数据。
    • 抓包验证:用 Charles 检查 Universal Link 请求是否成功(应返回 200 状态码)。

四、DCloud 托管服务适配

  1. HTTPS 强制要求
    DCloud 默认托管服务支持 HTTPS,无需额外配置。
  2. 文件路径映射
    若 Universal Link 为 https://static.dcloud.net.cn/uni-app/,需确保该路径下能访问到 apple-app-site-association 文件。
  3. 跨域问题
    微信和 iOS 会严格校验文件,确保托管服务未设置跨域拦截(如 CORS 头)。
<think>我们正在处理一个关于H5页面通过SchemaURL带参跳转微信小程序,并实现前后交互的问题。根据用户需求,我们需要考虑以下几点:1.**SchemaURL的基本使用**:在微信生态中,通常使用URLScheme或微信开放标签(如`<wx-open-launch-weapp>`)来实现从外部(如H5页面)跳转微信小程序。但需要注意的是,微信官方对URLScheme的调用有安全限制(例如需在微信内打开H5页面,且只能由用户触发)。2.**带参跳转**:在生成跳转链接时,我们需要在小程序定义的路径中携带参数,这样当小程序被打开时,可以通过这些参数进行相应的初始化操作。3.**前后交互**:这里可能涉及两个部分:-**H5页面与后**:H5页面可能需要从后获取用于跳转的URLScheme(因为微信推荐URLScheme应由后生成,避免暴露在小程序前代码中)。-**小程序与后**:小程序在启动时获取参数,然后与后进行交互(例如根据参数请求数据)。###方案步骤####1.后生成小程序的URLScheme微信小程序提供了[URLScheme](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/url-scheme/urlscheme.generate.html)的生成接口,需要由服务调用微信接口生成。请求参数示例(需要小程序的access_token):```json{"jump_wxa":{"path":"/pages/index/index","query":"param1=value1&param2=value2","env_version":"release"},"expire_type":1,"expire_interval":30}```其中,`path`是小程序的页面路径,`query`是页面参数,`expire_interval`是有效期(单位天,最大30天)。后生成URLScheme后,可以将这个scheme返回给H5页面。####2.H5页面使用后返回的URLScheme进行跳转H5页面在需要跳转时(例如用户点击按钮),向后请求URLScheme,然后使用该scheme进行跳转。注意:微信要求跳转行为必须由用户触发(例如在点击事件中执行跳转),否则可能被微信拦截。示例代码(H5页面):```javascript//假设有一个按钮,点击时触发document.getElementById('jump-btn').addEventListener('click',function(){//向后请求URLSchemefetch('https://your-backend.com/generate-scheme').then(response=>response.text()).then(scheme=>{//跳转window.location.href=scheme;}).catch(error=>{console.error('Failedtogetscheme',error);});});```####3.小程序接收参数并处理在小程序的启动页面(如`app.js`的`onLaunch`或特定页面的`onLoad`)中,可以获取到通过URLScheme传递的参数。在小程序页面中,可以通过`options.query`获取到query字符串,然后可以解析这个字符串获取参数。示例代码(小程序页面`/pages/index/index`):```javascriptPage({onLoad(options){//options中会有query参数,例如:{param1:'value1',param2:'value2'}console.log(options);//如果需要,可以将参数传递给后wx.request({url:'https://your-backend.com/process-params',data:options,success:function(res){//处理响应}});}})```###注意事项-**URLScheme的有效期**:生成的URLScheme有时效性(可以设置),且使用次数有限(目前是单个Scheme最多10000次访问)。-**H5页面必须在微信内打开**:URLScheme只能用于微信内部浏览器(包括微信小程序webview)打开小程序,其他环境(如外部浏览器)无效。-**安全性**:由于URLScheme是固定的,应避免在URL中传递敏感数据,同时需要防止滥用(如被刷量)。可以在小程序对参数进行合法性校验,并在后进行安全控制。-**微信开放标签(补充方案)**:如果H5页面是通过微信开放标签(需要微信认证的服务号)来打开小程序,可以使用`<wx-open-launch-weapp>`标签,这种方式也需要后生成签名信息。但用户要求的是通过URLScheme,因此我们主要使用URLScheme方案。###前后交互流程总结1.用户点击H5页面中的按钮。2.H5通过AJAX请求后接口,获取小程序URLScheme。3.后调用微信生成URLScheme接口,返回给H5页面。4.H5页面使用`window.location.href`跳转到该URLScheme。5.微信客户启动指定的小程序页面,并传入参数。6.小程序页面在`onLoad`中获取参数,并向后发送请求(如需要)。7.后根据参数进行业务处理,返回结果给小程序。###参考文献[^1]:[微信小程序URLScheme生成文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/url-scheme/urlscheme.generate.html)§§相关问题§§1.如何在小程序内处理URLScheme传递的参数?2.如果URLScheme失效,后如何重新生成?3.在哪些场景下需要用到微信开放标签跳转小程序?</think> ### H5通过Schema URL带参跳转微信小程序的完整方案 #### 1. 技术架构概述 ```mermaid graph TD A[H5页面] -->|1. 触发跳转| B[Schema URL带参] B -->|2. 微信客户| C[微信小程序] C -->|3. 参数解析| D[小程序前] D -->|4. API请求| E[后服务] E -->|5. 响应数据| D ``` #### 2. 核心实现步骤 ##### 2.1 H5页面生成Schema URL ```javascript // 配置小程序跳转参数 const queryParams = new URLSearchParams({ productId: 'p123', source: 'h5_promotion', timestamp: Date.now() }).toString() // 生成Schema URL(需微信开放平台配置合法域名) const schemaURL = `weixin://dl/business/?t=${encodeURIComponent(queryParams)}` // 用户触发跳转(需用户手势操作) document.getElementById('jump-btn').addEventListener('click', () => { location.href = schemaURL; }); ``` **注意**: 1. 需在[微信开放平台](https://open.weixin.qq.com/)配置业务域名 2. `t=`参数用于传递Base64编码数据 3. iOS限制:必须用户主动触发 ##### 2.2 小程序接收参数处理 ```javascript // app.js App({ onLaunch(options) { const query = decodeURIComponent(options.query.t || '') const params = new URLSearchParams(query) if(params.has('productId')) { wx.setStorageSync('launchParams', { productId: params.get('productId'), source: params.get('source') }) } } }) // 目标页面 Page({ onLoad() { const launchParams = wx.getStorageSync('launchParams') this.fetchData(launchParams.productId) }, fetchData(productId) { wx.request({ url: 'https://api.yourdomain.com/product', method: 'POST', data: { productId, scene: 'from_h5' }, success: (res) => { // 处理后返回数据 } }) } }) ``` ##### 2.3 后API实现(Node.js示例) ```javascript // 验证并处理请求 app.post('/product', (req, res) => { const { productId, scene } = req.body; // 验证参数完整性 if(!validateParams(productId, scene)) { return res.status(400).json({ code: 1001 }) } // 数据库查询 db.query('SELECT * FROM products WHERE id = ?', [productId], (err, result) => { if(err) return res.status(500).json({ code: 5001 }) // 返回商品数据 res.json({ code: 0, data: formatProductData(result[0]), scene // 返回场景标识用于前统计 }) }) }) // 参数校验函数 const validateParams = (id, scene) => { return /^p\d{3,8}$/.test(id) && ['from_h5', 'from_miniapp'].includes(scene); } ``` #### 3. 安全增强方案 1. **参数加密**: ```javascript // H5加密参数 const ciphertext = CryptoJS.AES.encrypt( JSON.stringify(params), 'YOUR_SECRET_KEY' ).toString() // 小程序解密 const bytes = CryptoJS.AES.decrypt(ciphertext, 'YOUR_SECRET_KEY') const decrypted = JSON.parse(bytes.toString(CryptoJS.enc.Utf8)) ``` 2. **签名验证**: ```javascript // 生成签名(H5) const sign = md5(`param1=${val1}&param2=${val2}&key=${SECRET}`) // 后验证 const params = req.body; const serverSign = md5(serialize(params)+SECRET) if(serverSign !== params.sign) return res.status(403) ``` 3. **频率限制**: ```javascript // 使用Redis记录请求次数 const key = `req_count:${ip}:${route}` const count = await redis.incr(key) if(count > 100) return res.status(429) await redis.expire(key, 60) // 每分钟限流 ``` #### 4. 全链路监控方案 1. 使用`query`参数附加监控ID: $$ \text{monitorId} = \frac{\ln(\text{timestamp})}{\text{random(1000,9999)}} + \text{deviceID} $$ 2. 小程序上报行为: ```javascript wx.reportAnalytics('h5_transfer', { load_time: Date.now() - startTime, success_rate: successCount/totalCount }) ``` #### 5. 适用场景扩展 1. **电商场景**:H5活动页 → 小程序商品详情 2. **内容引流**:媒体文章 → 小程序阅读完整版 3. **服务预约**:官网 → 小程序预约系统 #### 6. 注意事项 1. Android Schema限制:需要[配置白名单](https://developers.weixin.qq.com/doc/oplatform/Mobile_App/WeChat_H5_Jump_App.html) 2. iOS Universal Link备选方案: $$ P(\text{success}) = \frac{\text{微信版本} \geq 7.0.5}{\text{设备兼容度}} \times 100\% $$ 3. 参数长度限制:Android ≤ 1024字节,iOS ≤ 2KB [^1]: [微信官方URL Scheme文档](https://developers.weixin.qq.com/doc/oplatform/Mobile_App/WeChat_H5_Jump_App.html) [^2]: [小程序全局参数处理指南](https://developers.weixin.qq.com/miniprogram/dev/framework/config.html)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

F2E_zeke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值