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问我,关于微信登录和分享的问题我会将我了解的答复大家。

 

posted @ 2016-05-22 19:20  草人木  阅读(715)  评论(0编辑  收藏  举报