• node.weiChat


    微信的朋友圈分享是现在流行的推广模式,最近两天尝试了一下使用微信进行商品的分享,分享结束后我可以在自己的数据库中查询到用户是否分享成功,包括用户使用微信进行支付时的成功验证。个人觉得微信上的教程有些绕,因为学习时间比较短,方法不尽详细和完善。

    1.注册微信服务号/订阅号(微信公众平台

    2.订阅号企业认证(个人认证无法操作分享接口,非服务号企业认证无法操作支付接口

    3.手里需要有自己的服务器,申请域名及解析至服务器。(网站上线流程)

    4.进行服务端的开发,监听服务端80端口,接收微信参数(在成为微信开发者时,微信将以get方式请求域名,开发者需接收微信传来的参数,并使用排序、加密等算法验证其是否来源于微信)

    5.在微信公众平台申请成为开发者,首先会获得appid、appsecret,在配置信息中会要求填入url和token

        url:www.xxx.com       token:任意字符串(此字符串用户验证消息)  加密方式:随机即可

    6.填写完配置信息后,点击提交,微信会向服务器发送请求,接受参数并验证。

        微信首次验证开发者将传递4个参数,获取代码如下:

    var http = require('http');
    var url = require('url');
    
    //微信返回接收变量
    var weixinReturn = {
    signature:'',
    timestamp:'',
    nonce:'',
    echostr:'',
    state:'验证失败'
    };

    //启动服务,监听配置路径及端口 http.createServer(function (req, res) {//获取访问路径 var urlObj = url.parse(req.url,true); //json格式的参数列表 var param = urlObj.query //获取路径 var pathName = urlObj.pathname; //编码 res.setHeader('content-type', 'text/html;charset=utf-8'); /* * 验证信息是否来自于微信 */ if(pathName === '/'){ weixinReturn.signature = param.signature; weixinReturn.timestamp = param.timestamp; weixinReturn.nonce = param.nonce; weixinReturn.echostr = param.echostr; weichat.isFromWeiChat( weixinReturn.signature, weixinReturn.timestamp, weixinReturn.nonce, '用户自定义的token字符串', function (right) { /** * 如果数据验证成功 * 状态修改为成功 * 否则修改为失败 */ if(right){ weixinReturn.state = '验证成功'; }else{ weixinReturn.state = '验证失败'; } //控制台打印成功消息 console.log('数据验证完毕,已成为微信开发者,基础数据存入./weiChatReturn.json'); /* *将数据写入文件 * 如文件不存在 则在运行目录下创建文件 */ fs.writeFileSync('weiCaht.json',JSON.stringify(weixinReturn)); //为微信服务器返回echostr参数 以告知验证成功 res.end(weixinReturn.echostr); }); } }).listen(conn.hostPort);

    weichat.js

    /**
     * 验证信息是否来源于微信
     * @param signature
     * @param timestamp
     * @param nonce
     * @param token
     * @param callback
     */
    weiChat.isFromWeiChat = function(signature,timestamp,nonce,token,callback){
        var array=new Array();
        array[0]=timestamp;
        array[1]=nonce;
        array[2]=token;
        array.sort();
        var hasher=crypto.createHash("sha1");
        var msg=array[0]+array[1]+array[2];
        hasher.update(msg);
        var msg=hasher.digest('hex');//计算SHA1值
        if(msg==signature){
            callback(true);
        }else{
            callback(false);
        }
    }

    7.获取 access_token、jsapi_ticket

    /**
     * 获取token	icket
     * @param callback
     * @constructor
     *  ticket path: '/cgi-bin/ticket/getticket?access_token={0}&type=jsapi'.format(token),
     * token  path: '/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}'.format(appId,secret),
     */
    weiChat.GetChatMessage = function (path,callback){
        var options = 'https://api.weixin.qq.com{0}'.format(path);
    
        var req = http.request(options, function (res) {
            //状态码
            console.log('STATUS: ' + res.statusCode);
            //头文件
            console.log('HEADERS: ' + JSON.stringify(res.headers));
            //编码模式
            res.setEncoding('utf8');
            res.on('data', function (chunk) {
                console.log('BODY: ' + chunk);
                callback(chunk);
            });
        });
    
        req.on('error', function (e) {
            console.log(' 获取失败,错误信息: ' + e.message);
        });
    
        req.end();
    }

    注:微信对于access_token、jsapi_ticket 有7200秒的过期时间,解决方案是将方法放入setInterval函数中定时执行,将获取到的access_token、jsapi_ticket缓存在程序,或存储在数据库中。

    8.生成签名signature

    /**
     * 获取签名
     * @param currUrl 当前页面地址
     * @param timestamp 时间截
     * @param nonceStr 获取的nonce字符串
     * @param ticket 
     * @param callback
     */
    weiChat.getSignature = function (currUrl,timestamp,nonceStr,ticket,callback) {
        var string1 = 'jsapi_ticket={0}&nonceStr={1}&timestamp={2}&url={3}'.format(ticket,nonceStr,timestamp,currUrl);
        var hasher=crypto.createHash("sha1");
        hasher.update(string1);
        var msg=hasher.digest('hex');//计算SHA1值
        callback(msg);
    }

    9.以上完成了微信的开发者需求,接下来进行分享页面的配置。(微信JSSDK的使用

    注:在页面js中为保证分享成功,须获取实时最新的token和ticket,解决方法是前台html页面中使用jQuery ajax请求后台node服务端,将最新的值返回后,进行jweixin/wx 的各接口方法配置。

  • 相关阅读:
    高效并发服务器模型
    Linux下Wiki服务器的搭建
    Wiki程序PmWiki的安装和汉化
    Linux 套接字编程中的 5 个隐患
    IOCP简介
    IP协议详解之IP地址要领
    IP协议详解之配套协议:ARP, ICMP
    超级详细Tcpdump 的用法
    如何测试主机的MTU多大?
    Linux下Socket编程的端口问题( Bind error: Address already in use )
  • 原文地址:https://www.cnblogs.com/z-yue/p/5759876.html
Copyright © 2020-2023  润新知