Android 集成微信支付和支付宝支付工具类
1.前言 去年年底接了一个商城app 外包项目,里面尼涉及到 微信和支付宝支付,这里我整理出几个工具类,下面就和大家分享一下,废话不多说,下面我一步一步给大家介绍下。
一、支付宝支付
1.支付宝官方集成文档 2.支付宝官方资源下载
二、微信支付
1.微信官方的集成文档 2.微信官方资源下载
三、下面我直接上代码了哈 首先导入对应支付平台下载的SDK里面的jar
1.PayHelper 支付类:
package com.more.org.utils;
import android.app.Activity;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;
import com.alipay.sdk.app.PayTask;
import com.more.org.WEXModel;
import com.tencent.mm.opensdk.modelpay.PayReq;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
import java.util.Map;
/**
* Created by Administrator on 2017/5/23.
* 支付类
*/
public class PayHelper {
private static PayHelper mPayHelper = null;
public static PayHelper getInstance() {
if (mPayHelper == null) {
mPayHelper = new PayHelper();
}
return mPayHelper;
}
public PayHelper() {
}
IWXAPI msgApi = null;
public void WexPay(WEXModel.ReturnDataBean data) {
if (msgApi == null) {
msgApi = WXAPIFactory.createWXAPI(MyApplication.getInstance(), null);
msgApi.registerApp(Constant.WEXAPPID);// 将该app注册到微信
}
PayReq req = new PayReq();
if (!msgApi.isWXAppInstalled()) {
Toast.makeText(MyApplication.getInstance(), "手机中没有安装微信客户端!", Toast.LENGTH_SHORT).show();
return;
}
if (data != null) {
req.appId = data.getAppid();
req.partnerId = data.getPartnerid();
req.prepayId = data.getPrepayid();
req.nonceStr = data.getNoncestr();
req.timeStamp = data.getTimestamp() + "";
req.packageValue = data.getPackageX();
req.sign = data.getSign();
// req.extData = MaiLiApplication.getInstance().getUserInfo().getPhone(); 微信拓展参数
msgApi.sendReq(req);
}
}
public void AliPay(Activity activity, final String orderInfo) {
final PayTask alipay = new PayTask(activity);
Runnable payRunnable = new Runnable() {
@Override
public void run() {
Map<String, String> result = alipay.payV2(orderInfo, true);
Log.i("msp", result.toString());
Message msg = new Message();
msg.what = 0;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
Thread payThread = new Thread(payRunnable);
payThread.start();
}
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
PayResult payResult = new PayResult((Map<String, String>) msg.obj);
/**
对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
*/
String resultInfo = payResult.getResult();// 同步返回需要验证的信息
String resultStatus = payResult.getResultStatus();
// 判断resultStatus 为9000则代表支付成功
if (TextUtils.equals(resultStatus, "9000")) {
// 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
if (mIPayListener != null) {
mIPayListener.onSuccess();
}
} else {
// 该笔订单真实的支付结果,需要依赖服务端的异步通知。
if (mIPayListener != null) {
mIPayListener.onFail();
}
}
break;
}
}
};
private IPayListener mIPayListener;
public void setIPayListener(IPayListener mIPayListener) {
this.mIPayListener = mIPayListener;
}
public interface IPayListener {
void onSuccess();
void onFail();
}
}
2.PayResult看命名就知道 支付结果类:
package com.more.org.utils;
import android.text.TextUtils;
import java.util.Map;
public class PayResult {
private String resultStatus;
private String result;
private String memo;
public PayResult(Map<String, String> rawResult) {
if (rawResult == null) {
return;
}
for (String key : rawResult.keySet()) {
if (TextUtils.equals(key, "resultStatus")) {
resultStatus = rawResult.get(key);
} else if (TextUtils.equals(key, "result")) {
result = rawResult.get(key);
} else if (TextUtils.equals(key, "memo")) {
memo = rawResult.get(key);
}
}
}
@Override
public String toString() {
return "resultStatus={" + resultStatus + "};memo={" + memo
+ "};result={" + result + "}";
}
/**
* @return the resultStatus
*/
public String getResultStatus() {
return resultStatus;
}
/**
* @return the memo
*/
public String getMemo() {
return memo;
}
/**
* @return the result
*/
public String getResult() {
return result;
}
}
3.WXPayEntryActivity类(放在wxapi包名下):
package com.more.org.wxapi;
import android.content.Intent;
import android.widget.Toast;
import com.more.org.BaseActivity;
import com.more.org.BasePresenter;
import com.more.org.R;
import com.more.org.databinding.ActivityPayResultBinding;
import com.tencent.mm.opensdk.modelbase.BaseReq;
import com.tencent.mm.opensdk.modelbase.BaseResp;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
public class WXPayEntryActivity extends BaseActivity<BasePresenter,ActivityPayResultBinding> implements IWXAPIEventHandler {
private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";
private IWXAPI api;
// @Override
// public int getLayoutId() {
// return R.layout.activity_pay_result;
// }
//
// @Override
// protected boolean isTitleBar() {
// return false;
// }
//
// @Override
// protected boolean isPrestener() {
// return false;
// }
//
// @Override
// protected BasePresenter createPresenter() {
// return null;
// }
//
@Override
public void initData() {
super.initData();
api = WXAPIFactory.createWXAPI(this, Constant.WEXAPPID);
api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
@Override
public void onReq(BaseReq req) {
}
@Override
public void onResp(BaseResp resp) {
int code = resp.errCode;
String transaction = resp.transaction;
String errStr = resp.errStr;
if (code == 0) {
mBinding.tvResult.setText("充值成功了!");
//显示充值成功的页面和需要的操作
//EventBus.getDefault().post("微信支付成功");//微信支付成功
Toast.makeText(aty, "充值成功了!", Toast.LENGTH_SHORT).show();
}
if (code == -1) {
//错误 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
mBinding.tvResult.setText("充值失败!");
Toast.makeText(aty, "充值失败!", Toast.LENGTH_SHORT).show();
}
if (code == -2) {
mBinding.tvResult.setText("用户取消了!");
Toast.makeText(aty, "用户取消了!", Toast.LENGTH_SHORT).show();
//用户取消
}
// finish();
}
}
4.WEXModel实体类:(根据自己服务器返回的数据定义)
package com.more.org;
import com.google.gson.annotations.SerializedName;
import java.io.Serializable;
import java.util.List;
/**
* Created by Administrator on 2017/5/23.
*/
public class WEXModel implements Serializable {
/**
* ReturnCode : 1
* ReturnMessage :
* ReturnData : 服务器返回的josn数据
*/
private String ReturnCode;
private String ReturnMessage;
private List<ReturnDataBean> ReturnData;
public String getReturnCode() {
return ReturnCode;
}
public void setReturnCode(String ReturnCode) {
this.ReturnCode = ReturnCode;
}
public String getReturnMessage() {
return ReturnMessage;
}
public void setReturnMessage(String ReturnMessage) {
this.ReturnMessage = ReturnMessage;
}
public List<ReturnDataBean> getReturnData() {
return ReturnData;
}
public void setReturnData(List<ReturnDataBean> ReturnData) {
this.ReturnData = ReturnData;
}
public static class ReturnDataBean {
/**
* appid : //对应的参数后台返回
* partnerid :
* prepayid :
* package : Sign=WXPay
* noncestr :
* timestamp : 1521789303
* sign :
*/
private String appid;
private String partnerid;
private String prepayid;
@SerializedName("package")
private String packageX;
private String noncestr;
private String timestamp;
private String sign;
public String getAppid() {
return appid;
}
public void setAppid(String appid) {
this.appid = appid;
}
public String getPartnerid() {
return partnerid;
}
public void setPartnerid(String partnerid) {
this.partnerid = partnerid;
}
public String getPrepayid() {
return prepayid;
}
public void setPrepayid(String prepayid) {
this.prepayid = prepayid;
}
public String getPackageX() {
return packageX;
}
public void setPackageX(String packageX) {
this.packageX = packageX;
}
public String getNoncestr() {
return noncestr;
}
public void setNoncestr(String noncestr) {
this.noncestr = noncestr;
}
public String getTimestamp() {
return timestamp;
}
public void setTimestamp(String timestamp) {
this.timestamp = timestamp;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
}
}
5.AndroidManifest清单文件配置相关信息:
1.添加必要权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2.注册信息
<!-- 支付宝 -->
<activity
android:name="com.alipay.sdk.app.H5PayActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind" />
<activity
android:name="com.alipay.sdk.auth.AuthActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind" />
<!-- 微信支付回调函数 -->
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="这里替换自己申请的scheme" />
</intent-filter>
</activity>
6.下面我们看下调用的地方,其实很简单:
/*
* 支付宝支付方法
* */
private void initAlipay(String type) {
Api.getApi().getRechargePay(CacheService.getIntance().getUserId(), payMoney, type)
.compose(callbackOnIOToMainThread())
.subscribe(new BaseNetSubscriber<BaseBean>(true) {
@Override
public void onNext(BaseBean baseBean) {
super.onNext(baseBean);
PayHelper.getInstance().AliPay(aty, String.valueOf(baseBean.getReturnData()));
PayHelper.getInstance().setIPayListener(new PayHelper.IPayListener() {
@Override
public void onSuccess() {
showToast("支付成功!");
new Thread() {
@Override
public void run() {
super.run();
try {
sleep(1000);
} catch (InterruptedException e) {
}
EventBus.getDefault().post(new MineUpdateEvent());//更新价格
finish();
}
}.start();
}
@Override
public void onFail() {
showToast("支付失败!");
}
});
}
@Override
public void onError(Throwable e) {
super.onError(e);
}
});
}
/*
* 微信支付方法
* */
private void initWexPay(String type) {
Api.getApi().getRechargePay1(CacheService.getIntance().getUserId(), payMoney, type)
.compose(callbackOnIOToMainThread())
.subscribe(new BaseNetSubscriber<WEXModel>(true) {
@Override
public void onNext(WEXModel wexModel) {
super.onNext(wexModel);
if (wexModel.getReturnData() != null && wexModel.getReturnData().size() > 0) {
PayHelper.getInstance().WexPay(wexModel.getReturnData().get(0));
} else {
showToast("信息错误!");
}
}
@Override
public void onError(Throwable e) {
super.onError(e);
}
});
}
以上就是微信支付和支付宝支付所有代码了,哈哈是不是发现好简单! 关于微信的签名要说明的问题: 1.首先按照微信的签名的话,一般步骤都可以往下走,但是有一点需要注意就是签完名之后,如果你打包成正式版的话也就是releasea签名的话要用正式的包安装才能唤起微信,否则会出错的,如果要是想使用Dug签名的话,你要把签名后的keystore替换掉android studio的默认签名就可以使用了。 2.上面这些类是我从自己项目整理出来的,你们拿来用,稍微改下就行。 2.一般来说 遇到比较多问题 返回 -1,这种问题网上也有对应的链接解决的,比如参数配置,后台返回的信息是不是有问题,这些小伙伴们注意一下就ok啦.