最近做一個應用需要實作自定義分享朋友圈的文字和圖片,然后找了很多文章,總結趴坑如下,或許對你很有幫助,我看別人寫的都是亂七八糟的,浪費我好多時間,所以決定自己寫一個,保證拿過去直接用
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 服務就跑起來了
訪問:localhost:8080/auth/get_wx_access_token 但是獲取不到.....看下面....
公眾平臺設定
對于微信端權限的獲取,做了嚴格的控制,上面的介面服務需要平臺設定一些操作
設定1 :如果你的線上專案訪問如 域名+/路徑,那么設定如下

這個域名設定的時候要指定位置放置提示的檔案
比如:www.test.com/qys 我通過nginx代理指向的目錄如下,那么我就需要在這個目錄下放置MP....txt檔案 才能設定成功

設定2 添加服務器白名單

那就算基本設定完成
此時 線上的請求如下 www.test.com/qys/auth/get_wx_access_token 就可以拿到了
h5應用
import wx from "weixin-js-sdk";
uni.request({
url: "http://www.test.com/qys/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);
});
}
})
有用就點個贊
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/393080.html
標籤:其他
上一篇:Sonataadmin-僅當條件為真時,才在現有選項卡的開頭添加表單欄位
下一篇:前端網路基礎-應用層HTTP協議
