在开发的工程过程中,一般喜欢是用微信授权登陆,但是怎么实现app授权与小程序授权同时存在呢?
一、一个项目即要使用app授权登陆,又要使用小程序授权登陆。而且要保证同一个微信号,这个时候就不可以使用openid,因为app授权登陆拿到的是app应用获取的openid与小程序授权登陆获取到的openid肯定是不一致的,这个时候就需要使用他们的共同唯一标示 UnionID 因为同一用户,对同一个微信开放平台下的不同应用,UnionID是相同的。微信官网介绍:UnionID 机制说明
二、怎么拿到UnionID?
1、app授权登陆是可以直接拿到UnionID;
2、小程序就需要你自己去获取了,我使用是 调用接口 wx.login() wx.getUserInfo(),从解密数据中获取 UnionID。注意本接口需要用户授权,请开发者妥善处理用户拒绝授权后的情况。代码如下:
$open_info = get_user_openid($js_code);//$js_code wx.login 授权时候能获取到
function get_user_openid($js_code)
{
$appid = 'appid';//小程序唯一标识 (在微信小程序管理后台获取)
$appsecret = 'appsecret' ;//小程序的 app secret (在微信小程序管理后台获取)
$grant_type = "authorization_code"; //授权(必填)
$curl = curl_init();
//使用curl_setopt() 设置要获得url地址
$url = 'https://api.weixin.qq.com/sns/jscode2session?appid=' . $appid . '&secret=' . $appsecret . '&js_code=' . $js_code . '&grant_type=' . $grant_type;
curl_setopt($curl, CURLOPT_URL, $url);
//设置是否输出header
curl_setopt($curl, CURLOPT_HEADER, false);
//设置是否输出结果
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
//设置是否检查服务器端的证书
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
//使用curl_exec()将curl返回的结果转换成正常数据并保存到一个变量中
$data = curl_exec($curl);
//关闭会话
curl_close($curl);
return json_decode($data,true);
}
$result = get_decryptData($param['encryptedData'],$param['iv'],$open_info['session_key']);
/**
* 检验数据的真实性,并且获取解密后的明文.
* @param $encryptedData string 加密的用户数据
* @param $iv string 与用户数据一同返回的初始向量
* @param $session_key string 授权的获取的具有时效性哦
* @param $data string 解密后的原文
*
* @return int 成功0,失败返回对应的错误码
*/
function get_decryptData($encryptedData,$iv,$session_key)
{
$appid = 'appid';//小程序唯一标识 (在微信小程序管理后台获取)
$aesKey = base64_decode($session_key);
$aesIV = base64_decode($iv);
$aesCipher = base64_decode($encryptedData);
$result = openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
$data = json_decode( $result,true);
if( $data == NULL )
{
return false;
}
if($data['watermark']['appid'] != $appid )
{
return false;
}
return $data;
}
经过 wx.login() wx.getUserInfo() 操作的解码之后就能拿到 代码中的$result,里面就有UnionID
二、通过UnionID就可以判断是否是同一微信账号了,相当于你之前的openid。具体的逻辑需要你自己去写哦!
三,注意事项
1、微信小程序支付需要 必填参数openid,此时不可以使用UnionID代替哦!
2、app授权的时候获取到的UnionID不一致的时候,需要注意一下app需要打包到真机上去运行哦!在虚拟机与loder是会一直不对应哦!
3、一定要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),一定要绑定哦!