微信公众号开发
说明:由于最近开发公众号,特写篇文章来记录下开发流程和开发中的坑。
开发用的技术为 react + express , nodejs作为中间层。
一.配置篇
首先申请接口测试号
地址:https://mp.weixin.qq.com/wiki...
上面为测试号配置页面
1.接口配置信息 修改
这里的接口配置信息 需要和 微信进行一次通信,才能够填写。
这一层通信是在nodejs层里进行的。
在项目里创建一个路由,通信代码如下:
const sha1 = require('sha1');
router.get('/wx', function(req, res) {
const {
signature,
timestamp,
nonce,
echostr
} = req.query;
const token = config.token;
let str = [token, timestamp, nonce].sort().join('');
const sha = sha1(str);
if( sha === signature) {
console.log('验证成功')
res.send(echostr);
} else {
console.log('验证失败')
res.send('验证失败');
}
});
这里的URL就是填写你通信路由的地址,Token要和 通信代码中的 token保持一致。
然后点击 提交 按钮,微信就会向你填写的URL发起请求。URL和Token无误,即可提交成功。
2.JS接口安全域名
主要是在调用微信JS-SDK时用到。
这里我们有做一个朋友圈分享功能,要调用SDK的页面和分享的链接,要填写在安全域名下,才能成功
(在下面的微信JS-SDK使用会讲到)
3.授权回调页面


这里的域名填写你项目的域名(例如): xxx.com 即可,不需要加http/https。
到这里为止测试号配置就完成了!!!
二.微信网页授权篇
接口地址为:https://mp.weixin.qq.com/wiki...
这里你可以使用此地址上的接口进行自己编写,也可以使用别人封装好的SDK。
这里我使用的别人封装好的SDK
https://github.com/node-webot...
这里也是在node层进行处理
$ npm install wechat-oauth
var OAuth = require('wechat-oauth');
var client = new OAuth('your appid', 'your secret’);生成引导用户点击的URL。
var url = client.getAuthorizeURL('redirectUrl', 'state', 'scope');如果是PC上的网页,请使用以下方式生成
var url = client.getAuthorizeURLForWebsite('redirectUrl');获取Openid和AccessToken
用户点击上步生成的URL后会被重定向到上步设置的 redirectUrl,并且会带有code参数,我们可以使用这个code换取access_token和用户的openid
client.getAccessToken('code', function (err, result) {
var accessToken = result.data.access_token;
var openid = result.data.openid;
});复制代码获取用户信息
如果我们生成引导用户点击的URL中scope参数值为snsapi_userinfo,接下来我们就可以使用openid换取用户详细信息(必须在getAccessToken方法执行完成之后)
client.getUser(openid, function (err, result) {
var userInfo = result;
});通过以上这几个步骤,就可以拿到用户的信息!!!
三. 微信JS-SDK使用篇(这里以朋友圈分享为例子)
微信JS-SDK说明文档
地址:https://mp.weixin.qq.com/wiki...
sdk使用:(这里搬用下官网的文档,这里可详细参考文档,这里唯一麻烦一点的地方就是 签名算法)
步骤一:绑定域名
先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。
步骤二:引入JS文件
在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/...
步骤三:通过config接口注入权限验证配置
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '', // 必填,公众号的唯一标识
timestamp: , // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '',// 必填,签名
jsApiList: [] // 必填,需要使用的JS接口列表
});这里的timestamp,nonceStr,signature需要通过接口获取,接下来我们就来获取 timestamp,nonceStr,signature(在node层处理)
这里第一步就需要获取access_token,
要调取微信的SDK,必须要获取access_token,access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token,access_token有效期为2个小时,而调取access_token接口的次数限制为2000,所以需要存储下来(存的方式看你自己)
获取access_token接口:
https://mp.weixin.qq.com/wiki...
获取access_token 和timestamp,nonceStr,signature代码如下:
const rp = require('request-promise’);
const {sign} = require(‘./sign');
rp(`https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${config.appID}&secret=${config.appsecret}`)
.then(function (response) {
const access_token = JSON.parse(response).access_token;
setCookie(res, 'at', access_token);
rp(`https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=${access_token}&type=jsapi`)
.then(function (response2) {
let ticket = JSON.parse(response2).ticket;
let signObj = sign(ticket, config.originUrl + req.originalUrl);
setCookie(res, 'timestamp', signObj.timestamp);
setCookie(res, 'nonceStr', signObj.nonceStr);
setCookie(res, 'signature', signObj.signature);
/*...*/
}).catch(function () {
/*...*/
});
}).catch(function () {
/*...*/
});这里setCookie是我自己写的存cookie的方法,
这里的sign是微信的签名算法:
sign.js
'use strict';
const jsSHA = require('jssha');
var createNonceStr = function () {
return Math.random().toString(36).substr(2, 15);
};
var createTimestamp = function () {
return parseInt(new Date().getTime() / 1000) + '';
};
var raw = function (args) {
var keys = Object.keys(args);
keys = keys.sort();
var newArgs = {};
keys.forEach(function (key) {
newArgs[key.toLowerCase()] = args[key];
});
var string = '';
for (var k in newArgs) {
string += '&' + k + '=' + newArgs[k];
}
string = string.substr(1);
return string;
};
/**
* @synopsis 签名算法
*
* @param jsapi_ticket 用于签名的 jsapi_ticket
* @param url 用于签名的 url ,注意必须动态获取,不能 hardcode
*
* @returns
*/
exports.sign = function (jsapi_ticket, url) {
var ret = {
jsapi_ticket: jsapi_ticket,
nonceStr: createNonceStr(),
timestamp: createTimestamp(),
url: url
};
var string = raw(ret);
let shaObj = new jsSHA(string, 'TEXT');
ret.signature = shaObj.getHash('SHA-1', 'HEX');
return ret;
};此时我们已经把timestamp,nonceStr,signature存了起来,然后我们来到前台页面获取(我这里使用的react)
componentDidMount () {
wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: appID, // 必填,公众号的唯一标识
timestamp: Cookies.get('timestamp'), // 必填,生成签名的时间戳
nonceStr: Cookies.get('nonceStr'), // 必填,生成签名的随机串
signature: Cookies.get('signature'), // 必填,签名
jsApiList: [
'onMenuShareTimeline',
'onMenuShareAppMessage'
] // 必填,需要使用的JS接口列表
});
}步骤四:在需要的地方调用接口,
代码如下:
wx.ready(function() {
//分享给朋友
wx.onMenuShareTimeline({
title: '', // 分享标题
link: href, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl: imgUrl, // 分享图标
});
wx.onMenuShareAppMessage({
title: '', // 分享标题
link: href, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl: imgUrl, // 分享图标
});
});这里就完成了对微信JS-SDK的调用!!!
第一次写文章,很多地方有漏洞,不完善,希望各位指出。