首先微信授权登录为客户端(通过微信官方平台)集成和原生集成
原生集成:需要跟后台进行对接
客户端集成:是自己到微信官方平台去操作即可 跟友盟分享登录一样
以下是授权登录和支付
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;
}
以上就完成了支付
此博客为个人记录使用,每天进步一点点~