支付宝在线支付-android java 集成 2019.3.30
Java端
首先 maven引入 我用的是最新的3.7.4.ALL 现在的最新Sdk都是ALL
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.7.4.ALL</version>
</dependency>
创建一个AlipayConfig.Class类
按照提示加入需要的信息 回调地址可用natapp
/**
* 正式环境请求地址
*/
public static final String ALIPAY_URL = "https://openapi.alipay.com/gateway.do";
/**
* 支付宝分配给开发者的应用ID
*
*/
public static final String APP_ID = "2019************";
/**
* 仅支持JSON
*/
public static String FORMAT = "JSON";
/**
* 请求使用的编码格式
*/
public static String CHARSET = "utf-8";
/**
* 商户生成签名字符串所使用的签名算法类型
*/
public static String SIGN_TYPE = "RSA2";
/**
* 支付宝公钥
*/
public static final String ALIPAY_PUBLIC_KEY = "";
/**
* 商户私钥
*/
public static final String PRIVATE_KEY = "";
/**
* 回调地址
*/
public static final String CALLBACK_URL = "";
用的是ssm 所以在Collection中 我有一个方法makeOrder 需要方法抛出异常throws AlipayApiException
具体参数查看蚂蚁金服开放平台中的开发文档
public WebResult<String> makeOrder() throws AlipayApiException {
WebResult<String> webResult = new WebResult<>();
// 实例化客户端
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.ALIPAY_URL, AlipayConfig.APP_ID, AlipayConfig.PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGN_TYPE);
// 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
// SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel()
model.setBody("");
model.setOutTradeNo(商户唯一订单号);
model.setTotalAmount(价格);
model.setSubject("标题");
model.setTimeoutExpress("30m"); 过期时间
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
request.setNotifyUrl(AlipayConfig.CALLBACK_URL);//异步回调url
// 这里和普通的接口调用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
webResult.setSuccess(true);
webResult.setData(response.getBody());
return webResult;
}
将拼接好的数据返回给前端或者android端。
支付完毕后 支付宝异步回调处理 在这里判断订单状态,执行相关业务逻辑。
@RequestMapping(value = "/getAlipayNotify", produces = "application/json;charset=UTF-8", method = {RequestMethod.GET, RequestMethod.POST })
public void getAlipayNotify(HttpServletRequest request) {
Map<String, String> params = new HashMap<String, String>();
Map requestParams = request.getParameterMap();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
}
// 乱码解决,这段代码在出现乱码时使用。
// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
// 切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
try {
boolean flag = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET,
AlipayConfig.SIGN_TYPE);
if (flag) {
String trade_status = params.get("trade_status");
//TRADE_SUCCESS 交易成功 支付成功
//TRADE_CLOSED 未付款交易超时关闭,或支付完成后全额退款 交易关闭
//TRADE_FINISHED 交易结束,不可退款 交易完成
//WAIT_BUYER_PAY 交易创建,等待买家付款 交易创建
if ("TRADE_SUCCESS".equals(trade_status)){
//TODO 交易支付成功的执行相关业务逻辑
String realPay=params.get("total_amount");
String alipayId=params.get("trade_no");
String timestamp=params.get("timestamp");
String orderId=params.get("out_trade_no");
} else if ("TRADE_CLOSED".equals(trade_status)) {
//TODO 未付款交易超时关闭,或支付完成后全额退款,执行相关业务逻辑
System.out.println("Alipay:"+trade_status);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
android端
首先获取请求参数
try {
myOkHttp
.get()
.url(HttpUtil.HOST_ADDRESS+"/Alipay/makeOrder?orderid="+order.get("id").toString()+"&title="+servicetitle)
.tag(this)
.enqueue(new JsonResponseHandler() {
@Override
public void onSuccess(int statusCode, JSONObject response) {
try {
orderInfo = response.getString("data");
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(int statusCode, String error_msg) {
}
});
} catch (JSONException e) {
e.printStackTrace();
}
之后
Runnable payRunnable = new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask(getActivity());
Map<String,String> result = alipay.payV2(orderInfo,true);
}
};
// 必须异步调用
Thread payThread = new Thread(payRunnable);
payThread.start();
android 也需要引入相关sdk
在project下 找到libs文件夹 将下载的sdk添加进去
主要用于记录,可能大家会看的很难受,因为我是怕我自己忘记才写下来的。 哪里有问题请评论。