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

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\ticket
* @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 的各接口方法配置。

node.weiChat的更多相关文章

  1. babeljs源码

    babel.min.js!function(e,t){"object"==typeof exports&&"object"==typeof mo ...

  2. NPM (node package manager) 入门 - 基础使用

    什么是npm ? npm 是 nodejs 的包管理和分发工具.它可以让 javascript 开发者能够更加轻松的共享代码和共用代码片段,并且通过 npm 管理你分享的代码也很方便快捷和简单. 截至 ...

  3. node服务的监控预警系统架构

    需求背景 目前node端的服务逐渐成熟,在不少公司内部也开始承担业务处理或者视图渲染工作.不同于个人开发的简单服务器,企业级的node服务要求更为苛刻: 高稳定性.高可靠性.鲁棒性以及直观的监控和报警 ...

  4. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  5. 细说WebSocket - Node篇

    在上一篇提高到了 web 通信的各种方式,包括 轮询.长连接 以及各种 HTML5 中提到的手段.本文将详细描述 WebSocket协议 在 web通讯 中的实现. 一.WebSocket 协议 1. ...

  6. 高大上的微服务可以很简单,使用node写微服务

    安装 npm install m-service --save 使用 编写服务处理函数 // dir1/file1.js // 使用传入的console参数输出可以自动在日志里带上request id ...

  7. 构建通用的 React 和 Node 应用

    这是一篇非常优秀的 React 教程,这篇文章对 React 组件.React Router 以及 Node 做了很好的梳理.我是 9 月份读的该文章,当时跟着教程做了一遍,收获很大.但是由于时间原因 ...

  8. 利用Node.js的Net模块实现一个命令行多人聊天室

    1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...

  9. Node.js:进程、子进程与cluster多核处理模块

    1.process对象 process对象就是处理与进程相关信息的全局对象,不需要require引用,且是EventEmitter的实例. 获取进程信息 process对象提供了很多的API来获取当前 ...

随机推荐

  1. 关系数据库标准语言SQL的基本问答

    1 .试述 sQL 语言的特点. 答: (l)综合统一. sQL 语言集数据定义语言 DDL .数据操纵语言 DML .数据控制语言 DCL 的功能于一体. (2)高度非过程化.用 sQL 语言进行数 ...

  2. text-indent: -999px;是什么意思

    就是把该元素内的文字移到屏幕外面去,让我们肉眼看不见,有时候是因为如某栏目名称的文字或者logo的文字已经用背景图片代替了,我们不需要眼睛看见那些文字,但是希望搜索引擎可以搜到,就可以用这个把文字“隐 ...

  3. KETTLE使用入门

    一.准备文件 1.安装java虚拟机 2.安装kettle安装文件 二.使用步骤 1.点击Spoon.bat,启动kettle,弹出DOS窗口如下: 2.进入主界面 3.新建资源库

  4. servlet tomcat eclipse

    网上搜到的很多利用eclipse结合tomcat开发servlet的教程都要修改server.xml 感觉这种方式太粗暴了,server.xml最好是与应用无关的, 这里比较推荐export war的 ...

  5. QCA4002/QCA4004 为主流家电和消费电子产品推出低功耗Wi-Fi平台

    美国高通公司日前宣布,其子公司高通创锐讯推出全新芯片系列,这是低功耗Wi-Fi解决方案系列的一部分,可连接组成物联网的各种设备.QCA4002和QCA4004网络平台在芯片上纳入IP堆栈及完整的网络服 ...

  6. 关于ajax中async参数的感悟

    async,这个参数默认为true. 就是异步去处理信息. 当把它设置为false的时候,就是同步去处理数据了. var current_lead_id = '<?php echo $curre ...

  7. Android 模拟系统事件(三)

    简介 Android系统是基于Linux内核的,而Linux内核继承和兼容了丰富的Unix系统进程间通信(IPC)机制.Binder其实也不是Android提出来的一套新的进程间通信机制,它是基于Op ...

  8. Socks5协议中文文档

    译者:Radeon(Radeon bise@cmmail.com) 译文公布时间:2001-6-18 文件夹 1.介绍 2.现有的协议 3.基于TCP协议的客户 4.请求 5.地址 6.应答 7.基于 ...

  9. md笔记——HTTP知识

    HTTP权威指南 ******** 第一部分:HTTP:Web 的基础 第一章:HTTP概述 MIME 因特网上有数千种不同的数据类型,HTTP 仔细地给每种要通过 Web 传输的对象都打上了名为 M ...

  10. Validform表单验证的完美解决方案,推荐给大家

    http://validform.rjboy.cn/ 功能简介: 可以在input上直接绑定正则,可以自定义datatype,自定义datatype可以是正则,也可以是函数,datatype可以累加或 ...