微信APP授权登陆与微信小程序授权同时使用 (php版)

本文讲解如何在项目中同时实现微信App授权与小程序授权登录,利用UnionID确保同一微信账号的一致性。文中详细介绍了获取UnionID的方法,以及在微信小程序支付等场景下使用UnionID的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在开发的工程过程中,一般喜欢是用微信授权登陆,但是怎么实现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、一定要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),一定要绑定哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值