以往关注后会发一条欢迎XXX的信息给我。
最近遇到一个如为我生成了一个二维码关注后会提示XXX你是谁谁谁推荐的客户
不仅获取了当前用户信息还有推荐人的信息。
所以就有了本文:
文档:
http://mp.weixin.qq.com/wiki/18/8a8bbd4f0abfa3e58d7f68ce7252c0d6.html
https://mp.weixin.qq.com/debug/cgi-bin/apiinfo?t=index&type=向用户发送消息&form=发送客服消息接口%20/message/custom/send
http://mp.weixin.qq.com/wiki/18/c66a9f0b5aa952346e46dc39de20f672.html
http://mp.weixin.qq.com/wiki/14/d9be34fe03412c92517da10a5980e7ee.html
原理:在二维码Url上添加了参数,如用户md5id。
当扫成功后微信分析此url 获取到参数。并且回调给公众号上 基本配置里的url地址。
是以post 传递给我们服务器
参数是xml:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1348831860</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[this is a test]]></Content> <MsgId>1234567890123456</MsgId> </xml>
扫码参数:
<xml><ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[FromUser]]></FromUserName> <CreateTime>123456789</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[subscribe]]></Event> <EventKey><![CDATA[qrscene_123123]]></EventKey> <Ticket><![CDATA[TICKET]]></Ticket> </xml>
参数 | 描述 |
---|---|
ToUserName |
开发者 微信号 |
FromUserName | 发送方帐号(一个OpenID) |
CreateTime | 消息创建时间 (整型) |
MsgType | 消息类型,event |
Event | 事件类型,subscribe |
EventKey | 事件KEY值,qrscene_为前缀,后面为二维码的参数值 |
Ticket | 二维码的ticket,可用来换取二维码图片 |
这里有当前关注的openid 和ticket信息。
用openid来获取当前用户信息,用ticket来得到谁推荐的。
最后响应请求返回发送消息数据
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[你好]]></Content> </xml>
参数 | 是否必须 | 描述 |
---|---|---|
ToUserName | 是 | 接收方帐号(收到的OpenID) |
FromUserName | 是 |
开发者 微信号 |
CreateTime | 是 | 消息创建时间 (整型) |
MsgType | 是 | text |
Content | 是 | 回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示) |
实现:
1、生成参数的关注二维码:
需要先请求获取到access_token
post 请求传递参数获取生成的二维码url 和ticket
临时二维码请求说明
http请求方式: POST URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN POST数据格式:json POST数据例子:{"expire_seconds": 604800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}
永久二维码请求说明
http请求方式: POST URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN POST数据格式:json POST数据例子:{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 123}}} 或者也可以使用以下POST数据创建字符串形式的二维码参数: {"action_name": "QR_LIMIT_STR_SCENE", "action_info": {"scene": {"scene_str": "123"}}}
参数说明
参数 | 说明 |
---|---|
expire_seconds | 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。 |
action_name | 二维码类型,QR_SCENE为临时,QR_LIMIT_SCENE为永久,QR_LIMIT_STR_SCENE为永久的字符串参数值 |
action_info | 二维码详细信息 |
scene_id | 场景值ID,临时二维码时为32位非0整型,永久二维码时最大值为100000(目前参数只支持1–100000) |
scene_str |
场景值ID(字符串形式的ID),字符串类型,长度限制为1到64,仅永久二维码支持此字段 |
返回说明
正确的Json返回结果:
{"ticket":"gQH47joAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2taZ2Z3TVRtNzJXV1Brb3ZhYmJJAAIEZ23sUwMEmm3sUw==","expire_seconds":60,"url":"http:\/\/weixin.qq.com\/q\/kZgfwMTm72WWPkovabbI"}
参数 | 说明 |
---|---|
ticket | 获取的二维码ticket,凭借此ticket可以在有效时间内换取二维码。 |
expire_seconds | 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天)。 |
url | 二维码图片解析后的地址,开发者可根据该地址自行生成需要的二维码图片 |
返回里得到ticket url
用记扫描关注:
二、得到openid ticket 并回复用户
对于单个用记直接send 输出xml就可以了。
node 获取二维码和ticket
var request=require('request'); var http=require('http'); http.createServer(function(req,res){ if(req.url=='/'){ res.writeHead(200,{'Content-Type':'text/html'}); //先获取token request('http://123.103.22.208/token?appId=wxf7a88566a83b58cf',function(err,res1,body){ console.log(body); res.write(body); var token=body; //post 提交二维码上的参数值 得到ticket 和url request.post({ headers:{ 'content-type':'application/json', 'encoding':'utf-8' }, url:'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token='+token, //form 可以是一个对象也可以是字符串 form:'{"expire_seconds":604800,"action_name":"QR_SCENE","action_info":{"scene":{"scene_id":123}}}' },function(err,res1,body){ console.log(body) res.end(body); }) /*https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket= * 根据tocket 获取url二维码图片 */ }); } }).listen(3010,function(){ console.log('绑定成功') })
以上是源码,需要注意的是post到微信生成二维友的接口它只接收json字符串数据。所以form写成了Json字符串形式。