1.接入支付宝
接入前准备
- 商户需要进行审核签约
- 密钥管理(生成公私钥)
正式接入
服务端
私钥必须放在服务端,签名过程必须放在服务端。
客户端(Android)
- 根据用户选择商品请求服务端获取订单和签名,
- 根据服务端返回订单和签名调起支付宝App支付,并对支付返回结果做处理。
2.Android 集成并调用支付宝
- . 添加jar包
- . gradle中添加依赖
PayTask payTask = new PayTask(AboutUsActivity.this);
Map<String, String> result = payTask.payV2(orderInfo, true);
orderInfo :服务端返回的订单信息。
3.返回结果处理(全部代码)
/**
* 支付宝
* @param strURL
*/
private void aliPay(String strURL) {
Observable.create(new ObservableOnSubscribe<Object>() {
@Override
public void subscribe(@NonNull ObservableEmitter<Object> e) throws Exception {
String orderInfo = OkClient.get(strURL, new JSONObject());//获取订单信息
orderInfo = orderInfo.replace("amp;", "");//后台PHP,返回的所有&参数都变成&,所有需要替换。
PayTask payTask = new PayTask(AboutUsActivity.this);
Map<String, String> result = payTask.payV2(orderInfo, true);
e.onNext(result);
}
}).compose(RxUtil.activityLifecycle(this))
.compose(RxUtil.io())
.subscribe(new Consumer<Object>() {
@Override
public void accept(@NonNull Object o) throws Exception {
closeProgressDialog();
PayResult payResult = new PayResult((Map<String, String>) o);
/**
对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
*/
String resultInfo = payResult.getResult();// 同步返回需要验证的信息
String resultStatus = payResult.getResultStatus();
// 判断resultStatus 为9000则代表支付成功
if (TextUtils.equals(resultStatus, AliPay.PAY_OK)) {//--------->支付成功
finish();
} else if (TextUtils.equals(resultStatus, AliPay.PAY_FAIL)) {//--------->支付失败
// 该笔订单真实的支付结果,需要依赖服务端的异步通知。
ToastUtils.showToast(payResult.getMemo());
} else if (TextUtils.equals(resultStatus, AliPay.PAY_CANCEL)) {//--------->交易取消
ToastUtils.showToast(payResult.getMemo());
} else if (TextUtils.equals(resultStatus, AliPay.PAY_NET_ERROR)) {//---------->网络出现错误
ToastUtils.showToast(payResult.getMemo());
} else if (TextUtils.equals(resultStatus, AliPay.PAY_REPEAT)) {//------>交易重复
}
}
});
}
4.回调类
/**
* 支付宝回调code值
*/
public class AliPay {
public static final String PAY_OK = "9000";//支付宝支付成功
public static final String PAY_PROCESSING_UNKNOWN = "8000";//正在处理中,支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态
public static final String PAY_FAIL = "4000";//支付宝支付失败
public static final String PAY_REPEAT = "5000";//支付宝支付重复请求
public static final String PAY_CANCEL = "6001";//用户中途取消
public static final String PAY_NET_ERROR = "6002";//网络连接出错
public static final String PAY_UNKNOWN = "6004";//支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态
}
/**
* 支付宝回调
*/
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;
}
}
网友评论