Android:微信第三方登录和分享实现
微信第三方登录和分享搞起来感觉比QQ的复杂一点,下面带大家一步一步实现微信第三方登录以及微信分享功能。
1.新建项目Android项目:WeiXinExra
2.下载微信SDK:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=939716175125bf18854e4c652061c70fc9b9403c&lang=zh_CN
将libammsdk.jar放到项目libs目录下,并右键,选择Builld path,点击Add to Build path。如下
3.第三步获取该项目的微信的APPID
A.先将WeiXinExtra项目使用密钥导出为APK包。
B.申请微信开发者账号:https://open.weixin.qq.com/
C.在微信开放平台上的“管理中心”创建移动应用,填写具体信息,点击下一步。
D:在这里我们可以看到有一个应用签名,获取应用(WeiXinExtra)签名
a.下载微信提供的签名生成工具:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=939716175125bf18854e4c652061c70fc9b9403c&lang=zh_CN
b.将签名后的WeiXinExtra.apk进行安装,然后安装微信签名生成工具(Gen_Signature_Android2.apk),使用该工具获取我们APK对应的签名(注:使用不同密钥生成的APK,其使用微信签名生成工具获取的签名是不一样的,所以要保持APK使用同一密钥)
c.获取APK应用签名,我的应用签名为:e0fda5aec62fd48ae788f248e4eadbed
d.提交审核,等待审核完成吧,我的应用官网是随便填的,希望能审核成功吧,审核时间可能需要几个小时的时间。
E:审核成功后,获取得到APPID
4.接下来是代码部分了。可以先看看官方的文档:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=1417751808&token=939716175125bf18854e4c652061c70fc9b9403c&lang=zh_CN
5.微信第三方登录功能实现
1.注册APPID带微信,以及实现登录
public class WXManager { // 微信第三方登录appid public final static String WEIXINAPPID = "xxxxxxxxxxxxxxxxxx"; // 微信第三方登录appsecret public final static String WEIXINAPPSECRET = "xxxxxxxxxxxxxxxxxx"; private IWXAPI wxApi; private Context context; private WXManager(Context context) { this.context = context; initWeixin(context); } //向微信注册APPID(初始化) private void initWeixin(Context context) { wxApi = WXAPIFactory.createWXAPI(context, WXManager.WEIXINAPPID); wxApi.registerApp(WXManager.WEIXINAPPID); if (!wxApi.isWXAppInstalled()) {// 提醒用户没有安装微信 Toast.makeText(context, "你没有安装微信", 0).show(); return; } } // 微信第三方登录 public void weiXinLogin() { SendAuth.Req req = new SendAuth.Req(); req.scope = "snsapi_userinfo"; req.state = "wechat_sdk_demo_test";//外部应用本身用来标识其请求的唯一性,验证完成后,将由微信终端回传 wxApi.sendReq(req); } }
a.需要先向微信注册你应用的APPID
//向微信注册APPID(初始化) private void initWeixin(Context context) { wxApi wxApi = WXAPIFactory.createWXAPI(context, WXManager.WEIXINAPPID); wxApi.registerApp(WXManager.WEIXINAPPID); if (!wxApi.isWXAppInstalled()) {// 提醒用户没有安装微信 Toast.makeText(context, "你没有安装微信", 0).show(); return; } }
b.其次是使用微信第三方授权登录
// 微信第三方登录 public void weiXinLogin() { SendAuth.Req req = new SendAuth.Req(); req.scope = "snsapi_userinfo"; req.state = "wechat_sdk_demo_test";//外部应用本身用来标识其请求的唯一性,验证完成后,将由微信终端回传 wxApi.sendReq(req); }
2.需要在你当前的包下创建包:com.example.weixinexra.wxapi(wxapi名字不能错),并创建Activity类WXEntryActivity(名字不能错)。WXEntryActivity是微信的回调Activity,微信回调的数据信息会返回到这个类中。
讲解以下这个过程,其实是这样的无论是微信第三方登录还是实现分享,登录/分享后从微信返回,微信都会返回到WXEntryActivity类中,然后再返回到自己的APP中,所以为了更好的用户体验,建议将WXEntryActivity变为透明
public class WXEntryActivity extends Activity implements IWXAPIEventHandler { private IWXAPI api; private String result = ""; @Override protected void onCreate(Bundle savedInstanceState) {//基本是这样 super.onCreate(savedInstanceState); api = WXAPIFactory.createWXAPI(this, WXManager.WEIXINAPPID, false); api.registerApp(WXManager.WEIXINAPPID); api.handleIntent(getIntent(), this); } // 微信发送请求到第三方应用时,会回调到该方法 @Override public void onReq(BaseReq req) { } // 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法 @Override public void onResp(BaseResp resp) { switch (resp.getType()) { case ConstantsAPI.COMMAND_SENDAUTH:{//判断该回调是微信第三方登录 switch (resp.errCode) { case BaseResp.ErrCode.ERR_OK://授权成功 result = "发送成功"; String code = ((SendAuth.Resp) resp).code;//微信返回的数据,可以进行后续操作,如获取得到用户的信息 break; case BaseResp.ErrCode.ERR_USER_CANCEL: finish(); break; case BaseResp.ErrCode.ERR_AUTH_DENIED: result = "授权被拒绝"; Toast.makeText(this, result, 0).show(); finish(); break; default: finish(); break; } break; } } } @Override protected void onNewIntent(Intent intent) {//一定要实现的,里面的东西一个不能少 super.onNewIntent(intent); setIntent(intent); api.handleIntent(intent, this); } }
c.还需要在AndroidManifest.xml文件中,加入以下权限
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
以及在AndroidManifest.xml文件中加入以下activity
<activity android:name="com.luyuapp.citysurp.wxapi.WXEntryActivity" android:exported="true" android:theme="@android:style/Theme.Translucent.NoTitleBar" /> <activity android:name="com.tencent.connect.common.AssistActivity" android:screenOrientation="portrait" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
这样就实现了简单的微信授权登录,可以根据需要获取到((SendAuth.Resp) resp).code后访问微信用户的个人信息。
微信分享:微信分享的过程其实跟上面的过程一样,只是上面的过程实现了一个微信登录的方法,那个方法专门用以实现微信的授权登录,下面只要我们实现微信分享的方法便可以实现微信的分享
1.可以先看看微信的文档说明:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317340&token=939716175125bf18854e4c652061c70fc9b9403c&lang=zh_CN
微信分享及收藏目前支持文字、图片、音乐、视频、网页共五种类型。
这里介绍分享网页的方式。
2.微信分享网页URL,可以传入“标题”,“描述”,“图片”,“url”四个参数类型
A.这里有一点需要注意一个,非常重要的。微信对分享出去的标题,描述,图片的大小都有严格限制,一旦传入的参数超过其限制是调不出微信的,分享就更不用说了,我们可以从微信的API查看到相应的信息。
下面是微信对分享网页的限制。
B.实现一个分享网页的方法,我这里也做了对字符串限制其长度的操作。在上面的WXManager类中加入以下方面,并在需要的地方调用便可以实现微信分享
// 分享到好友 public static final int WEIXIN_SHARE_TYPE_TALK = SendMessageToWX.Req.WXSceneSession; // 分享到朋友圈 public static final int WEIXIN_SHARE_TYPE_FRENDS = SendMessageToWX.Req.WXSceneTimeline; // 添加到微信收藏 public static final int WEIXIN_SHARE_TYPE_COLLECTION = SendMessageToWX.Req.WXSceneFavorite; /** * 微信 分享url * @param shareType 分享类型:1好友 WEIXIN_SHARE_TYPE_TALK 2朋友圈 WEIXIN_SHARE_TYPE_FRENDS * @param title 标题 * @param detail 描述 * @param url url */ public void shareWebPage(int shareType,String title,String detail,String url) { WXWebpageObject webpage = new WXWebpageObject(); webpage.webpageUrl = url; WXMediaMessage msg = new WXMediaMessage(webpage); // 网页标题 msg.title =subStringByByte(title,256); // 网页描述 msg.description = subStringByByte(detail,512); Bitmap thumb = BitmapFactory.decodeResource(context.getResources(),R.drawable.ic_launcher); msg.thumbData = BitmapUtils.Bitmap2Bytes(thumb); SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = buildTransaction("webpage"); req.message = msg; req.scene = shareType; wxApi.sendReq(req); } private String buildTransaction(final String type) { return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis(); } private String subStringByByte(String str, int len) { String result = null; if (str != null) { byte[] a = str.getBytes(); if (a.length <= len) { result = str; } else if (len > 0) { result = new String(a, 0, len); int length = result.length(); if (str.charAt(length - 1) != result.charAt(length - 1)) { if (length < 2) { result = null; } else { result = result.substring(0, length - 1); } } } } return result; }
至此,微信登录和分享讲解完了,因为我的审核还没通过,或许通过不了。若通过了之后给出一个demo给大家参考。
注意:测试的时候,需要用之前的密钥打包APK进行测试,不能直接通过IDE运行的方式去测试,不然是调不出微信的。
如果有问题各位可以通过邮箱569844962@qq.com问我,关于微信登录和分享的问题我会将我了解的答复大家。