1.导入SDK
2.创建AliPayUtil工具类
代码:
public class AliPayUtil {
private static AliPayUtil instance;
//支付结果回调接口
private PayStateCallback payStateCallback;
private Activity activity;
/**
* 设置支付结果监听
*/
public AliPayUtil setPayStateCallback(PayStateCallback payStateCallback) {
this.payStateCallback = payStateCallback;
return this;
}
private AliPayUtil() {
}
public static AliPayUtil getInstance(Activity activity, PayStateCallback payStateCallback) {
if (instance == null) {
instance = new AliPayUtil();
}
instance.setActivity(activity);
instance.setPayStateCallback(payStateCallback);
return instance;
}
private void setActivity(Activity activity) {
this.activity = activity;
}
/**
* 调用支付宝SDK支付
*
* @param orderstr 编码后的订单信息
*/
public void startPay(String orderstr) {
//if (CommonUtils.isFastDoubleClick()){return;}
new PayThread(orderstr).start();
}
class PayThread extends Thread {
String orderstr;
public PayThread(String orderstr) {
this.orderstr = orderstr;
}
@Override
public void run() {
// 构造PayTask 对象
PayTask alipay = new PayTask(activity);
String result = alipay.pay(orderstr, true);
// 调用支付接口,获取支付结果
payStateCallBack(result);
}
}
private void payStateCallBack(String result) {
PayResult aliPayResult = new PayResult(result);
/**
* 同步返回的结果必须放置到服务端进行验证(验证的规则请看
* https://doc.open.alipay.com/doc2/detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&docType=1
* ) 建议商户依赖异步通知
* 服务端验证安全
*/
// String resultInfo = aliPayResult.getResult();// 同步返回需要验证的信息
String resultStatus = aliPayResult.getResultStatus();
// 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档
if (TextUtils.equals(resultStatus, "9000")) {
//ToastUtil.showToast("支付成功");
3.在单独创建一个类payStateCallback
public interface PayStateCallback {
/**
* 支付成功
*/
void onPaySuccess(String describe);
/**
* 支付结果确认中
*/
void onPayWatting(String describe);
/**
* 支付失败
*/
void onPayFailed(String describe);
}
4.还需要一个PayResult类
public class PayResult {
private String resultStatus;
private String result;
private String memo;
public PayResult(String rawResult) {
if (TextUtils.isEmpty(rawResult))
return;
String[] resultParams = rawResult.split(";");
for (String resultParam : resultParams) {
if (resultParam.startsWith("resultStatus")) {
resultStatus = gatValue(resultParam, "resultStatus");
}
if (resultParam.startsWith("result")) {
result = gatValue(resultParam, "result");
}
if (resultParam.startsWith("memo")) {
memo = gatValue(resultParam, "memo");
}
}
}
@Override
public String toString() {
return "resultStatus={" + resultStatus + "};memo={" + memo
+ "};result={" + result + "}";
}
private String gatValue(String content, String key) {
String prefix = key + "={";
return content.substring(content.indexOf(prefix) + prefix.length(),
content.lastIndexOf("}"));
}
/**
* @return the resultStatus
*/
public String getResultStatus() {
return resultStatus;
}
/**
* @return the memo
*/
public String getMemo() {
return memo;
}
/**
* @return the result
*/
public String getResult() {
return result;
}
}
5.然后请求下单数据,并调用支付宝进行支付:
AliPayUtil.getInstance(this, orderCallback).startPay(placeString);
private PayStateCallback orderCallback = new PayStateCallback() {
@Override
public void onPaySuccess(String describe) {
//支付成功的处理
showToast("支付成功");
}
@Override
public void onPayWatting(String describe) {
}
@Override
public void onPayFailed(String describe) {
//支付失败的处理
showToast("支付失败");
}
};
6.如果在支付成功或失败返回的市口出现闪白退出异常<Can't toast on a thread that has not called Looper.prepare()>,是因为子线程不能更新ui,做一下操作
rivate PayStateCallback orderCallback = new PayStateCallback() {
@Override
public void onPaySuccess(String describe) {
//支付成功的处理
runOnUiThread(new Runnable() {
@Override
public void run() {
showToast("支付成功");
}
});
}
@Override
public void onPayWatting(String describe) {
}
@Override
public void onPayFailed(String describe) {
//支付失败的处理
runOnUiThread(new Runnable() {
@Override
public void run() {
showToast("支付失败");
}
});
}
};
网友评论