Android支付封装(微信+支付宝)
2018-02-02 本文已影响1022人
流水潺湲
支付宝支付:Android支付宝支付详解
微信支付参考:android微信支付详解与坑
官方文档:App支付Android集成流程
做过支付的人都知道,微信支付回调的是Activity,支付宝是Handler
一般在开发过程中许多地方都有用到支付(特别是电商的APP),如果每次都写个回调会显得代码冗余繁琐,再次我将支付封装到工具类直接使用,只需要对应的参数。
先来看看怎么使用呢
一、Activity中实现PayResultListener 接口
··· Activity implements PayResultListener {···
@Override
public void onPaySuccess() {
showMessage("支付成功");
}
@Override
public void onPayError() {
showMessage("支付失败");
}
@Override
public void onPayCancel() {
showMessage("取消");
}
}
在OnCreateh中添加接口
PayListenerUtils.getInstance(this).addListener(this);
在onDestroy中销毁
@Override
protected void onDestroy() {
super.onDestroy();
PayListenerUtils.getInstance(this).removeListener(this);
}
二、使用
微信支付
PayUtils.getInstance(this).pay(PayUtils.PAY_TYPE_WX, "传入服务器获取的签名字段");
支付宝支付
PayUtils.getInstance(this).pay(PayUtils.PAY_TYPE_ALI, "传入服务器获取的签名字段");
三、具体封装
首先呢,封装个接口,用于返回支付状态的
/**
* Author: syhuang
* Date: 2018/2/2
* 支付返回结果
*/
public interface PayResultListener {
public void onPaySuccess();
public void onPayError();
public void onPayCancel();
}
通过管理类管理接口
public class PayListenerUtils {
private static PayListenerUtils instance;
private Context mContext;
private final static ArrayList<PayResultListener> resultList = new ArrayList<>();
private PayListenerUtils(Context context) {
this.mContext = context;
//TODO
}
public synchronized static PayListenerUtils getInstance(Context context) {
if (instance == null) {
instance = new PayListenerUtils(context);
}
return instance;
}
public void addListener(PayResultListener listener) {
if (!resultList.contains(listener)) {
resultList.add(listener);
}
}
public void removeListener(PayResultListener listener) {
if (resultList.contains(listener)) {
resultList.remove(listener);
}
}
public void addSuccess() {
for (PayResultListener listener : resultList) {
listener.onPaySuccess();
}
}
public void addCancel() {
for (PayResultListener listener : resultList) {
listener.onPayCancel();
}
}
public void addError() {
for (PayResultListener listener : resultList) {
listener.onPayError();
}
}
}
接下来主要封装支付的工具类,以后在使用的过程中直接采用工具类即可。
public class PayUtils {
private static String TAG = PayUtils.class.getSimpleName();
/**
* 支付类型
*/
public static final int PAY_TYPE_WX = 1;
public static final int PAY_TYPE_ALI = 2;
/**
* 支付宝返回参数
*/
final static int SDK_PAY_FLAG = 1001;
private static PayUtils instance;
private static Context mContext;
private static Activity mActivity;
private PayUtils() {
}
public static PayUtils getInstance(Context context) {
if (instance == null) {
instance = new PayUtils();
}
mContext = context;
mActivity = (Activity) mContext;
return instance;
}
public static void pay(int payType, String result) {
switch (payType) {
case PAY_TYPE_WX:
//微信
toWXPay(result);
break;
//
case PAY_TYPE_ALI:
toAliPay(result);
break;
}
}
/**
* 微信支付
*
* @param result
*/
private static void toWXPay(String result) {
//result中是重服务器请求到的签名后各个字符串,可自定义
//result是服务器返回结果
PayReq request = new PayReq();
request.appId = "wxfe2fa2f264353d7d3";
request.partnerId = "1494934532";
request.prepayId = "wx201802011023453926020588351720";
request.packageValue = "Sign=WXPay";
request.nonceStr = "4cdCo3o4453xhGPpv";
request.timeStamp = System.currentTimeMillis() / 1000 + "";
request.sign = "F8A42CF827345377A34646ADD9E321FAB4";
boolean send = getWxapi().sendReq(request);
}
/**
* 支付宝
*/
private static void toAliPay(String result) {
//result中是重服务器请求到的签名后字符串,赋值,此处随便写的
final String orderInfo = "app_id=2015052600090779&biz_content=%7B%22timeout_express%22%3A%2230m%22%2C%22seller_id%22%3A%22%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.02%22%2C%22subject%22%3A%221%22%2C%22body%22%3A%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%22%2C%22out_trade_no%22%3A%22314VYGIAGG7ZOYY%22%7D&charset=utf-8&method=alipay.trade.app.pay&sign_type=RSA2×tamp=2016-08-15%2012%3A12%3A15&version=1.0&sign=MsbylYkCzlfYLy9PeRwUUIg9nZPeN9SfXPNavUCroGKR5Kqvx0nEnd3eRmKxJuthNUx4ERCXe552EV9PfwexqW%2B1wbKOdYtDIb4%2B7PL3Pc94RZL0zKaWcaY3tSL89%2FuAVUsQuFqEJdhIukuKygrXucvejOUgTCfoUdwTi7z%2BZzQ%3D"; // 订单信息
Runnable payRunnable = new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask(mActivity);
Map<String, String> result = alipay.payV2(orderInfo, true);
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
Log.i(TAG, "aliresult--->" + result);
}
};
// 必须异步调用
Thread payThread = new Thread(payRunnable);
payThread.start();
}
/**
* 支付宝状态
* 9000 订单支付成功
* 8000 正在处理中,支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态
* 4000 订单支付失败
* 5000 重复请求
* 6001 用户中途取消
* 6002 网络连接出错
* 6004 支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态
* 其它 其它支付错误
*/
private static Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_PAY_FLAG: {
PayResult payResult = new PayResult((Map<String, String>) msg.obj);
/**
对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
*/
String resultInfo = payResult.getResult();// 同步返回需要验证的信息
String resultStatus = payResult.getResultStatus();
// 判断resultStatus 为9000则代表支付成功
if (TextUtils.equals(resultStatus, "9000")) {
// 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
showMessage("支付成功");
PayListenerUtils.getInstance(mContext).addSuccess();
} else if (TextUtils.equals(resultStatus, "6001")) {
// 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
showMessage("取消");
PayListenerUtils.getInstance(mContext).addCancel();
} else {
// 该笔订单真实的支付结果,需要依赖服务端的异步通知。
showMessage("支付失败");
PayListenerUtils.getInstance(mContext).addError();
}
break;
}
}
}
};
private static void showMessage(String str) {
Toast.makeText(mContext, str, Toast.LENGTH_SHORT).show();
}
}
微信的回调Activity中,直接添加回调就行了
public class WXPayEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {
private IWXAPI api;
private String TAG = WXPayEntryActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pay);
api = WXAPIFactory.createWXAPI(this, ConfigurationSettings.WECHAT_APP_ID);
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 baseResp) {
Log.i(TAG, "WX code:------>" + baseResp.errCode);
switch (baseResp.errCode) {
case 0:
//成功
PayListenerUtils.getInstance(this).addSuccess();
break;
case -1:
//失败
PayListenerUtils.getInstance(this).addError();
break;
case -2:
//用户取消
PayListenerUtils.getInstance(this).addCancel();
break;
}
finish();
}
}
至此整个结束,感谢各位大神指导!