Cordova微信登录插件Android端不能使用的问题

809 阅读3分钟

在开发混合项目的时候,避免不了使用微信登录。然而微信官方并没有提供针对混开项目的集成方式;好在网上有大神针对cordova写了一个微信登录的插件,可惜两年前就已经停止维护,存在一些问题,下面就主要遇到的问题,提供一些解决办法。

  1. java代码错误
  2. 微信文件位置放错

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版本的插件。