微信网页开发验证及调用接口经验分享

要想自定义微信分享的标题、图标等,就需要调用微信相应的接口,本文主要介绍微信接口权限的验证及之后的调用接口的过程。

整体思路

首先是微信公众后台配置js 接口安全域名,然后是需要在前端网页中引入js 文件:http://res.wx.qq.com/open/js/jweixin-1.2.0.js

之后微信文档便提供了权限验证的config 接口,也需要之后在前端网页中引用:

wx.config({
    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    appId: '', // 必填,公众号的唯一标识
    timestamp: , // 必填,生成签名的时间戳
    nonceStr: '', // 必填,生成签名的随机串
    signature: '',// 必填,签名,见附录1
    jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});

不过上面的内容是需要在服务器端运行微信提供的特定算法生成,然后再返回至前端网页中的。

代码整体逻辑部分

所以下面介绍整个验证的逻辑,包括服务器端和前端:

  1. 根据公众号的appId 和appSecret 先从微信服务器获取access_token ,且需要全局缓存,每7200 秒重新获取一次。
  2. 根据access_token 从微信服务器获取jsapi_ticket ,也需全局缓存在程序变量中,每7200 秒重新获取一次。
  3. 根据jsapi_ticket 和其他的随机字符串、时间戳、url 地址等运行微信提供的算法,生成signature
  4. 此时将时间戳、随机字符串、签名等信息写入上面前端的js 中,然后前端网页引用即可。
  5. 前端网页通过微信自带浏览器打开时,微信肯定会通过我们给出的签名、随机字符串、时间戳等信息自己运行一篇算法,如果结果一致,那接下来就会在wx.ready 接口中处理之后逻辑了。如果结果不一致,将会调用wx.error 接口。
  6. 验证成功,即可调用微信自带的各种接口如分享、扫一扫等。

代码详细分享 - node

我后端用的是node 实现的,所以下面介绍下node 的代码。

第一步、获取access_token

注意appId 和appSecret 需替换成自己公众号的对应字符:

var wxAssToken = {
    appId: appId,
    appSecret: appSecret,
    assToken: '',
    timeStamp: Date.now(),
    getAssToken: function(cb){
        if (this.assToken && (Date.now() - this.timeStamp < 7000000)) {
            console.log('使用本地缓存的assToken');
            cb(this.assToken);
        } else {
            console.log('联网获取assToken');
            var link = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' + this.appId + '&secret=' + this.appSecret;
            var that = this;
            https.get(link, function(res){
                var body = [];
                res.on('data', function(chunk){
                    body.push(chunk);   
                });
                res.on('end', function(){
                    body = Buffer.concat(body).toString();
                    that.assToken = JSON.parse(body).access_token;
                    that.timeStamp = Date.now();
                    cb(that.assToken);
                });
            });
        }
    }
};

我是直接新建了一个对象,对象中可缓存微信的access_token ,然后调用时直接使用此对象的getAssToken 方法,在回调函数中的第一个参数即为access_token。每7000 秒间隔会重新从微信服务器请求一次。

第二步、获取jsapi_ticket

和第一步获取access_token 逻辑完全相同,下面代码中引用了生成签名的函数sign 放在之后介绍:

var wxJsTic = {
    jsTic: '',
    timeStamp: Date.now(),
    sign: {},
    getJsTic: function(assToken, cb){
        if (this.jsTic && (Date.now() - this.timeStamp < 7000000)) {
            console.log('使用本地缓存的sign');
            cb(this.sign);
        } else {
            console.log('联网获取sign');
            var link = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=' + assToken + '&type=jsapi';
            var that = this;
            https.get(link, function(res){
                var body = [];
                res.on('data', function(chunk){
                    body.push(chunk);   
                });
                res.on('end', function(){
                    body = Buffer.concat(body).toString();
                    that.jsTic = JSON.parse(body).ticket;
                    that.timeStamp = Date.now();
                    that.sign = sign(that.jsTic, 'https://www.84games.com/jike/');
                    cb(that.sign);
                });
            });

        }
    }
};

第三步、签名算法部分

此部分微信官方已经提供了实例代码,包含php、java、nodejs 及python 的代码,直接访问文档进行下载即可。我是直接引用的微信官方的函数:

var sign = require('./sign.js');

第四步、网页请求时将sign 对象中的参数返回至前端即可

首先定义函数getSign ,此函数中会调用第一步和第二步的函数,且回调函数的第一个参数即算法生成的sign 对象:

function getSign(cb){
    wxAssToken.getAssToken(function(assToken){
        wxJsTic.getJsTic(assToken, function(sign){
            cb(sign);
        });
    });
}

module.exports = getSign;

然后直接在路由函数中返回特定的js 文件至前端即可,下面的getWeixinKey 函数即为上面代码所导出的getSign 方法,下面是使用express 做服务器端程序,表示请求main.js 文件时,会先对此文件替换上面算法生成的部分,然后再返回数据:

var getWeixinKey = require('./getWeixinKey');

router.get('/main.js', function(req, res){
    getWeixinKey(function(sign){
        fs.readFile(path.join(__dirname, './main.js.txt'), function(err, data){
            if (err) throw err;
            data = data.toString().replace('{{noncestr}}', sign.nonceStr).replace('{{timestamp}}', sign.timestamp).replace('{{signature}}', sign.signature);
            res.send(data);
        });
    });
});

第五步和第六步、前端验证部分

前面四部都是在服务器端进行的,第五步和第六步会回到前端网页中:

// 验证部分,双大括号中对应的参数会在上面代码中先替换再返回至前端
wx.config({
    debug: true,
    appId: 'wx175e7902f419b624',
    timestamp: '{{timestamp}}',
    nonceStr: '{{noncestr}}',
    signature: '{{signature}}',
    jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage']
});

// 如果验证成功,则可以调用微信自带接口,本程序调用了分享至朋友圈和分享至好友的接口
wx.ready(function(){
    console.log('ready');           
    wx.onMenuShareTimeline({
        title: '分享至朋友圈的标题',
        link: '前端网页url地址',
        imgUrl: '图标地址',
        success: function(){ // 分享成功后调用此方法
            console.log('share success');
        },
        cancel: function(){ // 取消分享调用此方法
            console.log('share cancel');
        }
    });

    wx.onMenuShareAppMessage({
        title: '分享给好友的标题',
        desc: '分享给好友的描述',
        link: '前端网页url地址',
        imgUrl: '图标地址'
    });
});

// 验证错误是会打印错误对象,方便查找错误具体信息
wx.error(function(res){
    console.log('error');
    console.log(res);       
});

参考

微信文档

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

推荐阅读更多精彩内容