最近项目需求 改版了支付方式,支付宝 微信都切换了 海外版,还集成了paypal,前几天随手记录了一下paypal的集成,
今天 整理一下 支付宝 和微信的,
支付宝 微信 账户申请 应用创建就不说了,截图太麻烦,这里只贴 一些 关键代码片段,
假设 支付宝 微信 账号申请 应用创建 ,后台接口都OK了,接下来:
1,自家后台 接口 获取 支付宝 拼接好的 orderInfo 参数 ,和 调起 微信支付需要的 七个 参数;
然后 传参 发起支付
/**
* 支付宝 支付
*/
public void goAliPay(final String orderInfo) {
Runnable payRunnable = new Runnable() {
@Override
public void run() {
//调用支付宝
PayTask payTask = new PayTask(ConfirmOrderAvtivity.this);
String result = payTask.pay(orderInfo, true);
Message msg = new Message();
msg.what = ALIPAY;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
// 必须异步调用
Thread payThread = new Thread(payRunnable);
payThread.start();
}
/**
* 微信支付
*/
public void goWeiXinPay(String appid, String partnerid, String prepayid, String noncestr, String timestamp, String packageNmae, String sign) {
//注册 微信APPID
api = WXAPIFactory.createWXAPI(ConfirmOrderAvtivity.this, Constant.WX_APP_ID, true);
api = WXAPIFactory.createWXAPI(ConfirmOrderAvtivity.this, null);
api.registerApp(appid);
PayReq req = new PayReq();
req.appId = appid;
req.partnerId = partnerid;
req.prepayId = prepayid;
req.nonceStr = noncestr;
req.timeStamp = timestamp;
req.packageValue = packageNmae;
req.sign = sign;
// 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
api.sendReq(req); // 返回的是调取 成功 失败
}
然后 等待 回调结果,我这里 是做的统一处理,就是根据 回调结果,支付失败 统一弹窗提示,支付成功 跳转支付结果页面,
微信的支付回调 我是 用的eventbus 处理的,收到支付回调,然后发送消息 告诉发起支付页面 支付结果,然后做处理,
因为WXPayEntryActivity 是个activity 页面,按着常规的处理 有时候会闪黑屏 然后跳转到 发起支付页面 很不舒服,不知道别的大佬是怎么处理的,广播的话 就很好的解决的了这个问题,
EventBUS 的话,网上有很多介绍的,这里贴个链接 可以学习一下 https://www.jianshu.com/p/f9ae5691e1bb
大神源码解读:http://a.codekk.com/detail/Android/Trinea/EventBus%20%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90
sweetdialog 是一个很不错的 弹窗 GitHub链接 https://github.com/pedant/sweet-alert-dialog
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
@SuppressWarnings("unused")
public void handleMessage(Message msg) {
switch (msg.what) {
case ALIPAY: {
PayResult payResult = new PayResult((String) msg.obj);
String resultInfo = payResult.getResult();// 同步返回需要验证的信息
String resultStatus = payResult.getResultStatus();
if (TextUtils.equals(resultStatus, "9000")) {
showMyDialog("1");
} else {
// "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服 务端异步通知为准(小概率状态)
if (TextUtils.equals(resultStatus, "8000")) {
showMyDialog("支付结果确认中...");
} else if (TextUtils.equals(resultStatus, "6001")) {
showMyDialog("支付取消");
} else if (TextUtils.equals(resultStatus, "6002")) {
showMyDialog("支付失败");
} else if (TextUtils.equals(resultStatus, "5000")) {
} else {
showMyDialog("支付失败");
// 其他值就可以判断为支付失败
}
}
break;
}
}
}
};
public void showMyDialog(String msg) {
if (msg.equals("1")) {
intent = new Intent(ConfirmOrderAvtivity.this, PayResultActivity.class);
intent.putExtra("from", "ConfirmOrderAvtivity");
startActivity(intent);
} else {
new SweetAlertDialog(ConfirmOrderAvtivity.this, SweetAlertDialog.WARNING_TYPE)
.setTitleText(msg)
.setContentText(msg + "!")
.show();
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMoonEvent(MessageEvent messageEvent) {
if (messageEvent.getMessage().equals("支付成功")) {
showMyDialog("1");
} else if (messageEvent.getMessage().equals("支付失败")) {
showMyDialog(messageEvent.getMessage());
} else if (messageEvent.getMessage().equals("支付取消")) {
showMyDialog(messageEvent.getMessage());
}
}
WXPayEntryActivity :
public class WXPayEntryActivity extends BaseActivity implements IWXAPIEventHandler {
private IWXAPI api;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.wxpay_bg_layout);
ActivityManagerUtils.getInstance().addActivity(this);
api = WXAPIFactory.createWXAPI(WXPayEntryActivity.this, Constant.WX_APP_ID);
api.handleIntent(getIntent(), WXPayEntryActivity.this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, WXPayEntryActivity.this);
}
@Override
public void onReq(BaseReq baseReq) {
}
@Override
public void onResp(BaseResp resp) {
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
int code = resp.errCode;
if (code == 0) {
//显示充值成功的页面和需要的操作
EventBus.getDefault().post(new MessageEvent("支付成功"));
}
if (code == -1) {
EventBus.getDefault().post(new MessageEvent("支付失败"));
//支付失败
}
if (code == -2) {
EventBus.getDefault().post(new MessageEvent("支付取消"));
//用户取消
}
finish();
}
}
}