第三方接微信登陆,分享,支付的一些坑(1)
最近接了公司遗漏项目,另一个安卓走了,接过他留下的bug,有点辛苦
主要就在这里讲讲接微信的一些问题,花费了我好久,主要出现在登陆部分和支付返回的JSON数据解析,以及分享纯图片时的一些问题。
那首先就是去微信公众平台注册,目前好像只支持企业注册,而且需要支付300元的费用,有点坑
之后你会得到一个APP ID和一个APPSecret 。APPID会在管理中心可以看到,APPSecret就需要你保存好,当然你也可以到时候要接接口的时候选择重置
之后下面是你已经获得的一些权限
之后是开发信息,这里面会涉及到一个应用签名,这个签名是可以更改的,但是一般为正式版签名,而在模拟机上运行时一般是测试版签名,也就是debug签名
之后你就可以开始用微信的功能了。
首先你需要在gradle中导入包
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
之后因为注册时应用签名选择的是正式版签名,在模拟机测试时比较麻烦,所以你需要把测试签名也转换成正式签名,同样也是在gradle:app中的android{}中进行更改
这些都是要写的,只是我发正式版了所以把它注释了。上面分别是正式签名的密码啊别名之类的,最后一个是绝对路径
1.微信登陆
在接微信登陆的时候,是我比较难以理解的地方。网上查找资料发现拉出授权页只需要4行代码就可以了,但在我项目里面就一直拉不出授权页。在最后正式版测试的时候换了个手机,授权页就出来了。
首先在登陆页面的onCreate中注册api
这之中的APP_ID你可以写在一个存放常量的类中,方便调用
之后在你登陆页的微信图标的点击事件中加入拉起授权的方法
就是这简单的4行代码
scope后面的是固定形式,不能更改
state后面的随便自己填写。
这样就能拉起授权页了。
PS:当你授权之后再次登陆,或者删除应用再跑起来再登陆都有可能无法拉起授权,而直接进入授权之后的回调。我就在这里疑惑了很久,不知道为什么拉不起来,疑惑了半天,后来索性就不管,反而好了。
之后就是授权确定之后的回调
你需要在包目录下创建一个wxapi文件夹,然后创建一个WXEntryActivity类,这些都要一模一样,不能更改
这个WXEntryActivity类就是微信授权登陆之后的回调处理
下面的WXPayEntryActivity类是用于之后的微信支付的
首先是注册
之后在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就可以了,具体的可看微信开发平台资源中心
之后在通过获取的access_token来获取授权
大致的接微信登录就是这样,有错勿喷,留言交流。