在开发混合项目的时候,避免不了使用微信登录。然而微信官方并没有提供针对混开项目的集成方式;好在网上有大神针对cordova写了一个微信登录的插件,可惜两年前就已经停止维护,存在一些问题,下面就主要遇到的问题,提供一些解决办法。
- java代码错误
- 微信文件位置放错
java代码错误
共有3个错误:
1 获取AppID方法调用错误
2 变量调用错误
3 获取js参数错误
首先来看一下错误文件所在位置:
报错文件路径:src/main/java/xu/li/cordova/wechat的WeChat文件
获取AppID错误
该方法调用getAppId()方法获取String类型的AppID并将值赋值给saveAppid。但是该方法传入了一个Activity。我们查看该方法时发现getAppId()方法并没有让传入任何参数。
(图3)
**解决方式**去掉cordova.getActivity()参数
try {
final String appid = params.getString("appid");
//去掉Activity参数
final String savedAppid = getAppId();
if (!savedAppid.equals(appid)) {
this.saveAppId(cordova.getActivity(), appid);
}
变量调用错误
在图3中我们看到异常代码
appId = preferences.getString(WXAPPID_PROPERTY_KEY, "");
如果懂点java基础的人一看就知道错误的原因,getAppId()方法为一个静态方法,里面调用的方法也应该是静态的。
解决方式
1 将CordovaPlugin类的成员变量也修改为静态的
protected static CordovaPreferences preferences;
2 在Wechat类中申明一个CordovaPreferences的静态变量,并在pluginInitialize()方法其赋值 最后将getAppId()方法改成如下
public static String getAppId() {
if (appId == null) {
//获取Appid
appId = myAppID.getString(WXAPPID_PROPERTY_KEY, "");
}
return appId;
}
获取js参数错误
在调用微信支付的时候会调用sendPaymentRequest()方法,此方法中会获取从js前端传过来的参数值获取AppId
由于公司项目中js代码调用微信分享适配的为2.0的微信登录分享插件;而当时我用的是2.3版本的插件所以,遇到了参数出入异常的问题。解决办法
1 去掉红框中的代码
2 将插件换成2.0版本(如果插件使用的为2.0版本,上面的错误都不存在了,只有一个微信官方文件路径错误的问题)
cordova命令:
//移除微信登录分享插件
cordova plugin rm cordova-plugin-wechat
// 添加微信登录分享插件并制定为2.0版本
cordova-plugin-wechat@2.0.0 --variable wechatappid=YOUR_WECHAT_APPID
微信文件位置放错
微信登录官方文档有两个是要自己创建的类:WXEntryActivity类和WXPayEntryActivity类 红框中已经说明必须放在包名下面,而插件在项目的目录中自己生成了一个src/包名/wxapi的目录
androidstudio的项目正确包名位置为app/src/main/java/包名
问题解决
1 直接将plugins文件下android项目的微信目录及文件放到正确的包名路径下
此种解决方式在每次写完前端代码,不要使用cordova build android 命令打包,使用此命令会使android项目重构,清楚之前修改的android文件。可以使用cordova run android 命令, 此命令及时没有连接手机,也会将最新的前端代码添加到android项目中;然后使用androidstudio打包即可。
2 修改插件的js代码。打开微信登录分享插件的js代码文件
将targetDir变量的发赋值方法path.join()
var targetDir = path.join(projectRoot, "platforms", "android", "src", packageName.replace(/\./g, path.sep), "wxapi");
targetFiles = ["EntryActivity.java", "WXEntryActivity.java", "WXPayEntryActivity.java"];
改为
var targetDir = path.join(projectRoot, "platforms", "android", "app","src","main","java", packageName.replace(/\./g, path.sep), "wxapi");
targetFiles = ["EntryActivity.java", "WXEntryActivity.java", "WXPayEntryActivity.java"];
此问题为androidstudio项目android包名路径的问题,上面解释过,这里就不多解释了。然后就可以删除platforms文件夹下的android平台重新生成了。(提示:如果是2.3版本,删除android平台后,需要修复上面的java代码错误)
总结
cordova微信登录分享插件因为年久失修,所以在android平台出现了一些问题(ios还未发现),问题主要是代码和文件路径错误。如果公司没有硬性要求必须使用2.3版本的插件,建议使用2.0.0版本的插件。