第三方接微信登陆,分享,支付的一些坑(1)

最近接了公司遗漏项目,另一个安卓走了,接过他留下的bug,有点辛苦

主要就在这里讲讲接微信的一些问题,花费了我好久,主要出现在登陆部分和支付返回的JSON数据解析,以及分享纯图片时的一些问题。

那首先就是去微信公众平台注册,目前好像只支持企业注册,而且需要支付300元的费用,有点坑

之后你会得到一个APP ID和一个APPSecret 。APPID会在管理中心可以看到,APPSecret就需要你保存好,当然你也可以到时候要接接口的时候选择重置

第三方接微信登陆,分享,支付的一些坑(1)

之后下面是你已经获得的一些权限

第三方接微信登陆,分享,支付的一些坑(1)

之后是开发信息,这里面会涉及到一个应用签名,这个签名是可以更改的,但是一般为正式版签名,而在模拟机上运行时一般是测试版签名,也就是debug签名

第三方接微信登陆,分享,支付的一些坑(1)

之后你就可以开始用微信的功能了。


首先你需要在gradle中导入包

compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'

之后因为注册时应用签名选择的是正式版签名,在模拟机测试时比较麻烦,所以你需要把测试签名也转换成正式签名,同样也是在gradle:app中的android{}中进行更改

第三方接微信登陆,分享,支付的一些坑(1)

这些都是要写的,只是我发正式版了所以把它注释了。上面分别是正式签名的密码啊别名之类的,最后一个是绝对路径


1.微信登陆

在接微信登陆的时候,是我比较难以理解的地方。网上查找资料发现拉出授权页只需要4行代码就可以了,但在我项目里面就一直拉不出授权页。在最后正式版测试的时候换了个手机,授权页就出来了。

首先在登陆页面的onCreate中注册api

第三方接微信登陆,分享,支付的一些坑(1)

这之中的APP_ID你可以写在一个存放常量的类中,方便调用

之后在你登陆页的微信图标的点击事件中加入拉起授权的方法

第三方接微信登陆,分享,支付的一些坑(1)

就是这简单的4行代码

scope后面的是固定形式,不能更改

state后面的随便自己填写。

这样就能拉起授权页了。

PS:当你授权之后再次登陆,或者删除应用再跑起来再登陆都有可能无法拉起授权,而直接进入授权之后的回调。我就在这里疑惑了很久,不知道为什么拉不起来,疑惑了半天,后来索性就不管,反而好了。

之后就是授权确定之后的回调

你需要在包目录下创建一个wxapi文件夹,然后创建一个WXEntryActivity类,这些都要一模一样,不能更改

这个WXEntryActivity类就是微信授权登陆之后的回调处理

第三方接微信登陆,分享,支付的一些坑(1)

下面的WXPayEntryActivity类是用于之后的微信支付的

第三方接微信登陆,分享,支付的一些坑(1)

首先是注册

之后在OnResp中进行微信回调处理

 public void onResp(BaseResp baseResp) {
        switch (baseResp.getType()) {
            case ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX:
                switch (baseResp.errCode) {
                    case BaseResp.ErrCode.ERR_OK:
                        finish();
                        break;
                    case BaseResp.ErrCode.ERR_USER_CANCEL:
                        Toast.makeText(WXEntryActivity.this, "用户已取消", Toast.LENGTH_SHORT).show();
                        finish();
                        break;
                }
                break;
            case ConstantsAPI.COMMAND_SENDAUTH:
                switch (baseResp.errCode) {
                    case BaseResp.ErrCode.ERR_OK:
                        SendAuth.Resp baseResp1 = (SendAuth.Resp) baseResp;
                        String code = baseResp1.code;
//                        sign(code);
                        Map<String, String> parmsMap = new HashMap<>();
                        parmsMap.put("code", code);
                        OkHttpManger.getInstance().getAsync(Constant.URL + "WxLogin", new OKHttpUICallback.ResultCallback<AppBack>() {
                            @Override
                            public void onSuccess(AppBack appBack) {
                                if (appBack.isSuccess())
                                {
                                }
                            }
                        }, parmsMap);
                        break;
                    case BaseResp.ErrCode.ERR_AUTH_DENIED:
//                        Lg.e("用户拒绝授权");
                        finish();
                        break;
                    case BaseResp.ErrCode.ERR_USER_CANCEL:
//                        Lg.e("用户取消");
                        finish();
                        break;
                    case BaseResp.ErrCode.ERR_UNSUPPORT:
//                        Lg.e("不支持");
                        finish();
                        break;
                    default:
                        Log.e("mm","errCode: " + baseResp.errCode);
                        finish();
                        break;
                }
                break;
        }
    }
case ConstantsAPI.COMMAND_SENDAUTH:
    switch (baseResp.errCode) {
        case BaseResp.ErrCode.ERR_OK:
            SendAuth.Resp baseResp1 = (SendAuth.Resp) baseResp;
            String code = baseResp1.code;

这个是授权之后会给你一个code,你需要通过这个code和之前申请的APPSecret来获取一个access_token。因为我这里是后台已经写好了直接传一个code就可以了,具体的可看微信开发平台资源中心

第三方接微信登陆,分享,支付的一些坑(1)

之后在通过获取的access_token来获取授权

第三方接微信登陆,分享,支付的一些坑(1)

大致的接微信登录就是这样,有错勿喷,留言交流。