Skip to main content

微信后端接口

前端直接调用接口即可 wechat.js

const util = require('util');
const crypto = require('crypto');
const request = require('../../common/request');
const config = require('../../configs');
const redis = require('../../common/redis')('default');

const jsapi_accesstoken_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s";
const jsapi_ticke_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=%s";

const auth_url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_userinfo&state=%s#wechat_redirect';
const base_auth_url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_base&state=%s#wechat_redirect';

const auth_access_token_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code';
const auth_userinfo_url = 'https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN';

const Cache_Key_Jsapi_Ticket = util.format("wx:%s:jsapi.ticket", config.wechat.appid);
const Cache_Key_Jsapi_Access_Token = util.format("wx:%s:jsapi.accesstoken", config.wechat.appid);
const uuidV4 = require('uuid');
const Cache_Expire_Time = 3600; //缓存1小时
const redirect_uri = '/v2/wechat/callback';

//SHA1
function SHA1(str) {
let sha = crypto.createHash('sha1');
sha.update(str);
return sha.digest('hex');
}

/**
* 获取微信认证URL
* @returns {ServerResponse}
*/
exports.auth_url = function (callbackUrl) {
let state = encodeURIComponent(callbackUrl);
let url = encodeURIComponent(config.default.base_url + redirect_uri);
return util.format(auth_url, config.wechat.appid, url, state);
};

/**
* 获取微信认证URL
* @returns {ServerResponse}
*/
exports.wechat_auth_url = function (callback_url, redirect_url) {
let state = encodeURIComponent(redirect_url);
let url = '';
if(/^http/.test(callback_url)){
url = encodeURIComponent(callback_url);
}else{
url = encodeURIComponent(config.default.base_url + callback_url);
}

return util.format(auth_url, config.wechat.appid, url, state);
};
/**
* 获取微信认证URL(静默)
* @returns {ServerResponse}
*/
exports.wechat_base_auth_url = function (callback_url, redirect_url) {
let state = encodeURIComponent(redirect_url);
let url = '';
if(/^http/.test(callback_url)){
url = encodeURIComponent(callback_url);
}else{
url = encodeURIComponent(config.default.base_url + callback_url);
}

return util.format(base_auth_url, config.wechat.appid, url, state);
};
/**
* 获取微信access_token
* @param access_token_url
*/
exports.get_access_token = async (code) => {
let access_token_url = util.format(auth_access_token_url, config.wechat.appid, config.wechat.appsecret, code);
let body = await request.get({url: access_token_url});
return JSON.parse(body);
};

/**
* 获取用户信息
* @param userinfo_url
*/
exports.get_userinfo = async (access_token, openid) => {
let userinfo_url = util.format(auth_userinfo_url, access_token, openid);
let body = await request.get({url: userinfo_url});
return JSON.parse(body);
};

/**
* 获取JSAPI Access Token
*/
async function get_jsapi_access_token() {
let token = await redis.get(Cache_Key_Jsapi_Access_Token);
if (token && token.length > 0) {
// return token;
}
let url = util.format(jsapi_accesstoken_url, config.wechat.appid, config.wechat.appsecret);
let json = await request.get({url: url});
json = JSON.parse(json);
token = json.access_token;
redis.set(Cache_Key_Jsapi_Access_Token, token, "EX", Cache_Expire_Time);
return token;
}
exports.get_jsapi_access_token = get_jsapi_access_token;

/**
* 获取JSAPI Ticket
*/
async function get_jsapi_ticket() {
let ticket = await redis.get(Cache_Key_Jsapi_Ticket);
if (ticket && ticket.length.length > 0) {
return ticket;
}
let token = await get_jsapi_access_token();
console.log('token:',token)
let url = util.format(jsapi_ticke_url, token);
let json = await request.get({url: url});
json = JSON.parse(json);
ticket = json.ticket;
redis.set(Cache_Key_Jsapi_Ticket, ticket, "EX", Cache_Expire_Time);
return ticket;

}
exports.get_jsapi_ticket = get_jsapi_ticket;

/**
* 获取当前url的签名信息
*/
async function get_jsapi_signature(url) {

let uuid = uuidV4(); // -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1'
let ticket = await get_jsapi_ticket();
let obj = {};
obj.noncestr = uuid.replace(/-/g, '');
obj.timestamp = Math.floor((new Date()).getTime() / 1000);
obj.appid = config.wechat.appid;
obj.url = url;
let str = util.format("jsapi_ticket=%s&noncestr=%s&timestamp=%d&url=%s", ticket, obj.noncestr, obj.timestamp, obj.url);
obj.signature = SHA1(str);
return obj;
}
exports.get_jsapi_signature = get_jsapi_signature;

/**
* 服务回调验证
* @param params
* @returns {string}
*/
exports.service_callback = function (params) {
let echostr = params.echostr;
let signature = params.signature;
let array = [params.nonce, params.timestamp, config.wechat.token];
let sign = SHA1(array.sort().join(''));
return sign == signature ? echostr : "Invalid Request";
};