第三方微信登录和支付

首先微信授权登录为客户端(通过微信官方平台)集成和原生集成
原生集成:需要跟后台进行对接
客户端集成:是自己到微信官方平台去操作即可 跟友盟分享登录一样

以下是授权登录和支付
1:导入依赖:implementation ‘com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+’
2:keystore文件放到app目录下
3:在app的build.gradle 中Android 代码块加入keystore文件配置

signingConfigs { //在android代码块下写
    debug {//这个地方可以写成 release
        storeFile file('movie.keystore')
        keyAlias "bw_movie"
        storePassword "123456"
        keyPassword "123456"
    }
}

4:在项目包下新建文件夹名字必须是以下名字 。 必须是你项目的包名下边
wxapi下新建 WXEntryActivity 以下是代码:

这个是用来做分享和登录的 。 在清单文件中配置这个Activity 需要加这个属性:android:exported=“true”

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

以下是微信登录的Activity,其中APP_ID是自己申请的应用ID

public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler, IView {

    private IWXAPI iwxapi;
    private String unionid;
    private String openid;
    private static String APP_ID = "wxb3852e6a6b7d9516";
    private IPresenterImpl presenter;

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

        presenter = new IPresenterImpl(this);
       // 隐藏状态栏
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        //接收到分享以及登录的intent传递handleIntent方法,处理结果
        iwxapi = WXAPIFactory.createWXAPI(this, APP_ID, false);
        iwxapi.handleIntent(getIntent(), this);

    }

    @Override
    public void onReq(BaseReq baseReq) {
        Log.e("onReq", "不是请求错误");//我们一般用不到 
    }
//成功的回调
    @Override
    public void onResp(BaseResp baseResp) {
        //登录回调
        switch (baseResp.errCode) {
            case BaseResp.ErrCode.ERR_OK://代表成功
                String code = ((SendAuth.Resp) baseResp).code;
                Map<String, String> map = new HashMap();
                map.put("code", code);
                presenter.requestData(Constant.URL_WX, null, map, WXBean.class, 2);
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED://用户拒绝授权
                finish();
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL://用户取消
                finish();
                break;
            default:
                finish();
                break;
        }
    }


    @Override
    public void getSuccessData(Object data) {
        if (data instanceof WXBean) {
            WXBean bean = (WXBean) data;
            if (bean != null && bean.getStatus().equals("0000")) {
                Log.e("WXBean", bean.toString());
                //可以在此处创建数据库  用于保存用户信息
            }
        }
    }

    @Override
    public void getErrorData(String error) {
        ToastUtils.show(this, error);
    }
}

这个就是回调去调用微信授权的代码 所以在他之前要进入这个页面的要发起请求(一般放在点击登录微信事件中),
请求代码如下:

if (WXUtils.success(this)) {//请求第三方登录
    SendAuth.Req req = new SendAuth.Req();
    req.scope = "snsapi_userinfo";
    req.state = "wx_login_duzun";
    WXUtils.reg(this).sendReq(req);
}

这个地方封装了一个工具类WXUtils 里面有一些判断

public class WXUtils {
    /**
     * APP_ID 替换为你的应用从官方网站申请到的合法appID
     */
    public static String APP_ID = "wxb3852e6a6b7d9516";

    public static IWXAPI reg(Context context) {
        if (context != null) {
            //AppConst.WEIXIN.APP_ID是指你应用在微信开放平台上的AppID,记得替换。
            IWXAPI wxapi = WXAPIFactory.createWXAPI(context, APP_ID, true);
            //注册到微信
            wxapi.registerApp(APP_ID);
            return wxapi;
        } else {
            return null;
        }
    }

    //判断是否安装过微信
    public static boolean success(Context context) {
        if (WXUtils.reg(context).isWXAppInstalled()) {
            return true;
        } else {
            return false;
        }
    }
}

以上是微信授权登录 。

微信支付,由于上面登录关于微信已经配置完成,所以不用再配置。常见支付流程都是创建订单–获取订单号–再根据订单号完成支付

1、创建订单

StringBuilder stringBuilder = new StringBuilder();
                HashMap<String, Object> map = new HashMap<>();
                //入参商品id
                map.put("commodityId", 1001);
                //拼参
                String result = "";
                stringBuilder.append(mmkv.decodeInt("userId"));
                stringBuilder.append(1001);
                stringBuilder.append("tech");
                result = stringBuilder.toString();
                //使用MD5进行加密
                String str = MD5(result);
                //入参下单签名
                map.put("sign", str);
                //请求获取订单号
                presenter.ppostLR(IMyUrls.BuyVip, map, VipBean.class);

请求成功后

 @Override
    public void onSuccess(Object o) {
        if (o instanceof VipBean) {
            if (((VipBean) o).getStatus().equals("0000")) {
                HashMap<String, Object> map = new HashMap<>();
                //入参订单号
                map.put("orderId", "20201130195203183");
                map.put("payType", 1);
                
                presenter.ppostLR(IMyUrls.Pay, map, PayBean.class);
            }
        }
        if (o instanceof PayBean) {
            PayBean pay = (PayBean) o;
            if (pay != null && pay.getStatus().equals("0000")) {
                PayReq req = new PayReq();
                req.appId = pay.getAppId();
                req.nonceStr = pay.getNonceStr();
                req.partnerId = pay.getPartnerId();
                req.prepayId = pay.getPrepayId();
                req.sign = pay.getSign();
                req.timeStamp = pay.getTimeStamp();
                req.packageValue = pay.getPackageValue();
                //去调微信
                WXUtils.reg(this).sendReq(req);
            }
        }
    }

2、调用微信支付类

public class WXPayEntryActivity extends AppCompatActivity implements
        IWXAPIEventHandler {

    private IWXAPI iwxapi;
    private static String APP_ID = "wxb3852e6a6b7d9516";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //        // 隐藏状态栏
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);

        //接收到分享以及登录的intent传递handleIntent方法,处理结果
        iwxapi = WXAPIFactory.createWXAPI(this, APP_ID, false);
        iwxapi.handleIntent(getIntent(), this);
    }

    @Override
    public void onReq(BaseReq baseReq) {

    }

    @Override
    public void onResp(BaseResp baseResp) {
        if (baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            switch (baseResp.errCode) {
                case BaseResp.ErrCode.ERR_OK:
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(WXPayEntryActivity.this, "成功", Toast.LENGTH_SHORT).show();
                            Log.e("dj", "支付成功");
                            WXPayEntryActivity.this.finish();
                        }
                    });
                    break;
                case BaseResp.ErrCode.ERR_USER_CANCEL:
                    Toast.makeText(WXPayEntryActivity.this, "取消支付", Toast.LENGTH_SHORT).show();
                    Log.e("dj", "用户取消支付");
                    WXPayEntryActivity.this.finish();
                    break;

                default:
                    break;
            }
        }
    }
}

后加MD5加密方法

//MD5加密
    public static String MD5(String sourceStr) {
        String result = "";
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(sourceStr.getBytes());
            byte b[] = md.digest();
            int i;
            StringBuffer buf = new StringBuffer("");
            for (int offset = 0; offset < b.length; offset++) {
                i = b[offset];
                if (i < 0)
                    i += 256;
                if (i < 16)
                    buf.append("0");
                buf.append(Integer.toHexString(i));
            }
            result = buf.toString();
        } catch (NoSuchAlgorithmException e) {
            System.out.println(e);
        }
        return result;
    }

以上就完成了支付
此博客为个人记录使用,每天进步一点点~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值