微信小程序与公众号网页共同开发解决未关注公众号情况下无法获取unionid的方法

BUG员 667 2019-05-29

后端版本:Tp5.1

前端:小程序,公众号网页

因项目需求,需采用共同的账户,此时需要用到unionid这个唯一的ID,具体如何操作,需要注册微信开放平台,将小程序和公众号绑定在一起才会有unionid这个参数

公众号网页方面可以直接获取到unionid,但是小程序方面无法获取到unionid(在用户没有关注公众号,也没有使用过公众号网页的情况下,是无法获取到unionid这个参数

那么就可以利用微信的API

https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserInfo.html

wx.getUserInfo这个API接口(注意参数withCredentials,获取到encryptedData, iv 等敏感信息),将其发送到后端执行解密能够获取到

后端代码块流程:

第一步利用微信API接口: auth.code2Session 获取到session_key 参数

第二步:判断是否存在unionid,如果不存在就执行第三步

第三步将参数利用wx.getUserInfo获取的encryptedData, iv 等敏感信息进行解密


具体代码

 $url="https://api.weixin.qq.com/sns/jscode2session?appid=".config('xiaochengxu')['appId']."&secret=".config('xiaochengxu')['secret']."&js_code=".$input['code']."&grant_type=authorization_code";
            $fanhui=file_get_contents($url);

            if(!$fanhui=json_decode($fanhui,true)){
                exception("加载失败1");
            }
            if(empty($fanhui['session_key'])){
                exception("加载失败2");
            }
            if(empty($fanhui['unionid'])){
                //如果没有找到这个东西 那就说明未关注公众号
                $pc = new WXBizDataCrypt(config('xiaochengxu')['appId'], $fanhui['session_key']);
                $errCode = $pc->decryptData($input['encryptedData'], $input['iv'], $data );

                if ($errCode != 0) {
                    exception("解密失败");
                }
                $data1=json_decode($data,true);
                if(!$data){
                    exception("其他错误1");
                }
                if(empty($data1['unionId'])){
                    exception("缺少参数1");
                }
//                unset($fanhui);
                $fanhui['unionid']=$data1['unionId'];

            }

贴上类

WXBizDataCrypt.php

<?php


namespace app\xiaochengxu\controller;
use  app\xiaochengxu\controller\ErrorCode;

class WXBizDataCrypt extends Base
{
    private $appid;
    private $sessionKey;

    /**
     * 构造函数
     * @param $sessionKey string 用户在小程序登录后获取的会话密钥
     * @param $appid string 小程序的appid
     */
    public function __construct( $appid, $sessionKey)
    {
        $this->sessionKey = $sessionKey;
        $this->appid = $appid;
    }


    /**
     * 检验数据的真实性,并且获取解密后的明文.
     * @param $encryptedData string 加密的用户数据
     * @param $iv string 与用户数据一同返回的初始向量
     * @param $data string 解密后的原文
     *
     * @return int 成功0,失败返回对应的错误码
     */
    public function decryptData( $encryptedData, $iv, &$data )
    {
//        dump($this->sessionKey);
        if (strlen($this->sessionKey) != 24) {
            return ErrorCode::$IllegalAesKey;
        }
        $aesKey=base64_decode($this->sessionKey);


        if (strlen($iv) != 24) {
            return ErrorCode::$IllegalIv;
        }
        $aesIV=base64_decode($iv);

        $aesCipher=base64_decode($encryptedData);

        $result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);

        $dataObj=json_decode( $result );
        if( $dataObj  == NULL )
        {
            return ErrorCode::$IllegalBuffer;
        }
        if( $dataObj->watermark->appid != $this->appid )
        {
            return ErrorCode::$IllegalBuffer;
        }
        $data = $result;
        return ErrorCode::$OK;
    }

}


贴上错误类

ErrorCode.php

<?php


namespace app\xiaochengxu\controller;


class ErrorCode extends Base
{
    public static $OK = 0;
    public static $IllegalAesKey = -41001;
    public static $IllegalIv = -41002;
    public static $IllegalBuffer = -41003;
    public static $DecodeBase64Error = -41004;
}

以上就是解决微信公众号和小程序共同开发情况下,无法获取到unionid的方法

上一篇:微信小程序搜索框回车搜索事件
下一篇:Tp5.1下载微信用户头像
相关文章

 发表评论

暂时没有评论,来抢沙发吧~