Android支付封装(微信+支付宝)
16lz
2022-06-24
支付宝支付: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 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 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) 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(); }}
至此整个结束,感谢各位大神指导!
更多相关文章
- Android(安卓)Looper 复制粘贴
- android的ndk修改app_platform的方法,亲测绝对可行
- android的ndk修改app_platform的方法,亲测绝对可行
- 银联手机支付 手机客户端有几个?
- android调用系统邮件组件(intent匹配的流程)
- android 银联支付接入报nullexception异常
- android的ndk修改app_platform的方法,亲测绝对可行
- android 银联支付接入报nullexception异常
- android启动SDK Manager闪退问题