Android微信登入

转发供给出名出处:

转发须求闻明出处:

转发须求盛名出处:

http://blog.csdn.net/lowprofile_coding/article/details/78004224
http://blog.csdn.net/lowprofile_coding/article/details/78004224
http://blog.csdn.net/lowprofile_coding/article/details/78004224

在此以前写过微信登陆分享支付第二版:

事先写过微信登入分享支付第三版:

事先写过微信登陆分享支付第二版:

http://blog.csdn.net/lowprofile_coding/article/details/48086381
http://blog.csdn.net/lowprofile_coding/article/details/48086381
http://blog.csdn.net/lowprofile_coding/article/details/48086381

前言

许多的app都有对接第3方sdk的急需。例如第一方登入必要连接微信、QQ、今日头条。第二方支付需求衔接微信、支付宝、银行职员联合会。

那个作者都有利用过,都有利用过她们的sdk,以为最费劲的便是微信,不可能直接调节和测试,得用正式的具名举办签约本事调整。还有他们官方的demo也是跑不起来的,因为未有签名文件。须求专注的地点也多数。

前言

大多数的app都有联网第2方sdk的急需。例如第1方登入须求连接微信、QQ、今日头条。第3方支付须要衔接微信、支付宝、银行职员联合会。

这几个笔者都有利用过,都有选取过她们的sdk,认为最麻烦的就是微信,不可能直接调节和测试,得用正式的具名举办签订契约才干调整。还有他们官方的demo也是跑不起来的,因为从没签字文件。供给专注的地点也多数。

前言

绝大很多的app都有连接第2方sdk的必要。例如第壹方登陆需求连接微信、QQ、搜狐。第二方支付须求衔接微信、支付宝、银行职员联合会。

那几个作者都有选拔过,都有接纳过她们的sdk,感觉最麻烦的正是微信,不可能直接调节和测试,得用正式的签署实行签约工夫调控。还有他们官方的demo也是跑不起来的,因为未有具名文件。须求专注的地点也很多。

代码完结

微信sdk现在帮衬Android
Studio在线引用了,在此之前都以增加jar的办法。要求拜访微信的接口获取用户消息,所以把大家此前封装的okhttp也联合在线引用。okhttp需求在自定义的Application中先河化那些本人就不贴代码了。此前已经讲过很频仍。在app/build.gradle文件dependencies标签中参与以下两行代码:

compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
compile 'com.ansen.http:okhttpencapsulation:1.0.1'

急需用到网络,所以在AndroidManifest.xml文件中参预互连网权限:

<uses-permission android:name="android.permission.INTERNET" />

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dp"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="登录之后信息在这里显示"/>

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/tv_nickname"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="昵称:"/>

        <TextView
            android:id="@+id/tv_age"
            android:layout_below="@+id/tv_nickname"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="年龄:"/>
    </RelativeLayout>

    <Button
        android:id="@+id/btn_login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="微信登录"/>

    <Button
        android:id="@+id/btn_share_friend_circle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="分享到朋友圈"/>

    <Button
        android:id="@+id/btn_share_friend"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="分享给好友"/>

    <Button
        android:id="@+id/btn_pay"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="微信支付"/>
</LinearLayout>

布局文件很简单,就LinearLayout里面放了多少个TextView,跟多少个按键。

WeiXin.java
用于伊芙ntBus来传送音信,微信sdk有个很意外的地方,正是不管登入、分享、支付之后都得用叁个Activity来收纳,所以大家还得从收受的万分activity把结果新闻通过伊夫ntBus传递给MainActivity。固然用广播也能落实,可是个人爱好用伊芙ntBus,使用灵活。简单轻量。

public class WeiXin {
    private int type;//1:登录 2.分享 3:微信支付
    private int errCode;//微信返回的错误码
    private String code;//登录成功才会有的code

    public WeiXin() {
    }

    public WeiXin(int type,int errCode, String code) {
        this.type = type;
        this.errCode=errCode;
        this.code = code;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public int getErrCode() {
        return errCode;
    }

    public void setErrCode(int errCode) {
        this.errCode = errCode;
    }
}

Constant.java
常量类,微信appid跟secret的值用八个常量保存。为了保养隐衷那四个值小编早就修改过。

public class Constant {
    public static String WECHAT_APPID="wxda6db2aec81389af";
    public static String WECHAT_SECRET="8fed5a2d510022587ef8a6194c965be3";
}

MainActivity.java 全体代码贴出来相比较乱,一时贴出MainActivity部分代码。

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private IWXAPI wxAPI;
    private TextView tvNickname,tvAge;
    public static final int IMAGE_SIZE=32768;//微信分享图片大小限制

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EventBus.getDefault().register(this);//注册
        wxAPI = WXAPIFactory.createWXAPI(this,Constant.WECHAT_APPID,true);
        wxAPI.registerApp(Constant.WECHAT_APPID);

        findViewById(R.id.btn_login).setOnClickListener(this);
        findViewById(R.id.btn_share_friend_circle).setOnClickListener(this);
        findViewById(R.id.btn_share_friend).setOnClickListener(this);
        findViewById(R.id.btn_pay).setOnClickListener(this);

        tvNickname= (TextView) findViewById(R.id.tv_nickname);
        tvAge=(TextView) findViewById(R.id.tv_age);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btn_login://微信登录
                login();
                break;
            case R.id.btn_share_friend_circle://微信分享到朋友圈
                share(true);
                break;
            case R.id.btn_share_friend://微信分享给朋友
                share(false);
                break;
            case R.id.btn_pay://微信支付
//              先去服务器获取支付信息,返回一个WeiXinPay对象,然后调用pay方法
                showToast("微信支付需要服务器支持");
                break;
        }
    }

    /**
     * 这里用到的了EventBus框架
     * @param weiXin
     */
    @Subscribe
    public void onEventMainThread(WeiXin weiXin){
        Log.i("ansen","收到eventbus请求 type:"+weiXin.getType());
        if(weiXin.getType()==1){//登录
            getAccessToken(weiXin.getCode());
        }else if(weiXin.getType()==2){//分享
            switch (weiXin.getErrCode()){
                case BaseResp.ErrCode.ERR_OK:
                    Log.i("ansen", "微信分享成功.....");
                    break;
                case BaseResp.ErrCode.ERR_USER_CANCEL://分享取消
                    Log.i("ansen", "微信分享取消.....");
                    break;
                case BaseResp.ErrCode.ERR_AUTH_DENIED://分享被拒绝
                    Log.i("ansen", "微信分享被拒绝.....");
                    break;
            }
        }else if(weiXin.getType()==3){//微信支付
            if(weiXin.getErrCode()==BaseResp.ErrCode.ERR_OK){//成功
                Log.i("ansen", "微信支付成功.....");
            }
        }
    }

    ..........

    public void showToast(String message){
        Toast.makeText(this,message,Toast.LENGTH_LONG).show();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);//取消注册
    }
}
  • onCreate
    注册EventBus,通过WXAPIFactory创设IWXAPI类,并且注册appid,给多个开关开关设置点击事件。查找呈现名字跟年龄的五个TextView。
  • onClick
    点击事件监听,依据id来判别点击不一致的开关,跳转到相应的法子,那么些办法没贴出来来,等会单独讲。
  • on伊夫ntMainThread(WeiXin weiXin)
    用来接收消息,那一个主意有个参数,用来决断项目,就是大家用EventBus发送时参数必须是WeiXin类型。首先判定type,是登入依然分享依旧支付。登6成功景观下会获得到code,依照code然后大家就能取获得微信用户新闻。
  • showToast Toast提示
  • onDestroy 取消EventBus注册

微信登录

微信登入流程有以下四个步骤:

  • 微信授权登入
  • 根据授权登录code 获取该用户token
  • 据悉token获取用户资料

当我们点击登6开关的时候,调用的是login方法。那一个格局就在MainActivity内部。正是给微信发起3个签到请求,弹出三个授权分界面。

public void login(){
    SendAuth.Req req = new SendAuth.Req();
    req.scope = "snsapi_userinfo";
    req.state = String.valueOf(System.currentTimeMillis());
    wxAPI.sendReq(req);
}

在你的包名相应目录下新建七个wxapi目录,然后在wxapi目录下增加产量3个WXEntryActivity类,用来收纳登陆授权以及享受时微信的回调音信。那个类承袭自Activity,须要完成IWXAPI伊夫ntHandler接口。

package com.ansen.shoenet.wxapi;
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
    private IWXAPI wxAPI;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        wxAPI = WXAPIFactory.createWXAPI(this,Constant.WECHAT_APPID,true);
        wxAPI.registerApp(Constant.WECHAT_APPID);
        wxAPI.handleIntent(getIntent(), this);
    }

    @Override
    protected void onNewIntent(Intent intent){
        super.onNewIntent(intent);
        wxAPI.handleIntent(getIntent(),this);
        Log.i("ansen","WXEntryActivity onNewIntent");
    }

    @Override
    public void onReq(BaseReq arg0) {
        Log.i("ansen","WXEntryActivity onReq:"+arg0);
    }

    @Override
    public void onResp(BaseResp resp){
        if(resp.getType()== ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX){//分享
            Log.i("ansen","微信分享操作.....");
            WeiXin weiXin=new WeiXin(2,resp.errCode,"");
            EventBus.getDefault().post(weiXin);
        }else if(resp.getType()==ConstantsAPI.COMMAND_SENDAUTH){//登陆
            Log.i("ansen", "微信登录操作.....");
            SendAuth.Resp authResp = (SendAuth.Resp) resp;
            WeiXin weiXin=new WeiXin(1,resp.errCode,authResp.code);
            EventBus.getDefault().post(weiXin);
        }
        finish();
    }
}

onCreate、onNewIntent、onReq这多少个艺术是定点写法。onResp方法接收微信结果新闻,首先剖断项目,遵照不相同的档次去封装WeiXin对象,借使是登入操作,把code传入进去,然后把包装好的WeiXin对象通过伊夫ntBus发送出去。MainActivity的on伊夫ntMainThread方法就会接受到那些新闻。最终调用finish关闭当前的activity。

WXEntryActivity记得在AndroidManifest.xml中注册

<activity
    android:exported="true"
    android:name=".wxapi.WXEntryActivity"/>

接轨回到首页的on伊芙ntMainThread,假如登录类型调用getAccessToken(),并且传入code。遵照code获取access_token,这么些url是微信公开的,供给传入四个参数,appid、secret、code。请求成功之后会回来access_token跟openid等信息。

public void getAccessToken(String code){
    String url = "https://api.weixin.qq.com/sns/oauth2/access_token?" +
            "appid="+Constant.WECHAT_APPID+"&secret="+Constant.WECHAT_SECRET+
            "&code="+code+"&grant_type=authorization_code";
    HTTPCaller.getInstance().get(WeiXinToken.class, url, null, new RequestDataCallback<WeiXinToken>() {
        @Override
        public void dataCallback(WeiXinToken obj) {
            if(obj.getErrcode()==0){//请求成功
                getWeiXinUserInfo(obj);
            }else{//请求失败
                showToast(obj.getErrmsg());
            }
        }
    });
}

获取到access_token跟openid之后一连调用getWeiXinUserInfo方法获取用户音讯。那样就能取到近期微信app登陆的用户1些消息。有外号、年龄、头像地址、语言等主导消息。在商场开辟中,到了这一步就足以拿着那个信息调用自身服务器的报到接口。当然大家那边就把小名跟年龄给TextView突显下。

public void getWeiXinUserInfo(WeiXinToken weiXinToken){
    String url = "https://api.weixin.qq.com/sns/userinfo?access_token="+
            weiXinToken.getAccess_token()+"&openid="+weiXinToken.getOpenid();
    HTTPCaller.getInstance().get(WeiXinInfo.class, url, null, new RequestDataCallback<WeiXinInfo>() {
        @Override
        public void dataCallback(WeiXinInfo obj) {
            tvNickname.setText("昵称:"+obj.getNickname());
            tvAge.setText("年龄:"+obj.getAge());
            Log.i("ansen","头像地址:"+obj.getHeadimgurl());
        }
    });
}

WeiXinToken跟WeiXinInfo那七个实体类就不贴代码了,WeiXinToken用来映射获取访问token接口再次回到的json。WeiXinInfo用来映射获取用户接口重返的json。

微信分享

分享有三种享受到对象圈跟分享给密友,统壹调用share方法。传入八个boolean类型来判别是或不是分享到对象圈。

public void share(boolean friendsCircle){
    WXWebpageObject webpage = new WXWebpageObject();
    webpage.webpageUrl = "www.baidu.com";//分享url
    WXMediaMessage msg = new WXMediaMessage(webpage);
    msg.title = "分享标题";
    msg.description = "分享描述";
    msg.thumbData =getThumbData();//封面图片byte数组

    SendMessageToWX.Req req = new SendMessageToWX.Req();
    req.transaction = String.valueOf(System.currentTimeMillis());
    req.message = msg;
    req.scene = friendsCircle ? SendMessageToWX.Req.WXSceneTimeline : SendMessageToWX.Req.WXSceneSession;
    wxAPI.sendReq(req);
}

享用内容有多数格式,分享图片、分享摄像、分享音信。我们那边就享受音讯为例,也是分享相比宽泛的格式。首先new三个WXWebpageObject对象,设置标题、内容、展开链接、封面等。最后调用wxAPI的sendReq放松1个请求。

享受跟登入同样,都会回调WXEntryActivity,然后又把分享结果发送给MainActivity.onEventMainThread方法。

支付
开垦第二供给请求大家友好的服务器,获取支付音信。获取成功之后调用pay方法。

public void pay(WeiXinPay weiXinPay){
    PayReq req = new PayReq();
    req.appId = Constant.WECHAT_APPID;//appid
    req.nonceStr=weiXinPay.getNoncestr();//随机字符串,不长于32位。推荐随机数生成算法
    req.packageValue=weiXinPay.getPackage_value();//暂填写固定值Sign=WXPay
    req.sign=weiXinPay.getSign();//签名
    req.partnerId=weiXinPay.getPartnerid();//微信支付分配的商户号
    req.prepayId=weiXinPay.getPrepayid();//微信返回的支付交易会话ID
    req.timeStamp=weiXinPay.getTimestamp();//时间戳

    wxAPI.registerApp(Constant.WECHAT_APPID);
    wxAPI.sendReq(req);
}

weiXinPay的值应该是大家从本身服务器获取的,然后把重返新闻打包到PayReq对象中,最终调用wxAPI的sendReq方法发起呼吁。

在wxapi目录下增加产量一个WXPayEntryActivity类,这些类跟WXEntryActivity同级,用来抽取微信支付的回调音讯。那么些类承继自Activity,必要达成IWXAPI伊芙ntHandler接口。

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
    private IWXAPI wxAPI;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        wxAPI = WXAPIFactory.createWXAPI(this, Constant.WECHAT_APPID);
        wxAPI.handleIntent(getIntent(), this);
    }

    @Override
    protected void onNewIntent(Intent intent){
        super.onNewIntent(intent);
        setIntent(intent);
        wxAPI.handleIntent(intent, this);
    }

    @Override
    public void onReq(BaseReq baseReq) {}

    @Override
    public void onResp(BaseResp resp) {
        Log.i("ansen", "微信支付回调 返回错误码:"+resp.errCode+" 错误名称:"+resp.errStr);
        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX){//微信支付
            WeiXin weiXin=new WeiXin(3,resp.errCode,"");
            EventBus.getDefault().post(weiXin);
        }
        finish();
    }
}

其余方法都是固定写法,在onResp中剖断假诺是微信登入,就封装2个WeiXin对象,然后发送伊芙ntBus请求。那样MainActivity的on伊芙ntMainThread就会吸收接纳到那一个WeiXin对象。

WXPayEntryActivity记得在AndroidManifest.xml中注册。

<activity
    android:exported="true"
    android:name=".wxapi.WXPayEntryActivity"/>

品类组织图如下所示,从图中我们看出软件包名是com.ansen.shoenet。接收微信登入支付再次回到的Activity的包名必须是com.ansen.shoenet.wxapi。几个activity的名字也是一定写法。

图片 1

代码达成

微信sdk以后支撑Android
Studio在线引用了,以前都以增添jar的法子。需求拜访微信的接口获取用户新闻,所以把大家前面封装的okhttp也一起在线引用。okhttp须求在自定义的Application中先河化那一个本人就不贴代码了。在此以前已经讲过很频仍。在app/build.gradle文件dependencies标签中进入以下两行代码:

compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'compile 'com.ansen.http:okhttpencapsulation:1.0.1'

亟需用到互连网,所以在AndroidManifest.xml文件中投入网络权限:

<uses-permission android:name="android.permission.INTERNET" />

activity_main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:andro android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dp" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="登录之后信息在这里显示"/> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android: android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="昵称:"/> <TextView android: android:layout_below="@+id/tv_nickname" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="年龄:"/> </RelativeLayout> <Button android: android:layout_width="match_parent" android:layout_height="wrap_content" android:text="微信登录"/> <Button android: android:layout_width="match_parent" android:layout_height="wrap_content" android:text="分享到朋友圈"/> <Button android: android:layout_width="match_parent" android:layout_height="wrap_content" android:text="分享给好友"/> <Button android: android:layout_width="match_parent" android:layout_height="wrap_content" android:text="微信支付"/></LinearLayout>

布局文件很不难,就LinearLayout里面放了多少个TextView,跟多少个按键。

WeiXin.java
用于伊夫ntBus来传送新闻,微信sdk有个很意外的地点,正是不管登陆、分享、支付之后都得用多个Activity来收纳,所以大家还得从接受的丰硕activity把结果音讯通过伊夫ntBus传递给MainActivity。纵然用广播也能达成,可是个人爱好用伊芙ntBus,使用灵活。轻易轻量。

public class WeiXin { private int type;//1:登录 2.分享 3:微信支付 private int errCode;//微信返回的错误码 private String code;//登录成功才会有的code public WeiXin() { } public WeiXin(int type,int errCode, String code) { this.type = type; this.errCode=errCode; this.code = code; } public int getType() { return type; } public void setType { this.type = type; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public int getErrCode() { return errCode; } public void setErrCode(int errCode) { this.errCode = errCode; }}

Constant.java
常量类,微信appid跟secret的值用七个常量保存。为了保证隐秘那多少个值笔者早已修改过。

public class Constant { public static String WECHAT_APPID="wxda6db2aec81389af"; public static String WECHAT_SECRET="8fed5a2d510022587ef8a6194c965be3";}

MainActivity.java 全体代码贴出来比较乱,权且贴出MainActivity部分代码。

public class MainActivity extends AppCompatActivity implements View.OnClickListener { private IWXAPI wxAPI; private TextView tvNickname,tvAge; public static final int IMAGE_SIZE=32768;//微信分享图片大小限制 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EventBus.getDefault().register;//注册 wxAPI = WXAPIFactory.createWXAPI(this,Constant.WECHAT_APPID,true); wxAPI.registerApp(Constant.WECHAT_APPID); findViewById(R.id.btn_login).setOnClickListener; findViewById(R.id.btn_share_friend_circle).setOnClickListener; findViewById(R.id.btn_share_friend).setOnClickListener; findViewById(R.id.btn_pay).setOnClickListener; tvNickname=  findViewById(R.id.tv_nickname); tvAge= findViewById(R.id.tv_age); } @Override public void onClick(View view) { switch (view.getId{ case R.id.btn_login://微信登录 login(); break; case R.id.btn_share_friend_circle://微信分享到朋友圈 share; break; case R.id.btn_share_friend://微信分享给朋友 share; break; case R.id.btn_pay://微信支付// 先去服务器获取支付信息,返回一个WeiXinPay对象,然后调用pay方法 showToast("微信支付需要服务器支持"); break; } } /** * 这里用到的了EventBus框架 * @param weiXin */ @Subscribe public void onEventMainThread(WeiXin weiXin){ Log.i("ansen","收到eventbus请求 type:"+weiXin.getType; if(weiXin.getType{//登录 getAccessToken(weiXin.getCode; }else if(weiXin.getType{//分享 switch (weiXin.getErrCode{ case BaseResp.ErrCode.ERR_OK: Log.i("ansen", "微信分享成功....."); break; case BaseResp.ErrCode.ERR_USER_CANCEL://分享取消 Log.i("ansen", "微信分享取消....."); break; case BaseResp.ErrCode.ERR_AUTH_DENIED://分享被拒绝 Log.i("ansen", "微信分享被拒绝....."); break; } }else if(weiXin.getType{//微信支付 if(weiXin.getErrCode()==BaseResp.ErrCode.ERR_OK){//成功 Log.i("ansen", "微信支付成功....."); } } } .......... public void showToast(String message){ Toast.makeText(this,message,Toast.LENGTH_LONG).show(); } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister;//取消注册 }}
  • onCreate
    注册伊夫ntBus,通过WXAPIFactory创制IWXAPI类,并且注册appid,给多个开关开关设置点击事件。查找显示名字跟年龄的五个TextView。
  • onClick
    点击事件监听,依照id来判别点击差别的按键,跳转到相应的方式,那个方法没贴出来来,等会单独讲。
  • on伊夫ntMainThread(WeiXin weiXin)
    用来接收音讯,这些办法有个参数,用来判别项目,正是大家用伊芙ntBus发送时参数必须是WeiXin类型。首先判别type,是登入依旧分享依旧支付。登入成功景色下会收获到code,依照code然后大家就能收获到微信用户音信。
  • showToast Toast提示
  • onDestroy 取消EventBus注册

微信登6

微信登入流程有以下多少个步骤:

  • 微信授权登入
  • 听大人讲明权登入code 获取该用户token
  • 依照token获取用户资料

当我们点击登陆开关的时候,调用的是login方法。这几个措施就在MainActivity里面。正是给微信发起三个记名请求,弹出叁个授权分界面。

public void login(){ SendAuth.Req req = new SendAuth.Req(); req.scope = "snsapi_userinfo"; req.state = String.valueOf(System.currentTimeMillis; wxAPI.sendReq;}

在你的包名相应目录下新建七个wxapi目录,然后在wxapi目录下增加产量3个WXEntryActivity类,用来收纳登入授权以及享受时微信的回调消息。那么些类承袭自Activity,需求达成IWXAPI伊夫ntHandler接口。

package com.ansen.shoenet.wxapi;public class WXEntryActivity extends Activity implements IWXAPIEventHandler { private IWXAPI wxAPI; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); wxAPI = WXAPIFactory.createWXAPI(this,Constant.WECHAT_APPID,true); wxAPI.registerApp(Constant.WECHAT_APPID); wxAPI.handleIntent(getIntent; } @Override protected void onNewIntent(Intent intent){ super.onNewIntent; wxAPI.handleIntent(getIntent; Log.i("ansen","WXEntryActivity onNewIntent"); } @Override public void onReq(BaseReq arg0) { Log.i("ansen","WXEntryActivity onReq:"+arg0); } @Override public void onResp(BaseResp resp){ if(resp.getType()== ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX){//分享 Log.i("ansen","微信分享操作....."); WeiXin weiXin=new WeiXin(2,resp.errCode,""); EventBus.getDefault().post; }else if(resp.getType()==ConstantsAPI.COMMAND_SENDAUTH){//登陆 Log.i("ansen", "微信登录操作....."); SendAuth.Resp authResp = (SendAuth.Resp) resp; WeiXin weiXin=new WeiXin(1,resp.errCode,authResp.code); EventBus.getDefault().post; } finish(); }}

onCreate、onNewIntent、onReq那四个法子是从来写法。onResp方法接收微信结果音讯,首先推断项目,依据分裂的品类去封装WeiXin对象,假诺是登陆操作,把code传入进去,然后把包装好的WeiXin对象通过伊夫ntBus发送出去。MainActivity的on伊夫ntMainThread方法就会接收到这么些音讯。最终调用finish关闭当前的activity。

WXEntryActivity记得在AndroidManifest.xml中注册

<activity android:exported="true" android:name=".wxapi.WXEntryActivity"/>

持续回到首页的on伊夫ntMainThread,固然登入类型调用getAccessToken(),并且传入code。依照code获取access_token,这几个url是微信公开的,供给传入多个参数,appid、secret、code。请求成功之后会回到access_token跟openid等信息。

public void getAccessToken(String code){ String url = "https://api.weixin.qq.com/sns/oauth2/access_token?" + "app&secret="+Constant.WECHAT_SECRET+ "&code="+code+"&grant_type=authorization_code"; HTTPCaller.getInstance().get(WeiXinToken.class, url, null, new RequestDataCallback<WeiXinToken>() { @Override public void dataCallback(WeiXinToken obj) { if(obj.getErrcode{//请求成功 getWeiXinUserInfo; }else{//请求失败 showToast(obj.getErrmsg; } } });}

获取到access_token跟openid之后接二连三调用getWeiXinUserInfo方法获取用户音信。那样就能取到当前微信app登陆的用户一些音信。有别称、年龄、头像地址、语言等主导消息。在店堂开垦中,到了这一步就足以拿着那么些信息调用自个儿服务器的报到接口。当然大家这边就把别名跟年龄给TextView显示下。

public void getWeiXinUserInfo(WeiXinToken weiXinToken){ String url = "https://api.weixin.qq.com/sns/userinfo?access_token="+ weiXinToken.getAccess_token()+"&open昵称:"+obj.getNickname; tvAge.setText("年龄:"+obj.getAge; Log.i("ansen","头像地址:"+obj.getHeadimgurl;}

WeiXinToken跟WeiXinInfo那多少个实体类就不贴代码了,WeiXinToken用来映射获取访问token接口重返的json。WeiXinInfo用来映射获取用户接口重回的json。

微信分享

分享有二种享受到对象圈跟分享给密友,统一调用share方法。传入一个boolean类型来判别是还是不是分享到对象圈。

public void share(boolean friendsCircle){ WXWebpageObject webpage = new WXWebpageObject(); webpage.webpageUrl = "www.baidu.com";//分享url WXMediaMessage msg = new WXMediaMessage; msg.title = "分享标题"; msg.description = "分享描述"; msg.thumbData =getThumbData();//封面图片byte数组 SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = String.valueOf(System.currentTimeMillis; req.message = msg; req.scene = friendsCircle ? SendMessageToWX.Req.WXSceneTimeline : SendMessageToWX.Req.WXSceneSession; wxAPI.sendReq;}

享受内容有为数不少格式,分享图片、分享摄像、分享音信。大家那边就享受音讯为例,也是分享相比较常见的格式。首先new一个WXWebpageObject对象,设置标题、内容、展开链接、封面等。最后调用wxAPI的sendReq放松1个伸手。

享受跟登6同样,都会回调WXEntryActivity,然后又把分享结果发送给MainActivity.on伊夫ntMainThread方法。

支付支出第3必要请求大家同心同德的服务器,获取支付新闻。获取成功未来调用pay方法。

public void pay(WeiXinPay weiXinPay){ PayReq req = new PayReq(); req.appId = Constant.WECHAT_APPID;//appid req.nonceStr=weiXinPay.getNoncestr();//随机字符串,不长于32位。推荐随机数生成算法 req.packageValue=weiXinPay.getPackage_value();//暂填写固定值Sign=WXPay req.sign=weiXinPay.getSign();//签名 req.partnerId=weiXinPay.getPartnerid();//微信支付分配的商户号 req.prepayId=weiXinPay.getPrepayid();//微信返回的支付交易会话ID req.timeStamp=weiXinPay.getTimestamp();//时间戳 wxAPI.registerApp(Constant.WECHAT_APPID); wxAPI.sendReq;}

weiXinPay的值应该是大家从友好服务器获取的,然后把再次来到消息打包到PayReq对象中,最终调用wxAPI的sendReq方法发起呼吁。

在wxapi目录下增加产量八个WXPayEntryActivity类,这么些类跟WXEntryActivity同级,用来抽出微信支付的回调音信。这一个类承继自Activity,要求完成IWXAPI伊夫ntHandler接口。

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler { private IWXAPI wxAPI; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); wxAPI = WXAPIFactory.createWXAPI(this, Constant.WECHAT_APPID); wxAPI.handleIntent(getIntent; } @Override protected void onNewIntent(Intent intent){ super.onNewIntent; setIntent; wxAPI.handleIntent(intent, this); } @Override public void onReq(BaseReq baseReq) {} @Override public void onResp(BaseResp resp) { Log.i("ansen", "微信支付回调 返回错误码:"+resp.errCode+" 错误名称:"+resp.errStr); if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX){//微信支付 WeiXin weiXin=new WeiXin(3,resp.errCode,""); EventBus.getDefault().post; } finish(); }}

任何格局都以定点写法,在onResp中判定如若是微信登入,就封装3个WeiXin对象,然后发送伊芙ntBus请求。那样MainActivity的on伊夫ntMainThread就会收取到那几个WeiXin对象。

WXPayEntryActivity记得在AndroidManifest.xml中注册。

<activity android:exported="true" android:name=".wxapi.WXPayEntryActivity"/>

品类协会图如下所示,从图中我们看出软件包名是com.ansen.shoenet。接收微信登陆支付再次来到的Activity的包名必须是com.ansen.shoenet.wxapi。多个activity的名字也是固定写法。

图片 2project_structure

代码达成

微信sdk未来支撑Android
Studio在线引用了,在此以前皆以添加jar的格局。供给拜访微信的接口获取用户新闻,所以把大家在此以前封装的okhttp也三头在线引用。okhttp供给在自定义的Application中开首化这几个本身就不贴代码了。以前曾经讲过很频仍。在app/build.gradle文件dependencies标签中参加以下两行代码:

compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
compile 'com.ansen.http:okhttpencapsulation:1.0.1'

供给用到互连网,所以在AndroidManifest.xml文件中出席互连网权限:

<uses-permission android:name="android.permission.INTERNET" />

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dp"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="登录之后信息在这里显示"/>

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/tv_nickname"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="昵称:"/>

        <TextView
            android:id="@+id/tv_age"
            android:layout_below="@+id/tv_nickname"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="年龄:"/>
    </RelativeLayout>

    <Button
        android:id="@+id/btn_login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="微信登录"/>

    <Button
        android:id="@+id/btn_share_friend_circle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="分享到朋友圈"/>

    <Button
        android:id="@+id/btn_share_friend"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="分享给好友"/>

    <Button
        android:id="@+id/btn_pay"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="微信支付"/>
</LinearLayout>

布局文件很简单,就LinearLayout里面放了多少个TextView,跟多少个按键。

WeiXin.java
用于伊芙ntBus来传送消息,微信sdk有个很奇异的地点,正是不管登陆、分享、支付之后都得用3个Activity来收纳,所以大家还得从收受的不得了activity把结果音讯经过伊夫ntBus传递给MainActivity。就算用广播也能促成,不过个人爱好用伊芙ntBus,使用灵活。轻松轻量。

public class WeiXin {
    private int type;//1:登录 2.分享 3:微信支付
    private int errCode;//微信返回的错误码
    private String code;//登录成功才会有的code

    public WeiXin() {
    }

    public WeiXin(int type,int errCode, String code) {
        this.type = type;
        this.errCode=errCode;
        this.code = code;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public int getErrCode() {
        return errCode;
    }

    public void setErrCode(int errCode) {
        this.errCode = errCode;
    }
}

Constant.java
常量类,微信appid跟secret的值用七个常量保存。为了掩护隐秘那八个值小编早已修改过。

public class Constant {
    public static String WECHAT_APPID="wxda6db2aec81389af";
    public static String WECHAT_SECRET="8fed5a2d510022587ef8a6194c965be3";
}

MainActivity.java 全部代码贴出来相比乱,暂且贴出MainActivity部分代码。

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private IWXAPI wxAPI;
    private TextView tvNickname,tvAge;
    public static final int IMAGE_SIZE=32768;//微信分享图片大小限制

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EventBus.getDefault().register(this);//注册
        wxAPI = WXAPIFactory.createWXAPI(this,Constant.WECHAT_APPID,true);
        wxAPI.registerApp(Constant.WECHAT_APPID);

        findViewById(R.id.btn_login).setOnClickListener(this);
        findViewById(R.id.btn_share_friend_circle).setOnClickListener(this);
        findViewById(R.id.btn_share_friend).setOnClickListener(this);
        findViewById(R.id.btn_pay).setOnClickListener(this);

        tvNickname= (TextView) findViewById(R.id.tv_nickname);
        tvAge=(TextView) findViewById(R.id.tv_age);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btn_login://微信登录
                login();
                break;
            case R.id.btn_share_friend_circle://微信分享到朋友圈
                share(true);
                break;
            case R.id.btn_share_friend://微信分享给朋友
                share(false);
                break;
            case R.id.btn_pay://微信支付
//              先去服务器获取支付信息,返回一个WeiXinPay对象,然后调用pay方法
                showToast("微信支付需要服务器支持");
                break;
        }
    }

    /**
     * 这里用到的了EventBus框架
     * @param weiXin
     */
    @Subscribe
    public void onEventMainThread(WeiXin weiXin){
        Log.i("ansen","收到eventbus请求 type:"+weiXin.getType());
        if(weiXin.getType()==1){//登录
            getAccessToken(weiXin.getCode());
        }else if(weiXin.getType()==2){//分享
            switch (weiXin.getErrCode()){
                case BaseResp.ErrCode.ERR_OK:
                    Log.i("ansen", "微信分享成功.....");
                    break;
                case BaseResp.ErrCode.ERR_USER_CANCEL://分享取消
                    Log.i("ansen", "微信分享取消.....");
                    break;
                case BaseResp.ErrCode.ERR_AUTH_DENIED://分享被拒绝
                    Log.i("ansen", "微信分享被拒绝.....");
                    break;
            }
        }else if(weiXin.getType()==3){//微信支付
            if(weiXin.getErrCode()==BaseResp.ErrCode.ERR_OK){//成功
                Log.i("ansen", "微信支付成功.....");
            }
        }
    }

    ..........

    public void showToast(String message){
        Toast.makeText(this,message,Toast.LENGTH_LONG).show();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);//取消注册
    }
}
  • onCreate
    注册伊夫ntBus,通过WXAPIFactory创造IWXAPI类,并且注册appid,给四个按键开关设置点击事件。查找展现名字跟年龄的多少个TextView。
  • onClick
    点击事件监听,依据id来判定点击区别的开关,跳转到相应的不二秘技,这一个方法没贴出来来,等会单独讲。
  • on伊夫ntMainThread(WeiXin weiXin)
    用来收取音信,那么些法子有个参数,用来决断项目,正是大家用伊夫ntBus发送时参数必须是WeiXin类型。首先判定type,是登6依然分享依旧支付。登入成功景观下会获取到code,遵照code然后我们就能博取到微信用户新闻。
  • showToast Toast提示
  • onDestroy 取消EventBus注册

微信登陆

微信登入流程有以下多个步骤:

  • 微信授权登6
  • 基于授权登入code 获取该用户token
  • 依据token获取用户资料

当大家点击登6按键的时候,调用的是login方法。这些主意就在MainActivity内部。正是给微信发起3个报到请求,弹出贰个授权分界面。

public void login(){
    SendAuth.Req req = new SendAuth.Req();
    req.scope = "snsapi_userinfo";
    req.state = String.valueOf(System.currentTimeMillis());
    wxAPI.sendReq(req);
}

在你的包名相应目录下新建五个wxapi目录,然后在wxapi目录下增加产量2个WXEntryActivity类,用来选拔登入授权以及享受时微信的回调消息。这么些类承袭自Activity,必要贯彻IWXAPI伊芙ntHandler接口。

package com.ansen.shoenet.wxapi;
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
    private IWXAPI wxAPI;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        wxAPI = WXAPIFactory.createWXAPI(this,Constant.WECHAT_APPID,true);
        wxAPI.registerApp(Constant.WECHAT_APPID);
        wxAPI.handleIntent(getIntent(), this);
    }

    @Override
    protected void onNewIntent(Intent intent){
        super.onNewIntent(intent);
        wxAPI.handleIntent(getIntent(),this);
        Log.i("ansen","WXEntryActivity onNewIntent");
    }

    @Override
    public void onReq(BaseReq arg0) {
        Log.i("ansen","WXEntryActivity onReq:"+arg0);
    }

    @Override
    public void onResp(BaseResp resp){
        if(resp.getType()== ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX){//分享
            Log.i("ansen","微信分享操作.....");
            WeiXin weiXin=new WeiXin(2,resp.errCode,"");
            EventBus.getDefault().post(weiXin);
        }else if(resp.getType()==ConstantsAPI.COMMAND_SENDAUTH){//登陆
            Log.i("ansen", "微信登录操作.....");
            SendAuth.Resp authResp = (SendAuth.Resp) resp;
            WeiXin weiXin=new WeiXin(1,resp.errCode,authResp.code);
            EventBus.getDefault().post(weiXin);
        }
        finish();
    }
}

onCreate、onNewIntent、onReq那四个章程是稳固写法。onResp方法接收微信结果音信,首先判定项目,根据不一样的花色去封装WeiXin对象,借使是登六操作,把code传入进去,然后把包装好的WeiXin对象通过EventBus发送出去。MainActivity的on伊芙ntMainThread方法就会接收到这么些音讯。最终调用finish关闭当前的activity。

WXEntryActivity记得在AndroidManifest.xml中注册

<activity
    android:exported="true"
    android:name=".wxapi.WXEntryActivity"/>

持续回到首页的on伊芙ntMainThread,假设登陆类型调用getAccessToken(),并且传入code。依据code获取access_token,这几个url是微信公开的,必要传入八个参数,appid、secret、code。请求成功之后会回到access_token跟openid等信息。

public void getAccessToken(String code){
    String url = "https://api.weixin.qq.com/sns/oauth2/access_token?" +
            "appid="+Constant.WECHAT_APPID+"&secret="+Constant.WECHAT_SECRET+
            "&code="+code+"&grant_type=authorization_code";
    HTTPCaller.getInstance().get(WeiXinToken.class, url, null, new RequestDataCallback<WeiXinToken>() {
        @Override
        public void dataCallback(WeiXinToken obj) {
            if(obj.getErrcode()==0){//请求成功
                getWeiXinUserInfo(obj);
            }else{//请求失败
                showToast(obj.getErrmsg());
            }
        }
    });
}

获取到access_token跟openid之后持续调用getWeiXinUserInfo方法获取用户消息。这样就能取到如今微信app登入的用户一些信息。有外号、年龄、头像地址、语言等主导音信。在集团支付中,到了这一步就能够拿着这个音信调用自个儿服务器的记名接口。当然我们那边就把外号跟年龄给TextView显示下。

public void getWeiXinUserInfo(WeiXinToken weiXinToken){
    String url = "https://api.weixin.qq.com/sns/userinfo?access_token="+
            weiXinToken.getAccess_token()+"&openid="+weiXinToken.getOpenid();
    HTTPCaller.getInstance().get(WeiXinInfo.class, url, null, new RequestDataCallback<WeiXinInfo>() {
        @Override
        public void dataCallback(WeiXinInfo obj) {
            tvNickname.setText("昵称:"+obj.getNickname());
            tvAge.setText("年龄:"+obj.getAge());
            Log.i("ansen","头像地址:"+obj.getHeadimgurl());
        }
    });
}

WeiXinToken跟WeiXinInfo那三个实体类就不贴代码了,WeiXinToken用来映射获取访问token接口重返的json。WeiXinInfo用来映射获取用户接口重回的json。

微信分享

分享有三种享受到对象圈跟分享给好友,统一调用share方法。传入一个boolean类型来推断是或不是分享到对象圈。

public void share(boolean friendsCircle){
    WXWebpageObject webpage = new WXWebpageObject();
    webpage.webpageUrl = "www.baidu.com";//分享url
    WXMediaMessage msg = new WXMediaMessage(webpage);
    msg.title = "分享标题";
    msg.description = "分享描述";
    msg.thumbData =getThumbData();//封面图片byte数组

    SendMessageToWX.Req req = new SendMessageToWX.Req();
    req.transaction = String.valueOf(System.currentTimeMillis());
    req.message = msg;
    req.scene = friendsCircle ? SendMessageToWX.Req.WXSceneTimeline : SendMessageToWX.Req.WXSceneSession;
    wxAPI.sendReq(req);
}

分享内容有那二个格式,分享图片、分享录制、分享音信。大家那边就享受消息为例,也是享受相比较广泛的格式。首先new一个WXWebpageObject对象,设置标题、内容、展开链接、封面等。最后调用wxAPI的sendReq放松1个呼吁。

享用跟登六一样,都会回调WXEntryActivity,然后又把分享结果发送给MainActivity.on伊芙ntMainThread方法。

支付
支付第贰须求请求我们协调的服务器,获取支付音信。获取成功今后调用pay方法。

public void pay(WeiXinPay weiXinPay){
    PayReq req = new PayReq();
    req.appId = Constant.WECHAT_APPID;//appid
    req.nonceStr=weiXinPay.getNoncestr();//随机字符串,不长于32位。推荐随机数生成算法
    req.packageValue=weiXinPay.getPackage_value();//暂填写固定值Sign=WXPay
    req.sign=weiXinPay.getSign();//签名
    req.partnerId=weiXinPay.getPartnerid();//微信支付分配的商户号
    req.prepayId=weiXinPay.getPrepayid();//微信返回的支付交易会话ID
    req.timeStamp=weiXinPay.getTimestamp();//时间戳

    wxAPI.registerApp(Constant.WECHAT_APPID);
    wxAPI.sendReq(req);
}

weiXinPay的值应该是我们从友好服务器获取的,然后把重临信息打包到PayReq对象中,最终调用wxAPI的sendReq方法发起呼吁。

在wxapi目录下增加产量1个WXPayEntryActivity类,那一个类跟WXEntryActivity同级,用来接过微信支付的回调音讯。那几个类承继自Activity,供给实现IWXAPI伊芙ntHandler接口。

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
    private IWXAPI wxAPI;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        wxAPI = WXAPIFactory.createWXAPI(this, Constant.WECHAT_APPID);
        wxAPI.handleIntent(getIntent(), this);
    }

    @Override
    protected void onNewIntent(Intent intent){
        super.onNewIntent(intent);
        setIntent(intent);
        wxAPI.handleIntent(intent, this);
    }

    @Override
    public void onReq(BaseReq baseReq) {}

    @Override
    public void onResp(BaseResp resp) {
        Log.i("ansen", "微信支付回调 返回错误码:"+resp.errCode+" 错误名称:"+resp.errStr);
        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX){//微信支付
            WeiXin weiXin=new WeiXin(3,resp.errCode,"");
            EventBus.getDefault().post(weiXin);
        }
        finish();
    }
}

别的措施都以固定写法,在onResp中剖断假如是微信登陆,就封装贰个WeiXin对象,然后发送EventBus请求。那样MainActivity的on伊夫ntMainThread就会吸收接纳到这些WeiXin对象。

WXPayEntryActivity记得在AndroidManifest.xml中注册。

<activity
    android:exported="true"
    android:name=".wxapi.WXPayEntryActivity"/>

花色布局图如下所示,从图中大家见到软件包名是com.ansen.shoenet。接收微信登录支付重返的Activity的包名必须是com.ansen.shoenet.wxapi。七个activity的名字也是一定写法。

图片 3

签名

微信登4分享支付都有3个具名验证,那几个很麻烦,导致每一遍调节和测试都亟待重新签字。

先是用android
studio生成2个标准的具名文件,具名文件是.jks结尾的,这一个签字文件是您之后打线上包直接要用到的。然后用这么些具名文件生成apk。那年大家的app就有了正规签字。把规范签字的apk发送到手提式有线电话机上进展安装。

并且下载四个具名生成工具安装,那一个工具用于获取安装到手提式有线电话机的第一方使用签名的apk包。微信官方下载地址:

https://res.wx.qq.com/open/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android2.apk

上述三个app都安装好了后头展开从微信下载的不胜app,软件名字叫「GenSignature」,有四个输入框,输入我们软件的包名,点击Get
Signature按键.效果图如下:
图片 4

把那行铅色的16进制数炒下来保存到txt文本中。

签名

微信登四分享支付都有二个签名验证,那一个很麻烦,导致每一回调节和测试都亟需重新具名。

率先用android
studio生成二个专业的具名文件,签字文件是.jks结尾的,这几个签字文件是你现在打线上包直接要用到的。然后用这几个签字文件生成apk。那个时候大家的app就有了正式签订契约。把规范具名的apk发送到手提式有线电话机上实行设置。

而且下载三个签约生成工具安装,那么些工具用于获取安装到手机的第二方使用具名的apk包。微信官方下载地址:

https://res.wx.qq.com/open/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android2.apk

如上三个app都安装好领会后张开从微信下载的足够app,软件名字叫「GenSignature」,有二个输入框,输入我们软件的包名,点击Get
Signature按键.效果图如下:

图片 5get_signature

把那行米色的1陆进制数炒下来保存到txt文本中。

签名

微信登入分享支付都有一个签名验证,这一个很艰苦,导致每一遍调节和测试都急需再一次签字。

第三用android
studio生成多个正规的签字文件,具名文件是.jks结尾的,这几个具名文件是您今后打线上包直接要用到的。然后用那个具名文件生成apk。那年我们的app就有了标准签订契约。把正规化签订契约的apk发送到手提式有线电话机上进行设置。

再者下载3个签订契约生成工具安装,这些工具用于获取安装到手提式有线话机的第二方采纳具名的apk包。微信官方下载地址:

https://res.wx.qq.com/open/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android2.apk

如上多少个app都设置好了之后展开从微信下载的老大app,软件名字叫「GenSignature」,有二个输入框,输入大家软件的包名,点击Get
Signature按键.效果图如下:
图片 6

把那行黄褐的1六进制数炒下来保存到txt文本中。

微信sdk官方网址后台配置

官方网址地址:

https://open.weixin.qq.com/

在微信sdk首页,有个管理主旨点击之后暗中同意正是运动应用,假如还并未有成立移动选择就先创立三个,倘若有了就点击当前的行使前面包车型大巴查阅按键,就会跻身应用详细界面。

在选择详细分界面向来往下滚动,滚到最底部有个开垦音讯。点击修改,进入修改分界面,在改变分界面滚动到最上边,效果图如下所示:
图片 7
率先大家在Android应用这里打上勾,然后填写应用签名,那一个具名都是自个儿后面要你们保存到记事本上的要命值,包名就是app包名。点击保存。

微信sdk官方网站后台配置

官方网站地址:

https://open.weixin.qq.com/

在微信sdk首页,有个管理为主点击之后私下认可就是活动选拔,要是还并未开创移动使用就先创设2个,假使有了就点击当前的采用前边的查看开关,就会进入应用详细分界面。

在运用详细分界面一向往下滚动,滚到最尾部有个开垦音信。点击修改,进入修改分界面,在修改分界面滚动到最上面,效果图如下所示:

图片 8app_info

第二我们在Android应用那里打上勾,然后填写应用具名,这一个签字都以本人事先要你们保存到记事本上的丰裕值,包名正是app包名。点击保存。

微信sdk官方网址后台配置

官方网址地址:

https://open.weixin.qq.com/

在微信sdk首页,有个管理为主点击之后私下认可就是移动使用,若是还尚无开创移动使用就先成立3个,倘使有了就点击当前的使用前边的查阅开关,就会进入应用详细分界面。

在运用详细分界面一贯往下滚动,滚到最尾巴部分有个开荒音信。点击修改,进入修改界面,在改造分界面滚动到最上面,效果图如下所示:
图片 9
先是我们在Android应用那里打上勾,然后填写应用具名,那一个签字都以自笔者在此以前要你们保存到记事本上的十三分值,包名正是app包名。点击保存。

运营软件

登6之后效果图如下:

图片 10

享用到对象圈如下:

图片 11

享受给爱人:

图片 12

微信支付无法测试,因为要求服务器援助。

运营软件

签到之后效果图如下:

图片 13login_success

分享到对象圈如下:

图片 14share_friend_circle

享受给爱人:

图片 15share_friend

微信支付无法测试,因为需求服务器扶助。

运作软件

签到之后效果图如下:

图片 16

分享到朋友圈如下:

图片 17

享用给心上人:

图片 18

微信支付没办法测试,因为要求服务器帮忙。

微信官方开采文书档案

自作者那偏小说只是对准今后微信的sdk版本接入,可是sdk是有十分的大希望变动的,版本变化、接口变化等。所以提出我们还是以合法文书档案为主。小编的篇章提供参考。

挪动使用微信登入开垦指南

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317851&token=219192a54f13e8e7011ced8e4ce5b36b699629c4&lang=zh_CN

Android微信支付开荒手册

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317784&token=219192a54f13e8e7011ced8e4ce5b36b699629c4&lang=zh_CN

微信官方开采文书档案

自笔者那偏小说只是针对未来微信的sdk版本接入,不过sdk是有非常大也许变化的,版本变化、接口变化等。所以建议大家依然以官方文书档案为主。笔者的稿子提供参考。

移步接纳微信登入开垦指南

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317851&token=219192a54f13e8e7011ced8e4ce5b36b699629c4&lang=zh_CN

Android微信支付开荒手册

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317784&token=219192a54f13e8e7011ced8e4ce5b36b699629c4&lang=zh_CN

微信官方开拓文书档案

本人那偏小说只是指向今后微信的sdk版本接入,可是sdk是有相当大也许变动的,版本变化、接口变化等。所以提出我们要么以合法文书档案为主。笔者的篇章提供参考。

移动应用微信登入开垦指南

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317851&token=219192a54f13e8e7011ced8e4ce5b36b699629c4&lang=zh_CN

Android微信支付开辟手册

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317784&token=219192a54f13e8e7011ced8e4ce5b36b699629c4&lang=zh_CN

注意事项

连接微信sdk有很多索要留意的地点,这里大家最终再来做二个总计。

  • 微信登陆,分享,支付回调的Activity包名跟类名一定要严格依据必要去写
  • 吸收回调的是Activity一定要在AndroidManifest.xml中中注册
  • Constant里面多少个常量的值要去微信报名并且创制应用才有的,那里须求改成你们申请的值。
  • 急需拜访网络所以记得在AndroidManifest.xml中加多权限
  • 调用微信的登录,分享,支付你的安装包一定要有签订契约,签字信息一定要跟你在微信官方网站上配置的具名信息1致
  • 微信未有客服帮忙…..假若出了难点看官方的德姆o或然官方API
  • 微信SDK日常进级,假如你付出的时候有新型的就用前卫的吧…..

注意事项

连着微信sdk有不少索要留意的地点,那里大家最终再来做二个总计。

  • 微信登录,分享,支付回调的Activity包名跟类名一定要严加遵守须要去写
  • 吸收回调的是Activity一定要在AndroidManifest.xml中中登记
  • Constant里面八个常量的值要去微信报名并且创立应用才有的,那里供给改成你们申请的值。
  • 亟需拜访互联网所以记得在AndroidManifest.xml中增多权限
  • 调用微信的登录,分享,支付你的安装包一定要有签署,签名音讯一定要跟你在微信官方网站上配置的签订契约新闻一样
  • 微信没有客服帮衬…..即使出了难题看官方的德姆o也许法定API
  • 微信SDK常常进级,借使您付出的时候有流行的就用新型的吧…..

注意事项

接通微信sdk有无数亟待专注的地点,那里我们最后再来做二个计算。

  • 微信登入,分享,支付回调的Activity包名跟类名一定要从严遵照须求去写
  • 收受回调的是Activity一定要在AndroidManifest.xml中中登记
  • Constant里面五个常量的值要去微信报名并且创办应用才有的,那里须要改成你们申请的值。
  • 亟需拜访网络所以记得在AndroidManifest.xml中增加权限
  • 调用微信的登录,分享,支付你的安装包一定要有签订契约,具名音讯一定要跟你在微信官方网址上配置的签署音讯一致
  • 微信未有客服协理…..就算出了难题看官方的德姆o或然官方API
  • 微信SDK日常升级,假如你付出的时候有新型的就用洋气的吧…..

终极的尾声

你们一贯运转笔者的demo是不行的,因为你们没有的jks文件,无法签字,并且源码中的appid跟secret被本人修改过了,是不可能动用的,但是你们只怕又想看运转作效果果,所以自身在类型下建了个apk文件夹,里面放了二个得以测试微信登入分享的apk安装包。

源码下载

假定你想第最近间看本身的前期小说,扫码关切公众号,周周不定期推送Android开垦实战教程小说…

      Android开发666 - 安卓开发技术分享
             扫描二维码加关注

图片 19

最后的终极

你们一直运营作者的demo是那多少个的,因为你们未有的jks文件,没办法具名,并且源码中的appid跟secret被笔者修改过了,是不可能运用的,可是你们也许又想看运维效果,所以我在档次下建了个apk文件夹,里面放了2个能够测试微信登入分享的apk安装包。

源码下载

即使你想第权且间看笔者的末代小说,扫码关怀公众号,周周不定期推送Android开垦实战教程作品…

 Android开发666 - 安卓开发技术分享 扫描二维码加关注

图片 20Android开发666

最后的结尾

你们一直运维我的demo是那多少个的,因为你们尚未的jks文件,没办法具名,并且源码中的appid跟secret被自身修改过了,是不可能利用的,不过你们只怕又想看运转效果,所以本身在档次下建了个apk文件夹,里面放了3个能够测试微信登5分享的apk安装包。

源码下载

万1您想第暂且间看自个儿的末梢小说,扫码关心公众号,周周不定时推送Android开荒实战教程小说…

      Android开发666 - 安卓开发技术分享
             扫描二维码加关注

图片 21

相关文章