模板消息请求接口-微信小程序-详解微信登陆、微信支付、模板消息

微信小程序-微信登录、微信支付、模板消息详解

更新时间:2016年11月23日09:33:23 作者:奋进程序员

本文主要介绍微信小程序——微信登录、微信支付、模板消息。 有一定的参考价值,有需要的可以进一步了解。

微信公众平台近日悄然开始微信小程序(微信公众号)功能的内测,吸引了无数开发者和普通用户的关注。 微信支付功能随小程序发布而上线,其功能介绍如下:

wx.login(对象)

调用该接口获取登录凭证(code),然后交换用户登录状态信息,包括用户的唯一标识(openid)和本次登录的会话密钥(session_key)。 用户数据通信的加密和解密依赖于会话密钥。

OBJECT参数说明:

成功返回参数说明:

示例代码:

//app.js
App({
 onLaunch: function() {
  wx.login({
   success: function(res) {
    if (res.code) {
     //发起网络请求
     wx.request({
      url: 'https://test.com/onLogin',
      data: {
       code: res.code
      }
     })
    } else {
     console.log('获取用户登录态失败!' + res.errMsg)
    }
   }
  });
 }
})

代码换取session_key

这是一个HTTP接口,开发者服务器通过登录凭证代码获取session_key和openid。 其中session_key是用于加密和签名用户数据的密钥。 为了应用安全,session_key不应该通过网络传输。

接口地址:

请求参数:

返回参数:

退货说明:

//正常返回的JSON数据包
{
   "openid": "OPENID",
   "session_key": "SESSIONKEY"
   "expires_in": 2592000
}
//错误时返回JSON数据包(示例为Code无效)
{
  "errcode": 40029,
  "errmsg": "invalid code"
}

登录状态维护

通过wx.login()获取用户登录状态后,需要维护登录状态。 开发者应注意不要直接使用session_key、openid等字段作为用户标识或会话标识。 相反,他们应该自己调度会话登录状态(请参阅登录序列图)。 对于开发者自己生成的Session,要保证其安全性,并且不要设置过长的过期时间。 会话分发到小程序客户端后,可以将其存储在存储中,以供后续通信使用。

登录时序图

wx.checkSession(OBJECT)

检查登录状态是否已过期

示例代码:

wx.checkSession({
 success: function(){
  //登录态未过期
 },
 fail: function(){
  //登录态过期
  wx.login()
 }
})

用户数据的签名验证和加解密

数据签名验证

为了保证开放接口返回的用户数据的安全,微信会对明文数据进行签名。 开发者可以根据业务需求对数据包进行签名验证模板消息请求接口,保证数据完整性。

如wx.getUserInfo的数据验证:

接口返回的rawData:

{
 "nickName": "Band",
 "gender": 1,
 "language": "zh_CN",
 "city": "Guangzhou",
 "province": "Guangdong",
 "country": "CN",
 "avatarUrl": "http://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0"
}

用户的会话密钥:

HyVFkGl5F5OQWJZZaNzBBg==

因此,用于签名的字符串是:

{
 "nickName": "Band",
 "gender": 1,
 "language": "zh_CN",
 "city": "Guangzhou",
 "province": "Guangdong",
 "country": "CN",
 "avatarUrl": "http://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0"
}HyVFkGl5F5OQWJZZaNzBBg==

使用sha1得到的结果是

75e81ceda165f4ffa64f4068af58c64b8f54b88c

加密数据解密算法

如果接口涉及敏感数据(如wx.getUserInfo中的openId、unionId)模板消息请求接口,则接口的明文内容不会包含这些敏感数据。 如果开发者需要获取敏感数据,需要对接口返回的加密数据(encryptedData)进行对称解密。 解密算法如下:

微信官方提供了多种编程语言的示例代码(点击下载)。 每种语言类型的接口名称都是一致的。 调用方法可以参考示例。

注意:之前提供的加密数据(encryptData)和相应的加密算法将被弃用。 要求开发人员不要依赖旧逻辑。

用户信息:

### wx.getUserInfo(OBJECT)

要获取用户信息,需要先调用wx.login接口。

OBJECT参数说明:

成功返回参数说明:

示例代码:

wx.getUserInfo({
 success: function(res) {
  var userInfo = res.userInfo
  var nickName = userInfo.nickName
  var avatarUrl = userInfo.avatarUrl
  var gender = userInfo.gender //性别 0:未知、1:男、2:女 
  var province = userInfo.province
  var city = userInfo.city
  var country = userInfo.country
 }
})

解密后,encryptedData为如下json结构。 详情参见加密数据解密算法

{
  "appId": "APPID",
  "openId": "OPENID",
  "nickName": "NICKNAME",
  "gender": 1,
  "city": "CITY",
  "province": "PROVINCE",
  "country": "COUNTRY",
  "avatarUrl": "AVATARURL",
  "unionId": "UNIONID"
}

UnionID机制​​说明:

如果一个开发者拥有多个移动应用、网站应用、公众号(包括小程序),可以通过unionid来区分用户的唯一性,因为只要是同一个微信下的移动应用、网站应用、公众号开放平台账号(包括小程序),用户的unionid是唯一的。 也就是说,对于同一个用户,同一个微信开放平台下的不同应用,unionid是相同的。

微信开放平台绑定小程序流程

前提条件:微信开放平台账号必须已完成开发者资质认证

开发者资质认证流程:

登录微信开放平台(open.weixin.qq.com)-账户中心-开发者资质认证

微信支付:

wx.requestPayment(OBJECT)

启动微信支付。

对象参数说明:

示例代码:

wx.requestPayment({
  'timeStamp': '',
  'nonceStr': '',
  'package': '',
  'signType': 'MD5',
  'paySign': '',
  'success':function(res){
  },
  'fail':function(res){
  }
})

基于微信的通知通道,我们为开发者提供了能够高效触达用户的模板消息能力,以实现服务闭环,提供更好的体验。

模板推送位置:服务通知

模板下发条件:用户与微信系统中的页面交互后触发。 详情请参阅交货条件说明。