微信支付 分享 登录 从零到一的实现

依赖:

 implementation 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'

 微信登录:

 

 这个类一定要在wxapi下面不然不好使。。。。

package com.wd.tech.wxapi;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Toast;

import com.tencent.mm.opensdk.constants.ConstantsAPI;
import com.tencent.mm.opensdk.modelbase.BaseReq;
import com.tencent.mm.opensdk.modelbase.BaseResp;
import com.tencent.mm.opensdk.modelmsg.SendAuth;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
import com.wd.tech.baselibrary.util.SpUtil;
import com.wd.tech.baselibrary.util.WXUtils;

import tech.wd.com.informationlibrary.wechat.WXShare;


/**
 * 微信登录
 */
public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler  {

    private static final int RETURN_MSG_TYPE_LOGIN = 1;
    private static final int RETURN_MSG_TYPE_SHARE = 2;
    private static final String TAG = "WXEntryActivity";

    public IWXAPI mWxApi;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       /* mWxApi = WXAPIFactory.createWXAPI(this, "wxb3852e6a6b7d9516");*/

        //这次我使用了一个微信分享的工具类获取IWXAPI
        WXShare share = new WXShare(this);
        mWxApi = share.getApi();
        //如果没回调onResp,八成是这句没有写
        mWxApi.handleIntent(getIntent(), this);
    }

    // 微信发送请求到第三方应用时,会回调到该方法
    @Override
    public void onReq(BaseReq req) {

    }

    // 第三的方应用发送到微信请求处理后的响应结果,会回调到该方法
    //app发送消息给微信,处理返回消息的回调
    @Override
    public void onResp(BaseResp baseResp) {
        Log.d("WXEntryActivity", "错误码 : " + baseResp.errCode + "");
        Log.i(TAG, "error_code:---->" + baseResp.errCode);
        int type = baseResp.getType(); //类型:分享还是登录
        switch (baseResp.errCode) {
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
                //用户拒绝授权
                /*ToastUtils.showToast(mContext, "拒绝授权微信登录");*/
                Toast.makeText(this, "拒绝授权微信  登录", Toast.LENGTH_SHORT).show();
            case BaseResp.ErrCode.ERR_USER_CANCEL:
                //用户取消
                String message = "";
                if (type == RETURN_MSG_TYPE_LOGIN) {
                    message = "取消了微信登录";
                } else if (type == RETURN_MSG_TYPE_SHARE) {
                    message = "取消了微信分享";
                }
                Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
                break;
            case BaseResp.ErrCode.ERR_OK:
                //用户同意,为微信登录
                if (type == RETURN_MSG_TYPE_LOGIN) {
                    //用户换取access_token的code,仅在ErrCode为0时有效
                    String code = ((SendAuth.Resp) baseResp).code;
                    Log.i(TAG, "微信code============" + code);
                    //这里拿到了这个code,去做2次网络请求获取access_token和用户个人信息
                    //这里我封装了一个工具类去做微信专用的登录的网络工具类
                    WXUtils.getWXUserInfo(code, this);
                    finish();
                    //销毁本页面
                } else if (type == RETURN_MSG_TYPE_SHARE) {
                    /*微信分享成功*/
                    finish();
                }
                break;
        }

    }
}

 下面是判断微信是否安装

    public static boolean isWeixinAvilible(Context context) {
        final PackageManager packageManager = context.getPackageManager();// 获取packagemanager
        List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);// 获取所有已安装程序的包信息
        if (pinfo != null) {
            for (int i = 0; i < pinfo.size(); i++) {
                String pn = pinfo.get(i).packageName;
                if (pn.equals("com.tencent.mm")) {
                    return true;
                }
            }
        }
        return false;
    }

 

清单文件

  清单文件一定要注册activity
  <uses-permission android:name="android.permission.INTERNET" />
  <activity android:name=".wxapi.WXEntryActivity"
            android:exported="true"
            />

 

 在appliaction中配置看如下信息

    private static App mainApp;

    public static IWXAPI mWxApi;

    public static App getMainApp() {
        mainApp = new App();
        return mainApp;
    }

    
        在onCcreat中写入
        mWxApi = WXAPIFactory.createWXAPI(this, "appid", true);
        // 将该app注册到微信
        mWxApi.registerApp("appid");

 配置齐全后我们进行调用微信进行微信登录

 

第三方登录

    private void wxLogin() {
        //先判断是否安装微信APP,按照微信的说法,目前移动应用上微信登录只提供原生的登录方式,需要用户安装微信客户端才能配合使用。
        if (!WXUtils.isWeixinAvilible(this)) {
            toase("您还未安装微信客户端",0);
            return;
        }
        SendAuth.Req req = new SendAuth.Req();
        req.scope = "snsapi_userinfo";
        req.state = "diandi_wx_login";
        //像微信发送请求
        BaseApp.mWxApi.sendReq(req);
    }

这样我们就可以掉起来微信登录后我们的WXEntryActivity 会受到回调拿到code我们进行请求我们的服务器

 

 

微信分享

微信分享我上面已经提到了在初始化微信api的时候我是调用的分享工具类,这个是分享的工具类了

package tech.wd.com.informationlibrary.wechat;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.os.Parcel;
import android.os.Parcelable;
//17600656561

import com.tencent.mm.opensdk.modelbase.BaseResp;
import com.tencent.mm.opensdk.modelmsg.SendMessageToWX;
import com.tencent.mm.opensdk.modelmsg.WXMediaMessage;
import com.tencent.mm.opensdk.modelmsg.WXTextObject;
import com.tencent.mm.opensdk.modelmsg.WXWebpageObject;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
import com.wd.tech.baselibrary.util.Logger;

import java.io.ByteArrayOutputStream;
import java.net.URL;

public class WXShare {

        public static final String APP_ID = "wx4c96b6b8da494224";
        public static final String ACTION_SHARE_RESPONSE = "action_wx_share_response";
        public static final String EXTRA_RESULT = "result";

        private final Context context;
        private final IWXAPI api;
        private OnResponseListener listener;
        private ResponseReceiver receiver;

        public WXShare(Context context) {
            api = WXAPIFactory.createWXAPI(context, APP_ID);
            this.context = context;
        }

        public WXShare register() {
            // 微信分享
            api.registerApp(APP_ID);
            receiver = new ResponseReceiver();
            IntentFilter filter = new IntentFilter(ACTION_SHARE_RESPONSE);
            context.registerReceiver(receiver, filter);
            return this;
        }

        public void unregister() {
            try {
                api.unregisterApp();
                context.unregisterReceiver(receiver);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }



    public void shared( final boolean friendsCircle, final String title, final String desc, final String link, final String pictrue) {
        new Thread(){
            @Override
            public void run() {
                super.run();
                WXWebpageObject webpage = new WXWebpageObject();
                webpage.webpageUrl = link;//分享url
                WXMediaMessage msg = new WXMediaMessage(webpage);
                msg.title = title;
                msg.description = desc;
                try {
                    Bitmap bitmap = BitmapFactory.decodeStream(new URL(pictrue).openStream());
                    Bitmap thumBitmap = bitmap.createScaledBitmap(bitmap, 10, 10, true);
//                    释放资源
                    bitmap.recycle();
                    msg.thumbData = bmpToByteArray(thumBitmap, true);
                    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);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }.start();

    }


    //bitmap转byte数组
    public static byte[] bmpToByteArray(final Bitmap bmp, final boolean needRecycle) {
        int i;
        int j;
        if (bmp.getHeight() > bmp.getWidth()) {
            i = bmp.getWidth();
            j = bmp.getWidth();
        } else {
            i = bmp.getHeight();
            j = bmp.getHeight();
        }

        Bitmap localBitmap = Bitmap.createBitmap(i, j, Bitmap.Config.RGB_565);
        Canvas localCanvas = new Canvas(localBitmap);

        while (true) {
            localCanvas.drawBitmap(bmp, new Rect(0, 0, i, j), new Rect(0, 0, i, j), null);
            if (needRecycle)
                bmp.recycle();
            ByteArrayOutputStream localByteArrayOutputStream = new ByteArrayOutputStream();
            localBitmap.compress(Bitmap.CompressFormat.JPEG, 100,
                    localByteArrayOutputStream);
            localBitmap.recycle();
            byte[] arrayOfByte = localByteArrayOutputStream.toByteArray();
            try {
                localByteArrayOutputStream.close();
                return arrayOfByte;
            } catch (Exception e) {
                // F.out(e);
            }
            i = bmp.getHeight();
            j = bmp.getHeight();
        }
    }




    public WXShare share(String text) {
            WXTextObject textObj = new WXTextObject();
            textObj.text = text;

            WXMediaMessage msg = new WXMediaMessage();
            msg.mediaObject = textObj;
    //        msg.title = "Will be ignored";
            msg.description = text;

            SendMessageToWX.Req req = new SendMessageToWX.Req();
            req.transaction = buildTransaction("text");
            req.message = msg;
            req.scene = SendMessageToWX.Req.WXSceneSession;

            boolean result = api.sendReq(req);
            Logger.i("tagger","text shared: " + result);
            return this;
        }

        public IWXAPI getApi() {
            return api;
        }

        public void setListener(OnResponseListener listener) {
            this.listener = listener;
        }

        private String buildTransaction(final String type) {
            return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
        }

        private class ResponseReceiver extends BroadcastReceiver {

            @Override
            public void onReceive(Context context, Intent intent) {
                Response response = intent.getParcelableExtra(EXTRA_RESULT);
                Logger.d("tagger","type: " + response.getType());
                Logger.d("tagger","errCode: " + response.errCode);
                String result;
                if (listener != null) {
                    if (response.errCode == BaseResp.ErrCode.ERR_OK) {
                        listener.onSuccess();
                    } else if (response.errCode == BaseResp.ErrCode.ERR_USER_CANCEL) {
                        listener.onCancel();
                    } else {
                        switch (response.errCode) {
                            case BaseResp.ErrCode.ERR_AUTH_DENIED:
                                result = "发送被拒绝";
                                break;
                            case BaseResp.ErrCode.ERR_UNSUPPORT:
                                result = "不支持错误";
                                break;
                            default:
                                result = "发送返回";
                                break;
                        }
                        listener.onFail(result);
                    }
                }
            }
        }

        public static class Response extends BaseResp implements Parcelable {

            public int errCode;
            public String errStr;
            public String transaction;
            public String openId;

            private int type;
            private boolean checkResult;

            public Response(BaseResp baseResp) {
                errCode = baseResp.errCode;
                errStr = baseResp.errStr;
                transaction = baseResp.transaction;
                openId = baseResp.openId;
                type = baseResp.getType();
                checkResult = baseResp.checkArgs();
            }

            @Override
            public int getType() {
                return type;
            }

            @Override
            public boolean checkArgs() {
                return checkResult;
            }


            @Override
            public int describeContents() {
                return 0;
            }

            @Override
            public void writeToParcel(Parcel dest, int flags) {
                dest.writeInt(this.errCode);
                dest.writeString(this.errStr);
                dest.writeString(this.transaction);
                dest.writeString(this.openId);
                dest.writeInt(this.type);
                dest.writeByte(this.checkResult ? (byte) 1 : (byte) 0);
            }

            protected Response(Parcel in) {
                this.errCode = in.readInt();
                this.errStr = in.readString();
                this.transaction = in.readString();
                this.openId = in.readString();
                this.type = in.readInt();
                this.checkResult = in.readByte() != 0;
            }

            public static final Creator<Response> CREATOR = new Creator<Response>() {
                @Override
                public Response createFromParcel(Parcel source) {
                    return new Response(source);
                }

                @Override
                public Response[] newArray(int size) {
                    return new Response[size];
                }
            };
        }

    }

 

public interface OnResponseListener {
    void onSuccess();

    void onCancel();

    void onFail(String message);
}

工具类我们已经准备齐全下面进行分享 

1.初始化工具类,注册分享
wxShare = WXShare(this);
wxShare.register()
2.在activity销毁的时候后分享注销注册
override fun onDestroy() {
        wxShare.unregister();

    }
3.分享调用工具类中的shared方法


第一个参数:
boolean friendsCircle false为好友,true为朋友圈

final String title  分享的标题
final String desc   分享的描述
final String link   分享的连接
final String pictrue  分享的图片

 

微信支付       

第一步:注册  

wxShare = WXShare(this);
api = wxShare .getApi();
wxShare.register()


第二部:掉起支付

val fromJson = Gson().fromJson(data, WeixinEntitiy::class.java)
val request = PayReq()
request.appId = fromJson.getAppId()
request.partnerId = fromJson.getPartnerId()
request.prepayId = fromJson.getPrepayId()
request.packageValue = fromJson.getPackageValue()
request.nonceStr = fromJson.getNonceStr()
request.timeStamp = fromJson.getTimeStamp()
request.sign = fromJson.getSign()
api!!.sendReq(request)

第三部:回调,这个里面可有判断支付是否成功



public class WXPayEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {

    private IWXAPI api;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        WXShare share = new WXShare(this);
        api = share.getApi();
        api.handleIntent(getIntent(), this);
    }

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

    @Override
    public void onReq(BaseReq baseReq) {
        //...
    }

    @Override
    public void onResp(BaseResp resp) {
        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            if (resp.errCode == 0) {
                SpUtil.saveData(this,"isPay",true);
                finish();
            } else if (resp.errCode == -2) {
                Toast.makeText(this, "您已取消付款!", Toast.LENGTH_SHORT).show();
                finish();
            } else {
                Toast.makeText(this, "参数错误", Toast.LENGTH_SHORT).show();
                finish();
            }
        } else {
            finish();
        }
    }
}

好了这就是以上我的小总结,对大家有帮助 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值