我博客前端时间已经启用了: 微信小程序登陆. 支付宝小程序登陆. QQ小程序登陆. 均不需要注册,直接扫码,点下小程序的登陆按钮即可..

 

虽然微信小程序之外的每个小程序平台都是抄微信,抄的接口和接口名字都一样.

但是还是有一些差异,主要是支付宝这个异端差距比较大.

这里一些差异主要是指像我博客这样用于网站登陆,各平台差异.

 

允许个人注册?

QQ,微信,支付宝平台3个平台 ,允许个人名义注册,允许个人名义上线小程序.

头条(抖音)小程序,可以个人注册,但是个人名义的小程序不能上线.(原来最初好像可以,现在关闭个人认证通道了.)

百度小程序,个人名义无法注册小程序.

 

总体登陆流程差异

首先都是网站前台请求登陆生成一个登陆字符串.然后各大平台小程序扫码进入登陆逻辑.

主要差异还是在支付宝小程序上.

 

支付宝小程序

 

服务器生成登陆参数->二维码-->小程序-->

用户点击授权得到authCode-->发送到服务器换授权令牌->

服务器用令牌换取用户信息->将用户名字和头像和openid返回给小程序.

 

非支付宝小程序

 

服务器生成登陆参数->二维码-->小程序-->

uni.login得到解密code->用户点击授权得到加密字符串->

发送到服务器->解密得到用户信息和openid->将openid返回给小程序.

 

 

 

 

二维码差异

 

QQ和微信是暴改的二维码,变形码.其他APP扫不出来.

支付宝和头条(抖音)的小程序使用的是普通的二维码.

 

 

小程序扫码部分差异

 

非微信小程序

非微信小程序的二维码可以直接带参数定位到login页面.

而不需要先打开index跳转到login.

 

微信小程序

微信小程序生成的二维码有两种:

有总数量限制的永久二维码,可以跳转到login页面.

另外一种生成总数量没有限制的.只能传入一个scene字符串,不能指定页面.

 

用于网站登陆的肯定数量不限.所以只能用第二种生成.

所以必须要先打开index页面.

然后携带二维码中的参数跳转到login页面.

 

//如果是扫码进入,那么直接跳转,仅小程序支持这个参数
//#ifndef MP-H5 	
	if	(typeof (options.scene) !== "undefined"){
		console.log('带参数');
		let scene = decodeURIComponent(options.scene);
		
		console.log(scene);
		uni.reLaunch({
			url: '/pages/login/login?scene=' + scene 
		})
	}
//#endif	

 

小程序端前端差异

这里都是指小程序Login页面前端.

实际上都是那个授权按钮的差异.

 

首先分有没有头像

 

没有头像

都是指没有授权过的(或者用户很久没有访问小程序,小程序清理了头像缓存的).

这种都需要调用用户授权.

 

有头像的

也要分是否需要刷新code的.

一个解密用code只能用一次.他和code,iv,encryptedData可以对应.

所以避免反复授权,都会将code,iv,encryptedData缓存到小程序.

 

 

如果code有效

那么可以直接将小程序缓存原来code,iv,encryptedData,以及二维码参数scene统一post到服务器登陆.

这次就不需要请求用户授权.

这需要服务器部分配合才能实现.

如果code失效

另外code如果过期, 那么iv,encryptedData这些数据不能再用,必须重新调用用户授权获得.

 

 

支付宝

因为支付宝小程序整体逻辑都不一样.

所以每次都需要调用授权函数.(好在主动授权第一次后,后续可以不弹出提示调用主动授权.)

 

 

QQ小程序

有个注意点就是必须要指定open-type="getUserInfo" 回调触发.不能直接响应按钮触发.

 

 

 

 

 

小程序登陆授权逻辑差异

 

非支付宝小程序

 

第一步

非支付宝的小程序都是先静默调用uni.login函数.此函数不需要授权即可调用.

得到解密用户数据的code.

自己缓存code.

自己使用uni.checkSession判断code是否过期,过期了需要重新调用uni.login,重新获取code.

 

第一步因为无需用户授权,可以直接在login页面的onLoad页面载入的时候自动处理.

 

 

第二步

用户点击按钮触发授权uni.getUserInfo/uni.getUserProfile(仅微信)函数.

在用户授权的情况下.得到:

userinfo:

小程序平台用户的头像和基本信息.

此信息不含openId/unionId.无法判断用户唯一性. (因为两个不同的微信用户可以用一样的头像一样的微信名字.)

iv:

加密向量,用于服务器解密encryptedData的.

encryptedData :

这个等于 加密的 userinfo+openId +小程序开发者appid(掩码)

必须经过服务器解密后才能得到openId,得到用户的唯一码.

signature:

加密的部分签名,如果不需要校验可以不管.

 

 

 

第三步

将 code ,iv ,encryptedData,scene (二维码传过来的参数) 4个数据发送到服务器.

服务器解密encryptedData得到用户基本信息和openId.

服务器解密成功可以返回success给小程序了.

 

 

代码

微信原来也是uni.getUserInfo今年改了.用uni.getUserProfile替代uni.getUserInfo了.

 

QQ小程序和头条小程序一样.

头条小程序要多一个参数.

 

 

 

支付宝小程序

 

支付宝小程序和其他平台有巨大差距.

支付宝有两种需要用户点击的授权的请求.

一种可以获取用户基本信息(支付宝昵称,支付宝头像),不含敏感信息,不包含openId(用户唯一值).

一种是只有一个authCode,没有其他信息.

 

想要利用支付宝小程序实现网站登陆,必须使用第二种方式.

 

 

authCode必须要服务器通过code2session换取用户的令牌.

然后用令牌获取用户基本信息(支付宝头像,支付宝昵称).

另外这个信息包括openid(用户唯一值)

 

 

逻辑代码

非常简单,就是调用一个 uni.getAuthCode .

然后将这个getAuthCode发送到服务器.

 

 

 

authCode分两种

主动授权:auth_user  ,

第一次会弹出授权窗口.用户确认后后续调用自动授权不会弹出.

但是支付宝不允许在onLoad页面种主动调用.

静默授权:auth_base 

无论如何都不会弹出信息,静默授权的authCode换取的令牌,不能获取用户openid.



 

服务器部分的差异

 

通讯方式差异

 

支付宝是使用RSA和服务器双向加密+验证签名通讯,安全性吊打其他几个.

所以支付宝小程序用的是RSA证书和支付宝服务器通讯.只有appid,没有secret..

其他的几个平台都是appid+secret向官方服务器换取令牌,后续用令牌通讯的.

 

code2Session

code(非支付宝) / authCode(仅支付宝) 都需要换取令牌.

共同点都是只能用一次.

 

差异的是

支付宝换取的用户操作令牌.

非支付宝的code换取的是解密密钥.

 

为了避免code/authCode 调用一次就立刻失效,我们需要将code/authCode 和 它们code2session后的解密密钥/令牌,联合存储起来.

后续登陆可以从缓存或者数据库拿出来.

 

得到用户信息

支付宝这步是直接用上一步的令牌,直接调用SDK可以得到用户基本信息+openid(用户唯一值)

非支付宝的这步需要用用上一步的sessionkey 和 iv + encryptedData解密出 用户基本信息+openid(用户唯一值)

 

 

用户信息差异

这步主要是考虑用户数据库表兼容.

 

微信和QQ都一样

"rrs": {
	"openId": "openid",
	"nickName": "yake-job",
	"gender": 1,
	"language": "zh_CN",
	"city": "Xinyu",
	"province": "Jiangxi",
	"country": "China",
	"avatarUrl": "用户头像网址",
	"unionId": "o72开头的unionId",
	"watermark": {
	  "timestamp": 1543412981,
	  "appid": "小程序开发者注册的appid"
}

 

 

支付宝

 

支付宝字段和其他差异巨大.需要自己做兼容.

{
	avatar: "https://tfs.alipayobjects.com/images/partner/TB1bT0gXkyEDuNjme6tXXXIKXXa"
	city: "新余市"
	code: "10000"
	gender: "m"
	msg: "Success"
	nick_name: "刘德华"
	province: "江西省"
	user_id: "208810210xxxxxxx十多位的数."
}

 

user_id相当于 微信小程序的unionId,

 某个用户对你名下所有支付宝小程序都是这个值.

 但是该用户对其他开发者的小程序这个值又不一样.可以理解为用户的对你的唯一ID.

 

 

小程序上线审核

 

支付宝小程序和微信小程序审核比较块,而且基本上都是直接通过.

qq的比较蛋疼,我打回来十几次.

最后告诉我不能含有百度网盘的链接.

 

 

补充

1,支付宝小程序因为用的UC浏览器内核,和QQ微信页面渲染差异还是挺大.

支付宝小程序对grba颜色样式支持差的很.支付宝小程序样式的选择器一律用不了.

 

2,微信小程序的开发者工具可以支持读取生成的微信小程序码进入页面,即使小程序没有上线.也能模拟扫小程序码的情况.

其他小程序的开发者工具目前均不支持,所以想要调试真机扫小程序码登陆必须要上线后才可以.可能后续也会抄微信的过去.