微信登录与分享和支付

public class WeChatUtil {
    private static WeChatUtil instance;
    private static final String TAG = WeChatUtil.class.getName();
    private String WXAPP_ID = "";
    private String WXAPP_SECRET = "";
    public static final int IMAGE_SIZE = 32768;//微信分享图片大小限制

    private IWXAPI api;
    private static Application application;
    private WeiXinToken mWeiXinToken;
    private WeiXinInfo mWeiXinInfo;

    public static WeChatUtil getInstance() {
        if (instance == null) {
            instance = new WeChatUtil();
            application = MyApplication.getmApplication();
        }
        return instance;
    }

    public void initWechatLogin() {
        api = WXAPIFactory.createWXAPI(application, WXAPP_ID, true);
        api.registerApp(WXAPP_ID);
        application.registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                api.registerApp(WXAPP_ID);
            }
        }, new IntentFilter(ConstantsAPI.ACTION_REFRESH_WXAPP));
    }

    /**
     * 微信登陆(三个步骤)
     * 1.微信授权登陆
     * 2.根据授权登陆code 获取该用户token
     * 3.根据token获取用户资料
     */
    public void login() {
        SendAuth.Req req = new SendAuth.Req();
        req.scope = "snsapi_userinfo";
        req.state = String.valueOf(System.currentTimeMillis());
        api.sendReq(req);
    }

    public void getAccessToken(String code) {
        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?" +
                "appid=" + WXAPP_ID + "&secret=" + WXAPP_SECRET +
                "&code=" + code + "&grant_type=authorization_code";
        OkGo.<WeiXinToken>post(url)
                .tag("WeiXinToken")
                .retryCount(2)
                .execute(new JsonCallback<WeiXinToken>() {
                    @Override
                    public void onSuccess(Response<WeiXinToken> response) {
                        WeiXinToken weiXinToken = response.body();
                        if (weiXinToken.getErrcode() == 0) {
                            getWeiXinUserInfo(weiXinToken);
                            setmWeiXinToken(weiXinToken);
                        } else {
                            ToastUtil.showToast(weiXinToken.getErrmsg());
                        }
                    }

                    @Override
                    public void onError(Response<WeiXinToken> response) {
                        super.onError(response);
                        ToastUtil.showToast(response.message());
                    }
                });
    }

    public void getWeiXinUserInfo(WeiXinToken weiXinToken) {
        String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" +
                weiXinToken.getAccess_token() + "&openid=" + weiXinToken.getOpenid();
        OkGo.<WeiXinInfo>post(url)
                .tag("WeiXinInfo")
                .retryCount(2)
                .execute(new JsonCallback<WeiXinInfo>() {
                    @Override
                    public void onSuccess(Response<WeiXinInfo> response) {
                        WeiXinInfo weiXinInfo = response.body();
                        setmWeiXinInfo(weiXinInfo);
                        XLog.json(weiXinInfo.toString());
                        ToastUtil.showToast(weiXinInfo.toString());
                    }
                });
    }

    /**
     * 微信分享
     *
     * @param friendsCircle 是否分享到朋友圈
     */
    public void share(boolean friendsCircle) {
        WXWebpageObject webpage = new WXWebpageObject();
        webpage.webpageUrl = "www.yunjichina.com.cn";//分享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;
        api.sendReq(req);
    }

    /**
     * 获取分享封面byte数组 我们这边取的是软件启动icon
     *
     * @return
     */
    private byte[] getThumbData() {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 2;
        Bitmap bitmap = BitmapFactory.decodeResource(application.getResources(), R.drawable.ic_launcher, options);
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, output);
        int quality = 100;
        while (output.toByteArray().length > IMAGE_SIZE && quality != 10) {
            output.reset(); // 清空baos
            bitmap.compress(Bitmap.CompressFormat.JPEG, quality, output);// 这里压缩options%,把压缩后的数据存放到baos中
            quality -= 10;
        }
        bitmap.recycle();
        byte[] result = output.toByteArray();
        try {
            output.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 发起支付
     *
     * @param weiXinPay
     */
    public void pay(WeiXinPay weiXinPay) {
        PayReq req = new PayReq();
        req.appId = WXAPP_ID;//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();//时间戳

        api.registerApp(WXAPP_ID);
        api.sendReq(req);
    }

    public WeiXinToken getmWeiXinToken() {
        return mWeiXinToken;
    }

    public void setmWeiXinToken(WeiXinToken mWeiXinToken) {
        this.mWeiXinToken = mWeiXinToken;
    }

    public WeiXinInfo getmWeiXinInfo() {
        return mWeiXinInfo;
    }

    public void setmWeiXinInfo(WeiXinInfo mWeiXinInfo) {
        this.mWeiXinInfo = mWeiXinInfo;
    }

    public IWXAPI getApi() {
        return api;
    }
}
public class WXEntryActivity extends BaseMvpLanActivity<WXEntryPresent> implements IWXAPIEventHandler {
    private static final String TAG = WXEntryActivity.class.getName();

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        WeChatUtil.getInstance().getApi().handleIntent(getIntent(), this);
        XLog.i(TAG, "WXEntryActivity onNewIntent");
    }

    @Override
    public void onReq(BaseReq baseReq) {
        XLog.i(TAG, "WXEntryActivity onReq:" + baseReq);
    }

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

    @Override
    public void initData(Bundle savedInstanceState) {
        WeChatUtil.getInstance().getApi().handleIntent(getIntent(), this);
    }

    @Override
    public WXEntryPresent newP() {
        return new WXEntryPresent();
    }
}
public class WXPayEntryActivity extends BaseMvpLanActivity<WXPayEntryPresent> implements IWXAPIEventHandler {
    @Override
    public void initData(Bundle savedInstanceState) {
        WeChatUtil.getInstance().getApi().handleIntent(getIntent(), this);
    }

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

    @Override
    public WXPayEntryPresent newP() {
        return new WXPayEntryPresent();
    }

    @Override
    public void onReq(BaseReq baseReq) {

    }

    @Override
    public void onResp(BaseResp resp) {
        XLog.i("whh", "微信支付回调 返回错误码:" + resp.errCode + " 错误名称:" + resp.errStr);
        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {//微信支付
            WeiXin weiXin = new WeiXin(3, resp.errCode, "");
            EventBus.getDefault().post(weiXin);
        }
        finish();
    }
}
 @Subscribe
    public void onEventMainThread(WeiXin weiXin) {
        XLog.i("whh", "收到eventbus请求 type:" + weiXin.getType());
        if (weiXin.getType() == 1) {//登录
            WeChatUtil.getInstance().getAccessToken(weiXin.getCode());
        } else if (weiXin.getType() == 2) {//分享
            switch (weiXin.getErrCode()) {
                case BaseResp.ErrCode.ERR_OK:
                    XLog.i("whh", "微信分享成功.....");
                    break;
                case BaseResp.ErrCode.ERR_USER_CANCEL://分享取消
                    XLog.i("whh", "微信分享取消.....");
                    break;
                case BaseResp.ErrCode.ERR_AUTH_DENIED://分享被拒绝
                    XLog.i("whh", "微信分享被拒绝.....");
                    break;
            }
        } else if (weiXin.getType() == 3) {//微信支付
            if (weiXin.getErrCode() == BaseResp.ErrCode.ERR_OK) {//成功
                XLog.i("whh", "微信支付成功.....");
            }
        }
    }

原文地址:https://www.cnblogs.com/dongweiq/p/12111921.html

时间: 2024-08-29 13:37:08

微信登录与分享和支付的相关文章

iOS开发笔记14:微博/微信登录与分享、微信/支付宝支付

产品中接入了微博/微信的第三方登录分享功能.微信和支付宝的第三方支付功能,之前在开发过程中涉及到这些部分,于是抽空将接入过程梳理了一遍. 1.微博.微信.支付宝SDK相关接入设置 (1)微博SDK SDK下载 设置URL Scheme,用于从第三方应用或浏览器中启动app 将SDK添加到工程中(支持CocoaPods),app启动时(didFinishLaunchingWithOptions)注册appkey 重写AppDelegate 的handleOpenURL和openURL方法,其它引用

Android调用微信登陆、分享、支付

前言:用了微信sdk各种痛苦,感觉比qq sdk调用麻烦多了,回调过于麻烦,还必须要在指定包名下的actvity进行回调,所以我在这里写一篇博客,有这个需求的朋友可以借鉴一下,以后自己别的项目有用到也有个找资料的地方. 一.微信登陆分三个步骤: 1).微信授权登陆  2).根据授权登陆code 获取该用户token  3).根据token获取用户资料  4).接收微信的请求及返回值 如果你的程序需要接收微信发送的请求,或者接收发送到微信请求的响应结果,需要下面3步操作: a. 在你的包名相应目录

Android应用实现微信登录与分享

Android应用实现微信登录与分享 1. 闲话(可直接无视 项目慢慢的推进,逐渐的做到了微信第三方登录的功能模块了.其实我想说Orz,我等这一天等了好久了,想做个微信验证登录都等了两个多星期咧(其实是我们这边出了点问题),先要申请微信开放平台的帐号,在里面创建一个应用,通过审核之后再交300软妹币,是的,你没有听错,上交300软妹币(听说会成为传说中的认证开发者)才可以获得应用第三方登录的权限,否则只能够分享到盆友圈.中间也是遇到了一些小问题,微信那边的文档写的也不是特别的清楚,还有一些关于微

vue 微信公众号分享后支付失效页面URL不变的坑

微信分享后支付页面还是初始页面,这个问题解决了, created(){ //判断是否是IOS设备 // IOS分享时的页面是首页,也就是进入页而不是当前页.所有可以采用刷新当前页,让进入页的链接改成当前页,再在页面卸载时删除缓存数据. let agent = navigator.userAgent let isIOS = !!agent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/) // ios终端 if(isIOS && !sessionStorage.g

手机站微信登录代码分享,自己开发仅供学习

首先前端的代码是 <div class="joint-login">   <h2><span>合作账号登录</span></h2>   <ul>       <li><a class="qq" href="javascript: void(0);"></a></li>   <li><a class="

【React Native 实战】微信登录

1.前言 在今天无论是游戏开发还是app开发,微信作为第三方登录必不可少,今天我们就用react-native-wechat实现微信登录,分享和支付同样的道理就不过多的介绍了. 2.属性 1)registerApp(appid): appid:String类型,从微信开放平台后台获取. 2)registerAppWithDescription(appid, appdesc): 此方法只支持iOS; appid: String类型,从微信后台获取;  appdesc:String类型,描述信息.

全网独家V25.6版H5游戏 接龙 扫雷 多雷 禁抢 微信登录封装APP赢率智能控制

全网独家V25.6A版H5游戏.牛牛 .接龙. 扫雷. 多雷禁抢. PC.蛋蛋. 微信登录封装APP.赢率智能控制 2018全新源码内核升级打造.更换域名后台简单配置便可,不需要重启和懂技术. 声明:所有代码仅限自我娱乐和学习,禁止用于非法应用,责任自负,本站无关联责任. 我们从不泄露买家隐私,从不监控买家数据和资金充值.流动,更不会将这些数据用于商业用途和推广忽悠.一切为了您的系统安全,防止不必要的风险. 2018-04-16升级日志 1.内置自助提现接口(需要根据要求申请接口秘钥) 2.完善

android使用友盟实现第三方登录、分享以及微信回调无反应问题解决办法

        Leaning_wk每一次的进步都会拉近与成功的距离! 帐号设置退出   关闭 qq_15855289的博客 目录视图 摘要视图 订阅 异步赠书:Kotlin领衔10本好书      免费直播:AI时代,机器学习如何入门?      程序员8月书讯      每周荐书:Java Web.Python极客编程(评论送书) android使用友盟实现第三方登录.分享以及微信回调无反应问题解决办法 标签: android友盟第三方登录分享微信登录回调问题 2017-02-10 16:2

微信第三方接入遇到的科恩(坑)——登录、分享

今天由于业务需要翻看了微信的开发平台和相应的接口文档 然后一边看,一边骂娘 微信开发者文档中的科恩! 科恩目录 微信分享 微信登录 一.微信分享是之用户通过第三方的app发送内容到微信,可以是群组,好友,朋友圈. 如下:开放平台的权限显示,应用审核后不需要认证300块的开发者也是可以分享内容的. 于是我天真的以为我快要成功了,我创建了一个HelloWorld,我然后导入了jar包,我然后填写的签名和包名,我逐个字母的核对着,我复制了Weixin_SDKDEMO里分享一段简单文本的例子,然后点击了