react native微信登录授权,以及一些错误
一、背景 公司的APP,上次发布版本,我们的APP微信登录还是可以用的。但是在最新一版中,微信登录一直报-6的错误。于是开始了蛋疼的寻找之路。二、关于RN中使用微信组件的问题请参考链接:http://www.cnblogs.com/tangyuanby2/p/5589836.html我这里解释下里面一些关键性的东西,前提是博主用的是0.47版本的:1)此处:
一、背景
公司的APP,上次发布版本,我们的APP微信登录还是可以用的。但是在最新一版中,微信登录一直报-6的错误。于是开始了蛋疼的寻找之路。
二、关于RN中使用微信组件的问题
请参考链接:http://www.cnblogs.com/tangyuanby2/p/5589836.html
我这里解释下里面一些关键性的东西,前提是博主用的是0.47版本的:
1)此处:
可能是大神写博客的时候,RN的版本还比较低。在我用的0.47版本,这部分主要是替换RCTWeChat:
include ':react-native-wechat'
project(':react-native-wechat').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-wechat/android')
2、按照大神的博客继续往下走,有个部分需要注意:
这个部分,我们在使用获取第三方包工具的时候,输入的应用包名就是这个部分。
1)红色箭头代表的是我们的应用包名,我们自己可以定义。但是要保证这个部分不会重复,一般都是用域名来区分。
2)大家默认都用反序来表示,所以我这边用的也是反序。
3)我用的获取APP签名的工具叫做:GenSignature,大家自行搜索即可
例如我的应用包名:
域名.user
3、第三个需要注意的地方
这里因为大神用的是android的IDE,所以自动给他生成了com.rnwechatdemo的目录。但是,如果你用的不是IDE,那么你的目录文件应该是这样的:
这里是按照我们上面设定的应用包名来建目录的。先是com,然后是域名,然后是user。这部分一定要注意。
OK,大家按照大神的教程,基本上就算是把配置给弄完了,接下来就是在项目中的引用问题
三、关于微信登录授权的代码部分
1、直接上代码
/**
* 配置 react-native-wechat 的集成功能
*/
//因为我们做了混淆设置,所以这边在引用的时候需要注意下,引用的是*
import * as WeChat from 'react-native-wechat';
import toastModule from './toastModule'; // 弹出窗
WeChat.registerApp(wechat_ini.AppId); // ~~~~~~~~~~~~~~~~~~~~~~~需初始化配置 AppId~~~~~~~~~~~~~~~~~~~~~~
// 模块内部 - 工具类
class toolsForWechat {
/**
* 判断是否安装,并依据功能回调
* @param function func 回调函数
*/
static check_install(func) {
WeChat.isWXAppInstalled()
.then((isInstalled) => {
if(isInstalled) {
func();
} else {
toastModule.run('没有安装微信软件,请您安装微信之后再试');
}
});
}
/**
* 生成随机字符串
* @param bool flag 是否是任意长度
* @param int min 任意长度最小值
* @param int max 任意长度最大值
* @return string
*/
static random_str(flag, min, max) {
let str = "";
let index = "";
let range = min;
let arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b',
'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D',
'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
];
//min,max范围内随机的一个数
if(flag) {
range = Math.floor(Math.random() * (max - min + 1) + min);
}
for(let i = 0; i < range; i++) {
index = Math.round(Math.random() * (arr.length - 1));
str += arr[index];
}
return str;
}
}
// 核心
export default class wechatModule {
/**
* 微信登录
* @param function func 闭包登录成功后的逻辑函数
* @param string set_url 设置带?的url
*/
login(func, set_url = http.url('v1/wechat/login?')) {
// 需配置:后端处理微信登录接口
let __conf__ = {
url: set_url,
callback: func,
state: toolsForWechat.random_str(true, 4, 6), // 随机生成的码
};
//判断微信是否安装
toolsForWechat.check_install(() => {
//这里的sendAuthRequest是获取微信授权的意思。发送的字符串代表获取用户的信息
WeChat.sendAuthRequest("snsapi_userinfo")
.then(res => {
switch(parseInt(res.errCode)) {
// 用户换取access_token的code,仅在ErrCode为0时有效
case 0:
// 验证此次操作是用户自己进行的,否则结束操作
// if (res.state != __conf__.state) {
// toastModule.run('这里state不正确');
// return;
// }
// 请求后端,登录操作
http.get(__conf__.url + '&code=' + res.code, (d) => {
__conf__.callback(d); // 运行回调函数
});
break;
default:
// code...;
}
})
.catch((error) => { toastModule.run(error.message); });
});
}
}
2、关于获取微信授权的接口:
sendAuthRequest([scope[, state]]) :发送微信登录授权
1)params
参数名 类型 默认值 描述
scope {Array/String} 无 应用授权作用域,如获取用户个人信息则填写snsapi_userinfo
state {String} 无 用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验
2)return
{Promise}
3)返回值:
参数名 类型 描述
errCode Number ERR_OK = 0(用户同意) ERR_AUTH_DENIED = -4(用户拒绝授权)
-6(代表APP的签名有问题,需要重新再微信开放平台中填写)
ERR_USER_CANCEL = -2(用户取消)
errStr String 无
openId String 无
code String 用户换取access_token的code,仅在ErrCode为0时有效
四、关于我碰到的问题。
1、问题:
我在微信登录的时候,返回值是-6。
2、原因
因为之前生成APP是在另一个同事那边生成的。然后我自己在本地配置了下RN的秘钥,又重新生成了一版。这就造成APP的签名发生了改变,所以报错是-6
3、解决方案
下载获取APP应用宝的签名工具,然后重新获取签名。获取之后,去微信公众平台,修改下签名。修改之后,APP就可以用了。
这里说下。微信分享好友,微信支付,微信分享朋友圈等,用的都是这个组件。所以大家把它的用法搞清楚,有利于以后使用微信的其他功能。
参考链接:http://www.cnblogs.com/tangyuanby2/p/5589836.html
https://www.jianshu.com/p/3f424cccb888
更多推荐
所有评论(0)