React-微信网页开发总结

reactjs+golang 的微信内浏览器支付场景 最近在做支付充值这一块,用的微信支付,发现坑点真不少。由于无golang的sdk于是拿着github上的别人写好的改了改,最终也还是圆满完成了支付这一块。 主要场景:微信支付-H5-微信内发起支付 主要内容:微信网页开发>jssdk>微信商户 开发语言:reactjs+golang 大概的主体思路如下每一步的操作都很重要 微信网页开发配置: 1、在微信后台配置域名(目的:获取openi... 阅读详情

前段时间用React写了几个微信公众号的网页,遇到的主要阻力就是微信的网页授权问题和JS-SDK使用问题。

1. 网页授权

根据微信官方网页授权介绍,只有在需要获取用户信息时,才需要用到微信网页授权机制。关于如何进行网页授权,官方文档已经介绍很详细了,这里主要记录一下使用过程中遇到的问题以及需要注意的地方。

1.1 网页授权access_token

由于一个公众号的网页授权access_token是所有人共用的,如果每个需要用到授权的服务都自己调用微信提供的获取access_token的接口,每调用一次都会刷新一遍access_token,之前的access_token将会过期,access_token也就无法实现缓存。而access_token默认是2小时内有效的,所以在开发时,需要有一个统一的授权中心,授权中心负责access_token的获取缓存和更新。
统一授权还有一个好处:在开发时,公众号上面的不同菜单的网页可能是部署在不同的服务器,但是公众号后台的网页授权域名设置只能设置一个,用统一授权就可以解决这个问题。网页授权域名设置为授权中心的域名,腾讯后台的回调都会回调到授权中心,由授权中心转发重定向回每个菜单的页面。

1.2 回调

调用授权接口时,要求传入一个回调地址redirect_uri。这个redirect_uri的域名必须要和公众号平台-设置-公众号设置-功能设置-网页授权域名一致。

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

回调网页还要一个需要注意的地方:如果调用授权的页面和配置的redirect_uri是同一个页面,会出现从redirect_uri页面后退时,又重新进入到调用授权页,导致无法退出的问题。

这个问题可以通过监听popstate,如果返回到了授权页,则直接调用wx.closeWindow();退出来解决。

    window.addEventListener("popstate", function(e) {
        console.log("test"); 
        var documentUrl = document.location.href;
        console.log("documentUrl=" + documentUrl );
        if (documentUrl.indexOf("weixin.qq.com") !== -1) {
          wx.closeWindow();
        } 
      }.bind(this));

2. 微信JS-SDK

微信JS-SDK说明文档里介绍的引入js-sdk的方式是在script标签里引入http://res.wx.qq.com/open/js/jweixin-1.4.0.js。这种方式在react上并不合适。

2.1 React集成JS-SDK

React上集成的方式和文档介绍的方式只有引入方式不一样,react需要先安装weixin-js-sdk的依赖包,再import。

  1. 在项目目录下执行
npm install weixin-js-sdk
  1. 在需要使用js-sdk的页面引入sdk
import wx from 'weixin-js-sdk';
  1. 之后的步骤和文档介绍的就一样了。
    附上完整的代码
import React from 'react';
import './DeviceList.css';
import Device from './Device';
import DeviceIcon from '../images/device_icon.png';
import ReactList from 'react-list';
import wx from 'weixin-js-sdk';
import InfiniteScroll from 'react-infinite-scroller';

const baseUrl = process.env.PUBLIC_URL;
const serverIp = process.env.REACT_APP_SERVER_IP;
const resourceServerIp = process.env.REACT_APP_RESOURCE_SERVER_IP;
const wxAppId = process.env.REACT_APP_WX_APPID;

const jsAuthAddress = process.env.REACT_APP_WX_JS_AUTH_ADDRESS;

export default class DeviceList extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      tracks: [],
      hasMoreItems: true,
      nextHref: null,
      latitude:-1,
      longitude:0
    };
  }

  componentWillMount() {
    this.fetchSignatureAndLocation();
  }

  componentDidMount() {
    
  }

    loadItems(page) {
      var that = this;
      var url = serverIp + '/devices/' + this.state.longitude + '/' + this.state.latitude + '/'+ page;
      if (this.state.nextHref) {
        url = this.state.nextHref;
      }
      fetch(url)
        .then((res) => res.json())
        .then((responseJson) => {
          if (responseJson.flag == "00") {
            var tracks = that.state.tracks;
            responseJson.data.list.map((track) => {
              tracks.push(track);
            });
            if (responseJson.data.hasNextPage) {
              that.setState({
                tracks: tracks,
                nextHref: serverIp + '/devices/' + this.state.longitude + '/' + this.state.latitude + '/' + responseJson.data.nextPage
              });
            } else {
              that.setState({
                hasMoreItems: false
              });
            }
          } else {
            alert(responseJson.message);
          }


      }); 
  }

  checkJSApi() {
      wx.checkJsApi({
          jsApiList: [
               'getLocation'
            ],
            success: function (res) {
                console.log('wx check js api',res);
                if (res.checkResult.getLocation === false) {
                    alert('你的微信版本太低,不支持微信JS接口,请升级到最新的微信版本!');
                    return;
                }
            }
      });
}

  fetchSignatureAndLocation() {
    var that = this;
    var url = jsAuthAddress +'?appid='+ wxAppId + '&url=' + resourceServerIp + baseUrl + "/";//统一授权中心
    fetch(url)
    .then((res) => res.json())
    .then((responseJson) => {
          console.log(responseJson.message)
          wx.config({
            debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
            appId: wxAppId, // 必填,公众号的唯一标识
            timestamp: responseJson.timestamp, // 必填,生成签名的时间戳
            nonceStr: responseJson.noncestr, // 必填,生成签名的随机串
            signature: responseJson.signature,// 必填,签名
            jsApiList: [       
              'checkJsApi',
              'openLocation',
              'getLocation'
              ] // 必填,需要使用的JS接口列表
          });
          wx.ready(function () {
              console.log('wx config ready');
              //基础接口判断当前客户端版本是否支持指定JS接口
              wx.getLocation({
                type : 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
                success : function(res) {
                    
                    // alert(JSON.stringify(res));
                    var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
                    // $("#latitude").val(latitude);
                    var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
                    // $("#longitude").val(longitude);
                    var speed = res.speed; // 速度,以米/每秒计
                    // $("#speed").val(speed);
                    var accuracy = res.accuracy; // 位置精度
                    // $("#accuracy").val(accuracy);
                    that.setState({
                      longitude: res.longitude,
                      latitude: res.latitude
                    })
                },
                cancel : function(res) {
                    alert('用户拒绝授权获取地理位置');
                }
            });
          });
          wx.error(function(res){
            console.log('wx error', res);
             alert('wx config error');
               // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
          });
        })
    .catch((error) => {
      console.error(error);
    });

  }

  renderItem(index, key) {
    var distanceStr = '距离您' + this.state.deviceList[index].distance;
    var metroStationDes = this.state.deviceList[index].metroLine + '-'+ this.state.deviceList[index].name 
    return (<Device deviceDistance={distanceStr} deviceName={metroStationDes}   imageURL={DeviceIcon}></Device>);
  }

  render() {
    const loader = <div className="loader">Loading ...</div>;
    var items = [];
    let scrool;
    this.state.tracks.map((track, i) => {
      var distanceStr = '距离您' + track.distance;
      var metroStationDes = track.metroLine + '-'+ track.name;
      items.push(
          <div className="track" key={i}>
              <Device deviceDistance={distanceStr} 
              deviceName={metroStationDes}
              imageURL={DeviceIcon}></Device>
          </div>
            );
        });
    if (this.state.latitude != -1) {
      scrool = <InfiniteScroll
                pageStart={0}
                loadMore={this.loadItems.bind(this)}
                hasMore={this.state.hasMoreItems}
                loader={loader}>

                <div className="tracks">
                    {items}
                </div>
            </InfiniteScroll>
    }

return (
			<div class="DeviceListContainer">
        		<div class="DeviceListView">
         			 {scrool}
       			 </div>
       		</div>
			)
	}
}

2.2 授权

引入JS-SDK也是需要授权的,我们也可以做一个统一的授权中心。和网页授权不一样的是,即使有这个统一的授权中心,同一个公众号的使用了js-sdk的网页必须部署在同一个服务器下。因为js-sdk的不仅校验回调的域名,还会校验使用js-sdk的网页路径,只有调用腾讯的授权接口时传入的回调url和我们网页部署之后访问的url一致才能通过校验。

react-react版本的微信js基础服务 react版本的微信js基础服务 立即下载

相关推荐

react-wxsdk:基本react的微信帮助类

react-wxsdk +应用于react的微信sdk帮助类 打包编译命令 npm run build npm install npm install smalleast/react-wxsdk --save

React Typescript项目对接微信jssdk

微信sdk

qq_27762267的博客 1239

SQLite性能优化:从WAL模式到内存映射的深度解析

本文深入解析SQLite性能优化策略,重点介绍WAL模式和内存映射技术的应用。通过合理配置WAL日志、同步策略和事务批处理,SQLite的IO吞吐量可提升3-5倍。结合内存映射和缓存优化,性能可进一步提升至默认配置的50倍,适用于高并发读写场景。

weixin_29231027的博客 455

React配置微信jssdk关闭公众号分享等

前文: react本身是单页面,通过路由加载组件显示页面。微信官方案例说明,在安卓端没问题,但是在ios下异常。不能关闭,提示签名错误。 文档: 微信官方文档:https://qydev.weixin.qq.com/wiki/index.php?title=%E5%BE%AE%E4%BF%A1JS-SDK%E6%8E%A5%E5%8F%A3 复制微信打开看效果:https://www.weixinsxy.com/jssdk/ 解决原理: 一: ios下每次传递的url配置参数,是最初第一个进来时候的全连接

刻痕 1570

用示波器抓取同步Buck自举电容波形:从充电回路到SW节点振铃的完整分析

本文通过实测TI TPS54561和MPS MPQ4572同步Buck芯片,详细解析了自举电容在充电、维持和放电三个工作阶段的波形特征。重点揭示了电感泄放回路与充电回路重叠时,在SW节点引发的振铃现象及其产生机理,并提供了串联阻尼电阻等有效的工程抑制方法。文章结合示波器实测,为硬件工程师提供了从波形观测到问题调试的完整实践指南。

weixin_29276847的博客 374

告别OLE!Delphi操作Excel的3种轻量级方案横向评测(FlexCel/XLSReadWriteII/LibXL)

本文深入评测了Delphi操作Excel的三种轻量级方案:FlexCel、XLSReadWriteII和LibXL。通过技术架构、API设计、性能测试和实战案例的全面对比,帮助开发者选择最适合的工具,提升Excel文件处理效率,告别传统OLE方案的依赖和性能问题。

onion的博客 932

前端react对接企业微信JS-SDK

前端react对接企业微信JS-SDK 官方地址: https://work.weixin.qq.com/api/doc/90000/90136/90514 步骤一:index.html中引入JS文件 <script src="//res.wx.qq.com/open/js/jweixin-1.2.0.js"></script> //调用 wx.agentConfig需要额外引入下面的: <script src="https://open.work.weixin.qq.com/

weixin_41827052的博客 2281

医药行业SAP序列号管理深度解析:如何满足GMP合规要求

本文深度解析了医药行业如何利用SAP序列号管理构建满足GMP合规要求的数字化追溯体系。文章详细阐述了SAP序列号在实现从生产到患者全流程“一物一码”精准追溯中的核心作用,并探讨了其与质量管理、冷链监控等系统的关键集成配置,为医药企业应对严格监管、保障产品质量与安全提供了切实可行的技术方案。

backprop5master的博客 656

react,tsx中使用微信jssdk分享总结

在React项目内终端下载 在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.2.0.js 在页面上方一引入weixin-js-sdk,若在react-tsx页面内报错,在pages内创建types文件夹-创建index.d.ts文件: 配置next.config.js文件内域名代理 一些踩坑: 如遇到import wx from ‘weixin-js-sdk’ 报错找不到window,则可按需引入

weixin_48315912的博客 3257

手把手教你用SpringBoot+Vue3+Docker从零搭建一个在线OJ系统(附完整源码)

本文详细介绍了如何使用SpringBoot、Vue3和Docker从零搭建一个在线OJ系统,涵盖前后端开发、判题机实现及Docker容器化部署。通过完整的源码和实战步骤,帮助开发者掌握OJ系统的核心架构与关键技术,适用于算法训练、编程竞赛等场景。

weixin_42648844的博客 297

SAP BASIS运维之三方SSL证书导入

事情的起因是我司SAP使用的SSL证书即将要到期了(上一个的SAP BASIS也辞职了),需要进行证书的更换。如上图所示,我司的证书有效期到2024年4月30日到期,需要提前预防并更换,防止过期后导致接口和访问出现问题。9.在弹出的框中,选择我们在第5个步骤中导出的转换结果存储地址,并选择导出的转换文件,点打开。12.最后一步也是关键的一步,不然就会无法更新证书,再点击左上角的个人安全环境,点另存为。10.在打开后的弹窗中,输入我们在第4个步骤中设置的密码。6.经过以上步骤后,我们获得了最终的证书文件。

fegda的专栏 1885

React项目中加入微信分享

第二部:获取数据,拿到appId,timestamp,nonceStr,signature(必填,很重要,后端那配置好获取接口就行)appId: data.appId, //appId通过微信服务号后台查看。timestamp: data.timestamp, //生成签名的时间戳。nonceStr: data.nonceStr, //生成签名的随机字符串。debug: false, ////生产环境需要关闭debug模式。signature: data.signature, //签名。

insist_Y的博客 976

(三十九)Flask 多应用架构(Multiple Apps)与 DispatcherMiddleware 实战解析

(三十九)Flask 多应用架构(Multiple Apps)与 DispatcherMiddleware 实战解析

孤寒者的博客 1万+

React Native WeChat高级用法:如何实现朋友圈分享和文件传输

想要在React Native应用中集成微信分享功能吗?react-native-wechat库为你提供了完整的解决方案!这个强大的桥接库让开发者能够轻松实现朋友圈分享和文件传输功能,为你的移动应用增添社交分享能力。😊 ## 为什么选择React Native WeChat? react-native-wechat是一个专业的React Native桥接库,支持最新的微信SDK版本,包括iO

gitblog_00384的博客 690

Android 埋点信息分析——statsd框架

StatsPullAtomService 用以采集数据,并将数据填充到参数中,在StatsManager.PullAtomCallbackInternal 中会转换成 Parcel 格式传入到 native。 StatsCallbackPuller::PullInternal 中会回调StatsManager.PullAtomCallbackInternal 的onPullAtom,该函数中会回调StatsCallbackPuller::PullInternal 中定义的PullResultRecei

私房菜 2631

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

使用微信开发者工具调试微信网页授权登录-react

转:https://www.jianshu.com/p/9ced1a297c95 1.使用localhost本地调试 使用微信开发者工具, 选择微信网页授权, 微信团队为广大的开发者提供了一个测试账号。该帐号无需公众账号,快速申请接口测试,直接体验和测试公众平台所有高级接口。这么好用的功能,只需要要你有一个手机,手机上安装了一个微信即可。 地址:https://mp.weixin.qq.co...

周鹏的博客 7396

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

微信网页开发

微信网页开发是微信生态中容易被忽略但实际应用广泛的技术领域。它不仅限于公众号和小程序,而是通过H5页面与微信原生能力深度结合,形成灵活的功能扩展方案。

m0_51429350的博客 1750

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

3分钟带你了解微信小程序开发

微信小程序是腾讯2017年1月9日正式上线的一种基于微信的无需安装的应用程序简单粗暴的理解就是运行在微信中的应用程序,如果没有安装微信则不能运行无需安装只是宣传噱头,本质上小程序也是需要下载安装的.只不过微信官方对小程序安装的大小有严格的限制(单包2M/总包20M),所以下载安装非常快,以至于给用户一种无需安装的错觉小程序是一种介于网页和原生APP之间的应用程序它既拥有原生APP良好的用户体验和良好的系统契合度,又拥有网页较低的开发成本和极佳的传播速度唯一值得注意的两点是。...

m0_54853420的博客 259

react网页版聊天室|仿微信react+web版

一、项目介绍 基于react+react-dom+react-router-dom+redux+react-redux+webpack2.0+nodejs等技术混合开发的reactWebChat仿微信网页版聊天室,实现了聊天记录右键菜单、发送消息、表情(动图),图片、视频预览,浏览器截...

chourenchan4303的博客 742

React 微信页面开发过程

今天记录下使用React 开发微信网页的经历 0.提示 微信有很多平台,例如公众平台,开放平台,订阅号,服务号,小程序等等 1.使用服务号ID(订阅号比较恶心,不关注就不能用我们的页面,所以为了解决这个问题直接使用服务号) 2.引入Js-sdk,目的是使用微信的登录,分享,支付 在public文件下,index.html里面引入 <script type="text/javas...

hopefullman的博客 438

微信网页-隐藏分享

在使用react开发微信网页的时候,发现直接在componentWillMount中调用微信隐藏分享的接口wx.hideOptionMenu();在第一次进入页面的时候,发现分享没有被隐藏掉. 进入其他页面后再返回,这时分享被隐藏了. 解决: wx.ready(function(){ // config信息验证后会执行ready方法,所有接口调用都必须在config接口获...

287

【微信小游戏学习心得】

本人通过学习了解微信小游戏,学习微信小游戏,加深了对前端框架,vue和react基于数据驱动视图的理解,及浏览器文档模型和javaScript之间的关系。帮助本人更好的工作和学习前端领域的编程。因为2d小游戏提供了一个画布,并没有浏览器文档模型和层叠样式表。所以整个绘制过程需要自己实现。其复杂度是大于常规网页开发的。借助一些游戏类引擎可以帮我们简化开发。而数据驱动视图应该是电脑系统的工作模式。我们开发的app也是借助了系统的原生能力。

qq_52440306的博客 1068

taro多端开发

react语法,跨端开发,支持打包app(reactNative),如果你熟悉React,不懂Vue.js,推荐Taro。如:小程序中的 wx.request(),在taro中是 Taro.request().then().catch()1、若要支持 React Native 端,必须采用 Flex 布局,并且样式选择器仅支持类选择器,思想:对齐短板;1、在 App 类中的 render() 函数没有实际作用,不写逻辑,不会起作用;src/app.config.js 里的 == 小程序app.json。

2301_81919613的博客 1789

reactjs+golang微信支付的充值功能

最近在做支付充值这一块,用的微信支付,发现坑点真不少。由于无golang的sdk于是拿着github上的别人写好的改了改,最终也还是圆满完成了支付这一块。 主要场景:微信支付-H5-微信内发起支付 主要内容:微信网页开发>jssdk>微信商户 开发语言:reactjs+golang 大概的主体思路如下每一步的操作都很重要微信网页开发配置:1、在微信后台配置域名(目...

weixin_33941350的博客 401

微信网页调试小记

近期在用mater-ui(react)开发一个用于手机端的网页,遇到了一些坑,记录一下。提交表单的时候,按钮无论如何也点击不动,由于微信中浏览器的特殊性,一直没找到合适的调试方式。 在chrome中和安卓上都运行的没问题,到了ios平台的微信网页中没报错,按钮就是点不动。 经过多次调试探究,在表单提交的回调函数中直接alert(err)ws.insert(obj, function (err,

~ 1239

终极桌面微信客户端weweChat完整使用指南:免费开源替代方案

还在为官方微信客户端的功能限制而烦恼吗?weweChat是一款基于React、MobX和Electron技术构建的免费开源桌面微信客户端,专为追求高效办公和便捷沟通的用户设计。这款第三方微信替代品不仅保留了官方客户端的核心功能,还增加了许多实用的增强特性,让你在电脑上也能享受完整的微信体验。无论是日常聊天、文件传输还是批量消息发送,weweChat都能满足你的需求,彻底告别手机依赖。 ## 🚀

gitblog_00867的博客 898
上一篇: 解决-前端:如何格式化Date对象
下一篇: React-使用Sublime Text3开发的必备工具
Huang-Lin
博客等级 码龄10年 20粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值