公众号node服务与前端关联

一:前期准备:

首先你需要一台服务器,:阿里云或者腾讯云啥的,最便宜的可以选择类似阿里云这种轻量级服务器,和域名配置好A记录。

需要在服务器打架node环境:可以找客服帮忙基本配置环境搭好。

需要有一个自己的公众号:官方详见文档

二:配置

公众号配置:IP白名单:为服务器IP地址。


公众号配置:JS接口安全域名。


node后端JS代码:

var express = require('express'); //node的一个框架 就是相当于jquery

var path = require('path');

var request = require('request');

var ejs = require('ejs'); // 后台模板库

var wechat = require('wechat'); //第三方处理微信推送的库

var https = require('https'); // node 端 请求别的服务的模块

var sign = require('sign'); //微信提供的签名工具

const stringRandom = require('string-random')

const crypto = require('crypto')

var app = express();

app.use("*", function (req, res, next) {

  res.header('Access-Control-Allow-Origin', '*');

  res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");

  res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");

  // if (req.method === 'OPTIONS') {

  //  res.send(200)

  // } else {

  //  next()

  // }

    next()

});

const getSha1 = function(str) {

  var sha1 = crypto.createHash("sha1"); //定义加密方式:md5不可逆,此处的md5可以换成任意hash加密的方法名称;

  sha1.update(str);

  var res = sha1.digest("hex"); //加密后的值d

  return res;

};

const getSignature = function(nowUrl,key){

  let noncestr = stringRandom(16,{numbers:false})

  let timestamp = new Date().getTime()

  let jsapi_ticket = `jsapi_ticket=${key}&noncestr=${noncestr}&timestamp=${timestamp}&url=${nowUrl}`;

  let signature = getSha1(jsapi_ticket)

  return {

    noncestr,

    timestamp,

    signature

  }

}

app.set('views', './views');

app.engine('.html', ejs.__express);

app.set('view engine', 'html');

app.use(express.static('./'));

//发送请求

app.get('/index', function(req, res) {

    console.log('this is index')

    res.render('index');

});

//处理URL 验证的 微信服务器要通过get请求来测试的

app.get('/weixin', wechat('wechat', function(req, res, next) {

    console.log('true');

}));

//处理后台获取签名的请求

app.post('/getSignature', function(req, res) {

    let nowurl = req.headers['referer']

    console.log(nowurl)

    console.log('this is getSignature')

    var token = 'wechat',

        appsecret = '', //你申请的

        APPID = '', //你申请的id

        url = '' //JS接口安全域名 参与签名用的

    Res = res;

    //发送https get请求 获取 access_token;l

    https.get("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + APPID + "&secret=" + appsecret, function(res) {

        var datas = [];

        var size = 0;

        res.on('data', function(data) {

            datas.push(data);

            size += data.length;

        });

        res.on("end", function() {

            var buff = Buffer.concat(datas, size);

            var result = buff.toString();

            //console.log(JSON.parse(result).access_token);

            // 获取 jsapi_ticket //异步嵌套是不合理的 不推荐这样 使用promise

            https.get('https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=' + JSON.parse(result).access_token + '&type=jsapi', function(res) {

                var datas = [];

                var size = 0;

                res.on('data', function(data) {

                    datas.push(data);

                    size += data.length;

                });

                res.on('end', function() {

                    var buff = Buffer.concat(datas, size);

                    var rlt = buff.toString();

                    let resultData = getSignature(nowurl,JSON.parse(rlt).ticket)

                    rlt = Object.assign(JSON.parse(rlt),resultData)

                    // var config = sign(JSON.parse(rlt).ticket, url);

                    // console.log(111,config)

                    Res.json(rlt);

                });

            }).on('error', function(e) {

                console.log("Got error: " + e.message);

            })

        });

    }).on('error', function(e) {

        console.log("Got error: " + e.message);

    });

});

var server = app.listen(80, function() {

    var host = server.address().address;

    var port = server.address().port;

    console.log('Example app listening at http://%s:%s', host, port);

});

前端代码:

先设置wx.config

this.$post("/getSignature", {}).then(config => {

                console.log(config)

                // config = JSON.parse(config);

                if (config != undefined && config != null) {

                    wx.config({

                        debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。

                        appId: '', // 必填,appID公众号的唯一标识

                        timestamp: config.timestamp, // 必填,生成签名的时间戳

                        nonceStr: config.noncestr, // 必填,生成签名的随机串

                        signature: config.signature,// 必填,签名,见附录1

                        jsApiList: ['getLocation', 'scanQRCode', 'closeWindow', 'checkJsApi', 'startRecord', 'stopRecord', 'translateVoice', 'openCard','chooseImage']

                        // 必填,需要使用的JS接口列表,所有JS接口列表见附录2

                    });

                    // alert('配置成功!');

                }

            });

在调取微信接口

wx.ready(function () {

    wx.getLocation({

        type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'

        success: function (res) {

            var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90

            var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。

            var speed = res.speed; // 速度,以米/每秒计

            var accuracy = res.accuracy; // 位置精度

            console.log(latitude,longitude,speed,accuracy)

            alert(latitude,longitude,speed,accuracy)

        }

    });

    wx.scanQRCode({

        needResult: 0, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,

        scanType: ["qrCode","barCode"], // 可以指定扫二维码还是一维码,默认二者都有

        success: function (res) {

            var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果

            alert(result);

        }

    });

})

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,951评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,606评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,601评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,478评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,565评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,587评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,590评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,337评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,785评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,096评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,273评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,935评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,578评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,199评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,440评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,163评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,133评论 2 352