最近做一个应用需要实现自定义分享朋友圈的文字和图片,然后找了很多文章,总结趴坑如下,或许对你很有帮助,我看别人写的都是乱七八糟的,浪费我好多时间,所以决定自己写一个,保证拿过去直接用
node实现代码
新建请求路由文件oauth.js
var express = require('express');
var router = express.Router();
var request = require('request');
const sha1 = require('sha1');
var AppID = '公众平台获取';
var AppSecret = '公众平台获取';
var getJsapiTicketUrl = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket'
let CACHE = {
AppID: AppID
}
//获取access_token
router.get('/get_wx_access_token', function (req, res, next) {
request.get({
url: 'https://api.weixin.qq.com/cgi-bin/token?appid=' + AppID + '&secret=' + AppSecret + '&grant_type=client_credential',
},
function (error, response, body) {
if (response.statusCode == 200) {
var data = JSON.parse(body);
var access_token = data.access_token;
var openid = data.openid;
let nonceStr = createNonceStr();
let timestamp = createTimestamp();
CACHE.openid = openid;
CACHE.nonceStr = nonceStr;
CACHE.timestamp = timestamp;
CACHE.accessToken = access_token;
CACHE.accessTokenTimeout = body.expires_in * 500;
CACHE.accessTokenTime = new Date();
refreshJsapiTicket(access_token, function (ticket) {
CACHE.signature = createSign({ //编码获取到签名
jsapi_ticket: ticket,
nonceStr,
timestamp,
url
});
console.log(CACHE, 555)
res.send(CACHE);
})
} else {
console.log(response.statusCode, 'error');
}
}
);
});
/**
* 获取Jsapi_ticket
*/
function refreshJsapiTicket(access_token, fn) { // Jsapi_ticket
let ticketUrl = `${getJsapiTicketUrl}?access_token=${access_token}&type=jsapi`;
request.get(ticketUrl, function (err, response, content) {
content = JSON.parse(content);
console.error('refreshJsapiTicket', content);
if (content && (content.errcode == 0 || !content.errcode)) {
CACHE.ticket = content.ticket;
CACHE.ticketTimeout = content.expires_in * 500;
CACHE.accessTokenTime = new Date();
fn(content.ticket)
}
})
};
/**
* 随机字符串
*/
function createNonceStr() {
return Math.random().toString(36).substr(2, 15);
};
/**
* 时间戳
*/
function createTimestamp() {
return parseInt(new Date().getTime() / 1000).toString();
};
/**
* 拼接字符串
* @param {*} args
*/
function rawString(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;
};
/**
* 新的
* @param {*} config
*/
function createSign(config) {
var ret = {
jsapi_ticket: config.jsapi_ticket,
nonceStr: config.nonceStr,
timestamp: config.timestamp,
url: config.url
};
let url = ret.url;
let index = url.indexOf('#');
let res = Object.assign({}, ret, {
url: index > -1 ? url.substr(0, index) : url
});
var string = rawString(res);
var shaObjs = sha1(string);
return shaObjs;
}
module.exports = router;
新建服务server.js
const path = require("path")
const bodyParser = require("body-parser")
const express = require("express")
const app = new express()
const request = require("request")
const port = 8088;
var oauth = require('./oauth');
app.use('/oauth', oauth);
app.listen(port, (error) => {
if (error) {
console.error(error);
} else {
console.log(port)
}
});
安装好依赖后执行 node server.js 服务就跑起来了,我们把代码丢到服务起上跑起来,我通过nginx代理的 /auth 的请求 为 127.0.0.1:8088,假设域名为www.test.com,那么请求的地址为:www.test.com/auth/get_wx_access_token, 但是获取不到.....看下面....
公众平台设置
对于微信端权限的获取,做了严格的控制,上面的接口服务需要平台设置一些操作
设置1 :如果你的线上项目访问如 域名+/路径,那么设置如下,这里表示允许设置里面的域名允许请求,举例:我的项目访问为www.test.com/qys,那么问就需要设置www.test.com/qys,如果我的项目访问为www.test.com 那么问就设置www.test.com/qys
这个域名设置的时候要指定位置放置提示的文件
比如:www.test.com/qys 我通过nginx代理指向的目录如下,那么我就需要在这个目录下放置MP....txt文件 才能设置成功
设置2 添加服务器ip白名单
那就算基本设置完成
此时 请求权限如下 www.test.com/auth/get_wx_access_token 就可以拿到了
h5应用
import wx from "weixin-js-sdk";
uni.request({
url: "http://www.test.com/oauth/get_wx_access_token",
method: 'get',
success: function(res) {
console.log(res.data)
wx.config({
debug: false,
appId: res.data.AppID, // 必填,公众号的唯一标识
timestamp: res.data.timestamp, // 必填,生成签名的时间戳
nonceStr: res.data.nonceStr, // 必填,生成签名的随机串
signature: res.data.signature, // 必填,签名,见附录1
jsApiList: ['updateAppMessageShareData','updateTimelineShareData',
'onMenuShareAppMessage', 'onMenuShareTimeline'],
});
let shareObj = {
title: '', // 分享标题
desc: '', // 分享描述
link: 'www.test.com/qys', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl:'',
success: function() {
console.log(222)
},
}
wx.ready(function() {
console.log("ready")
wx.onMenuShareTimeline(shareObj);
wx.onMenuShareAppMessage(shareObj);
});
wx.error(function(res) {
console.log(res.errMsg);
});
}
})
有用就点个赞