更新时间: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){ } })
基于微信的通知通道,我们为开发者提供了能够高效触达用户的模板消息能力,以实现服务闭环,提供更好的体验。
模板推送位置:服务通知
模板下发条件:用户与微信系统中的页面交互后触发。 详情请参阅交货条件说明。