微信JS-SDK的使用

微信公众号:weixin-js-sdk使用总结 JS-SDK说明文档 网页授权说明文档 微信公众号授权登录参考方案 1、安装weixin-js-sdk npm install weixin-js-sdk 2、js封装 import wx from 'weixin-js-sdk' // 步骤1、引入微信js-sdk import http from '@/utils/axios.js'; //接口请求封装 // 1、wx.config配置参数 const getWxConfig = async (pageUrl) => { await 阅读详情

前台

// 安装js-sdk 本文中使用的版本是 1.6.0
npm i weixin-js-sdk,

方法定义

ios使用JS-SDK报错:config:invalid signature

vue 单页应用中 ,使用 history 模式时,在 ios 中,使用JS-SDK报错:config:invalid signature

ios中,必须用第一次进入的链接地址去获取签名,通过路由跳转的页面无法获取正确签名。
如:进入系统后第一个页面是A,点击A中的按钮,通过路由跳转到B后,仍然要用A的url去签名,B的url无法获取正确签名

代码如下:

router.beforeEach(async (to, from, next) => {
	iosWxSign(to, from, next)
})

// ios授权时无法获取到正确的url,用此方法作兼容
const iosWxSign = (to, from, next) => {
  // window.__wxjs_is_wkwebview:true为 IOS 设备;false为 安卓 设备
  if (window.__wxjs_is_wkwebview) {
    // wechat=1,表示页面已自动刷新过一次,并添加了wechat标识
    if (to.query.wechat !== undefined && to.query.wechat === '1') {
      window.wechaturl = window.location.href;
      console.log('window.wechaturl:', window.wechaturl);
    } else {
      if (window.wechaturl) {
        // 不是首次进入
      } else {
        // 重要步骤!!!当页面被点击刷新后wechaturl是null,这个时候就要把当前的页面再做上小标记。记录一下。
        const host = 'http://' + window.location.host + '自己项目的根路径';
        let url = host + to.fullPath;
        if (url.indexOf('?') >= 0) {
          url += '&wechat=1';
        } else {
          url += '?wechat=1';
        }
        window.wechaturl = url;
        setTimeout(function () {
          // 相当于加载一下当前界面,如果不执行这一步的话,微信只是重新渲染了dom,而不重新执行wx.config;
          location.replace(url);
        }, 300);
      }
    }
  }
};

使用JS-SDK
// 获取微信JS-SDK使用权限的签名,并通过 config 接口注入权限验证配置
// 要使用微信JS-SDK功能的页面,必须先调用此方法
export const getWxSignInfo = async () => {
  let wechaturl = window.location.href;
  if (window.wechaturl !== undefined) {
    wechaturl = window.wechaturl;
  }
  console.log('签名进去->' + wechaturl);
  const [err, res] = await axios.asyncPost('api/wechat/getWxSignInfo', { url: encodeURIComponent(wechaturl.split('#')[0]) });
  if (!err && res) {
    if (res.data.code === 0) { // 接口调用成功(我自己业务定义的,不是微信的错误码)
      // 注入权限验证配置
      wx.config({
        debug: window.provinceOperator.sdk_debug, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
        appId: res.data.sign.appId, // 必填,公众号的唯一标识
        timestamp: res.data.sign.timestamp, // 必填,生成签名的时间戳
        nonceStr: res.data.sign.nonceStr, // 必填,生成签名的随机串
        signature: res.data.sign.signature, // 必填,签名
        jsApiList: ['updateAppMessageShareData', 'updateTimelineShareData'] // 必填,需要使用的JS接口列表
      });
    } else {
      // 接口失败报错信息
      this.$dialog.alert({ message: res.data.msg }).then(() => {}).catch(() => {});
    }
  }
};

// 微信分享功能
export const wxShare = (title = document.title, desc = '', link = location.href, imgUrl) => {
  console.log('link: ', link);
  // “分享给朋友”及“分享到QQ”
  wx.ready(() => { // 需在用户可能点击分享按钮前就先调用
    wx.updateAppMessageShareData({
      title, // 分享标题
      desc, // 分享描述
      link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
      imgUrl, // 分享图标
      success: function () {
        // 设置成功
      }
    });
    // “分享到朋友圈”及“分享到QQ空间”
    wx.updateTimelineShareData({
      title, // 分享标题
      desc, // 分享描述
      link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
      imgUrl, // 分享图标
      success: function () {
        // 设置成功
      }
    });
  });
};
  async created() {
    await getWxSignInfo();
    wxShare('周报分享', '快来看看TA的家庭周报吧', location.href, '头像url');
  },

后台

   /**
     * 获取微信JsSDK签名信息
     * @param param
     * @param request
     * @return
     */
    @RequestMapping(value = "/getWxSignInfo", method = RequestMethod.POST)
    public R WeekRecordShare(@RequestBody Map<String,Object> param, HttpServletRequest request) {
        String url = StringUtils.toStrOrNull(param.get("url"));
        if(StringUtils.isEmpty(url)){
            return R.error("url不能为空!");
        }
        Map<String, Object> params = new HashMap<>();
        params.put("url",url);
        //获取access_token
        String accessToken = wechatService.getAccessToken(params, request);
        if(StringUtils.isEmpty(accessToken)){
            return R.error("获取access_token失败!");
        }
        //拿token换取ticket
        params.put("access_token",accessToken);
        String jsapi_ticket = wechatService.getTicket(params, request);
        if(StringUtils.isEmpty(jsapi_ticket)){
            return R.error("获取ticket失败!");
        }
        //返回签名信息
        params.put("jsapi_ticket",jsapi_ticket);
        params.put("channel",param.get("channel"));
        return wechatService.getJsSign(params, request);
    }

WechatService.java

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

    /**
     * 获取access_token
     * @param request
     * @return access_token
     */
    @Override
    public String getAccessToken(Map<String, Object> params,HttpServletRequest request) {
        String access_token = "";
        // 公众号的 appId 和 secret
        String newAppId = appId;
        String newSecret = secret;
        try {
            Cache tokenCache = CacheService.getCacheInfo("access_token");
            //缓存中access_token为空或者已失效,则重新获取access_token
            if(tokenCache == null || tokenCache.isExpired() ){
                JSONObject accessTokenData = WeChatMsg.getAccessToken(newAppId, newSecret);
                //查询成功,则将access_token放置缓存中
                if(accessTokenData != null){
                    access_token =  String.valueOf(accessTokenData.get("access_token"));//token
                    Integer expires_in =  Integer.valueOf(accessTokenData.get("expires_in").toString());//失效时间
                    //为防止token失效,全局缓存失效时间比微信官方失效时间早2min
                    CacheService.clearOnly("access_token");
                    Cache cache = new Cache("access_token",access_token,(expires_in-120)*1000,false);
                    CacheService.putCache("access_token",cache);
                }
            }else{
                //直接从缓存中获取access_token
                Cache cacheInfo = CacheService.getCacheInfo("access_token");
                access_token = String.valueOf(cacheInfo.getValue());
            }
        }catch (Exception e){
            e.printStackTrace();
            logger.error("获取access_token失败!原因:"+e.getMessage());
            return null;
        }
        return access_token;
    }




    /**
     * 获取ticket
     * @param request
     * @return ticket
     */
    @Override
    public String getTicket(Map<String, Object> params,HttpServletRequest request) {
        String ticket = "";
        try {
            Cache ticketCache = CacheService.getCacheInfo("ticket");
            //缓存中ticket为空或者已失效,则重新获取ticket
            if(ticketCache == null || ticketCache.isExpired() ){
                String access_token = params.get("access_token").toString();
                JSONObject ticketData = WeChatMsg.getTicket(access_token);
                //查询成功,则将ticket放置缓存中
                if(ticketData != null && "0".equals(String.valueOf(ticketData.get("errcode")))){
                    ticket =  String.valueOf(ticketData.get("ticket"));//ticket
                    Integer expires_in =  Integer.valueOf(ticketData.get("expires_in").toString());//失效时间
                    CacheService.clearOnly("ticket");
                    //为防止ticket失效,全局缓存失效时间比微信官方失效时间早2min
                    Cache cache = new Cache("ticket",ticket,(expires_in-120)*1000,false);
                    CacheService.putCache("ticket",cache);
                }
            }else{
                //直接从缓存中获取ticket
                Cache cacheInfo = CacheService.getCacheInfo("ticket");
                ticket = String.valueOf(cacheInfo.getValue());
            }
        }catch (Exception e){
            e.printStackTrace();
            logger.error("获取ticket失败!原因:"+e.getMessage());
            return null;
        }
        return ticket;
    }

WeChatMsg.java

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;;
import java.util.*;
    /**
     * 通过appId和secret获取access_token
     * https://api.weixin.qq.com/cgi-bin/token
     * @param appid
     * @param secret
     * @return
     */
    public static JSONObject getAccessToken(String appid, String secret) {
        JSONObject jsonObject = null;
        try {
            String result = CustomizedHttpClient.get("https://api.weixin.qq.com/cgi-bin/token"+"?appid="+appid+"&secret="+secret+"&grant_type=client_credential");
            jsonObject = JSON.parseObject(result);
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("通过appId和secret获取access_token失败!原因:"+e.getMessage());
        }
        return jsonObject;
    }



    /**
     * 通过access_token获取ticket
     * https://api.weixin.qq.com/cgi-bin/ticket/getticket
     * @param accessToken
     * @return
     */
    public static JSONObject getTicket(String accessToken) {
        JSONObject ticketData = null;
        try {
            String result = CustomizedHttpClient.get("https://api.weixin.qq.com/cgi-bin/ticket/getticket"+"?access_token="+accessToken+"&type=jsapi");
            ticketData = JSON.parseObject(result);
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("通过access_token获取ticket失败!原因:"+e.getMessage());
        }
        return ticketData;
    }

Cache.java

public class Cache {
    private String key;//缓存ID
    private Object value;//缓存数据
    private long timeOut;//更新时间
    private boolean expired; //是否终止
    public Cache() {
        super();
    }

    public Cache(String key, Object value, long timeOut, boolean expired) {
        this.key = key;
        this.value = value;
        this.timeOut = timeOut;
        this.expired = expired;
    }

    public String getKey() {
        return key;
    }

    public long getTimeOut() {
        return timeOut;
    }

    public Object getValue() {
        return value;
    }

    public void setKey(String string) {
        key = string;
    }

    public void setTimeOut(long l) {
        timeOut = l;
    }

    public void setValue(Object object) {
        value = object;
    }

    public boolean isExpired() {
        return expired;
    }

    public void setExpired(boolean b) {
        expired = b;
    }
}

CacheService .java

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * @Describe 将数据存入缓存处理类
 */
public class CacheService {
    private static HashMap cacheMap = new HashMap();

    //单实例构造方法
    private CacheService() {
        super();
    }

    //得到缓存。同步静态方法
    private synchronized static Cache getCache(String key) {
        return (Cache) cacheMap.get(key);
    }

    //判断是否存在一个缓存
    private synchronized static boolean hasCache(String key) {
        return cacheMap.containsKey(key);
    }

    //清除所有缓存
    public synchronized static void clearAll() {
        cacheMap.clear();
    }

    //清除某一类特定缓存,通过遍历HASHMAP下的所有对象,来判断它的KEY与传入的TYPE是否匹配
    public synchronized static void clearAll(String type) {
        Iterator i = cacheMap.entrySet().iterator();
        String key;
        ArrayList arr = new ArrayList();
        try {
            while (i.hasNext()) {
                Map.Entry entry = (Map.Entry) i.next();
                key = (String) entry.getKey();
                if (key.startsWith(type)) { //如果匹配则删除掉
                    arr.add(key);
                }
            }
            for (int k = 0; k <arr.size(); k++) {
                clearOnly(arr.get(k).toString());
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    //清除指定的缓存
    public synchronized static void clearOnly(String key) {
        cacheMap.remove(key);
    }

    //载入缓存
    public synchronized static void putCache(String key, Cache obj) {
        obj.setTimeOut(obj.getTimeOut() + System.currentTimeMillis()); //设置缓存失效时间
        cacheMap.put(key, obj);
    }

    //获取缓存信息
    public static Cache getCacheInfo(String key) {

        if (hasCache(key)) {
            Cache cache = getCache(key);
            if (cacheExpired(cache)) { //调用判断是否终止方法
                cache.setExpired(true);
            }
            return cache;
        }else{
            return null;
        }
    }

    //判断缓存是否终止
    public static boolean cacheExpired(Cache cache) {
        if (null == cache) { //传入的缓存不存在
            return false;
        }
        long nowDt = System.currentTimeMillis(); //系统当前的毫秒数
        long cacheDt = cache.getTimeOut(); //缓存内的过期毫秒数
        if (cacheDt <= 0||cacheDt>nowDt) { //过期时间小于等于零时,或者过期时间大于当前时间时,则为FALSE
            return false;
        } else { //大于过期时间 即过期
            return true;
        }
    }

    //获取缓存中的大小
    public static int getCacheSize() {
        return cacheMap.size();
    }

}

企业微信 - 封装JS-SDK使用方法 前言 企业微信JS-SDK是企业微信面向网页开发者提供的基于企业微信内的网页开发工具包。 – 企业微信开发文档 所有的JS接口只能在企业微信应用的可信域名下调用(包括子域名),且可信域名必须有ICP备案且在管理端验证域名归属。 步骤一:引入js文件 在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.2.0.js <script src="//res.wx.qq.com/open/js/jweixin-1.2.0. 阅读详情

相关推荐

Unity微信小游戏接入第三方js端sdk集成指南

该文件用于实现C#与JavaScript之间的调用通信。

weixin_38027841的博客 2833

uniapp开发h5 调用微信sdk 全网最全指南!!!! 血泪史!!!

场景:公司需求是在h5调用扫一扫来识别条形码,经调研发现使用微信sdk是最好的方式。技术栈:uniapp、微信sdk版本:1.6.0先贴(踩的所有坑文档里是一句都不提!!!麻蛋)遇到的问题先抛出来:1.通过后端同学获取调用微信sdk所需的签名过程中,遇到的跨域问题2.使用微信sdk前提必须是微信容器,换句话说就是微信浏览器打开,才能使用微信sdk3.如何在开发本地环境去测试微信sdk的调用情况4.在微信容器使用微信sdk报错,config报错:config:invalid signature。

柑橘乌云_ 1万+

weixin-jssdk:微信 JS-SDK

微信JS-SDK 安装 npm install weixin-jssdk 去做 添加示例 添加文件

微信开发相关:使用微信 JS-SDK 接口

通过微信 JS-SDK 接口,可以在自己写的 JS 程序中使用很多微信的功能。例如微信里的卡片式链接、拍照上传下载图片、录制播放上传下载音频、获取地理位置、使用摇一摇、扫一扫、微信支付等功能。

runsong911的博客 8720

平面变压器PCB绕组设计实战:从原理到布局的工程考量

本文深入探讨了平面变压器PCB绕组设计的工程实践,从基础原理到布局优化,涵盖了电流密度、层间绝缘、绕组拓扑结构等关键参数。通过实战案例分享,解析了高频应用中的集肤效应、邻近效应等挑战,并提供了热管理和EMC优化的实用技巧,助力工程师在服务器电源、车载充电器等空间敏感场景实现高效设计。

weixin_42666036的博客 453

3D Slicer-最强大的开源医学图像分割工具简要概述

3D Slicer 是一个免费的开源软件平台,用于医学、生物医学和其他 3D 图像的可视化、处理、分割、配准和分析。读/写DICOM图像和多种其他格式;三维图像、多边形网格和体积渲染的交互式可视化;手动编辑和标记图像;使用刚性和非刚性算法融合和共同配准数据;图像自动分割;跟踪图像引导程序的设备。所有的功能模块可在工具栏里找到,提供搜索,下拉选择,左右切换等功能。3D slicer的大概情况就介绍到这里。它的功能非常强大,也没有必要说掌握每个功能的使用。

Tina姐的博客 2万+

关于微信js-sdk使用流程整理

关于微信sdk的使用,微信测试号的申请与配置,集前后端代码一体搞定微信分享,测试结果展示...

Program Apes 5048

CANoe_Demo_下载以及安装教程

CANoe Demo下载安装流程

Jar_Lee的博客 1万+

微信JS-SDK集成终极指南:使用wechat-python-sdk实现网页签名与权限验证的完整教程 [特殊字符]

微信JS-SDK是微信公众平台提供的网页开发工具包,通过它可以在网页中调用微信的原生功能,如分享、拍照、录音等。对于Python开发者来说,wechat-python-sdk提供了一个简单高效的方式来实现JS-SDK的签名验证和权限配置。本文将详细介绍如何使用这个工具包快速集成微信JS-SDK功能。 ## 📋 为什么需要JS-SDK签名验证? 在微信网页开发中,所有需要调用微信原生功能的页面

gitblog_02976的博客 578

dToF直方图之美

上面视频里如果你能看懂,那么就能理解对于dToF单点的测距问题,对于大部分的描述在AMS和ST里的手册都非常的详细,有疑问的可以后台来找我探讨,今天我们单纯从上层讨论成像的问题。作为dToF算法工程师,应该是对直方图敏感的,直方图的每个Count峰都会表征出问题,因为dToF的输出只有直方图,观察直方图能够逆推出dToF的很多东西,这也是大多数公司不愿意开放直方图和Raw data的缘故。以上是一个小面阵的分辨率,第一张是直方图,后面是基于直方图寻峰出来的成像ToF图,Peak图,以及噪声Noise图。

dream it possible 2995

手把手教你接入京东购物小程序:从领券到下单的全流程解析

本文详细解析了如何从API申请到领券下单,手把手教你接入京东购物小程序的全流程。涵盖京东联盟账号注册、商品信息获取、优惠券链接转换等关键技术实践,帮助开发者高效实现电商功能集成,提升用户购物体验。

g5h6i的博客 911

终极微信JS开发工具:wechat.js核心功能详解与实战案例

在微信生态开发中,处理分享、网络检测和菜单控制是常见需求。wechat.js是一个轻量级JavaScript库,专门为微信内网页开发提供简洁API,让开发者能够轻松实现微信分享、网络状态检测、菜单控制等功能。这个终极微信JS开发工具简化了复杂的微信JS-SDK调用流程,让开发者专注于业务逻辑而非API兼容性问题。 ## 🚀 为什么选择wechat.js? 微信JS-SDK虽然功能强大,但AP

gitblog_00166的博客 918

基于YOLOv11的手写数字与符号识别系统设计与实现

手写数字与符号识别系统需要丰富多样的训练数据才能达到理想的泛化性能。MNIST:包含70,000个手写数字样本(0-9),28x28灰度图像优点:干净整齐,适合初学者缺点:多样性不足,只有数字EMNIST:MNIST的扩展,包含数字、字母(大小写)和特殊符号样本量:814,255张图像覆盖62个类别(10数字+26小写字母+26大写字母)HASYv2:专门的手写符号数据集包含369个不同符号类别约168,000个标注实例包括数学符号、箭头、括号等:英文手写文本数据库。

YOLO 291

从0到1掌握wechat.js:构建功能完善的微信Web应用

wechat.js是一款专注于微信Web应用开发的JavaScript工具库,提供了分享、网络状态检测、菜单控制等核心功能,帮助开发者快速实现微信环境下的各类交互需求。无论是社交分享功能还是基础的界面控制,wechat.js都能提供简洁易用的API接口,让微信Web应用开发变得简单高效。 ## 📦 快速开始:安装与配置 ### 一键安装步骤 wechat.js支持通过bower包管理器进行

gitblog_00070的博客 776

YOLOv8改进 | Neck篇 | Slim-Neck替换特征融合层实现超级涨点 (又轻量又超级涨点)

本文给大家带来的改进机制是Slim-neck提出的Neck部分,Slim-neck是一种设计用于优化卷积神经网络中neck部分的结构。在我们YOLOv8中,neck是连接主干网络(backbone)和头部网络(head)的部分,负责特征融合和处理,以便提高检测的准确性和效率。亲测在小目标检测和大尺度目标检测的数据集上都有大幅度的涨点效果(mAP直接涨了大概有0.4左右。同时本文对Slim-Neck的框架原理进行了详细的分析,不光让大家会添加到自己的模型在写论文的时候也能够有一定的参照。

Snu77的博客 1万+

实现真正的「人机」对战:引入三方 AI 引擎

引入三方 AI 引擎 前边,我们实现了与云库对战的象棋游戏。这一节中,我们将开始实现真正的「人机」对战 — 人与手机 AI 之间对弈; 实现一套象棋 AI 工程浩大,这个工作我们后续文章会做一番介绍。现代软件工程并不主张每个人都「造轮子」,因此我们要有「站在巨人肩膀上」的小智慧。 本节概要 从 github 寻找开源中象引擎 梳理引擎接入的思路 寻找适合的开源中国象棋引擎 github 上有大...

tosmart的博客 983

Node.js 获取微信JS-SDK CONFIG

&#13; 背景 前端在调用微信提供的分享、拍照、扫一扫等功能时需要到后台获取配置,主要是签名(signature)。Node 开发可以用朴灵大佬的SDK——co-wechat-api。 配置 到微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。前提是该域名的项目目录下有微信提供的校验文件。如果需要本地调试或者测试环境调试,可以把IP白名单也顺便配置一下...

超超不会飞 234

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

从 微信 JS-SDK 认识 JSBridge

前言前段时间由于要实现 H5 移动端拉取微信卡包并同步卡包数据的功能,于是在项目中引入了 微信 JS-SDK(jweixin)[1] 相关包实现功能,但也由此让我对其产生了好奇心,于是打算好好了解下相关的内容,通过查阅相关资料发现这其实属于 JSBridge 的一种实现方式。因此,只要了解 JSBridge 就能明白 微信 JS-SDK 是怎么一回事。为什么需要 JSBridge?相信大多数人...

zz_jesse的博客 540

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

wechat 企业号 php sdk,微信企业号 JS-SDK:上传图片

微信的JS-SDK提供了微信客户端相关的功能,如:拍照、选图、语音、位置等手机系统的能力,同时可以直接使用微信分享、扫一扫等微信特有的能力,为微信用户提供更优质的网页体验。这里将会介绍如何通过调用JS-SDK接口从手机摄像头或相册内上传图片。目录1. 介绍1. 介绍1.1 流程说明首先看下整个Demo的流程:①微信客户端访问页面②获取JS-SDK中的相关权限说明:想使用具体的操作都要在操作之前申请...

weixin_39598954的博客 229

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

uniapp在开发微信H5使用微信js-sdk记录

本文介绍了如何在uni-app中使用jweixin-module插件实现微信功能。该插件支持微信支付、分享、获取用户信息、扫码等功能。首先通过npm安装插件,然后在项目中封装wx-jssdk.js文件,提供初始化、支付、分享等基础方法。使用时导入封装模块,创建实例后即可调用相关功能。文中给出了具体代码示例和调用方法,并提供了微信官方文档链接供参考。

baidu_33927029的博客 1055

.NET微信网页开发之使用微信JS-SDK调用微信扫一扫功能

前言:  之前有个项目需要调用微信扫描二维码的功能,通过调用微信扫码二维码功能,然后去获取到系统中生成的二维码信息。正好微信JS-SDK提供了调用微信扫一扫的功能接口,下面让我们来看看是如何实现的吧。第一步、微信JS-SDK的使用步骤,配置信息的生成获取讲解:  关于JS-SDK的使用步骤和timestamp(时间戳),nonceStr(随机串),signature(签名...

zls365365的博客 1054
上一篇: 文字提示样式
下一篇: vue-cli4中Stylelint配置
My_Java_Life
博客等级 码龄11年 39粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值