您的位置:首页 > 移动开发 > 微信开发

微信登录及注意事项

2017-01-04 17:04 429 查看
直接上登录核心代码 

***

demo   地址  http://download.csdn.net/detail/u013134722/9728876
//   1,WXEntryActivity这个类要写在  youpackagename.wxapi  这个包下

   2 ,每次测试要用keystore  打包测试

 3,注册微信登录平台时,提供的应用签名一定要是  ,用keystore打包安装的apk得到的应用签名  ,(获取签名软件    gensignsture.apk)

  <activity

            android:name="包名.wxapi.WXEntryActivity"

            android:exported="true"

            android:screenOrientation="portrait"

            android:theme="@android:style/Theme.NoDisplay" />

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {

    private final static String APP_ID = " "; // 微信平台AppId

    // 微信登录id,SECRET

    private final static String APP_SECRET = " "; // 微信平台SECRET

    private static Activity mContext;

    private static IWXAPI mApi;

    private static int mIsLogin = 1;// 0微信分享,1微信登录

    String infoStr;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        Log.e("after", "WXEntryActivity.onCreate。。。");

        super.onCreate(savedInstanceState);

        if (mApi != null) {

            mApi.handleIntent(getIntent(), this);

            Log.e("after", "mApi.handleIntent(getIntent(), this);");

        }

        Log.e("after", "oncreate");

    }

    @Override

    protected void onDestroy() {

        super.onDestroy();

        mContext = null;

    }

    @Override

    protected void onNewIntent(Intent intent) {

        Log.d(WXEntryActivity.class.getSimpleName(),

                "WXEntryActivity.onNewIntent。。。");

        super.onNewIntent(intent);

        setIntent(intent);

        if (mApi != null)

            mApi.handleIntent(intent, this);

    }

    // 微信发送请求到第三方应用时,会回调到该方法

    @Override

    public void onReq(BaseReq req) {

        Log.d(WXEntryActivity.class.getSimpleName(),

                "WXEntryActivity.onReq => type " + req.getType()

                        + " <=> transaction " + req.transaction);

    }

    // 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法

    @Override

    public void onResp(BaseResp resp) {

        Log.e("after", "onResp   微信回调");

        if (mContext == null)

            return;

        String result = "";

        switch (resp.errCode) {

        case BaseResp.ErrCode.ERR_OK:// (用户同意)

            result = "R.string.errcode_success";

            if (mIsLogin == 1) {

                result = "用户同意";

            }

            // UIUtil.showMessageText(this, result);

            Log.e("after", "用户同意");

            // 用户同意授权,对数据进行处理

            if (mIsLogin == 1) {// 登录

                SendAuth.Resp re = (SendAuth.Resp) resp;

                // int expireDate = re.expireDate;// 过期时间

                // int errCode = re.errCode;// 错误码

                // String errStr = re.errStr;// 错误描述

                // String state = re.state; // 状态

                String token = re.token;// 应该是类似code

                // Log.e("after", "getcode" + token);

                // s使用code换取taken

                //

                final String getAccess_tokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="

                        + APP_ID

                        + "&secret="

                        + APP_SECRET

                        + "&code="

                        + token

                        + "&grant_type=authorization_code";

                // 分两次与腾讯服务器交互,第一次根据返回的 re.token和自己申请的 秘钥 获取 接入 凭证

                // access_token,第二次通过这个凭证连接服务器获取用户数据

                // 分两个线程演示

                /**

                 * Thread one

                 */

                new Thread(new Runnable() {

                    @Override

                    public void run() {

                        getHttpData(getAccess_tokenUrl,

                                new GetWeixinDataListener() {

                                    @Override

                                    public void getDataOK(String strResult) {

                                        // TODO Auto-generated method stub

                                        JSONObject obj1 = null;

                                        try {

                                            obj1 = new JSONObject(strResult);

                                            String access_token = obj1

                                                    .getString("access_token");

                                            String openid = obj1

                                                    .getString("openid");

                                            infoStr = "https://api.weixin.qq.com/sns/userinfo?access_token="

                                                    + access_token

                                                    + "&openid="

                                                    + openid;

                                            Log.i("after",

                                                    "获取地址 infoStr        "

                                                            + infoStr);

                                            /**

                                             * 获取takeon之后获取用户信息 Thread two

                                             */

                                            new Thread(new Runnable() {

                                                @Override

                                                public void run() {

                                                    // TODO Auto-generated

                                                    // method stub

                                                    getHttpData(

                                                            infoStr,

                                                            new GetWeixinDataListener() {

                                                                @Override

                                                                public void getDataOK(

                                                                        final String strResult) {

                                                                    Log.i("after",

                                                                            "获取数据                  "

                                                                                    + strResult);

                                                                    // 在主线程操作UI线程

                                                                    runOnUiThread(new Runnable() {

                                                                        public void run() {

                                                                            Toast.makeText(

                                                                                    mContext,

                                                                                    "huqude 数据     "

                                                                                            + strResult,

                                                                                    1)

                                                                                    .show();

                                                                        }

                                                                    });

                                                                    //根据需要解析获取的数据

                                                                    JSONObject obj2;

                                                                    try {

                                                                        obj2 = new JSONObject(

                                                                                strResult);

                                                                        String nickname = obj2

                                                                                .getString("nickname");

                                                                        int sex = obj2

                                                                                .getInt("sex");

                                                                        String headimgurl = obj2

                                                                                .getString("headimgurl");

                                                                        String unionid = obj2

                                                                                .getString("unionid");

                                                                        String gender = "未知";

                                                                        if (sex == 1) {

                                                                            gender = "男";

                                                                        } else if (sex == 2) {

                                                                            gender = "女";

                                                                        } else {

                                                                            gender = "未知";

                                                                        }

                                                                        Log.i("after",

                                                                                "获取数据                  "

                                                                                        + nickname

                                                                                        + "性别      "

                                                                                        + gender);

                                                                    } catch (JSONException e) {

                                                                        e.printStackTrace();

                                                                    }

                                                                }

                                                            });

                                                }

                                            }).start();

                                        } catch (JSONException e) {

                                            // TODO Auto-generated catch block

                                            e.printStackTrace();

                                        }

                                    }

                                });

                    }

                }).start();

                // 获取用户信息

            }

            break;

        case BaseResp.ErrCode.ERR_USER_CANCEL:// 用户取消)

            result = "用户取消";

            Log.e("after", "用户取消)");

            break;

        case BaseResp.ErrCode.ERR_AUTH_DENIED:// (用户拒绝授权)

            result = "用户拒绝授权";

            Log.e("after", "用户拒绝授权)");

            break;

        default:

            result = "默认错误";

            Log.e("after", "默认错误)");

            break;

        }

        Toast.makeText(this, "" + result, 0).show();

        finish();

    }

    /**

     * 初始化微信

     *

     * @param mContext

     */

    public static void initWXEntry(Context mContext) {

        if (mApi == null) {

            mApi = WXAPIFactory.createWXAPI(mContext, APP_ID, true);

            mApi.registerApp(APP_ID);

        }

    }

    /**

     * 微信分享 (这里仅提供一个分享网页的示例,其它请参看官网示例代码)

     *

     * @param flag

     *            (0:分享到好友,1:分享到朋友圈)

     */

    private static WeChatLoginListener mLoginListener;

    public static void login(Activity context, WeChatLoginListener loginListener) {

        mLoginListener = loginListener;

        mContext = context;

        mIsLogin = 1;

        if (!mApi.isWXAppInstalled()) {

            mLoginListener.loginError("您尚未安装微信");

            return;

        }

        if (!mApi.isWXAppSupportAPI()) {

            mLoginListener.loginError("请安装最新版本的微信");

            return;

        }

        // 弹出界面

        final SendAuth.Req req = new SendAuth.Req();

        req.scope = "snsapi_userinfo";

        req.state = "none";

        boolean flag = mApi.sendReq(req);

        Log.e("after", "调用登录++是否成功" + flag);

    }

    public interface WeChatLoginListener {

        public void loginSuccess(String uuid, String nickname, String photo,

                String gender);

        public void loginError(String errorMessage);

        public void loginCancel();

    }

    /**

     * 将流装成string

     *

     * @param inputStream

     * @return

     * @throws Exception

     */

    public static String streamUtils(InputStream inputStream) throws Exception {

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

        byte[] buffer = new byte[1024];

        int len = 0;

        while ((len = inputStream.read(buffer)) != -1) {

            byteArrayOutputStream.write(buffer, 0, len);

        }

        return byteArrayOutputStream.toString();

    }

    /**

     * 与腾讯服务器连接获取用户信息

     *

     * @param strURL

     * @param mListener

     */

    public void getHttpData(String strURL, GetWeixinDataListener mListener) {

        HttpURLConnection connection = null;

        try {

            URL url = new URL(strURL);

            connection = (HttpURLConnection) url.openConnection();

            // 设置请求方法,默认是GET

            connection.setRequestMethod("GET");

            // 设置字符集

            connection.setRequestProperty("Charset", "UTF-8");

            // 设置文件类型

            connection.setRequestProperty("Content-Type",

                    "text/xml; charset=UTF-8");

            // 设置请求参数,可通过Servlet的getHeader()获取

            connection.setRequestProperty("Cookie",

                    "AppName=" + URLEncoder.encode("你好", "UTF-8"));

            // 设置自定义参数

            connection.setRequestProperty("MyProperty", "this is me!");

            if (connection.getResponseCode() == 200) {

                InputStream is = connection.getInputStream();

                String result = "";

                try {

                    result = streamUtils(is);

                    mListener.getDataOK(result);

                } catch (Exception e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }

            }

        } catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        } finally {

            if (connection != null) {

                connection.disconnect();

            }

        }

    }

    /**

     * 获取微信数据之后回调

     *

     * @author zyh

     *

     */

    public interface GetWeixinDataListener {

        void getDataOK(String strResult);

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 微信