微信登录和支付
先微信授权登录和支付分为客户端(通过微信官方平台)集成和原生集成
原生集成:需要跟后台进行对接
客户端集成:是自己到微信官方平台去操作即可 跟咱们友盟分享登录一样
以下是授权登录和支付
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"
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);
// getSupportActionBar().hide();
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 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:首先要去下订单去获取订单账号
2:通过订单去支付
3:在支付成功的接口里面去回调微信
其实跟微信授权登录差不多
我贴出关键代码:
这个方法是MVP成功的回调
@Override
public void getSuccessData(Object data) {
请求订单成功的回调
if (data instanceof OrderBean) {
OrderBean orderBean = (OrderBean) data;
if (orderBean != null && orderBean.getStatus().equals("0000")) {
Map headmap = new HashMap<>();
headmap.put("userId", userId + "");
headmap.put("sessionId", sessionId);
Map parms = new HashMap<>();
parms.put("payType", 1 + "");
parms.put("orderId", orderBean.getOrderId());
//发起支付接口
presenter.requestData(Constant.URL_GO_TO_PAY, headmap, parms, PayBean.class, 2);
}
}
//支付成功的回调
if (data instanceof PayBean) {
PayBean pay = (PayBean) data;
// "appId":"wxb3852e6a6b7d9516",
// "message":"支付成功",
// "nonceStr":"WQ72A7mNfUaA05Gw",// 随机字符串
// "partnerId":"1510865081",// 微信支付分配的商户号
// "prepayId":"wx07084938610450dcaad697243945045542",// 微信返回的支付交易会话ID
// "sign":"94F2FD993AB97C002E6CE898B04B578A",// 签名
// "status":"0000",
// "timeStamp":"1533602976",// 时间戳
// "packageValue":"Sign=WXPay"// 扩展字段占时填固定
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);
}
}
}
老样子在wxapi下新建WXPayEntryActivity
以下是代码:
public class WXPayEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {
private IWXAPI iwxapi;
private static String APP_ID = "wxb3852e6a6b7d9516";
@Override
protected void onCreate(@Nullable 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;
}
}
}
}