微信公众号
使用内网穿透工具创建测试号,提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,将参数字典排序再SHA1加密后,与传来的签名对比即可验证是否来自于微信官方。注意:公众号接口必须满足:http+80或https+443。用户关注,扫码,发消息等都是通过对以上URL发送POST请求进行的,开发者通过返回值可以回复内容,为XML格式
准备工作
创建一个HttpUtils
类,用来发送不同的请求并返回JSONObject
类型。
创建一个官方接口类,把每个需要用到的接口封装为一个方法,出参为JSONObject
类型,入参根据请求类型决定。
获取access_token
接口为https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
封装成方法,调用获取access_token
后设定过期时间并存入缓存,过期时间:7200s。
创建菜单
接口为https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
该接口为post请求,需要传JSON
结构的字符串,则可以先用面向对象的方式创建JSONObject
,再转成字符串传入即可。
最外一层属性名为button
,属性值为json
数组(即为菜单数组),二级菜单需要放在名为sub_button
的属性下。
消息接收与回复
使用XML文本来和用户进行交流。XML中包含了发送人,收件人,创建时间,事件,事件类型和内容等等标签,获取相应标签的内容便可以对消息进行处理,进行一些业务操作。为了更快捷的接收和生成XML字符串,创建一个消息类,属性与XML标签对应,并包含不同类型的XML字符串生成方法(为了使对象功能尽量单一化,可能需要创建一些其他类来与消息类进行互动)。
用户通过微信服务器发来互动时,首先利用SAXBuilder
将得到的XML字符串转化成DOM对象,再转化成消息类,然后就可以调用消息类的get方法进行各种判断了。首先进行类型判断,若是event类型,则对eventType进行判断,进入关注和取消关注事件;若是text,则获取内容,等等。return可以将XML字符串返回,微信服务器解析后将把内容发给相应的用户,return空字符串则无事件。
//text类型
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>
//常用的图文消息
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>1</ArticleCount>
<Articles>
<item>
<Title><![CDATA[title1]]></Title>
<Description><![CDATA[description1]]></Description>
<PicUrl><![CDATA[picurl]]></PicUrl>
<Url><![CDATA[url]]></Url>
</item>
</Articles>
</xml>
获取用户基本信息
获取接口为GET请求:
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
其中的OPENID
即为用户通过微信服务器与公众号互动时发来的XML中的FromUserName
值,因此,通过消息互动即可获取用户的一般信息并存入数据库
用户网页授权
用户进入公众号后点击链接进入网页时,若需要获取用户信息,则该网址需要官方接口进行重定向,同时指定scope
参数,将决定只获取用户openid
还是更多信息(用户授权后将可以通过openid
获取更多信息)。获取详细信息的接口如下:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60&redirect_uri=http%3A%2F%2Fnba.bluewebgame.com%2Foauth_response.php&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
其中的redirect_uri
需要用URLEncoder
进行处理。用户同意授权后,页面跳转至指定地址并附带code
参数,再通过以下接口获取临时token
,接口如下:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
返回如下:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
此时若scope为snsapi_userinfo
,便可以通过以下接口获取更多用户信息了
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
使用JS-SDK
引入js
文件:http://res.wx.qq.com/open/js/jweixin-1.6.0.js
,
稳定版:http://res2.wx.qq.com/open/js/jweixin-1.6.0.js
所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用。首先获取jspapi_ticket
,接口如下:
https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
此处的access_token
为全局唯一调用凭据,区别于用户授权时的token
。返回:
{
"errcode":0,
"errmsg":"ok",
"ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",
"expires_in":7200
}
拿到ticket后,再获取一个随机字符串,一个时间戳以及当前网页url
(由前端传来,去除#后面内容),字段名按字典序(如下)排列:
jsapi_ticket=ticket&noncestr=Wm3WZYTPz0wzccnW×tamp=1414587457&url=http://mp.weixin.qq.com?params=value
对该字符串进行SHA1加密得到签名,并将签名,随机字符串,APPID
和时间戳传递给前端注入配置信息。方法如下:
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过 log打出,仅在pc端时才会打印。
appId: '', // 必填,公众号的唯一标识
timestamp: , // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '',// 必填,签名
jsApiList: [] // 必填,需要使用的JS接口列表
});
分享接口
常用的如下
updateAppMessageShareData
:分享给朋友或QQ
updateTimelineShareData
:分享到朋友圈
以分享给朋友为例,自定义“分享给朋友”及“分享到QQ”按钮的分享内容:
wx.ready(function () { //需在用户可能点击分享按钮前就先调用
wx.updateAppMessageShareData({
title: '', // 分享标题
desc: '', // 分享描述
link: '', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl: '', // 分享图标
success: function () {
// 设置成功
}
})
});
若某网页的JS中有这段代码,则该网页被分享时生效
生成带参数的二维码
临时二维码获取接口为:
https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN
此接口为POST请求,需附带参数(actionname
可以指定二维码参数为数字类型或字符串类型)
{"expire_seconds": 604800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}
{"expire_seconds": 604800, "action_name": "QR_STR_SCENE", "action_info": {"scene": {"scene_str": "test"}}}
若把以上的scene_*
的值设为转发者id,当该码被扫时通过扫码事件可以绑定被扫码者与扫码者的关系。
返回:
{
"ticket":"gQH47joAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2taZ2Z3TVRtNzJXV1Brb3ZhYmJJAAIEZ23sUwMEmm",
"expire_seconds":60,
"url":"http://weixin.qq.com/q/kZgfwMTm72WWPkovabbI"
}
拿到ticket,即可获取对应二维码图片:
https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET
,ticket需要进行URLEncode
。