#登录API
>微信小程序的登录简介
可以简单理解为以下几个步骤:
>小程序里使用wx.login方法获取登录凭证code值
>拿到code值后再加上AppID、secret、grant_type授权类型这3个参 数发送到自己后台开发服务器,在后台服务器上去请求 https://api.weixin.qq.com/sns/jscode2session这个路径,同时上传这3个参数,来获取唯一标识(openId)和会话密钥(session_key)
>拿到唯一标识(openId)和会话密钥(session_key)后在自己后台开发服务器上生成自己的sessionId
>微信小程序可以将服务器生成的sessionId信息保存到本地缓存信息 Storage里
>后续用户进入微信小程序,先从Storage获得sessionId,将这个 sessionId传输到服务器上进行查询来维护登录状态
>wx.login(OBJECT)获取登录凭证code
>小程序使用wx.login接口来获取登录凭证(code),进而获取用户登录状态信息,包括用户的唯一标识(openId)和本次登 录的会话密钥(session_key)
>用户数据的加解密通信需要依赖session_key完成
属性 | 类型 | 必填 | 说明 |
timeout | string | 是 | 超时时间,单位ms |
success | function | 否 | 接口调用成功的回调函数 |
fail | function | 否 | 接口调用失败的回调函数 |
complete | function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
示例代码:
App({
onLaunch:function(){
wx.login({
success:function(res){
var code=res.code;
if(code){
console.log('获取用户登录凭证:'+code);
}
else{
console.log('获取用户登录失败');
}
}
})
}
})
>用户登录凭证code发往开发者服务器换取唯一标识(opened) 和会话密码(session_key)
>开发者服务器需要提供一个后台接口,来接收用户登录凭证 code
示例代码:
App({
onLaunch:function(){
wx.login({
success:function(res){
var code=res.code;
if(code){
console.log('获取用户登录凭证:'+code);
wx.request({
url:'https://www.my-domain.com/wx/onlogin',
data:{ code:code}
})
}
else{
console.log('获取用户登录失败');
}
}
})
}
})
>开发者服务器获取唯一标识(opened)和会话密钥 (session_key)
>开发者服务器接收到用户登录凭证code值后 ,加上小程序唯一标识appid、小程序secret 、小程序的授权类型grant_type这3个参数去 请求微信服务接口https://api.weixin.qq.com/sns/jscode2 session,来获取session_key和唯一标识 openid
属性 | 必填 | 说明 |
appid | 是 | 小程序唯一标识 |
secret | 是 | 小程序的App secret |
js_code | 是 | 登录时获取的code |
grant_type | 是 | 填写为authorization_code |
>该接口返回参数为openid和session_key
>后台服务器有多种语言实现方式来请求微信服务器代码实现,如java、php或Node.js
>开发者服务器生成自己的sessionId
>开发者服务器获取到openid和session_key后,需要生成自己的sessionid
>规则可以自己定,可以采用拼接成字符串或拼接成字符串后再MD5加密等
>生成的sessionid需要在开发者服务器中保存起来
>sessionid保存到缓存Memcached、Redis、内存都可以
>小程序客户端保存sessionId
>小程序客户端没有类似于浏览器客户端的cookie或者 session机制,但是可以利用小程序的storage缓存机制来保存sessionid
>在后续调用需要登录后才有权限访问的后台服务时,可以将 保存在storage中的sessionid取出并携带在请求中,传递到后台
>后台代码获取到sessionid后,从缓存Redis或内存中查找是 否有该sessionid存在,若有,则确认该session是有效的, 继续执行后续代码,否则要进行错误处理
>wx.checkSession(OBJECT)检查登录状态是否过期
>使用该接口来检查登录状态是否过期
>如过期,则需要重新登录
属性 | 类型 | 必填 | 说明 |
timeout | string | 是 | 超时时间,单位ms |
success | function | 否 | 接口调用成功的回调函数 |
fail | function | 否 | 接口调用失败的回调函数 |
complete | function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
示例代码:
wx.checkSession({
success () {
//session_key 未过期,并且在本生命周期一直有效
},
fail () {
// session_key 已经失效,需要重新执行登录流程
wx.login() //重新登录
}
})
>wx.getUserInfo(OBJECT)获取用户信息
>该接口用来获取用户信息
>在获取用户信息之前,需要调用wx.login接口
>用户只有在登录状态下才能获取用户相关信息
属性 | 类型 | 必填 | 说明 |
withCrede ntials | boolean | 否 | 是否带上登录态信息。当 withCredentials 为 true 时,要求此前有调 用过 wx.login 且登录态尚未过期,此时返回的数据会包含 encryptedData, iv 等敏感信息;当 withCredentials 为 false 时,不 要求有登录态,返回的数据不包含 encryptedData, iv 等敏感信息。 |
lang | string | 否 | 显示用户信息的语言 |
success | function | 否 | 接口调用成功的回调函数 |
fail | function | 否 | 接口调用失败的回调函数 |
complete | function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
示例代码:
Page({
onLoad:function(){
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
}
})
}
})
#微信支付API
>微信小程序支付介绍
>微信支付主要经过:
>小程序内调用登录接口
>商户server调用支付统一下单
>API:https://pay.weixin.qq.com/wiki/doc/api/wxa /wxa_api.php?chapter=9_1
>商户server调用再次签名
>API:https://pay.weixin.qq.com/wiki/doc/api/wxa /wxa.api.php?chapter=7_7
>商户server接收支付通知
>API:https://pay.weixin.qq.com/wiki/doc/api/wxa /wxa.api.php?chapter=9_7
>商户server查询支付结果
>API:https://pay.weixin.qq.com/wiki/doc/api/wxa /wxa_api.php?chapter=9_2
>微信支付接口:wx.requestPayment(OBJECT)
属性 | 类型 | 必填 | 说明 |
timeStamp | string | 是 | 时间戳,从 1970 年 1 月 1 日 00:00:00 至今的秒数, 即当前的时间 |
nonceStr | string | 是 | 随机字符串,长度为32个字符以下 |
package | string | 是 | 统一下单接口返回的 prepay_id 参数值,提交格式如: prepay_id=*** |
signType | string | 否 | 签名算法 |
paySign | string | 是 | 签名,具体签名方案参见pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=3 |
success | function | 否 | 接口调用成功的回调函数 |
fail | function | 否 | 接口调用失败的回调函数 |
complete | function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
示例代码:
wx.requestPayment({
timeStamp: '',
nonceStr: '',
package: '',
signType: 'MD5',
paySign: '',
success (res) { },
fail (res) { }
})
>微信小程序支付实现步骤
>微信小程序调用wx.login方法,获取用户登录凭证code
>微信小程序将用户登录凭证code传输给自己的开发者后台服务器
>开发者后台服务器根据用户登录凭证code向微信服务器请求获取 唯一标识(openid)
>开发者后台服务器获取到唯一标识(opened)后,开发者后台服务 器调用统一下单支付接口,来获取预支付交易会话标识 (prepay_id)
>开发者后台服务器调用签名,并返回支付需要使用的参数
>微信小程序调用wx.requestPayment方法发起微信支付
>开发者后台服务器接收微信服务器的通知并处理微信服务器返回 的结果
#分享API
>微信小程序可以在Page中定义onShareAppMessage函数, 设置该页面的分享信息
>只有定义了此事件处理函数,右上角菜单才会显示“分享” 按钮
>用户单击“分享”按钮的时候会调用
>此事件需要return一个Object,用于自定义分享内容
属性 | 类型 | 必填 | 说明 |
timeout | string | 是 | 超时时间,单位ms |
success | function | 否 | 接口调用成功的回调函数 |
fail | function | 否 | 接口调用失败的回调函数 |
complete | function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
示例代码:
Page({
onShareAppMessage:function(){
return {
title:'自定义分享标题',
desc:'自定义分享描述',
path:'/page/user?id=123'
}
}
})
效果截图:
...持续学习完善中。
#学无止境#