原生微信登录开发记录

原生微信登录开发记录(微信开发文档太陈旧了不更新)

微信回调页面

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private static final String TAG = “WXEntryActivity”;
private static final int RETURN_MSG_TYPE_LOGIN = 1; ///< 登录
private static final int RETURN_MSG_TYPE_SHARE = 2; ///< 分享
private IWXAPI api;

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

    ///< 这句没有写,是不能执行回调的方法的
    api = WXAPIFactory.createWXAPI(this, Constants.WeChat_APP_ID, false);
    api.handleIntent(getIntent(), this);
}

@Override
public void onReq(BaseReq baseReq) {
    Log.e(TAG, "onReq" + baseReq.getType());
}

@Override
public void onResp(BaseResp baseResp) {
    Log.e(TAG, "onResp:------>");
    Log.e(TAG, "error_code:---->" + baseResp.errCode);
    int type = baseResp.getType(); //类型:分享还是登录

    switch (baseResp.errCode) {
        case BaseResp.ErrCode.ERR_AUTH_DENIED:
            ///< 用户拒绝授权
            finish();
        case BaseResp.ErrCode.ERR_USER_CANCEL:
            ///< 用户取消
            String message = "";
            if (type == RETURN_MSG_TYPE_LOGIN) {
                message = "取消了微信登录";
            } else if (type == RETURN_MSG_TYPE_SHARE) {
                message = "取消了微信分享";
            }
            finish();
            break;
        case BaseResp.ErrCode.ERR_OK:
            if (type == RETURN_MSG_TYPE_LOGIN) {
                ///< 用户换取access_token的code,仅在ErrCode为0时有效
                String code = ((SendAuth.Resp) baseResp).code;
                String stata = ((SendAuth.Resp) baseResp).state;

                ///< 这里拿到了这个code,去做2次网络请求获取access_token和用户个人信息
                getAccessToken(code, stata);
            } else if (type == RETURN_MSG_TYPE_SHARE) {
                ///< "微信分享成功"
                finish();
            }
            break;
    }
}

/**
 * @param code 根据code再去获取AccessToken
 */
private void getAccessToken(String code, String state) {
    //        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
    String url = "https://api.weixin.qq.com/sns/oauth2/access_token";
    OkHttpClient mOkHttpClient = new OkHttpClient();
    ///< Post方式也可以...
    //        RequestBody body = new FormBody.Builder()
    //                .add("appid", "替换为你的appid")
    //                .add("secret", "替换为你的app密钥")
    //                .add("code", code)
    //                .add("grant_type", "authorization_code")
    //                .build();
    url += "?appid=" + Constants.WeChat_APP_ID + "&secret=f886493b0656ae8125e1edc5df6e01d6"
            + "&code=" + code + "&grant_type=authorization_code";
    final Request request = new Request.Builder()
            .url(url)
            //.post(body)
            .build();
    Call call = mOkHttpClient.newCall(request);
    call.enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            finish();
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            String json = response.body().string();
            AccessToken accessToken = JSONObject.parseObject(json, new TypeReference<AccessToken>() {
            });
            getUserInfo(accessToken.getAccess_token(), accessToken.getOpenid(), state);
        }
    });
}

/**
 * @param access_token 根据access_token再去获取UserInfo
 */
private void getUserInfo(String access_token, String openid, String state) {
    //        String url = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";
    String url = "https://api.weixin.qq.com/sns/userinfo";
    OkHttpClient mOkHttpClient = new OkHttpClient();
    RequestBody body = new FormBody.Builder()
            .add("access_token", access_token)
            .add("openid", openid)
            .build();
    final Request request = new Request.Builder()
            .url(url)
            .post(body)
            .build();
    Call call = mOkHttpClient.newCall(request);
    call.enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            finish();
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            String json = response.body().string();
            WXUserInfo wxUserInfo = JSONObject.parseObject(json, new TypeReference<WXUserInfo>() {

            });
            //加绑和登陆的区分(这里用state字段来区分代码里不同地方调用微信登录)
            if (state.equals("jiabang")) {
          //      jiabangcheckType(2, wxUserInfo.getOpenid());  我自己项目里的业务处理
            } else {
           //     checkType(2, wxUserInfo.getOpenid()); 我自己项目里的业务处理
            }
            ///< 发送广播到登录界面,把数据带过去; 可用EventBus
            finish();
        }
    });
}

}

调起微信登录

private IWXAPI api;
api = WXAPIFactory.createWXAPI(this, “你自己的微信id”, true);
api.registerApp(“你自己的微信id”);

final SendAuth.Req req = new SendAuth.Req();
req.scope = “snsapi_userinfo,snsapi_friend,snsapi_message,snsapi_contact”;
req.state = “none”;
api.sendReq(req);

实体类

AccessToken.java
package com.xxxxxx.app.bean;

import com.xxxxxx.app.anotation.NotProguard;

@NotProguard
public class AccessToken {

/**
 * access_token : xxxx
 * expires_in : xxxx
 * refresh_token : xxxxx
 * openid : xxxxx
 * scope : xxxxx
 * unionid : xxxxx
 */

private String access_token;
private int expires_in;
private String refresh_token;
private String openid;
private String scope;
private String unionid;

private AccessToken(){}
public String getAccess_token() {
    return access_token;
}

public void setAccess_token(String access_token) {
    this.access_token = access_token;
}

public int getExpires_in() {
    return expires_in;
}

public void setExpires_in(int expires_in) {
    this.expires_in = expires_in;
}

public String getRefresh_token() {
    return refresh_token;
}

public void setRefresh_token(String refresh_token) {
    this.refresh_token = refresh_token;
}

public String getOpenid() {
    return openid;
}

public void setOpenid(String openid) {
    this.openid = openid;
}

public String getScope() {
    return scope;
}

public void setScope(String scope) {
    this.scope = scope;
}

public String getUnionid() {
    return unionid;
}

public void setUnionid(String unionid) {
    this.unionid = unionid;
}

}

WXUserInfo.java

package com.xxxxxx.app.bean;

import com.xxxxxx.app.anotation.NotProguard;

@NotProguard
public class WXUserInfo {

/**
 * openid : xxxxxxx
 * nickname : xxxxxxx
 * sex : 1
 * language : zh_CN
 * city : Chengdu
 * province : Sichuan
 * country : CN
 * headimgurl :xxxxxx
 * privilege : []
 * unionid : xxxxxxx
 */

private String openid;
private String nickname;
private int sex;
private String language;
private String city;
private String province;
private String country;
private String headimgurl;
private String unionid;

private WXUserInfo(){}
public String getOpenid() {
    return openid;
}

public void setOpenid(String openid) {
    this.openid = openid;
}

public String getNickname() {
    return nickname;
}

public void setNickname(String nickname) {
    this.nickname = nickname;
}

public int getSex() {
    return sex;
}

public void setSex(int sex) {
    this.sex = sex;
}

public String getLanguage() {
    return language;
}

public void setLanguage(String language) {
    this.language = language;
}

public String getCity() {
    return city;
}

public void setCity(String city) {
    this.city = city;
}

public String getProvince() {
    return province;
}

public void setProvince(String province) {
    this.province = province;
}

public String getCountry() {
    return country;
}

public void setCountry(String country) {
    this.country = country;
}

public String getHeadimgurl() {
    return headimgurl;
}

public void setHeadimgurl(String headimgurl) {
    this.headimgurl = headimgurl;
}

public String getUnionid() {
    return unionid;
}

public void setUnionid(String unionid) {
    this.unionid = unionid;
}

}
引用的库:

compile 'com.alibaba:fastjson:1.1.68.android'

结束

就一个掉起和回调。写这篇文章纯属因为微信文档陈旧看的蛋疼、

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,开发一个记账小程序需要以下几个主要步骤: 1. 界面设计:使用微信小程序原生开发软件设计小程序的UI界面,包括首页、记账页面、报表页面等。 2. 数据库设计:设计小程序的数据表结构,包括账单表、分类表等。 3. 数据库操作:使用小程序提供的API进行数据库操作,包括增删改查等。 4. 记账功能实现:在记账页面中提供用户输入账单的功能,同时将账单存入数据库中。 5. 报表功能实现:在报表页面中对账单进行统计分析,并展示给用户。 下面是一个简单的代码示例: 1. 在app.js中定义全局变量和数据库初始化代码 ```javascript App({ globalData: { userInfo: null, db: null }, onLaunch: function () { // 初始化云数据库 wx.cloud.init({ env: 'xxx', traceUser: true }) // 获取数据库引用 const db = wx.cloud.database() this.globalData.db = db } }) ``` 2. 在记账页面中实现账单的添加功能 ```javascript Page({ data: { types: ['餐饮', '购物', '交通', '住房', '娱乐'], typeIndex: 0, amount: '', remark: '' }, bindTypeChange: function (e) { this.setData({ typeIndex: e.detail.value }) }, bindAmountInput: function (e) { this.setData({ amount: e.detail.value }) }, bindRemarkInput: function (e) { this.setData({ remark: e.detail.value }) }, addBill: function () { const db = getApp().globalData.db const { types, typeIndex, amount, remark } = this.data const type = types[typeIndex] if (!amount) { wx.showToast({ title: '请输入金额', icon: 'none' }) return } db.collection('bill').add({ data: { type, amount: Number(amount), remark, time: new Date() }, success: res => { wx.showToast({ title: '记账成功' }) this.setData({ typeIndex: 0, amount: '', remark: '' }) }, fail: err => { wx.showToast({ title: '记账失败', icon: 'none' }) console.error('[数据库] [新增记录] 失败:', err) } }) } }) ``` 3. 在报表页面中实现账单的统计分析 ```javascript Page({ data: { types: ['餐饮', '购物', '交通', '住房', '娱乐'], typeIndex: 0, totalAmount: 0, bills: [] }, bindTypeChange: function (e) { this.setData({ typeIndex: e.detail.value }) this.getBillList() }, getBillList: function () { const db = getApp().globalData.db const type = this.data.types[this.data.typeIndex] db.collection('bill').where({ type }).get({ success: res => { const bills = res.data || [] const totalAmount = bills.reduce((sum, bill) => sum + bill.amount, 0) this.setData({ bills, totalAmount }) }, fail: err => { console.error('[数据库] [查询记录] 失败:', err) } }) }, onLoad: function () { this.getBillList() } }) ``` 以上是一个简单的记账小程序的示例代码,您可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值