node拉取微信权限,实现自定义分享微信朋友圈等操作

最近做一个应用需要实现自定义分享朋友圈的文字和图片,然后找了很多文章,总结趴坑如下,或许对你很有帮助,我看别人写的都是乱七八糟的,浪费我好多时间,所以决定自己写一个,保证拿过去直接用

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);
					});

				}
			})

有用就点个赞

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>