微信 snsapi_userinfo 失败

通过 snsapi_userinfo 网页授权,从微信获取个人信息时,会出现失败的情况,频率大概在9%左右,几个项目下来,百思不得其解。测试时,明明好好地,上线后流量增大就经常出现空白数据的情况。后来经过好友点播,才明白个中原因。
先看代码:

function curl_post_json($url, $vars)
{

    $ch = curl_init();
    curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_POST, 1 );
    curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);
    //disable https check
    curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    'Content-Length: ' . strlen($vars))
    );
    //disable https check
    $data = curl_exec($ch);
    if ($data) {
        curl_close($ch);
        return $data;
    }  else {
        $curl_errno = curl_errno($ch);
        if($curl_errno > 0){
            $log       =   new \Think\Log();
            $log->write($curl_errno,'','',LOG_PATH.'cul_error.log');
        }
        curl_close($ch);
        return false;
    }
}

其中最重要的一句:

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    'Content-Length: ' . strlen($vars))
    );

设置header后,从微信接口返回的值,再也跑不掉了。

另外从微信获取信息后,有些表情数据库不能存储,或存储之后为乱码。此时,可以通过设置数据库编码来兼容,还有一种兼容所有数据编码的方法,就是:将昵称转换成 JSON 。json字符串数据库总是能保存的。这样做不好的地方是:数据库不能通过昵称明文查询了。只能是手动json_encode再拿去数据库中查。但是对于程序中的显示还是很方便的。

<think>好的,我现在需要解决用户的问题:他们的React Native代码在调用微信登录时跳转到了浏览器页面,而他们希望直接在微信内打开或者正确处理。让我仔细分析一下代码。 首先,用户使用了Linking.openURL来打开微信的授权URL。微信的OAuth2流程通常是需要用户在微信客户端内完成授权的,如果应用没有正确配置或调用方式不对,可能会导致跳转到浏览器而不是微信应用内。 查看代码,用户构造的URL是`https://open.weixin.qq.com/...`,这是微信网页授权的标准URL。但在移动端,特别是React Native应用中,可能需要使用微信的SDK来处理登录,而不是直接通过网页授权。因为直接打开网页授权链接可能在设备上没有微信客户端时无法处理,或者被系统默认用浏览器打开。 接下来,用户可能没有安装微信的SDK。React Native应用中集成微信登录通常需要第三方库,比如react-native-wechat-lib,这些库封装了原生SDK的调用。直接使用Linking可能无法正确唤起微信客户端,特别是在iOS上,需要正确配置URL Scheme和处理深层链接。 然后,代码中检查了微信是否安装,这部分是正确的。但是,使用Linking.openURL可能无法正确触发微信的授权流程,因为微信的移动端授权需要特定的SDK方法,比如发送请求到微信,然后通过应用的自定义URL Scheme回到应用。 用户的重定向URI是`myapp://login`,这需要在应用的配置中正确注册,确保微信授权后能跳转回来。同时,React Native端需要监听这个自定义的URL Scheme,以获取返回的code和state参数。 可能的问题点在于,使用网页授权的方式(通过https://open.weixin.qq.com)在移动端不被推荐,应该改用微信SDK提供的API。例如,在微信官方文档中,移动应用授权需要使用SDK中的发送授权请求的方法,而不是直接打开网页链接。 解决方案应该是集成微信的React Native SDK,使用其提供的方法(如sendAuthRequest)来发起登录请求,这样微信客户端会被正确唤起,处理授权流程,然后通过应用的自定义Scheme返回到应用。同时,需要确保iOS的Info.plist和Android的AndroidManifest.xml中正确配置了微信的App ID和URL Scheme,以便正确处理回调。 另外,用户可能需要在微信开放平台注册应用,确保AppID和包名、签名等正确配置,否则授权请求会被拒绝。这也会导致跳转到浏览器或者无法正常处理。 总结下来,修改的关键点在于替换Linking.openURL为微信SDK的授权方法,并确保SDK正确集成和配置。同时,处理回调的监听和参数的解析,以获取code进行后续的令牌交换和用户信息获取。</think>这个代码需要修改的关键点在于微信授权流程的唤起方式。我来帮你逐步分析和修改: 1. 问题核心原因分析: - 直接使用`Linking.openURL()`调用网页版微信授权链接会导致在浏览器打开 - 移动端微信登录需要通过原生SDK唤起微信客户端 2. 解决方案步骤: (1) 安装React Native微信SDK: ```bash npm install react-native-wechat-lib # 或 yarn add react-native-wechat-lib ``` (2) 修改后的代码: ```javascript import wechat from 'react-native-wechat-lib'; const handleWeChatLogin = async () => { try { // 检查微信是否安装 const isInstalled = await wechat.isWXAppInstalled(); if (!isInstalled) { Alert.alert('提示', '请先安装微信客户端'); return; } // 注册微信AppID(需在应用初始化时调用一次) await wechat.registerApp('wxc063640eb0fd5cce'); // 发送授权请求 const authResult = await wechat.sendAuthRequest( 'snsapi_userinfo', 'myapp_login_state' // 自定义state参数 ); console.log('微信授权结果:', authResult); // 这里会返回code,需要用code向后台换取access_token } catch (error) { console.error('微信登录失败:', error); if (error.code === -2) { Alert.alert('提示', '用户取消了授权'); } else { Alert.alert('错误', '微信登录失败,请重试'); } } } ``` 3. 配套需要做的配置: - iOS端: ```xml <!-- Info.plist --> <key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleTypeRole</key> <string>Editor</string> <key>CFBundleURLSchemes</key> <array> <string>wxc063640eb0fd5cce</string> <!-- 微信AppID --> <stri
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值