【hash/history路由模式通用】微信公众号h5授权前端代码(中转授权页,解决微信公众号网页授权域名不足问题)

概述

本文章使用中转授权页,解决了存在多个域名时,微信公众号网页授权域名不足的问题,hash和history路由模式通用

一、 授权中转页代码(HTML)

将中转页代码放置于一个服务器文件下

//getAuthorized.html
// An highlighted block
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>微信授权</title>
</head>

<body>
  <script>
    function geturl(data) {
      var url = document.location.toString();
      var Objs = url.split("?");
      if (Objs.length > 1) {
        var arr = Objs[1].split("&");
        var newarr;
        for (var i = 0; i < arr.length; i++) {
          newarr = arr[i].split("=");
          if (newarr != null && newarr[0] == data) {
            return newarr[1];
          }
        }
      }
    }
    if (geturl('code')) {
      let code=geturl('code')
      let sourceUrl=localStorage.source
      document.location.replace(
        `${sourceUrl}?code=${code}`
      );
    } else {
      localStorage["source"]=geturl('redirect_uri')
      const redirect_uri = location.href.split("?")[0];
      const appid = geturl('appid'); //公众号的唯一标识
      const scope = geturl('scope')||'snsapi_base'
      const state = geturl('state')||'STATE'
      document.location.replace(
        `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&redirect_uri=${redirect_uri}&response_type=code&scope=${scope}&state=${state}#wechat_redirect`
      );
    }
  </script>
</body>

</html>

二、 项目中使用代码

        onLaunch(e) {
           // 微信浏览器内公众号h5获取openid
			const ua = window.navigator.userAgent.toLowerCase()
			if (ua.match(/MicroMessenger/i) == 'micromessenger') {
				const openid = uni.getStorageSync('OPENID');
				const code = uni.getStorageSync('CODE');
				const appid = "你的appid"; //公众号的唯一标识
				const redirect_uri = location.href; 
				const scope = "snsapi_userinfo" //授权类型
				if (!code && !(e && e.query && e.query.code) && !openid) {
					//不存在存储的code 不存在地址参数code 不存在openid
					//存储当前初始页面历史列表数量
					uni.setStorageSync("historyLength", history.length);
					//获取code
					document.location.replace(
						`https://你的放置域名/getAuthorized.html?appid=${appid}&redirect_uri=${redirect_uri}&response_type=code&scope=${scope}&state=STATE#wechat_redirect`
					);
				} else if ((e && e.query && e.query.code) && !openid) {
					//存在地址参数code 不存在openid
					uni.setStorageSync('CODE', e.query.code);
					const historyLength = uni.getStorageSync("historyLength");
					//跳转回初始页面
					history.go(-(history.length - historyLength));
				} else if (code && !openid) {
					//存在存储的code 不存在openid
					uni.removeStorageSync('CODE');
					//请求后端接口用code换取openid
					(你封装的接口请求)
					requestLogin({
						method: 'POST',
						data: {
							code: code,
						},
						success(res) {
						//保存用户的openid
					    uni.setStorageSync('OPENID', isExist);
					    (你的换取成功后操作逻辑)
						},
						fail: (err) => {
							uni.clearStorageSync('OPENID')
						}
					}'/getWxOpenid')
				}
			}
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以的,以下是一个简单的Node.js代码示例,用于接入微信公众号: ```javascript const express = require('express'); const bodyParser = require('body-parser'); const xml2js = require('xml2js'); const app = express(); // 配置body-parser中间件以解析POST请求体 app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.text({ type: '*/xml' })); // 接收微信服务器发送的POST请求 app.post('/wechat', (req, res) => { // 解析POST请求体中的XML数据 xml2js.parseString(req.body, { explicitArray: false }, (err, xml) => { if (err) { console.error(err); return res.send('error'); } // 处理接收到的消息 const message = xml.xml; console.log(message); // 回复消息 const reply = `<xml> <ToUserName><![CDATA[${message.FromUserName}]]></ToUserName> <FromUserName><![CDATA[${message.ToUserName}]]></FromUserName> <CreateTime>${Math.floor(Date.now() / 1000)}</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[你好,我是机器人]]></Content> </xml>`; res.send(reply); }); }); app.listen(80, () => console.log('Server started.')); ``` 以上代码使用了Express框架和body-parser中间件,用于接收微信服务器发送的POST请求并解析XML数据。在接收到消息后,回复一个简单的文本消息。需要注意的是,以上代码仅作为示例使用,实际开发中需要根据自己的业务需求进行更改和扩展。 ### 回答2: 下面是一个使用Node.js接入微信公众号的示例代码: ```javascript const express = require('express'); const crypto = require('crypto'); const xml2js = require('xml2js'); const request = require('request'); const bodyParser = require('body-parser'); const app = express(); app.use(bodyParser.urlencoded({ extended: false })); const token = 'your_token'; // 验证微信服务器签名 app.get('/wechat', (req, res) => { const { signature, timestamp, nonce, echostr } = req.query; const hash = crypto.createHash('sha1'); const arr = [token, timestamp, nonce].sort().join(''); const encrypted = hash.update(arr).digest('hex'); if (encrypted === signature) { res.send(echostr); } else { res.send('Invalid signature'); } }); // 处理微信服务器发来的消息 app.post('/wechat', (req, res) => { const parser = new xml2js.Parser(); let xml = ''; req.on('data', (chunk) => { xml += chunk; }); req.on('end', () => { parser.parseString(xml, (err, result) => { if (err) { console.error(err); res.send('Bad request'); } else { const msgType = result['xml'].MsgType[0]; const content = result['xml'].Content[0]; const reply = generateReply(msgType, content); // 根据收到的消息生成回复内容 res.set('Content-Type', 'text/xml'); res.send(reply); } }); }); }); // 生成回复消息 function generateReply(msgType, content) { const replyContent = 'This is the reply message.'; // 设置回复内容 const replyXml = `<xml> <ToUserName><![CDATA[${content.FromUserName}]]></ToUserName> <FromUserName><![CDATA[${content.ToUserName}]]></FromUserName> <CreateTime>${Date.now()}</CreateTime> <MsgType><![CDATA[${msgType}]]></MsgType> <Content><![CDATA[${replyContent}]]></Content> </xml>`; return replyXml; } app.listen(80, () => { console.log('Server is running on port 80.'); }); ``` 上述代码使用Express框架创建了一个Node.js应用程序,监听在80端口。通过`GET /wechat`路由来进行微信服务器的签名验证,通过`POST /wechat`路由来处理微信服务器发来的消息。在`generateReply`函数中,可以根据收到的消息类型和内容生成相应的回复内容。 ### 回答3: 在Node.js中接入微信公众号可以使用wechaty模块实现,以下是一个简单的示例代码: ```javascript const { Wechaty } = require('wechaty'); const bot = new Wechaty({ puppet: 'wechaty-puppet-wechat' }); bot.on('scan', (qrcode, status) => { if (status === 0) { const qrcodeImageUrl = ['https://wechaty.js.org/qrcode/', encodeURIComponent(qrcode)].join(''); console.log(`Scan QR Code to login: ${qrcodeImageUrl}`); } }); bot.on('login', (user) => { console.log(`User ${user} logged in`); }); bot.on('message', (message) => { console.log(`Received message: ${message.text()}`); }); bot.start().then(() => console.log('Bot started')); ``` 以上代码使用`wechaty`模块实现了一个简单的微信机器人。首先,引入`Wechaty`类,然后创建一个`wechaty`实例。接下来,注册了一些事件处理程序,在扫描二维码、登录和接收消息时分别触发相应的事件。当扫描到二维码时,会输出二维码的链接;当登录成功时,会输出登录用户的信息;当收到消息时,会输出消息内容。 最后,调用`start()`方法启动机器人。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值