微信开发常用功能总结

一、获取access_token

参考文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183

1.用途

调用公众号的各个接口都需要用到access_token

备注:占用大小至少512个字符空间、有效期目前为2个小时,需要定时刷新,重复刷新获取惠导致上一次获取的access_token失效

2.获取方式
https请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

备注:调用接口时,请登录“微信公众平台-开发-基本配置”提前将服务器IP地址添加到IP白名单中,点击查看设置方法,否则将无法调用成功。小程序无需配置IP白名单。

注意获取到access_token后需要存在数据库中,并且设置一个时间(2小时过期),最好在过期之前重新获取一次,更新数据库中的值。

二、接口配置信息(验证服务器有效性)

配置服务器地址需要一个外网地址,开发过程中可以使用内网穿透工具,将一个外网地址指向你的本地服务,方便调试。

常用的内网穿透工具:
mac: ngrok
windows: 花生壳、nat123

image.png

url:服务器接口地址
token:信息需要与服务器定义的token一直

点击提交按钮时,微信会向服务器发送一个get请求,请求地址就是配置的url,这个请求会携带signature(微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数)、timestamp(时间戳)、nonce(随机数)、echostr(随机字符串)四个字符串过来

服务器拿到这些字符串之后进行校验:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

代码可参考:


image.png

三、被动回复用户消息

1.接收post请求

当用户向微信公众号发送消息的时候,微信会向我们认证(即之前配置的服务器地址)发送请求,配置服务器地址的时候向服务器发送的get请求,此时发送的post请求,请求地址相同。

2.处理请求返回信息

当服务器端接收到请求时,需要验证一下请求来源,即也需要配置服务器地址时的判断,判断成功,可以获取用户发送来的消息,并且返回给用户信息

const token = opts.token
const {
  signature,
  nonce,
  timestamp,
  echostr
} = ctx.query

const str = [token, timestamp, nonce].sort().join('')
const sha = sha1(str)
if (sha !== signature) {
  ctx.body = 'Failed'
  return false
}

const data = await getRawBody(ctx.req, {
  length: ctx.length,
  limit: '1mb',
  encoding: ctx.charset
})

const content = await util.parseXML(data)
console.log(content) //用户向微信公众号发送的消息
const replyBody = `哈哈哈,欢迎来的v家族.点击<a href="http://coding.imooc.com">viho viho</a>`//定义用户返回的信息

//注意这一段模版<与!之间不能有空格,如果有空格,向微信公众号发送消息时会返回“该公众号提供的服务出现故障,请稍后再试”
const xml = `<xml><ToUserName><![CDATA[${content.xml.FromUserName}]]></ToUserName><FromUserName><![CDATA[${content.xml.ToUserName}]]></FromUserName><CreateTime>12345678</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[${replyBody}]]></Content></xml>`
console.log('--replyBody', replyBody)
ctx.status = 200
ctx.type = 'application/xml'
ctx.body = xml

注意:
接收消息的格式和回复的格式不一样,所以在判断的时候会有区别。可以通过判断接收到的消息格式或内容作出处理,返回对应的回复消息格式或内容。
参考文档如下:
接收消息
回复消息

四、JS-SDK

1.基本步骤:

步骤一:绑定域名
登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”

步骤二:引入JS文件
在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.2.0.js

步骤三:通过config接口注入权限验证配置

wx.config({
  debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  appId: '', // 必填,公众号的唯一标识
  timestamp: , // 必填,生成签名的时间戳
  nonceStr: '', // 必填,生成签名的随机串
  signature: '',// 必填,签名
  jsApiList: [] // 必填,需要使用的JS接口列表
});

步骤四:通过ready接口处理成功验证

步骤五:通过error接口处理失败验证

2.签名算法

备注:此部分若想使用现成的代码测试,可以参考 微信开发总结

步骤三中涉及的appId、timestamp、nonceStr、signature 这四个参数是需要发送请求到后端服务器获取的。
后端服务器需要做一个签名才能生成signature。

具体实现:

步骤一:获取access_token
参考获取access_token部分

步骤二:获取jsapi_ticket
access_token 采用http GET方式请求获得jsapi_ticket(有效期7200秒,开发者必须在自己的服务全局缓存jsapi_ticket):https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi

步骤三:签名算法
参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。

参考代码:

/**
 * 创建随机数
 */
function createNoncestr() {
  return Math.random().toString(35).substring(2, 15)
}

/**
 * 生成时间戳
 */
function createTimestamp() {
  return parseInt((+new Date()) / 1000)
}

/**
 * 签名算法
 */
function signIt(args) {
  const keys = Object.keys(args)
  keys.sort()
  let str = ''

  keys.forEach(key => {
    str += '&' + key.toLowerCase() + '=' + args[key]
  })

  str = str.substring(1)
  console.log('str--', str)
  const sha = sha1(str) //需要引入外部sha1依赖包
  return sha
}

/**
 * 签名函数
 * @param ticket
 * @param url
 * @returns {{noncestr: *, timestamp: *, signature: *}}
 */
function sign(ticket, url) {
  const nonceStr = createNoncestr()
  const timestamp = createTimestamp()
  const signature = signIt({nonceStr, timestamp, jsapi_ticket: ticket, url})

  return {
    nonceStr,
    timestamp,
    signature
  }
}

五、网页授权、获取用户信息

1.类别

(1)以snsapi_base为scope发起的网页授权,用户无感知,静默授权,但只能获取到openid
(2)以snsapi_userinfo为scope发起的网页授权,弹出授权确认页面,用户点击确认授权后才能获取到用户信息
注意:对于已关注公众号的用户,如果用户从公众号的会话或者自定义菜单进入本公众号的网页授权页,即使是scope为snsapi_userinfo,也是静默授权,用户无感知。

2.基本流程

(1)在公众中先设置授权回调域名


image.png

(2)用户同意授权,获取code
可以让用户直接访问下面的url地址,但是这个url过长,而且可以修改url中的参数,因此最好向服务器端发起一个get请求,由服务器端重定向到下面地址。
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

用户访问上面这个地址,如果合法会跳转redirect_uri参数值的地址,并在这个地址上加上code和state参数。

(3)通过code换取网页授权access_token
注意:这里的access_token是专门用来获取授权用户信息使用的,与其他微信接口,需要通过基础支持中的“获取access_token”接口来获取到的普通access_token是两个不一样的参数,只是名字相同。
每个code只能使用一次。

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

(4)刷新access_token(如果需要)
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

(5)拉取用户信息(需scope为 snsapi_userinfo)
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容