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

Posted ztg_superman

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
					);

				
			)

有用就点个赞

以上是关于node拉取微信权限,实现自定义分享微信朋友圈等操作的主要内容,如果未能解决你的问题,请参考以下文章

如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)

移动端以及 PC浏览器页面分享到朋友圈等的功能实现

知识微信隐藏分享给好友朋友圈等的功能

支付模块-第三方APP如何拉取微信小程序支付(编码篇)

微信JSSDK分享朋友圈微信自定义分享接口

h5 微信分享朋友和朋友圈