首页 > 其他分享 >Vue3 iOS微信JSSDK授权签名错误及图片选择兼容

Vue3 iOS微信JSSDK授权签名错误及图片选择兼容

时间:2024-11-05 11:19:08浏览次数:4  
标签:const JSSDK 微信 image iOS window data

iOS微信JSSDK授权签名错误及图片选择兼容

转载请注明出处:https://blog.csdn.net/hx7013/article/details/143502680

一、项目概述

Vue3 + Vite + Vue-Router 4+ JS-SDK 1.6

由于之前开发调试都是在微信开发者工具及 Android 平台,后上线前测试发现 iOS 平台会出现 invalid signature 及图片选择后预览失败的问题。
查询资料后逐步解决,重新整理了下问题原因,及修复的详细代码和说明。

二、iOS 签名错误 invalid signature

由于我 vue-router 使用的是 history 模式,页面跳转后在iOS使用 window.location.href 获取到的地址签名后 wx.config 会报错 invalid signature ,使用 微信 JS 接口签名校验工具 对比过,确认签名无误,但是还是会报该错误。各种查询后得知传给后端签名的URL地址 iOSvue-router history 模式下,需要传刚进入的页面urlAndroid可以实时window.location.href取当前url。

  • 解决方法1:
    vue-router改为hash模式。(实际就是保证了地址的不变,但是不推荐该做法,对于我这边来说,对现有项目影响较大)

  • 解决方法2:
    存储首次启动时的地址,获取JSSDK签名时判断是iOS 还是 Android,区别传入首次进入的地址或当前地址即可。

解决方法2代码:

  1. 工具类WxUtils.ts
/**
 * iOS微信内JSSDK授权需提交启动地址
 */
export const WX_ENTRY_URL_TAG = 'wxEntryUrl'

/**
 * 是否为微信浏览器
 */
export function isWxBrowser() {
    const ua = navigator.userAgent.toLocaleLowerCase()
    return /micromessenger/.test(ua)
}

/**
 * 是否为iOS浏览器
 */
export function isIOSBrowser() {
    const ua = navigator.userAgent.toLocaleLowerCase()
    return /iphone|ipad|ipod/.test(ua)
}

/**
 * 获取JSSDK授权地址
 * App.vue -> sessionStorage.setItem(WX_ENTRY_URL_TAG, window.location.href)
 */
export function loadJSSDKUrl(): string {
    let sdkUrl = window.location.href
    const sessionWxEntryUrl = sessionStorage.getItem(WX_ENTRY_URL_TAG)
    if (isIOSBrowser() && sessionWxEntryUrl && sessionWxEntryUrl.length > 0) {
        sdkUrl = sessionWxEntryUrl
    }
    return sdkUrl.split('#')[0]
}
  1. App.vue
<script setup lang="ts">
import { WX_ENTRY_URL_TAG, loadJSSDKUrl } from './utils/WxUtils';

/**
 * iOS微信内JSSDK授权需提交启动地址
 * {@link loadJSSDKUrl}
 */
sessionStorage.setItem(WX_ENTRY_URL_TAG, window.location.href)
</script>
  1. 使用,在需要授权的页面使用loadJSSDKUrl() 获取地址即可
<script setup lang="ts">
import { isWxBrowser, loadJSSDKUrl } from '../../../utils/WxUtils'
... //忽略其它import

const wxEntryUrl = ref(window.location.href)
... // 忽略其它代码

function loadJSAuthorization() {
    Net.post<JSAuthor>('/xxx', ???, { url: wxEntryUrl.value ?? window.location.href })
        .then(resp => initJSSDK(resp.data))
        .catch(err => {
            pageState.value = PageState.Failed
            pageMessage.value = `加载失败: ${err}`
        })
}

onMounted(() => {
    wxEntryUrl.value = loadJSSDKUrl()
    ... // 忽略其它代码
})

三、iOS 选择图片

JSSDK
授权后使用 wx.chooseImage ,按文档说明“返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片”,实际测试 Android 是可以显示的,但是 iOS 却不能显示。
具体原因为 iOSWKWebView UIWebView 的WebView内核不同导致的,详细可查看官方文档 iOS WKWebview网页开发适配指南
后使用wx.chooseImage + wx.getLocalImgData 直接获取图片Base64后交给 <img> 标签显示。但是在获取图片Base64时又发现新的问题,iOS 获取时会携带data:image/... 数据头,但是 Android 又不携带,所以在 wx.getLocalImgData 中又需要进行一次处理。
最后兼容 iOSAndroid 的代码如下:

<script setup lang="ts">
const imageBase64 = ref('')

function onSelectImage() {
    const loading = showLoadingToast({ message: '获取图片中', forbidClick: true })
    wx.chooseImage({
        count: 1,
        sizeType: ['compressed'],
        sourceType: ['camera'],
        success(res) {
            wx.getLocalImgData({
                localId: res.localIds[0],
                success(res) {
                    let localImage = res.localData
                    localImage = localImage.startsWith('data:image') ? localImage.replace('data:image/jgp;', 'data:image/jpeg;') : `data:image/jpeg;base64,${localImage}`
                    imageBase64.value = localImage.replace(/\r|\n/g, '')
                },
                fail(err) {
                    showNotify({ type: 'warning', message: `获取图片失败: ${err}` })
                },
                complete() {
                    loading.close()
                },
            })
        },
        cancel() {
            loading.close()
        },
        fail(err) {
            loading.close()
            showNotify({ type: 'warning', message: `选择图片失败: ${err.errMsg}` })
        },
    })
}
</script>

<template>
    <img v-else class="object-cover self-center rounded-lg w-[60%] h-28" :src="imageBase64" @click="onSelectImage" />
</template>

其中涉及逻辑为:先判断获取的base64开头是否有 data:image 数据头,没有的话加上data:image/jpeg;base64,。如果有数据头,判断是否为 iOSdata:image/jgp; ,是的话需替换为 data:image/jpeg; ,最后赋值时替换掉全部的换行及回车 /\r|\n/g

转载请注明出处:https://blog.csdn.net/hx7013/article/details/143502680


涉及资料:

1. 微信 JS 接口签名校验工具
2. JS-SDK说明文档
3. iOS WKWebview网页开发适配指南

标签:const,JSSDK,微信,image,iOS,window,data
From: https://blog.csdn.net/hx7013/article/details/143502680

相关文章

  • iostat命令详解
    iostat用于输出CPU和磁盘I/O相关的统计信息. 1.不加选项执行iostat [patrickxu@vm1~]$iostatLinux2.6.32-279.19.3.el6.ucloud.x86_64(vm1)  06/11/2017 _x86_64_   (8CPU)avg-cpu: %user  %nice%system%iowait %steal  %idle        ......
  • 2024 年可免费下载的 6 款最佳 iOS 解锁软件
    众所周知,如果所有者或其他人多次输入错误密码,iOS会锁定并禁用iPhone或iPad。Apple推出了使用iTunes/Finder、iCloud或其他iOS设备解锁已禁用设备的方法。但是,每种方法都需要一些先决条件,例如Apple密码。在这种情况下,使用第三方免费iPhone/iPad解锁器是进入锁定的i......
  • uniapp微信小程序-分包(一看就懂)
    一、为什么要分包微信小程序每个分包的大小是2M,总体积一共不能超过20M,当然你也可以提升启动速度,降低首次加载时间,模块化开发,按需加载,提高性能。二、分包步骤 1.首先在 mainfest.jsonmp-weixin添加以下代码(启动分包)"optimization":{"subPackages":true}2.项......
  • Axios详解及用法
    文章目录Axios详解:用法、创作流程、优缺点、代码案例及使用场景Axios简介Axios的用法Axios的创作流程Axios的优缺点代码案例及详细解释Axios的使用场景Axios详解:用法、创作流程、优缺点、代码案例及使用场景Axios简介Axios是一个基于Promise的HTTP客户端,用于浏览......
  • python+flask框架的智慧工会微信小程序 小程序端28(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着信息技术的飞速发展和移动互联网的普及,微信小程序作为一种轻量级的应用形态,已成为各类服务接入互联网的重要平台。智慧工会作为新时代......
  • 微信公众号服务器配置一直提示token验证失败?
    本地使用postman,请求了要设置在微信公众号服务器回调的URL,可以正常返回echostr,点击提交,一直报错token验证失败,请问这个是什么原因呢? 解决办法:解决了,我去,好坑啊,遇到该问题的朋友,请做如下检查: 1.检查,request是不是UTF-8,避免获取的数据是乱码  2.response.setContentTyp......
  • django抛出异常然后在axios里处理
     1.views.py代码@csrf_exemptdefget_selectdata_by_sql(request):current=request.GET.get("current",1)size=request.GET.get("size",0)limit_size=50try:res_list=[]request_dict=json.loads(req......
  • 如何快速定位Windows微信客户端数据库加密秘钥偏移地址
     手工获取网上涉及如何调试微信客户端获取数据库加密key的教程很多,但是每次微信版本更新后都要调试肯定会比较麻烦,但是有一个问题是这个key其实不是经常变更的,具体如何变更我也不清楚,可能是改密码?因此我们可以直接使用CheatEngine等内存搜索工具直接搜索之前获取的key,这样......
  • 电脑软件:PC端微信4.0内测版功能一览
    目录一、版本说明二、安装说明三、使用说明3.1UI界面优化3.2联系人界面优化3.3文件管理功能优化四、总结一、版本说明近期腾讯官方更新了Windows版本的微信,4.0.0内测版本。这次和往常不同,不需要申请内测资格就可以下载体验,并且安装的版本和已经安装的微信版......
  • java springboot对接微信小程序和微信支付v3接口
    1、controller代码packagecom.saburo.server.controller.weixin;importcn.dev33.satoken.annotation.SaIgnore;importcom.gcode.common.core.R;importcom.saburo.server.common.dto.WeiXinUserInfoDto;importcom.saburo.server.common.dto.money.PayDto;importcom.......