您的位置:首页 > Web前端 > React

react native微信登录授权,以及一些错误

2018-01-13 17:59 603 查看

一、背景

公司的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: